{"_id":"@orioro/expression","_rev":"33-f43771e2c8cf75ecf629459909d4157f","name":"@orioro/expression","dist-tags":{"latest":"6.5.0","next":"6.5.0"},"versions":{"0.1.0":{"name":"@orioro/expression","version":"0.1.0","description":"","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest","test-watch":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepublish":"npm run build","update-dependencies":"npx npm-check-updates -u","develop":"rm -rf dist && rollup --config ./rollup/build.config.js --watch","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","babel-jest":"^26.3.0","jest":"^26.4.2","rollup":"^2.26.8","typescript":"^4.0.2"},"dependencies":{"lodash":"^4.17.20","luxon":"^1.25.0"},"gitHead":"ea7901255240c8ebcfb8451cd89ef669834852fa","_id":"@orioro/expression@0.1.0","_nodeVersion":"12.17.0","_npmVersion":"6.14.4","_npmUser":{"name":"simonfan","email":"simonxd@gmail.com"},"dist":{"integrity":"sha512-h2RjRn3bJAwjlCi86ZBX3zutI7+AEMYkz88nc88dAV9ZgLI2thVT5PeIPLCnBeRYLBs1EUjc7A1SapthSM+G7g==","shasum":"b2d676ec0afabf0e4de7c1b7d1ada17b7e1b7b34","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-0.1.0.tgz","fileCount":27,"unpackedSize":122444,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkz3aCRA9TVsSAnZWagAAMLcP/ihU2kwqaa9zlOYVF0GD\n6AWBNd0M+ESFKIhbDkXKPZ+lH1g7Od4Q1bAmVBL+/9QIbGx1J3zzCHAhmium\n19ooyyVkUOD7ckfR+DysDZQ5wUX1iRIFUis+ZJDBWLcW6nZiWBCZFL9Geb/f\nsTTCsNKMPc0kEsb9cttijQxf28WcXABIrXytMVWCoTdRgN5t+VN8/g+aFgtS\nMIV8IllFwddg/tEHIiF9j9sXLB/oAE34X05pCgy8hdceOu2a7bVHrwfINB2f\nge3QiAc5oDa3x7KMzOx7VAot6mclAT/ie2ZE906SUvn/mRzX/GbUIrKooMot\nQQvPfWUIYWOIM2vdh2QE+tc/4MCbP2r8MAbMJaBSFr6L+yPTv+dOMcQsK3OC\nJ8TENZbVrE/UhdSDyzcZsF311VAfqbeGrEh5RYCyFIURHx6p++HD42iMI8x0\nsBvUP3aJY6mdjQF3CV0Z2fnELkAU9+ucVuBfNHTV+4AaWKS9QvDdrKvpkXYr\n0HuA1p1v/NlrA/hZkqxb0sw8sMZ4SjGq+TjPT1dLSG9dIVyiHH3UBRblNg81\nF4SaMdbgFd4pBxxJXdpCqbRVJdkrh5mEc5PhS2Xx3j11g+WHvUOGQvaVnV1T\n+RHwTptCKSlPjykA3XWCUttYjodlB0JllVKyt8k48F72A9IyGJY/UToUKHlL\nOFRI\r\n=ZAuq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBa+RrvieYWIHbtKbsbO4AHUo3/2Xu0lXwFJLbFDF7ZNAiBEXtrSOiVxK6dZLKoEX+xcg/B9kG0VlL9qHsWBuoT24Q=="}]},"maintainers":[{"name":"simonfan","email":"simonxd@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_0.1.0_1603485145469_0.8339526306644083"},"_hasShrinkwrap":false},"1.0.0-alpha.1":{"name":"@orioro/expression","version":"1.0.0-alpha.1","description":"","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepublish":"npm run build","update-dependencies":"npx npm-check-updates -u","develop":"rm -rf dist && rollup --config ./rollup/build.config.js --watch","develop-test":"jest --watch","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","babel-jest":"^26.3.0","jest":"^26.4.2","rollup":"^2.26.8","typescript":"^4.0.2"},"dependencies":{"lodash":"^4.17.20","luxon":"^1.25.0"},"gitHead":"285f631d5b3d75bca9f44630f7040c4ad4207391","_id":"@orioro/expression@1.0.0-alpha.1","_nodeVersion":"14.15.4","_npmVersion":"6.14.10","dist":{"integrity":"sha512-xmUPR8dO9URlndudWET82E+YIu8/2aPTiQ6OSLKN8B3joB+2opPDvQ7mIzeNceHrVnHEpOz1ErBfIvvOiU6Qyw==","shasum":"d273e1c64fa9e73f4eb970eda6f8e0c658188f7e","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-1.0.0-alpha.1.tgz","fileCount":34,"unpackedSize":131638,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgCHSPCRA9TVsSAnZWagAASQQP+wXLnBFNpH1kbYEqZXNo\n5n6Iq+zlNkRt5ytxq2kpMekQGHmzN84ku1DxYOU5OfX/TxUUb3gKKBLDGl2n\nuyjGhRGxzcB4yG44il+T6AuzdFw4dlm5792xjKSLlqLMvw23n/FXwx2ffS/y\nmkUioCWm3Fk6l2KZqCafkYHAig0wxUfwNGXjg9k4V1vm7F4MXKOr6GYpiWm/\nwFFRofO3V/1XwJjZ2AAyecYdfpx+J+tqjtLmR+TyvNz5JgWouNrmU7/a3IEh\n/zLG6L4qtF98qtOPwjQHYeiqZ1yH5uJM5OLXY9Zgsi735kR56nF10cSezXbU\n4/tBfbFoCF6AiWdZJfVImk+EAbQXZt5mG96RnXPl48rK9MDrvfAbJDOhw6HV\n5BAKYOC65orO7XGQ89e4M0oD+r7BgVE6vCYhswA4cJhGTMey/yYFEtWD6+c8\nJmLPULqhaaO9NEPQvsVOY3SLmxWcsdQqFAMQx7gygkpwG8pkcopYCRzuZJuf\nch9lisKWFSdjjpxjyBFg+GeXQU0XYYG7KSfLSfjqfvBWaZGJFwTcFURqD8MT\nSQQirhkg/5eeUNA0PPfKAsI5V0DZq3kDE3vB3KuMgjGceUIIH64rC1X/oOx9\n7kUhAJxUVGvQlnCaMlBEV3fux9FmOubAm5iSA2D9hK31ij1+i/fs++4/iIdW\nZGxk\r\n=ppa2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHW7ercmZWlDw2X/DkX7STWj6zbiSlijnSnQHezLyclDAiAUom/nQK+L6tkSgiTuhJ/QGK8Brf20XJ21Q+khs1dpBA=="}]},"_npmUser":{"name":"simonfan","email":"simonxd@gmail.com"},"directories":{},"maintainers":[{"name":"simonfan","email":"simonxd@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_1.0.0-alpha.1_1611166862913_0.11823963773549018"},"_hasShrinkwrap":false},"1.0.0-alpha.3":{"name":"@orioro/expression","version":"1.0.0-alpha.3","description":"","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","develop":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepublish":"npm run build","update-dependencies":"npx npm-check-updates -u","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","babel-jest":"^26.3.0","jest":"^26.4.2","rollup":"^2.26.8","typescript":"^4.0.2"},"dependencies":{"lodash":"^4.17.20","luxon":"^1.25.0"},"gitHead":"1e8402061cf3ae7f2eecc7774da0389ccb1d93b9","_id":"@orioro/expression@1.0.0-alpha.3","_nodeVersion":"14.15.4","_npmVersion":"6.14.10","dist":{"integrity":"sha512-Okol3Wf8t4LhUFAzEIJLIXY2GDdTl6cNm0yK/c37jPmTjYB/GgT/1CU0r7ENr33afR1IoAXeoTWHxmcYaFVwjA==","shasum":"2fb713db6ed5cf35bd6f529151f2b78f5bb13287","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-1.0.0-alpha.3.tgz","fileCount":36,"unpackedSize":133388,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgCg1OCRA9TVsSAnZWagAAR/4P/3NUt0draLmmnjZ0LY2B\n5n0ipjkB4tT8e4MPzIZtDHbX1qSlrMl0gwlc5Byrw26mmDLhfipV8h00y3zK\nCQ2J9EgGmjzRbPk3tFGGOM6lHn8o2HijoFTIv+fyklroy+VbDfyijjLkJ9hm\ndzeicMtT41lkQBDv+DogooCcUJJ/GkT1sO+iE5InjLwd/6iVHotpd8RPNaF8\neBe1w3EvZ9edHK0CYFUMhJbV2Fg31iyfrGALPHSK6idnPa9T0/hd3hs6eGc5\not82B67/WbcnmXhEHzWCUbNbSdqXDBZhqz8/Z1TL1WvikEjiCk5vybKwFXrp\n9i+3ZZcF7tSuAt4u0puO/o1buQhVxhpxaYO3WaAx6vFUDR9VoYKi0aRgIE5B\n09R65YR0REQa7rIBCiICPUWw0ghZoKjBERluCgufEInuPDFSulrp0TqZpV3T\nfEXGajYErm0DanEOExYuqFaQ3CzlVMIBCxQdHk2MGrrPAspEJ2OdD9jsuxNl\nTxpsGatIWrce2E/lm0CSpc41xmRus1tziocpN2PJVChZ8H9xiHwb4HSgSiGQ\n7wixA9jbIdUvHeU07LJ5hhkccO1Md53pcvM6GXplEauEdifmfCdkKQKsGXMy\nvhKqm/qKF5tTlvhLsRLBynh8dvFCg4YSItB8WIMkT9cpoUhHOd5PmvtX8YGv\nq7um\r\n=g+dI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7F4hXo6gL5v0wf3x3E+ymamcRbQcZ8Q3vqdy8Q7vh6wIgBDvaDQM6pxpHi67x8pZDkTQGIGi/A5IxADmjOSqGbmE="}]},"_npmUser":{"name":"simonfan","email":"simonxd@gmail.com"},"directories":{},"maintainers":[{"name":"simonfan","email":"simonxd@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_1.0.0-alpha.3_1611271502058_0.10582151510869386"},"_hasShrinkwrap":false},"1.0.0-alpha.4":{"name":"@orioro/expression","version":"1.0.0-alpha.4","description":"","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","develop":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepublish":"npm run build","update-dependencies":"npx npm-check-updates -u","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","babel-jest":"^26.3.0","jest":"^26.4.2","rollup":"^2.26.8","typescript":"^4.0.2"},"dependencies":{"lodash":"^4.17.20","luxon":"^1.25.0"},"gitHead":"f13412a3da38159507d434be827e9d456c34367a","_id":"@orioro/expression@1.0.0-alpha.4","_nodeVersion":"14.15.4","_npmVersion":"6.14.10","dist":{"integrity":"sha512-5fAlK491Xa7hPDu2lwdVLF8G9OFq/GqcJYOz+aupDx0KIaVwZjVro/U0cpjj4gJMbQQN07SEOrlFOpKYSzQDLA==","shasum":"c779e05cc92fb827d2b373f626cdf10cab27268d","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-1.0.0-alpha.4.tgz","fileCount":36,"unpackedSize":134361,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgChNvCRA9TVsSAnZWagAAv1oP/2obgQMOuvseDRoPxLFg\nvP/+m/FRN6Gl+OeDU73aZ4Qcse4FV9FruTDKQSzRo8toLNQdV6XLj+btIJQl\nKtmiwT8sbTqtqjw/8DS2QJTKPHlZ/yl7Ws7KQZna+GC0lL6EsO/PE/hzPFFl\nfbPI5QZinXbZdfi6Y8lJbWmsDPqxTONYs1H9CrSX6taXTh9M2HyxZZIfoNtw\nS6wdCO+JYZemfn/a+rY3LALyvRZv8Xj/zb3Bd7IgRZI0WEoqVQ32LU+nsGR3\nC3ockXMUo1OATqKbRzlJ9ytyDXSgElH4TPb8EGqjXaJXwjhttFw+IDs6mP3+\nawlv3yuyPevuK3/LEvzZxgrJ0jIdzgqkNEdZfa8hQt9NNl01julvVYPMWTlA\nmfjykqEhzagOANSd4i/G3P2S8YbH5wPp6qVuYW5aBgwyhLSg8lD0MCAa0AeF\nmHA5HwOcdI4YJnk6GozZw/4cZr5/6dpRZtz3VSiJ+X/fpj99s7ko3Lzfcu4K\nZnNmro6nS4H6szCFgHPyolHLIa4CKlp5KWTGTSqz6ezCoSffgl55wjEia1L7\nh4fwNP6nVaLRVDww25n7xdeeknotcTkp6NjRY7nO5IzaXXVO30AeELo32Byq\nOnZA5b8PiAJr4La5ulBxN9564F5+ukYgwvId+F57TIeUihhW7KifUInMXk6i\nAwgG\r\n=rE+Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDdzhnmFufeMCYBdU8B4k2CluS+CyBdaFcJkPywHdW8kwIhAJ4E+RnehgI1nsvvMuCEzUSbwPzCKffjm3h+Hgke4LxT"}]},"_npmUser":{"name":"simonfan","email":"simonxd@gmail.com"},"directories":{},"maintainers":[{"name":"simonfan","email":"simonxd@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_1.0.0-alpha.4_1611273070687_0.6219242022914815"},"_hasShrinkwrap":false},"1.0.0-alpha.5":{"name":"@orioro/expression","version":"1.0.0-alpha.5","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","dev:readme":"readme --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepare":"npm run build && readme","update-dependencies":"npx npm-check-updates -u","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","babel-jest":"^26.3.0","jest":"^26.4.2","rollup":"^2.26.8","typescript":"^4.0.2"},"dependencies":{"lodash":"^4.17.20","luxon":"^1.25.0"},"gitHead":"9d758856b2a5cf222e669605b5ee93b555837fae","_id":"@orioro/expression@1.0.0-alpha.5","_nodeVersion":"14.15.4","_npmVersion":"6.14.10","dist":{"integrity":"sha512-taQc8pc3RwzR2rvGvP74FemVwsxOhyAEX00s8uLMQu5yndSCIecJunBQK8Vd6l7tiQbKVPN8SUm/HHbSIcIZPQ==","shasum":"8b88b8de59780f23518cdf44c0a666cfd7f4a34d","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-1.0.0-alpha.5.tgz","fileCount":39,"unpackedSize":206212,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgGawgCRA9TVsSAnZWagAAABoP/12dq9OlXAwtDTF8pWBP\nlCreFyJ5tTV+eHqTmIY/ewLZOihPjw3KWRvp/aAsWXbRj4anKSmcAoZihJ4C\n3ZqmdWUe0chu8ERVArWYGWQO+5ssNRztGI+xt7+ZnjIGuHjkwfoYYGsWZw+0\nNDhunqX8ED+FAyc1tqGdWczPStAAa5njT6hoelDcGT3cXDleAeb7azLj/yk6\nAQZ+6h1gdSEY3IVKBQwTrCcWa0m3yIu5AGZFQMyEZjJiuSBSlhnJDphrLKrb\nRZmsGPnEIXGBVPmV6sfyTovhTz4Gp9GjojtjQ7kh8CeY7ebpJl0WPEMhaeGS\nmUTqGYTvcojpqJU63espC/gxkzB6AjlOHLwM++45m6YA5C/bsy8FbraE7Tum\nKGbWkNwAYNVlKXVY1+EqpZcDwlNDk8eMtbdnQhfiXoPNq7P+6psIJx4eErPY\nziQX1QLpeT4jRFXSLGzE//AahGQlz5F+o4VQdTTXId9Z2NfgMgv2ERLn2WdZ\nN2guh0+Emu9HFzHT5F2JXDJuQ0KJULUs3t3IlWbqaKzASp6k9UYOvsmBxoxQ\nPdjlf/S7QLXngytdvn+QgJ2Tn0vGzI/dVQyBrGV6D2IB+hYy8kq6EbrxFZE1\neWd9OsVEp+MvJdOVfrdXDTVOJ/7wsIkKYfiQtS2VUTuUkI/R63GUTVre3o8u\ngMCw\r\n=fENQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC0whMGY/Hhq7/ZaAcbMYAK+p5RmOqwOcicgtVNd4XkYgIhAOZpgn8HaiZMNgTHxjQ74VXH3NChi2hbhIZOp2G6DJDc"}]},"_npmUser":{"name":"simonfan","email":"simonxd@gmail.com"},"directories":{},"maintainers":[{"name":"simonfan","email":"simonxd@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_1.0.0-alpha.5_1612295200298_0.6265759857328197"},"_hasShrinkwrap":false},"1.0.0":{"name":"@orioro/expression","version":"1.0.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","dev:readme":"readme --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepare":"npm run build && readme","update-dependencies":"npx npm-check-updates -u","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","commit":"cz"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","babel-jest":"^26.3.0","commitizen":"^4.2.3","jest":"^26.4.2","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"cz-conventional-changelog":"^3.3.0","lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"gitHead":"cc3d0538a3f3f81679cc78692bac9c7edff8f266","_id":"@orioro/expression@1.0.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-nHL5rMih146PmFXkNDHMi8iDnT16czValapwewn4mh41dbvDje2Jt1JxJwfC/ombDol+GZ+A4waMJC6hjkGgeA==","shasum":"34927e804079ea2d49c6dd62de3421d830628192","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-1.0.0.tgz","fileCount":41,"unpackedSize":207732,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgGzVCCRA9TVsSAnZWagAAlcgP/3Z2K92bCtEwZ167wKxk\nZxxDFJhmECPXOWiafbFiDfUII1LShgPUIbfduwQKerG/DCCfYXyoGVKQ9sTq\nbr1h6EYKih7Zgx125YiuO9MxJctZUaz/XtA+DnmSkTuBHSx16IbHeY6vw5Tf\nvwe02c1YdYGDRbm+GmxiFdgGLepAsmuhh9A7AcqCThllmczUUcX4z/UBKfLI\nPDrle8XOqhBzhbP2sXHQyw9Pqt4v1hxqsYCN1wGw24l58E+qtObghXaqihuj\nn4ZahqwU9/JqNgh9814XfQWgHf9DwqBODwvc1dSNUtMa2xWqOXJBTIm4zrl7\ndhdz+TVzyr0gZhRPBwpOXCO4Bo7vR1xR2qpWxACwljb5ismCMOFBhdn1n4HU\nrrOxPpPRw5GqZ4wOdgMVl+KeGIavoVITEjy0l4FZJeKZ6T7LPz3aujBqpIUY\nDFqeIwI59LwtFPCb1utP5ERhIPGLe+bAR4uM3eNBxIJXHT+4F9hvMBto40Qs\nf2zhNf43lmg/14ukz4eR6NjUFOyvaNWu2UF001Li756vhXoAIC43ndpGEcFn\nY5iLIKTrnXTyRIQUNJ5b1/LW7eh023h5yj/nCp7Vk7A/aXvGljjGSPPAA5zc\nbs/jnNVvOVRESxYJTQi6L/VWto382WlAbNlLUDs8ppfflIqK3m0rQIZqmvze\nmWNu\r\n=zHMe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFG1XFLTFqB3vnEDAhRnG/8ElSMZWe+R3dBDFtSXTgi1AiBGThS6NHC91QoJp1BZM2E6uxF21cH7QOhcbrPjol6JsQ=="}]},"_npmUser":{"name":"simonfan","email":"simonxd@gmail.com"},"directories":{},"maintainers":[{"name":"simonfan","email":"simonxd@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_1.0.0_1612395841452_0.027000347549550163"},"_hasShrinkwrap":false},"2.0.0":{"name":"@orioro/expression","version":"2.0.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","dev:readme":"readme --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepare":"npm run build && readme","update-dependencies":"npx npm-check-updates -u","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","commit":"cz"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","babel-jest":"^26.3.0","commitizen":"^4.2.3","jest":"^26.4.2","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2","cz-conventional-changelog":"^3.3.0"},"dependencies":{"lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n## Array\n\n- [`$arrayIncludes(searchValueExp, arrayExp)`](#arrayincludessearchvalueexp-arrayexp)\n- [`$arrayIncludesAll(searchValuesExp, arrayExp)`](#arrayincludesallsearchvaluesexp-arrayexp)\n- [`$arrayIncludesAny(searchValueExp, arrayExp)`](#arrayincludesanysearchvalueexp-arrayexp)\n- [`$arrayLength(arrayExp)`](#arraylengtharrayexp)\n- [`$arrayReduce(reduceExp, startExp, arrayExp)`](#arrayreducereduceexp-startexp-arrayexp)\n- [`$arrayMap(mapExp, arrayExp)`](#arraymapmapexp-arrayexp)\n- [`$arrayFilter(queryExp, arrayExp)`](#arrayfilterqueryexp-arrayexp)\n- [`$arrayIndexOf(queryExp, arrayExp)`](#arrayindexofqueryexp-arrayexp)\n- [`$arrayFind(queryExp, arrayExp)`](#arrayfindqueryexp-arrayexp)\n- [`$arrayReverse(arrayExp)`](#arrayreversearrayexp)\n- [`$arraySort(sortExp, arrayExp)`](#arraysortsortexp-arrayexp)\n- [`$arrayPush(arrayExp)`](#arraypusharrayexp)\n- [`$arrayUnshift(valueExp, arrayExp)`](#arrayunshiftvalueexp-arrayexp)\n- [`$arrayShift(arrayExp)`](#arrayshiftarrayexp)\n- [`$arraySlice(startExp, endExp, arrayExp)`](#arrayslicestartexp-endexp-arrayexp)\n- [`$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`](#arraysubstitutestartexp-endexp-valuesexp-arrayexp)\n- [`$arrayAddAt(indexExp, valuesExp, arrayExp)`](#arrayaddatindexexp-valuesexp-arrayexp)\n- [`$arrayRemoveAt(indexExp, countExp, arrayExp)`](#arrayremoveatindexexp-countexp-arrayexp)\n- [`$arrayJoin(separatorExp, arrayExp)`](#arrayjoinseparatorexp-arrayexp)\n- [`$arrayAt(indexExp, arrayExp)`](#arrayatindexexp-arrayexp)\n\n\n##### `$arrayIncludes(searchValueExp, arrayExp)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValueExp` {*}\n- `arrayExp` {Array}\n- Returns: `includes` {boolean} \n\n##### `$arrayIncludesAll(searchValuesExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAll` {boolean} \n\n##### `$arrayIncludesAny(searchValueExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValueExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAny` {boolean} \n\n##### `$arrayLength(arrayExp)`\n\n- `arrayExp` {Array}\n- Returns: `length` {number} \n\n##### `$arrayReduce(reduceExp, startExp, arrayExp)`\n\n- `reduceExp` {Expression}\n- `startExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayMap(mapExp, arrayExp)`\n\n- `mapExp` {Expression}\n- `arrayExp` {Array}\n\n##### `$arrayFilter(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayIndexOf(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayFind(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayReverse(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySort(sortExp, arrayExp)`\n\n- `sortExp` {number}\n- `arrayExp` {Array}\n\n##### `$arrayPush(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arrayUnshift(valueExp, arrayExp)`\n\n- `valueExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayShift(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySlice(startExp, endExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(indexExp, valuesExp, arrayExp)`\n\nAdds items at the given position.\n\n- `indexExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(indexExp, countExp, arrayExp)`\n\n- `indexExp` {number}\n- `countExp` {number}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separatorExp, arrayExp)`\n\n- `separatorExp` {StringExpression}\n- `arrayExp` {Array}\n- Returns: {string} \n\n##### `$arrayAt(indexExp, arrayExp)`\n\n- `indexExp` {number}\n- `arrayExp` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(valueExp)`](#booleanvalueexp)\n\n\n##### `$boolean(valueExp)`\n\n- `valueExp` {*}\n- Returns: {boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {number}\n- Returns: {boolean} \n\n\n## Date\n\nSet of expressions aimed at solving common date-related operations: \nparse, format, compare, validate, manipulate (e.g. move forward, move back).\nMost (if not all) operations are based on and built with [`Luxon`](https://github.com/moment/luxon/) `DateTime`. If not stated otherwise, date operations return a `string` in ISO 8601 format (`2021-01-27T20:38:12.807Z`).\n\n- [`DateFormat`](#dateformat)\n- [`ISODate`](#isodate)\n- [`Duration`](#duration)\n- [`$date(parseFmtArgs, serializeFmtArgs, date)`](#dateparsefmtargs-serializefmtargs-date)\n- [`$dateNow(serializeFmtArgs)`](#datenowserializefmtargs)\n- [`$dateIsValid()`](#dateisvalid)\n- [`$dateStartOf(unitExp, date)`](#datestartofunitexp-date)\n- [`$dateEndOf(unitExp, date)`](#dateendofunitexp-date)\n- [`$dateSet(valuesExp, dateExp)`](#datesetvaluesexp-dateexp)\n- [`$$dateSetConfig(configExp, date)`](#datesetconfigconfigexp-date)\n- [`$dateGt(referenceDateExp, date)`](#dategtreferencedateexp-date)\n- [`$dateGte(referenceDateExp, date)`](#dategtereferencedateexp-date)\n- [`$dateLt(referenceDateExp, date)`](#dateltreferencedateexp-date)\n- [`$dateLte(referenceDateExp, date)`](#dateltereferencedateexp-date)\n- [`$dateEq(referenceDateExp, compareUnitExp, date)`](#dateeqreferencedateexp-compareunitexp-date)\n- [`$dateMoveForward(duration, date)`](#datemoveforwardduration-date)\n- [`$dateMoveBackward(duration, date)`](#datemovebackwardduration-date)\n\n\n##### `DateFormat`\n\nArguments to be forwarded to Luxon corresponding DateTime parser.\nIf a `string`, will be considered as the name of the format.\nIf an `Array`, will be considered as a tuple consisting of\n[format, formatOptions].\nRecognized formats (exported as constants `DATE_{FORMAT_IN_CONSTANT_CASE}`):\n- `ISO`\n- `ISODate`\n- `ISOWeekDate`\n- `ISOTime`\n- `RFC2822`\n- `HTTP`\n- `SQL`\n- `SQLTime`\n- `SQLTime`\n- `UnixEpochMs`\n- `UnixEpochS`\n- `JSDate`\n- `PlainObject`\n- `LuxonDateTime`\n\n\n\n##### `ISODate`\n\nString in the full ISO 8601 format:\n`2017-04-20T11:32:00.000-04:00`\n\n\n\n##### `Duration`\n\nDuration represented in an object format:\n\n- `duration` {Object}\n  - `years` {number}\n  - `quarters` {number}\n  - `months` {number}\n  - `weeks` {number}\n  - `days` {number}\n  - `hours` {number}\n  - `minutes` {number}\n  - `seconds` {number}\n  - `milliseconds` {number}\n\n##### `$date(parseFmtArgs, serializeFmtArgs, date)`\n\nParses a date from a given input format and serializes it into\nanother format. Use this expression to convert date formats into\nyour requirements. E.g. `UnixEpochMs` into `ISO`.\n\n- `parseFmtArgs` {[DateFormat](#dateformat)}\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- `date` {string | number | Object | Date}\n- Returns: `date` {string | number | Object | Date} Output will vary according to `serializeFmtArgs`\n\n##### `$dateNow(serializeFmtArgs)`\n\nGenerates a ISO date string from `Date.now`\n\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- Returns: `date` {string | number | Object | Date} \n\n##### `$dateIsValid()`\n\nVerifies whether the given date is valid.\nFrom Luxon docs:\n> The most common way to do that is to over- or underflow some unit:\n> - February 40th\n> - 28:00\n> - 4 pm\n> - etc\nSee https://github.com/moment/luxon/blob/master/docs/validity.md\n\n- `` {[ISODate](#isodate)}\n- Returns: `isValid` {boolean} \n\n##### `$dateStartOf(unitExp, date)`\n\nReturns the date at the start of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateEndOf(unitExp, date)`\n\nReturns the date at the end of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateSet(valuesExp, dateExp)`\n\nModifies date specific `units` and returns resulting date.\nSee [`DateTime#set`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-set)\nand [`DateTime.fromObject`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#static-method-fromObject)\n\n- `valuesExp` {Object}\n  - `year` {number}\n  - `month` {number}\n  - `day` {number}\n  - `ordinal` {number}\n  - `weekYear` {number}\n  - `weekNumber` {number}\n  - `weekday` {number}\n  - `hour` {number}\n  - `minute` {number}\n  - `second` {number}\n  - `millisecond` {number}\n- `dateExp` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$$dateSetConfig(configExp, date)`\n\nModifies a configurations of the date.\n\n- `configExp` {Object}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateGt(referenceDateExp, date)`\n\nGreater than `date > reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateGte(referenceDateExp, date)`\n\nGreater than or equal `date >= reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLt(referenceDateExp, date)`\n\nLesser than `date < reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLte(referenceDateExp, date)`\n\nLesser than or equal `date <= reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateEq(referenceDateExp, compareUnitExp, date)`\n\n`date == reference`\nConverts both `date` and `reference` and compares their\nspecified `compareUnit`. By default compares `millisecond` unit\nso that checks whether are exactly the same millisecond in time,\nbut could be used to compare other units, such as whether two dates\nare within the same `day`, `month` or `year`.\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `compareUnitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateMoveForward(duration, date)`\n\nModifies the date by moving it forward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateMoveBackward(duration, date)`\n\nModifies the date by moving it backward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n\n## Functional\n\n- [`$pipe(expressionsExp)`](#pipeexpressionsexp)\n\n\n##### `$pipe(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(casesExp, defaultExp)`](#switchcasesexp-defaultexp)\n- [`$switchKey(casesExp, defaultExp, ValueExp)`](#switchkeycasesexp-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {BooleanExpression}\n- `expressionB` {BooleanExpression}\n- Returns: {boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {BooleanExpression}\n- `thenExp` {Expression}\n- `elseExp` {Expression}\n- Returns: `result` {*} \n\n##### `$switch(casesExp, defaultExp)`\n\n- `casesExp` {ArrayExpression}\n- `defaultExp` {Expression}\n- Returns: `result` {*} \n\n##### `$switchKey(casesExp, defaultExp, ValueExp)`\n\n- `casesExp` {Cases[]}\n  - `0` {string}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathAbs(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathRound(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathFloor(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathCeil(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {number}\n- `value` {*}\n- Returns: {number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPathExp, valueExp)`](#objectmatchescriteriabypathexp-valueexp)\n- [`$objectFormat(formatExp, sourceExp)`](#objectformatformatexp-sourceexp)\n- [`$objectDefaults(defaultValuesExp, baseExp)`](#objectdefaultsdefaultvaluesexp-baseexp)\n- [`$objectAssign(valuesExp, baseExp)`](#objectassignvaluesexp-baseexp)\n\n\n##### `$objectMatches(criteriaByPathExp, valueExp)`\n\n- `criteriaByPathExp` {Object}\n- `valueExp` {Object}\n- Returns: `matches` {boolean} \n\n##### `$objectFormat(formatExp, sourceExp)`\n\n- `formatExp` {Object | Array}\n- `sourceExp` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, baseExp)`\n\n- `defaultValuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(valuesExp, baseExp)`\n\n- `valuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n\n## String\n\n- [`$string(valueExp)`](#stringvalueexp)\n- [`$stringStartsWith(query, strExp)`](#stringstartswithquery-strexp)\n- [`$stringLength(strExp)`](#stringlengthstrexp)\n- [`$stringSubstr(startExp, endExp, strExp)`](#stringsubstrstartexp-endexp-strexp)\n- [`$stringConcat(concatExp, baseExp)`](#stringconcatconcatexp-baseexp)\n- [`$stringTrim(strExp)`](#stringtrimstrexp)\n- [`$stringPadStart(targetLengthExp, padStringExp, strExp)`](#stringpadstarttargetlengthexp-padstringexp-strexp)\n- [`$stringPadEnd(targetLengthExp, padStringExp, strExp)`](#stringpadendtargetlengthexp-padstringexp-strexp)\n- [`$stringMatch(regExpExp, regExpOptionsExp, valueExp)`](#stringmatchregexpexp-regexpoptionsexp-valueexp)\n- [`$stringTest(regExpExp, regExpOptionsExp, valueExp)`](#stringtestregexpexp-regexpoptionsexp-valueexp)\n\n\n##### `$string(valueExp)`\n\n- `valueExp` {*}\n- Returns: {string} \n\n##### `$stringStartsWith(query, strExp)`\n\n- `query` {string}\n- `strExp` {string}\n- Returns: {boolean} \n\n##### `$stringLength(strExp)`\n\n- `strExp` {string}\n- Returns: {number} \n\n##### `$stringSubstr(startExp, endExp, strExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `strExp` {string}\n\n##### `$stringConcat(concatExp, baseExp)`\n\n- `concatExp` {string}\n- `baseExp` {string}\n- Returns: {string} \n\n##### `$stringTrim(strExp)`\n\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringMatch(regExpExp, regExpOptionsExp, valueExp)`\n\n- `regExpExp` {string}\n- `regExpOptionsExp` {string}\n- `valueExp` {string}\n- Returns: {string[]} \n\n##### `$stringTest(regExpExp, regExpOptionsExp, valueExp)`\n\n- `regExpExp` {string}\n- `regExpOptionsExp` {string}\n- `valueExp` {string}\n- Returns: {boolean} \n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {string} \n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {string}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {Expression}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"readme.md","gitHead":"712369f5633afae27ff343232ef479a611c7ddd5","_id":"@orioro/expression@2.0.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-5uyT4h3e87BXVc3WTbkKKa6N5koe1MT417WTB3Gs/GzuHFgVR/xjta4p73Yk6nprs3lXmg7vvuAh1yLjaUPo/g==","shasum":"50bc2e09fee580544948dfbacc7d71376a97fac1","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-2.0.0.tgz","fileCount":41,"unpackedSize":207820,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgIOHkCRA9TVsSAnZWagAAYRsP/3YstZlKr8ZcPKxmPo0Q\nju/CnVhRef8/YjJxe6vbCyLvn8k/2PRPtXlon5ZqOXGkn35uvu5UAV74JJYE\nY2BIg34+zSoBD29ouwLGRkgRX/fgpxlUUMi7CcQCmZIHlfOnJfRNg0VHPWsY\ngQK15mu5yj32/mF9Xctc4Gr46t1/zHGwiBYNIWocUdgAQieKKlh1Me9FKGKQ\nyTgpwRmvbpSwqb4gnCmNDplQuFf1cP6dfNC2cgdGTwmWaA0ZpLBAYHFmrUSu\ntH5chGO90NDvCRhI9jTY6FbpGwaMhbnddF8HlN/RKPong5scp+moOX3Cuqsq\nS1gKQi07xSyEGptfS8WlZvFMBoUVrV4s8OMr8Z2bUQ9EwJlB7svfetJX8Ph9\nwr1YrgqcQEFUY+LM59XA6YZfYgeav8/fj2ActCk39FiGgLVhE3vbq+Cf3bha\nAbEbUFO/iPFXlBXFYPfJanveqA5SOTQK9MLiWPCt/AozUbgmLgG6WZRHP4Za\nZ58p5ka+A95i4qelyE1ZUdf87/CNDCZFjAsqsq5Wac4oYqPsJsZ5T0GQNgG9\nLKd+nIr+Z2jI1bBjddZieNEjc1tPOJ9fWQC4yUzgYnXX6k5M+nQ7n1orx6oF\nEp/2LrEBeewcPyld1+QQ6lzOfOkEjoBt8tutJlky/pZC34x92OTKdXOv7b0/\nv8Rc\r\n=tIi6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAN+jLYnERevs2Q5RHb8t7JUqzyy/2NuCG7VmFIWUbaLAiEAqU41NaR37RX7mpJt4lEVO9fHiPBiGNWOhPIsgIk/9qU="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_2.0.0_1612767715948_0.49681085624232746"},"_hasShrinkwrap":false},"2.1.0":{"name":"@orioro/expression","version":"2.1.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","dev:readme":"readme --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepare":"npm run build && readme","update-dependencies":"npx npm-check-updates -u","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","commit":"cz"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","babel-jest":"^26.3.0","commitizen":"^4.2.3","jest":"^26.4.2","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2","cz-conventional-changelog":"^3.3.0"},"dependencies":{"lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n## Array\n\n- [`$arrayIncludes(searchValueExp, arrayExp)`](#arrayincludessearchvalueexp-arrayexp)\n- [`$arrayIncludesAll(searchValuesExp, arrayExp)`](#arrayincludesallsearchvaluesexp-arrayexp)\n- [`$arrayIncludesAny(searchValueExp, arrayExp)`](#arrayincludesanysearchvalueexp-arrayexp)\n- [`$arrayLength(arrayExp)`](#arraylengtharrayexp)\n- [`$arrayReduce(reduceExp, startExp, arrayExp)`](#arrayreducereduceexp-startexp-arrayexp)\n- [`$arrayMap(mapExp, arrayExp)`](#arraymapmapexp-arrayexp)\n- [`$arrayFilter(queryExp, arrayExp)`](#arrayfilterqueryexp-arrayexp)\n- [`$arrayIndexOf(queryExp, arrayExp)`](#arrayindexofqueryexp-arrayexp)\n- [`$arrayFind(queryExp, arrayExp)`](#arrayfindqueryexp-arrayexp)\n- [`$arrayReverse(arrayExp)`](#arrayreversearrayexp)\n- [`$arraySort(sortExp, arrayExp)`](#arraysortsortexp-arrayexp)\n- [`$arrayPush(arrayExp)`](#arraypusharrayexp)\n- [`$arrayUnshift(valueExp, arrayExp)`](#arrayunshiftvalueexp-arrayexp)\n- [`$arrayShift(arrayExp)`](#arrayshiftarrayexp)\n- [`$arraySlice(startExp, endExp, arrayExp)`](#arrayslicestartexp-endexp-arrayexp)\n- [`$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`](#arraysubstitutestartexp-endexp-valuesexp-arrayexp)\n- [`$arrayAddAt(indexExp, valuesExp, arrayExp)`](#arrayaddatindexexp-valuesexp-arrayexp)\n- [`$arrayRemoveAt(indexExp, countExp, arrayExp)`](#arrayremoveatindexexp-countexp-arrayexp)\n- [`$arrayJoin(separatorExp, arrayExp)`](#arrayjoinseparatorexp-arrayexp)\n- [`$arrayAt(indexExp, arrayExp)`](#arrayatindexexp-arrayexp)\n\n\n##### `$arrayIncludes(searchValueExp, arrayExp)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValueExp` {*}\n- `arrayExp` {Array}\n- Returns: `includes` {boolean} \n\n##### `$arrayIncludesAll(searchValuesExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAll` {boolean} \n\n##### `$arrayIncludesAny(searchValueExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValueExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAny` {boolean} \n\n##### `$arrayLength(arrayExp)`\n\n- `arrayExp` {Array}\n- Returns: `length` {number} \n\n##### `$arrayReduce(reduceExp, startExp, arrayExp)`\n\n- `reduceExp` {Expression}\n- `startExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayMap(mapExp, arrayExp)`\n\n- `mapExp` {Expression}\n- `arrayExp` {Array}\n\n##### `$arrayFilter(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayIndexOf(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayFind(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayReverse(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySort(sortExp, arrayExp)`\n\n- `sortExp` {number}\n- `arrayExp` {Array}\n\n##### `$arrayPush(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arrayUnshift(valueExp, arrayExp)`\n\n- `valueExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayShift(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySlice(startExp, endExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(indexExp, valuesExp, arrayExp)`\n\nAdds items at the given position.\n\n- `indexExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(indexExp, countExp, arrayExp)`\n\n- `indexExp` {number}\n- `countExp` {number}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separatorExp, arrayExp)`\n\n- `separatorExp` {StringExpression}\n- `arrayExp` {Array}\n- Returns: {string} \n\n##### `$arrayAt(indexExp, arrayExp)`\n\n- `indexExp` {number}\n- `arrayExp` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(valueExp)`](#booleanvalueexp)\n\n\n##### `$boolean(valueExp)`\n\n- `valueExp` {*}\n- Returns: {boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {number}\n- Returns: {boolean} \n\n\n## Date\n\nSet of expressions aimed at solving common date-related operations: \nparse, format, compare, validate, manipulate (e.g. move forward, move back).\nMost (if not all) operations are based on and built with [`Luxon`](https://github.com/moment/luxon/) `DateTime`. If not stated otherwise, date operations return a `string` in ISO 8601 format (`2021-01-27T20:38:12.807Z`).\n\n- [`DateFormat`](#dateformat)\n- [`ISODate`](#isodate)\n- [`Duration`](#duration)\n- [`$date(parseFmtArgs, serializeFmtArgs, date)`](#dateparsefmtargs-serializefmtargs-date)\n- [`$dateNow(serializeFmtArgs)`](#datenowserializefmtargs)\n- [`$dateIsValid()`](#dateisvalid)\n- [`$dateStartOf(unitExp, date)`](#datestartofunitexp-date)\n- [`$dateEndOf(unitExp, date)`](#dateendofunitexp-date)\n- [`$dateSet(valuesExp, dateExp)`](#datesetvaluesexp-dateexp)\n- [`$$dateSetConfig(configExp, date)`](#datesetconfigconfigexp-date)\n- [`$dateGt(referenceDateExp, date)`](#dategtreferencedateexp-date)\n- [`$dateGte(referenceDateExp, date)`](#dategtereferencedateexp-date)\n- [`$dateLt(referenceDateExp, date)`](#dateltreferencedateexp-date)\n- [`$dateLte(referenceDateExp, date)`](#dateltereferencedateexp-date)\n- [`$dateEq(referenceDateExp, compareUnitExp, date)`](#dateeqreferencedateexp-compareunitexp-date)\n- [`$dateMoveForward(duration, date)`](#datemoveforwardduration-date)\n- [`$dateMoveBackward(duration, date)`](#datemovebackwardduration-date)\n\n\n##### `DateFormat`\n\nArguments to be forwarded to Luxon corresponding DateTime parser.\nIf a `string`, will be considered as the name of the format.\nIf an `Array`, will be considered as a tuple consisting of\n[format, formatOptions].\nRecognized formats (exported as constants `DATE_{FORMAT_IN_CONSTANT_CASE}`):\n- `ISO`\n- `ISODate`\n- `ISOWeekDate`\n- `ISOTime`\n- `RFC2822`\n- `HTTP`\n- `SQL`\n- `SQLTime`\n- `SQLTime`\n- `UnixEpochMs`\n- `UnixEpochS`\n- `JSDate`\n- `PlainObject`\n- `LuxonDateTime`\n\n\n\n##### `ISODate`\n\nString in the full ISO 8601 format:\n`2017-04-20T11:32:00.000-04:00`\n\n\n\n##### `Duration`\n\nDuration represented in an object format:\n\n- `duration` {Object}\n  - `years` {number}\n  - `quarters` {number}\n  - `months` {number}\n  - `weeks` {number}\n  - `days` {number}\n  - `hours` {number}\n  - `minutes` {number}\n  - `seconds` {number}\n  - `milliseconds` {number}\n\n##### `$date(parseFmtArgs, serializeFmtArgs, date)`\n\nParses a date from a given input format and serializes it into\nanother format. Use this expression to convert date formats into\nyour requirements. E.g. `UnixEpochMs` into `ISO`.\n\n- `parseFmtArgs` {[DateFormat](#dateformat)}\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- `date` {string | number | Object | Date}\n- Returns: `date` {string | number | Object | Date} Output will vary according to `serializeFmtArgs`\n\n##### `$dateNow(serializeFmtArgs)`\n\nGenerates a ISO date string from `Date.now`\n\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- Returns: `date` {string | number | Object | Date} \n\n##### `$dateIsValid()`\n\nVerifies whether the given date is valid.\nFrom Luxon docs:\n> The most common way to do that is to over- or underflow some unit:\n> - February 40th\n> - 28:00\n> - 4 pm\n> - etc\nSee https://github.com/moment/luxon/blob/master/docs/validity.md\n\n- `` {[ISODate](#isodate)}\n- Returns: `isValid` {boolean} \n\n##### `$dateStartOf(unitExp, date)`\n\nReturns the date at the start of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateEndOf(unitExp, date)`\n\nReturns the date at the end of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateSet(valuesExp, dateExp)`\n\nModifies date specific `units` and returns resulting date.\nSee [`DateTime#set`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-set)\nand [`DateTime.fromObject`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#static-method-fromObject)\n\n- `valuesExp` {Object}\n  - `year` {number}\n  - `month` {number}\n  - `day` {number}\n  - `ordinal` {number}\n  - `weekYear` {number}\n  - `weekNumber` {number}\n  - `weekday` {number}\n  - `hour` {number}\n  - `minute` {number}\n  - `second` {number}\n  - `millisecond` {number}\n- `dateExp` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$$dateSetConfig(configExp, date)`\n\nModifies a configurations of the date.\n\n- `configExp` {Object}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateGt(referenceDateExp, date)`\n\nGreater than `date > reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateGte(referenceDateExp, date)`\n\nGreater than or equal `date >= reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLt(referenceDateExp, date)`\n\nLesser than `date < reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLte(referenceDateExp, date)`\n\nLesser than or equal `date <= reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateEq(referenceDateExp, compareUnitExp, date)`\n\n`date == reference`\nConverts both `date` and `reference` and compares their\nspecified `compareUnit`. By default compares `millisecond` unit\nso that checks whether are exactly the same millisecond in time,\nbut could be used to compare other units, such as whether two dates\nare within the same `day`, `month` or `year`.\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `compareUnitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateMoveForward(duration, date)`\n\nModifies the date by moving it forward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateMoveBackward(duration, date)`\n\nModifies the date by moving it backward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n\n## Functional\n\n- [`$pipe(expressionsExp)`](#pipeexpressionsexp)\n\n\n##### `$pipe(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(casesExp, defaultExp)`](#switchcasesexp-defaultexp)\n- [`$switchKey(casesExp, defaultExp, ValueExp)`](#switchkeycasesexp-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {BooleanExpression}\n- `expressionB` {BooleanExpression}\n- Returns: {boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {BooleanExpression}\n- `thenExp` {Expression}\n- `elseExp` {Expression}\n- Returns: `result` {*} \n\n##### `$switch(casesExp, defaultExp)`\n\n- `casesExp` {ArrayExpression}\n- `defaultExp` {Expression}\n- Returns: `result` {*} \n\n##### `$switchKey(casesExp, defaultExp, ValueExp)`\n\n- `casesExp` {Cases[]}\n  - `0` {string}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathAbs(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathRound(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathFloor(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathCeil(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {number}\n- `value` {*}\n- Returns: {number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPathExp, valueExp)`](#objectmatchescriteriabypathexp-valueexp)\n- [`$objectFormat(formatExp, sourceExp)`](#objectformatformatexp-sourceexp)\n- [`$objectDefaults(defaultValuesExp, baseExp)`](#objectdefaultsdefaultvaluesexp-baseexp)\n- [`$objectAssign(valuesExp, baseExp)`](#objectassignvaluesexp-baseexp)\n\n\n##### `$objectMatches(criteriaByPathExp, valueExp)`\n\n- `criteriaByPathExp` {Object}\n- `valueExp` {Object}\n- Returns: `matches` {boolean} \n\n##### `$objectFormat(formatExp, sourceExp)`\n\n- `formatExp` {Object | Array}\n- `sourceExp` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, baseExp)`\n\n- `defaultValuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(valuesExp, baseExp)`\n\n- `valuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n\n## String\n\n- [`$string(valueExp)`](#stringvalueexp)\n- [`$stringStartsWith(query, strExp)`](#stringstartswithquery-strexp)\n- [`$stringLength(strExp)`](#stringlengthstrexp)\n- [`$stringSubstr(startExp, endExp, strExp)`](#stringsubstrstartexp-endexp-strexp)\n- [`$stringConcat(concatExp, baseExp)`](#stringconcatconcatexp-baseexp)\n- [`$stringTrim(strExp)`](#stringtrimstrexp)\n- [`$stringPadStart(targetLengthExp, padStringExp, strExp)`](#stringpadstarttargetlengthexp-padstringexp-strexp)\n- [`$stringPadEnd(targetLengthExp, padStringExp, strExp)`](#stringpadendtargetlengthexp-padstringexp-strexp)\n- [`$stringMatch(regExpExp, valueExp)`](#stringmatchregexpexp-valueexp)\n- [`$stringTest(regExpExp, valueExp)`](#stringtestregexpexp-valueexp)\n\n\n##### `$string(valueExp)`\n\n- `valueExp` {*}\n- Returns: {string} \n\n##### `$stringStartsWith(query, strExp)`\n\n- `query` {string}\n- `strExp` {string}\n- Returns: {boolean} \n\n##### `$stringLength(strExp)`\n\n- `strExp` {string}\n- Returns: {number} \n\n##### `$stringSubstr(startExp, endExp, strExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `strExp` {string}\n\n##### `$stringConcat(concatExp, baseExp)`\n\n- `concatExp` {string}\n- `baseExp` {string}\n- Returns: {string} \n\n##### `$stringTrim(strExp)`\n\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringMatch(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {string[]} \n\n##### `$stringTest(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {boolean} \n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {string} \n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {string}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {Expression}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"readme.md","gitHead":"e070df93d8704847d72ca639f8e83e552176dc07","_id":"@orioro/expression@2.1.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-yrZLbrzthse/ABPEvvqxMUBFMi69bp3qUC3MWq0HfnZTGEWn1tmYmHHhooUnIgDhLiqk2qoHa47Qf4LygkrG8w==","shasum":"8371f014ae15edbac7a9d1de6a710bd964e3e8a3","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-2.1.0.tgz","fileCount":41,"unpackedSize":207629,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgIaCjCRA9TVsSAnZWagAAlA8P/j/Dn8OFjgYXs+l7X3iQ\nx2ol2ld6RTKDMJxrptxdcAPExSHjA0EDi4EhY88QxJ6TumdwBfRuvHncM32D\nAZVztvAosFoo2y7J0TAHZzSGAuQzJmBcP0r93LUGgE5drEP2454yYkYdnUI5\ndPEirfZS3Zsbk8VPjG1Tuw9L+3FPuhsbgHatzl01xdMStRE8967m7MPWbHZt\ne+nNj1vNrRCP4E25k3kr7ljLkzxyz/jeInJuQQPlSFs+Un3/5TFaU2ya/d14\nq5WStAubODx+30b/ZnKWC1Ywl73HEHiMGbhXVMSV8T+r0HFN7JWeBYJybOmN\nzJ6cqFjePIyGpP4UZlb7LtzlyeDs5OolAj+9JQpoIIs0wbA+LD7KrVM9rwcF\n34ZgeGF4hNmwcatzwouaL7M7OXqZGxWQ7yjeBIVdtAqpDCnnvFuR5OBwk/17\npOUB9A5whpsoUqtTKUdmAbki07bcAMuabbSjJg1sTOelHJGZusT3LLoN93dz\ntFbLGyLquJvpPD27laA3eKxkQB9UlKXiO5VCIxA+QzH0T+zBK0dSpldMaiCF\nCpbmJjeWylHCDoyDEwGl8vZxIM5ZNeE1OOK9U2RNdAr/Unyg8EKPpDtNrjEa\nuvJvCEvlWOdOcTKIjiGTjRSC7XqKkq73TOZYLrUHmLFlTHkASlCcNzJ2Ttpu\nx1yG\r\n=MHHx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC883/dCv+6fi+vC5Nb9Jm1tYOe1LlYzy3ENkL87UtSIgIgKz1PLJtnh1jaLACUo1lk1/fuU+ks5ypulpScv+j6K9s="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_2.1.0_1612816547219_0.22012169097917278"},"_hasShrinkwrap":false},"2.2.0":{"name":"@orioro/expression","version":"2.2.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","dev:readme":"readme --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepare":"npm run build && readme","update-dependencies":"npx npm-check-updates -u","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","commit":"cz"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","babel-jest":"^26.3.0","commitizen":"^4.2.3","jest":"^26.4.2","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2","cz-conventional-changelog":"^3.3.0"},"dependencies":{"lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n## Array\n\n- [`$arrayIncludes(searchValueExp, arrayExp)`](#arrayincludessearchvalueexp-arrayexp)\n- [`$arrayIncludesAll(searchValuesExp, arrayExp)`](#arrayincludesallsearchvaluesexp-arrayexp)\n- [`$arrayIncludesAny(searchValueExp, arrayExp)`](#arrayincludesanysearchvalueexp-arrayexp)\n- [`$arrayLength(arrayExp)`](#arraylengtharrayexp)\n- [`$arrayReduce(reduceExp, startExp, arrayExp)`](#arrayreducereduceexp-startexp-arrayexp)\n- [`$arrayMap(mapExp, arrayExp)`](#arraymapmapexp-arrayexp)\n- [`$arrayEvery(everyExp, arrayExp)`](#arrayeveryeveryexp-arrayexp)\n- [`$arraySome(someExp, arrayExp)`](#arraysomesomeexp-arrayexp)\n- [`$arrayFilter(queryExp, arrayExp)`](#arrayfilterqueryexp-arrayexp)\n- [`$arrayFindIndex(queryExp, arrayExp)`](#arrayfindindexqueryexp-arrayexp)\n- [`$arrayIndexOf(value, arrayExp)`](#arrayindexofvalue-arrayexp)\n- [`$arrayFind(queryExp, arrayExp)`](#arrayfindqueryexp-arrayexp)\n- [`$arrayReverse(arrayExp)`](#arrayreversearrayexp)\n- [`$arraySort(sortExp, arrayExp)`](#arraysortsortexp-arrayexp)\n- [`$arrayPush(arrayExp)`](#arraypusharrayexp)\n- [`$arrayUnshift(valueExp, arrayExp)`](#arrayunshiftvalueexp-arrayexp)\n- [`$arrayShift(arrayExp)`](#arrayshiftarrayexp)\n- [`$arraySlice(startExp, endExp, arrayExp)`](#arrayslicestartexp-endexp-arrayexp)\n- [`$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`](#arraysubstitutestartexp-endexp-valuesexp-arrayexp)\n- [`$arrayAddAt(indexExp, valuesExp, arrayExp)`](#arrayaddatindexexp-valuesexp-arrayexp)\n- [`$arrayRemoveAt(indexExp, countExp, arrayExp)`](#arrayremoveatindexexp-countexp-arrayexp)\n- [`$arrayJoin(separatorExp, arrayExp)`](#arrayjoinseparatorexp-arrayexp)\n- [`$arrayAt(indexExp, arrayExp)`](#arrayatindexexp-arrayexp)\n\n\n##### `$arrayIncludes(searchValueExp, arrayExp)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValueExp` {*}\n- `arrayExp` {Array}\n- Returns: `includes` {boolean} \n\n##### `$arrayIncludesAll(searchValuesExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAll` {boolean} \n\n##### `$arrayIncludesAny(searchValueExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValueExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAny` {boolean} \n\n##### `$arrayLength(arrayExp)`\n\n- `arrayExp` {Array}\n- Returns: `length` {number} \n\n##### `$arrayReduce(reduceExp, startExp, arrayExp)`\n\n- `reduceExp` {Expression}\n- `startExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayMap(mapExp, arrayExp)`\n\n- `mapExp` {Expression}\n- `arrayExp` {Array}\n\n##### `$arrayEvery(everyExp, arrayExp)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {Expression}\n- `arrayExp` {Array}\n\n##### `$arraySome(someExp, arrayExp)`\n\n`Array.prototype.some`\n\n- `someExp` {Expression}\n- `arrayExp` {Array}\n\n##### `$arrayFilter(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayFindIndex(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayIndexOf(value, arrayExp)`\n\n- `value` {*}\n- `arrayExp` {Array}\n\n##### `$arrayFind(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayReverse(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySort(sortExp, arrayExp)`\n\n- `sortExp` {number}\n- `arrayExp` {Array}\n\n##### `$arrayPush(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arrayUnshift(valueExp, arrayExp)`\n\n- `valueExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayShift(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySlice(startExp, endExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(indexExp, valuesExp, arrayExp)`\n\nAdds items at the given position.\n\n- `indexExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(indexExp, countExp, arrayExp)`\n\n- `indexExp` {number}\n- `countExp` {number}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separatorExp, arrayExp)`\n\n- `separatorExp` {StringExpression}\n- `arrayExp` {Array}\n- Returns: {string} \n\n##### `$arrayAt(indexExp, arrayExp)`\n\n- `indexExp` {number}\n- `arrayExp` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(valueExp)`](#booleanvalueexp)\n\n\n##### `$boolean(valueExp)`\n\n- `valueExp` {*}\n- Returns: {boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {number}\n- Returns: {boolean} \n\n\n## Date\n\nSet of expressions aimed at solving common date-related operations: \nparse, format, compare, validate, manipulate (e.g. move forward, move back).\nMost (if not all) operations are based on and built with [`Luxon`](https://github.com/moment/luxon/) `DateTime`. If not stated otherwise, date operations return a `string` in ISO 8601 format (`2021-01-27T20:38:12.807Z`).\n\n- [`DateFormat`](#dateformat)\n- [`ISODate`](#isodate)\n- [`Duration`](#duration)\n- [`$date(parseFmtArgs, serializeFmtArgs, date)`](#dateparsefmtargs-serializefmtargs-date)\n- [`$dateNow(serializeFmtArgs)`](#datenowserializefmtargs)\n- [`$dateIsValid()`](#dateisvalid)\n- [`$dateStartOf(unitExp, date)`](#datestartofunitexp-date)\n- [`$dateEndOf(unitExp, date)`](#dateendofunitexp-date)\n- [`$dateSet(valuesExp, dateExp)`](#datesetvaluesexp-dateexp)\n- [`$$dateSetConfig(configExp, date)`](#datesetconfigconfigexp-date)\n- [`$dateGt(referenceDateExp, date)`](#dategtreferencedateexp-date)\n- [`$dateGte(referenceDateExp, date)`](#dategtereferencedateexp-date)\n- [`$dateLt(referenceDateExp, date)`](#dateltreferencedateexp-date)\n- [`$dateLte(referenceDateExp, date)`](#dateltereferencedateexp-date)\n- [`$dateEq(referenceDateExp, compareUnitExp, date)`](#dateeqreferencedateexp-compareunitexp-date)\n- [`$dateMoveForward(duration, date)`](#datemoveforwardduration-date)\n- [`$dateMoveBackward(duration, date)`](#datemovebackwardduration-date)\n\n\n##### `DateFormat`\n\nArguments to be forwarded to Luxon corresponding DateTime parser.\nIf a `string`, will be considered as the name of the format.\nIf an `Array`, will be considered as a tuple consisting of\n[format, formatOptions].\nRecognized formats (exported as constants `DATE_{FORMAT_IN_CONSTANT_CASE}`):\n- `ISO`\n- `ISODate`\n- `ISOWeekDate`\n- `ISOTime`\n- `RFC2822`\n- `HTTP`\n- `SQL`\n- `SQLTime`\n- `SQLTime`\n- `UnixEpochMs`\n- `UnixEpochS`\n- `JSDate`\n- `PlainObject`\n- `LuxonDateTime`\n\n\n\n##### `ISODate`\n\nString in the full ISO 8601 format:\n`2017-04-20T11:32:00.000-04:00`\n\n\n\n##### `Duration`\n\nDuration represented in an object format:\n\n- `duration` {Object}\n  - `years` {number}\n  - `quarters` {number}\n  - `months` {number}\n  - `weeks` {number}\n  - `days` {number}\n  - `hours` {number}\n  - `minutes` {number}\n  - `seconds` {number}\n  - `milliseconds` {number}\n\n##### `$date(parseFmtArgs, serializeFmtArgs, date)`\n\nParses a date from a given input format and serializes it into\nanother format. Use this expression to convert date formats into\nyour requirements. E.g. `UnixEpochMs` into `ISO`.\n\n- `parseFmtArgs` {[DateFormat](#dateformat)}\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- `date` {string | number | Object | Date}\n- Returns: `date` {string | number | Object | Date} Output will vary according to `serializeFmtArgs`\n\n##### `$dateNow(serializeFmtArgs)`\n\nGenerates a ISO date string from `Date.now`\n\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- Returns: `date` {string | number | Object | Date} \n\n##### `$dateIsValid()`\n\nVerifies whether the given date is valid.\nFrom Luxon docs:\n> The most common way to do that is to over- or underflow some unit:\n> - February 40th\n> - 28:00\n> - 4 pm\n> - etc\nSee https://github.com/moment/luxon/blob/master/docs/validity.md\n\n- `` {[ISODate](#isodate)}\n- Returns: `isValid` {boolean} \n\n##### `$dateStartOf(unitExp, date)`\n\nReturns the date at the start of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateEndOf(unitExp, date)`\n\nReturns the date at the end of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateSet(valuesExp, dateExp)`\n\nModifies date specific `units` and returns resulting date.\nSee [`DateTime#set`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-set)\nand [`DateTime.fromObject`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#static-method-fromObject)\n\n- `valuesExp` {Object}\n  - `year` {number}\n  - `month` {number}\n  - `day` {number}\n  - `ordinal` {number}\n  - `weekYear` {number}\n  - `weekNumber` {number}\n  - `weekday` {number}\n  - `hour` {number}\n  - `minute` {number}\n  - `second` {number}\n  - `millisecond` {number}\n- `dateExp` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$$dateSetConfig(configExp, date)`\n\nModifies a configurations of the date.\n\n- `configExp` {Object}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateGt(referenceDateExp, date)`\n\nGreater than `date > reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateGte(referenceDateExp, date)`\n\nGreater than or equal `date >= reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLt(referenceDateExp, date)`\n\nLesser than `date < reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLte(referenceDateExp, date)`\n\nLesser than or equal `date <= reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateEq(referenceDateExp, compareUnitExp, date)`\n\n`date == reference`\nConverts both `date` and `reference` and compares their\nspecified `compareUnit`. By default compares `millisecond` unit\nso that checks whether are exactly the same millisecond in time,\nbut could be used to compare other units, such as whether two dates\nare within the same `day`, `month` or `year`.\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `compareUnitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateMoveForward(duration, date)`\n\nModifies the date by moving it forward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateMoveBackward(duration, date)`\n\nModifies the date by moving it backward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n\n## Functional\n\n- [`$pipe(expressionsExp)`](#pipeexpressionsexp)\n\n\n##### `$pipe(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(casesExp, defaultExp)`](#switchcasesexp-defaultexp)\n- [`$switchKey(casesExp, defaultExp, ValueExp)`](#switchkeycasesexp-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {BooleanExpression}\n- `expressionB` {BooleanExpression}\n- Returns: {boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {BooleanExpression}\n- `thenExp` {Expression}\n- `elseExp` {Expression}\n- Returns: `result` {*} \n\n##### `$switch(casesExp, defaultExp)`\n\n- `casesExp` {ArrayExpression}\n- `defaultExp` {Expression}\n- Returns: `result` {*} \n\n##### `$switchKey(casesExp, defaultExp, ValueExp)`\n\n- `casesExp` {Cases[]}\n  - `0` {string}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathAbs(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathRound(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathFloor(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathCeil(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {number}\n- `value` {*}\n- Returns: {number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPathExp, valueExp)`](#objectmatchescriteriabypathexp-valueexp)\n- [`$objectFormat(formatExp, sourceExp)`](#objectformatformatexp-sourceexp)\n- [`$objectDefaults(defaultValuesExp, baseExp)`](#objectdefaultsdefaultvaluesexp-baseexp)\n- [`$objectAssign(valuesExp, baseExp)`](#objectassignvaluesexp-baseexp)\n\n\n##### `$objectMatches(criteriaByPathExp, valueExp)`\n\n- `criteriaByPathExp` {Object}\n- `valueExp` {Object}\n- Returns: `matches` {boolean} \n\n##### `$objectFormat(formatExp, sourceExp)`\n\n- `formatExp` {Object | Array}\n- `sourceExp` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, baseExp)`\n\n- `defaultValuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(valuesExp, baseExp)`\n\n- `valuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n\n## String\n\n- [`$string(valueExp)`](#stringvalueexp)\n- [`$stringStartsWith(query, strExp)`](#stringstartswithquery-strexp)\n- [`$stringLength(strExp)`](#stringlengthstrexp)\n- [`$stringSubstr(startExp, endExp, strExp)`](#stringsubstrstartexp-endexp-strexp)\n- [`$stringConcat(concatExp, baseExp)`](#stringconcatconcatexp-baseexp)\n- [`$stringTrim(strExp)`](#stringtrimstrexp)\n- [`$stringPadStart(targetLengthExp, padStringExp, strExp)`](#stringpadstarttargetlengthexp-padstringexp-strexp)\n- [`$stringPadEnd(targetLengthExp, padStringExp, strExp)`](#stringpadendtargetlengthexp-padstringexp-strexp)\n- [`$stringMatch(regExpExp, valueExp)`](#stringmatchregexpexp-valueexp)\n- [`$stringTest(regExpExp, valueExp)`](#stringtestregexpexp-valueexp)\n\n\n##### `$string(valueExp)`\n\n- `valueExp` {*}\n- Returns: {string} \n\n##### `$stringStartsWith(query, strExp)`\n\n- `query` {string}\n- `strExp` {string}\n- Returns: {boolean} \n\n##### `$stringLength(strExp)`\n\n- `strExp` {string}\n- Returns: {number} \n\n##### `$stringSubstr(startExp, endExp, strExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `strExp` {string}\n\n##### `$stringConcat(concatExp, baseExp)`\n\n- `concatExp` {string}\n- `baseExp` {string}\n- Returns: {string} \n\n##### `$stringTrim(strExp)`\n\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringMatch(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {string[]} \n\n##### `$stringTest(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {boolean} \n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {string} \n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {string}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {Expression}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"readme.md","gitHead":"1554c8072b726fb8b371cc4cfc3e638c9228feea","_id":"@orioro/expression@2.2.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-mfn02hNAl9OnHqEkMwArPttxzxSzHMcfQwI0c87iUqSk5JeJmq9cA4nWQ0hesjinngvYSntMSDP+Umt9gTcoew==","shasum":"d9fae27a047a15d3f4f325a2a020333160bf5330","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-2.2.0.tgz","fileCount":41,"unpackedSize":212027,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgIgARCRA9TVsSAnZWagAAF9EP/RuIhtBaC95JvJPgbzAQ\nq4I9gqoAwJm5GUDM6TX0ok8cbcFridoGwmqXX2EE9OijWd1Y3Sj3PZ5bJkRt\nTNECjZLLnvyxasKmGUmrQqyrp2kgDznbI7BTTsz09OLExZWNF5YdU7rZ1SC2\nF1adJtI6ZeT/8yg5g2m0qeEuZB6EKctHMvfHSbVhPDfjTjpH9IRMPBerrjIN\nv2fWaw8spNlpFy7fseHo5cYjI1meQ4TYZN43jsVBiSZ0/Uzf087UtS/+iAYI\nspLZHTXzqdJM7sDaCbO/u06fWrIeBVmWeQjYpXk3fCp9MqAsjM7o6OS7x/5e\nhWllWFTNaW0wSfUjtcw3k9gGTZO0c+x/1eKCrwBKFRZ1Tl2K/Xv/Arev4DO0\n/WueO4i2eXoi2s/pVSCitmWZvouWJK0LH2M6UV6Y5K2W+nme4mmxp24cN9IT\nKsC/wlGrAOkmw2PhX7TCe0XXq75lj3Q63p8kLMZ3Ex2Ljq2wPlxYdFkLmCk4\nGnJFrGo5xTV5hR6RgIA32n/O2+P4eamxszxBJXFWpj5mq/wG8FPGMoXuSUNT\ngVyE01r0zo27PezhkodsIqHOcsF37rr4uRRN5oV3xen/DwSI6PhWVWBAEmKm\ngx4ZbikFVfVCztqHM5hFzSgIhGTnbcMm+Eq9xtw3LpnnWM0YvdeT9kZrVV0n\nr9mA\r\n=Ajoe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDWy1Lc5vLSup9YUll7fDKTqmzfaOCDQHCFezFTcKeGoAiEArwPYWljBuM2oawrQbIu5AdL0zyAHez5hqDHVrQny5G0="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_2.2.0_1612840976564_0.7658196497634533"},"_hasShrinkwrap":false},"2.3.0":{"name":"@orioro/expression","version":"2.3.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","dev:readme":"readme --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepare":"npm run build && readme","update-dependencies":"npx npm-check-updates -u","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","commit":"cz"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","babel-jest":"^26.3.0","commitizen":"^4.2.3","jest":"^26.4.2","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2","cz-conventional-changelog":"^3.3.0"},"dependencies":{"lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n## Array\n\n- [`$arrayIncludes(searchValueExp, arrayExp)`](#arrayincludessearchvalueexp-arrayexp)\n- [`$arrayIncludesAll(searchValuesExp, arrayExp)`](#arrayincludesallsearchvaluesexp-arrayexp)\n- [`$arrayIncludesAny(searchValueExp, arrayExp)`](#arrayincludesanysearchvalueexp-arrayexp)\n- [`$arrayLength(arrayExp)`](#arraylengtharrayexp)\n- [`$arrayReduce(reduceExp, startExp, arrayExp)`](#arrayreducereduceexp-startexp-arrayexp)\n- [`$arrayMap(mapExp, arrayExp)`](#arraymapmapexp-arrayexp)\n- [`$arrayEvery(everyExp, arrayExp)`](#arrayeveryeveryexp-arrayexp)\n- [`$arraySome(someExp, arrayExp)`](#arraysomesomeexp-arrayexp)\n- [`$arrayFilter(queryExp, arrayExp)`](#arrayfilterqueryexp-arrayexp)\n- [`$arrayFindIndex(queryExp, arrayExp)`](#arrayfindindexqueryexp-arrayexp)\n- [`$arrayIndexOf(value, arrayExp)`](#arrayindexofvalue-arrayexp)\n- [`$arrayFind(queryExp, arrayExp)`](#arrayfindqueryexp-arrayexp)\n- [`$arrayReverse(arrayExp)`](#arrayreversearrayexp)\n- [`$arraySort(sortExp, arrayExp)`](#arraysortsortexp-arrayexp)\n- [`$arrayPush(arrayExp)`](#arraypusharrayexp)\n- [`$arrayUnshift(valueExp, arrayExp)`](#arrayunshiftvalueexp-arrayexp)\n- [`$arrayShift(arrayExp)`](#arrayshiftarrayexp)\n- [`$arraySlice(startExp, endExp, arrayExp)`](#arrayslicestartexp-endexp-arrayexp)\n- [`$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`](#arraysubstitutestartexp-endexp-valuesexp-arrayexp)\n- [`$arrayAddAt(indexExp, valuesExp, arrayExp)`](#arrayaddatindexexp-valuesexp-arrayexp)\n- [`$arrayRemoveAt(indexExp, countExp, arrayExp)`](#arrayremoveatindexexp-countexp-arrayexp)\n- [`$arrayJoin(separatorExp, arrayExp)`](#arrayjoinseparatorexp-arrayexp)\n- [`$arrayAt(indexExp, arrayExp)`](#arrayatindexexp-arrayexp)\n\n\n##### `$arrayIncludes(searchValueExp, arrayExp)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValueExp` {*}\n- `arrayExp` {Array}\n- Returns: `includes` {boolean} \n\n##### `$arrayIncludesAll(searchValuesExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAll` {boolean} \n\n##### `$arrayIncludesAny(searchValueExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValueExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAny` {boolean} \n\n##### `$arrayLength(arrayExp)`\n\n- `arrayExp` {Array}\n- Returns: `length` {number} \n\n##### `$arrayReduce(reduceExp, startExp, arrayExp)`\n\n- `reduceExp` {Expression}\n- `startExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayMap(mapExp, arrayExp)`\n\n- `mapExp` {Expression}\n- `arrayExp` {Array}\n\n##### `$arrayEvery(everyExp, arrayExp)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {Expression}\n- `arrayExp` {Array}\n\n##### `$arraySome(someExp, arrayExp)`\n\n`Array.prototype.some`\n\n- `someExp` {Expression}\n- `arrayExp` {Array}\n\n##### `$arrayFilter(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayFindIndex(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayIndexOf(value, arrayExp)`\n\n- `value` {*}\n- `arrayExp` {Array}\n\n##### `$arrayFind(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayReverse(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySort(sortExp, arrayExp)`\n\n- `sortExp` {number}\n- `arrayExp` {Array}\n\n##### `$arrayPush(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arrayUnshift(valueExp, arrayExp)`\n\n- `valueExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayShift(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySlice(startExp, endExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(indexExp, valuesExp, arrayExp)`\n\nAdds items at the given position.\n\n- `indexExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(indexExp, countExp, arrayExp)`\n\n- `indexExp` {number}\n- `countExp` {number}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separatorExp, arrayExp)`\n\n- `separatorExp` {StringExpression}\n- `arrayExp` {Array}\n- Returns: {string} \n\n##### `$arrayAt(indexExp, arrayExp)`\n\n- `indexExp` {number}\n- `arrayExp` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(valueExp)`](#booleanvalueexp)\n\n\n##### `$boolean(valueExp)`\n\n- `valueExp` {*}\n- Returns: {boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {number}\n- Returns: {boolean} \n\n\n## Date\n\nSet of expressions aimed at solving common date-related operations: \nparse, format, compare, validate, manipulate (e.g. move forward, move back).\nMost (if not all) operations are based on and built with [`Luxon`](https://github.com/moment/luxon/) `DateTime`. If not stated otherwise, date operations return a `string` in ISO 8601 format (`2021-01-27T20:38:12.807Z`).\n\n- [`DateFormat`](#dateformat)\n- [`ISODate`](#isodate)\n- [`Duration`](#duration)\n- [`$date(parseFmtArgs, serializeFmtArgs, date)`](#dateparsefmtargs-serializefmtargs-date)\n- [`$dateNow(serializeFmtArgs)`](#datenowserializefmtargs)\n- [`$dateIsValid()`](#dateisvalid)\n- [`$dateStartOf(unitExp, date)`](#datestartofunitexp-date)\n- [`$dateEndOf(unitExp, date)`](#dateendofunitexp-date)\n- [`$dateSet(valuesExp, dateExp)`](#datesetvaluesexp-dateexp)\n- [`$$dateSetConfig(configExp, date)`](#datesetconfigconfigexp-date)\n- [`$dateGt(referenceDateExp, date)`](#dategtreferencedateexp-date)\n- [`$dateGte(referenceDateExp, date)`](#dategtereferencedateexp-date)\n- [`$dateLt(referenceDateExp, date)`](#dateltreferencedateexp-date)\n- [`$dateLte(referenceDateExp, date)`](#dateltereferencedateexp-date)\n- [`$dateEq(referenceDateExp, compareUnitExp, date)`](#dateeqreferencedateexp-compareunitexp-date)\n- [`$dateMoveForward(duration, date)`](#datemoveforwardduration-date)\n- [`$dateMoveBackward(duration, date)`](#datemovebackwardduration-date)\n\n\n##### `DateFormat`\n\nArguments to be forwarded to Luxon corresponding DateTime parser.\nIf a `string`, will be considered as the name of the format.\nIf an `Array`, will be considered as a tuple consisting of\n[format, formatOptions].\nRecognized formats (exported as constants `DATE_{FORMAT_IN_CONSTANT_CASE}`):\n- `ISO`\n- `ISODate`\n- `ISOWeekDate`\n- `ISOTime`\n- `RFC2822`\n- `HTTP`\n- `SQL`\n- `SQLTime`\n- `SQLTime`\n- `UnixEpochMs`\n- `UnixEpochS`\n- `JSDate`\n- `PlainObject`\n- `LuxonDateTime`\n\n\n\n##### `ISODate`\n\nString in the full ISO 8601 format:\n`2017-04-20T11:32:00.000-04:00`\n\n\n\n##### `Duration`\n\nDuration represented in an object format:\n\n- `duration` {Object}\n  - `years` {number}\n  - `quarters` {number}\n  - `months` {number}\n  - `weeks` {number}\n  - `days` {number}\n  - `hours` {number}\n  - `minutes` {number}\n  - `seconds` {number}\n  - `milliseconds` {number}\n\n##### `$date(parseFmtArgs, serializeFmtArgs, date)`\n\nParses a date from a given input format and serializes it into\nanother format. Use this expression to convert date formats into\nyour requirements. E.g. `UnixEpochMs` into `ISO`.\n\n- `parseFmtArgs` {[DateFormat](#dateformat)}\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- `date` {string | number | Object | Date}\n- Returns: `date` {string | number | Object | Date} Output will vary according to `serializeFmtArgs`\n\n##### `$dateNow(serializeFmtArgs)`\n\nGenerates a ISO date string from `Date.now`\n\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- Returns: `date` {string | number | Object | Date} \n\n##### `$dateIsValid()`\n\nVerifies whether the given date is valid.\nFrom Luxon docs:\n> The most common way to do that is to over- or underflow some unit:\n> - February 40th\n> - 28:00\n> - 4 pm\n> - etc\nSee https://github.com/moment/luxon/blob/master/docs/validity.md\n\n- `` {[ISODate](#isodate)}\n- Returns: `isValid` {boolean} \n\n##### `$dateStartOf(unitExp, date)`\n\nReturns the date at the start of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateEndOf(unitExp, date)`\n\nReturns the date at the end of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateSet(valuesExp, dateExp)`\n\nModifies date specific `units` and returns resulting date.\nSee [`DateTime#set`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-set)\nand [`DateTime.fromObject`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#static-method-fromObject)\n\n- `valuesExp` {Object}\n  - `year` {number}\n  - `month` {number}\n  - `day` {number}\n  - `ordinal` {number}\n  - `weekYear` {number}\n  - `weekNumber` {number}\n  - `weekday` {number}\n  - `hour` {number}\n  - `minute` {number}\n  - `second` {number}\n  - `millisecond` {number}\n- `dateExp` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$$dateSetConfig(configExp, date)`\n\nModifies a configurations of the date.\n\n- `configExp` {Object}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateGt(referenceDateExp, date)`\n\nGreater than `date > reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateGte(referenceDateExp, date)`\n\nGreater than or equal `date >= reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLt(referenceDateExp, date)`\n\nLesser than `date < reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLte(referenceDateExp, date)`\n\nLesser than or equal `date <= reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateEq(referenceDateExp, compareUnitExp, date)`\n\n`date == reference`\nConverts both `date` and `reference` and compares their\nspecified `compareUnit`. By default compares `millisecond` unit\nso that checks whether are exactly the same millisecond in time,\nbut could be used to compare other units, such as whether two dates\nare within the same `day`, `month` or `year`.\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `compareUnitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateMoveForward(duration, date)`\n\nModifies the date by moving it forward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateMoveBackward(duration, date)`\n\nModifies the date by moving it backward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n\n## Functional\n\n- [`$pipe(expressionsExp)`](#pipeexpressionsexp)\n\n\n##### `$pipe(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(casesExp, defaultExp)`](#switchcasesexp-defaultexp)\n- [`$switchKey(casesExp, defaultExp, ValueExp)`](#switchkeycasesexp-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {BooleanExpression}\n- `expressionB` {BooleanExpression}\n- Returns: {boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {BooleanExpression}\n- `thenExp` {Expression}\n- `elseExp` {Expression}\n- Returns: `result` {*} \n\n##### `$switch(casesExp, defaultExp)`\n\n- `casesExp` {ArrayExpression}\n- `defaultExp` {Expression}\n- Returns: `result` {*} \n\n##### `$switchKey(casesExp, defaultExp, ValueExp)`\n\n- `casesExp` {Cases[]}\n  - `0` {string}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathAbs(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathRound(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathFloor(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathCeil(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {number}\n- `value` {*}\n- Returns: {number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPathExp, valueExp)`](#objectmatchescriteriabypathexp-valueexp)\n- [`$objectFormat(formatExp, sourceExp)`](#objectformatformatexp-sourceexp)\n- [`$objectDefaults(defaultValuesExp, baseExp)`](#objectdefaultsdefaultvaluesexp-baseexp)\n- [`$objectAssign(valuesExp, baseExp)`](#objectassignvaluesexp-baseexp)\n\n\n##### `$objectMatches(criteriaByPathExp, valueExp)`\n\n- `criteriaByPathExp` {Object}\n- `valueExp` {Object}\n- Returns: `matches` {boolean} \n\n##### `$objectFormat(formatExp, sourceExp)`\n\n- `formatExp` {Object | Array}\n- `sourceExp` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, baseExp)`\n\n- `defaultValuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(valuesExp, baseExp)`\n\n- `valuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n\n## String\n\n- [`$string(valueExp)`](#stringvalueexp)\n- [`$stringStartsWith(query, strExp)`](#stringstartswithquery-strexp)\n- [`$stringLength(strExp)`](#stringlengthstrexp)\n- [`$stringSubstr(startExp, endExp, strExp)`](#stringsubstrstartexp-endexp-strexp)\n- [`$stringConcat(concatExp, baseExp)`](#stringconcatconcatexp-baseexp)\n- [`$stringTrim(strExp)`](#stringtrimstrexp)\n- [`$stringPadStart(targetLengthExp, padStringExp, strExp)`](#stringpadstarttargetlengthexp-padstringexp-strexp)\n- [`$stringPadEnd(targetLengthExp, padStringExp, strExp)`](#stringpadendtargetlengthexp-padstringexp-strexp)\n- [`$stringMatch(regExpExp, valueExp)`](#stringmatchregexpexp-valueexp)\n- [`$stringTest(regExpExp, valueExp)`](#stringtestregexpexp-valueexp)\n- [`$stringReplace(searchExp, replacementExp)`](#stringreplacesearchexp-replacementexp)\n- [`$stringToUpperCase(valueExp)`](#stringtouppercasevalueexp)\n- [`$stringToLowerCase(valueExp)`](#stringtolowercasevalueexp)\n\n\n##### `$string(valueExp)`\n\n- `valueExp` {*}\n- Returns: {string} \n\n##### `$stringStartsWith(query, strExp)`\n\n- `query` {string}\n- `strExp` {string}\n- Returns: {boolean} \n\n##### `$stringLength(strExp)`\n\n- `strExp` {string}\n- Returns: {number} \n\n##### `$stringSubstr(startExp, endExp, strExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `strExp` {string}\n\n##### `$stringConcat(concatExp, baseExp)`\n\n- `concatExp` {string}\n- `baseExp` {string}\n- Returns: {string} \n\n##### `$stringTrim(strExp)`\n\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringMatch(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {string[]} \n\n##### `$stringTest(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {boolean} \n\n##### `$stringReplace(searchExp, replacementExp)`\n\n- `searchExp` {string | [string, string?]}\n- `replacementExp` {string | StringExpression}\n- Returns: {string} \n\n##### `$stringToUpperCase(valueExp)`\n\n- `valueExp` {string}\n- Returns: {string} \n\n##### `$stringToLowerCase(valueExp)`\n\n- `valueExp` {string}\n- Returns: {string} \n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {string} \n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {string}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {Expression}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"readme.md","gitHead":"897dd385856e02583ae8db6596072699a2f7561e","_id":"@orioro/expression@2.3.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-OLSCyZOSd2nm5/giou37TRPy2GaAyouFQFsOnaXkAjKr9mldEx3qC87wBI5+4ClrAymKtGeleh1g9oP2ig8eSQ==","shasum":"4998dc7add2c1a6584cdadb62c9c6ebb6218e59b","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-2.3.0.tgz","fileCount":41,"unpackedSize":217287,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgJUSyCRA9TVsSAnZWagAABy0QAID/Tw9cSpzG/9j/8usk\nilizrgs/u1PdXYTKzKgoV6CQ2HI0kLZoT89BwNfZIobZONqds2LL5KMXT4x0\nQe0XBm6+xdLO/PqwsxLV5Hlmw3il1BhnPfBo289jGNhO2FLhOetBLHfKM28N\nqTTovB60KkRarbg4DD4yjBlL4gqsQGlfreSR62Y5U/GgnbZtLJoDhhy0iBwQ\n0SuoHqXz3rWeM3Lgte2svd8dGsnidRRv94z0r1Fwa93I8F10+I918TfeMTc3\njFOiOJ9omE3Ptvy8/r5uNZDirUohXygBdNNFuTdf4/YZRyyJEujipu3GpEUA\n90ejeKljBl60WlofDnWh/f330K8hjk/bC8Jvff4QWn7Uznaog7wgh/lR1sbK\n1BkE8SqSwVN+U/0PlZHRQJb56EImRkyB9YsC40qYWj3lxl0EebP4K8dsV5jG\nX7DU7h8zdjIMbh7RIhAzFkWIV6vDRvdTnU6stBMGh3oa7KMZcw5mpe1eFpBK\nhrQ3cIykTQLk9wEZL2Sx+9ZLaZh8jlQ5BFWlYwvWGnUkvOnX00oK8TYPaHuC\n9ToEtf7AXMAy9mkZKFDxq1hyXHNGtOauW6eKpZAV6EIN6m+Wkpv2/XlMdjj0\nfQQ19CwG0aIClO7Ui3+TOOvGxz35to8lFBYkmwTVTU35AqJR9lY/1YFbuJiQ\n9L3N\r\n=QUmK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAdepQcYWteg4lxwGbZqHmNqEQmFFpOfsXL9pDCF7c0vAiB71dRxOBOtba/Gcbm97xQcRERMrKcfJha/x6plDMHK/Q=="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_2.3.0_1613055154117_0.7310922735293093"},"_hasShrinkwrap":false},"2.3.1":{"name":"@orioro/expression","version":"2.3.1","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","dev:readme":"readme --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepare":"npm run build && readme","update-dependencies":"npx npm-check-updates -u","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","commit":"cz"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","jest":"^26.4.2","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/validate-type":"^1.0.0","lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n## Array\n\n- [`$arrayIncludes(searchValueExp, arrayExp)`](#arrayincludessearchvalueexp-arrayexp)\n- [`$arrayIncludesAll(searchValuesExp, arrayExp)`](#arrayincludesallsearchvaluesexp-arrayexp)\n- [`$arrayIncludesAny(searchValueExp, arrayExp)`](#arrayincludesanysearchvalueexp-arrayexp)\n- [`$arrayLength(arrayExp)`](#arraylengtharrayexp)\n- [`$arrayReduce(reduceExp, startExp, arrayExp)`](#arrayreducereduceexp-startexp-arrayexp)\n- [`$arrayMap(mapExp, arrayExp)`](#arraymapmapexp-arrayexp)\n- [`$arrayEvery(everyExp, arrayExp)`](#arrayeveryeveryexp-arrayexp)\n- [`$arraySome(someExp, arrayExp)`](#arraysomesomeexp-arrayexp)\n- [`$arrayFilter(queryExp, arrayExp)`](#arrayfilterqueryexp-arrayexp)\n- [`$arrayFindIndex(queryExp, arrayExp)`](#arrayfindindexqueryexp-arrayexp)\n- [`$arrayIndexOf(value, arrayExp)`](#arrayindexofvalue-arrayexp)\n- [`$arrayFind(queryExp, arrayExp)`](#arrayfindqueryexp-arrayexp)\n- [`$arrayReverse(arrayExp)`](#arrayreversearrayexp)\n- [`$arraySort(sortExp, arrayExp)`](#arraysortsortexp-arrayexp)\n- [`$arrayPush(arrayExp)`](#arraypusharrayexp)\n- [`$arrayUnshift(valueExp, arrayExp)`](#arrayunshiftvalueexp-arrayexp)\n- [`$arrayShift(arrayExp)`](#arrayshiftarrayexp)\n- [`$arraySlice(startExp, endExp, arrayExp)`](#arrayslicestartexp-endexp-arrayexp)\n- [`$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`](#arraysubstitutestartexp-endexp-valuesexp-arrayexp)\n- [`$arrayAddAt(indexExp, valuesExp, arrayExp)`](#arrayaddatindexexp-valuesexp-arrayexp)\n- [`$arrayRemoveAt(indexExp, countExp, arrayExp)`](#arrayremoveatindexexp-countexp-arrayexp)\n- [`$arrayJoin(separatorExp, arrayExp)`](#arrayjoinseparatorexp-arrayexp)\n- [`$arrayAt(indexExp, arrayExp)`](#arrayatindexexp-arrayexp)\n\n\n##### `$arrayIncludes(searchValueExp, arrayExp)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValueExp` {*}\n- `arrayExp` {Array}\n- Returns: `includes` {boolean} \n\n##### `$arrayIncludesAll(searchValuesExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAll` {boolean} \n\n##### `$arrayIncludesAny(searchValueExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValueExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAny` {boolean} \n\n##### `$arrayLength(arrayExp)`\n\n- `arrayExp` {Array}\n- Returns: `length` {number} \n\n##### `$arrayReduce(reduceExp, startExp, arrayExp)`\n\n- `reduceExp` {Expression}\n- `startExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayMap(mapExp, arrayExp)`\n\n- `mapExp` {Expression}\n- `arrayExp` {Array}\n\n##### `$arrayEvery(everyExp, arrayExp)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {Expression}\n- `arrayExp` {Array}\n\n##### `$arraySome(someExp, arrayExp)`\n\n`Array.prototype.some`\n\n- `someExp` {Expression}\n- `arrayExp` {Array}\n\n##### `$arrayFilter(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayFindIndex(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayIndexOf(value, arrayExp)`\n\n- `value` {*}\n- `arrayExp` {Array}\n\n##### `$arrayFind(queryExp, arrayExp)`\n\n- `queryExp` {BooleanExpression}\n- `arrayExp` {Array}\n\n##### `$arrayReverse(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySort(sortExp, arrayExp)`\n\n- `sortExp` {number}\n- `arrayExp` {Array}\n\n##### `$arrayPush(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arrayUnshift(valueExp, arrayExp)`\n\n- `valueExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayShift(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySlice(startExp, endExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(indexExp, valuesExp, arrayExp)`\n\nAdds items at the given position.\n\n- `indexExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(indexExp, countExp, arrayExp)`\n\n- `indexExp` {number}\n- `countExp` {number}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separatorExp, arrayExp)`\n\n- `separatorExp` {StringExpression}\n- `arrayExp` {Array}\n- Returns: {string} \n\n##### `$arrayAt(indexExp, arrayExp)`\n\n- `indexExp` {number}\n- `arrayExp` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(valueExp)`](#booleanvalueexp)\n\n\n##### `$boolean(valueExp)`\n\n- `valueExp` {*}\n- Returns: {boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {number}\n- Returns: {boolean} \n\n\n## Date\n\nSet of expressions aimed at solving common date-related operations: \nparse, format, compare, validate, manipulate (e.g. move forward, move back).\nMost (if not all) operations are based on and built with [`Luxon`](https://github.com/moment/luxon/) `DateTime`. If not stated otherwise, date operations return a `string` in ISO 8601 format (`2021-01-27T20:38:12.807Z`).\n\n- [`DateFormat`](#dateformat)\n- [`ISODate`](#isodate)\n- [`Duration`](#duration)\n- [`$date(parseFmtArgs, serializeFmtArgs, date)`](#dateparsefmtargs-serializefmtargs-date)\n- [`$dateNow(serializeFmtArgs)`](#datenowserializefmtargs)\n- [`$dateIsValid()`](#dateisvalid)\n- [`$dateStartOf(unitExp, date)`](#datestartofunitexp-date)\n- [`$dateEndOf(unitExp, date)`](#dateendofunitexp-date)\n- [`$dateSet(valuesExp, dateExp)`](#datesetvaluesexp-dateexp)\n- [`$$dateSetConfig(configExp, date)`](#datesetconfigconfigexp-date)\n- [`$dateGt(referenceDateExp, date)`](#dategtreferencedateexp-date)\n- [`$dateGte(referenceDateExp, date)`](#dategtereferencedateexp-date)\n- [`$dateLt(referenceDateExp, date)`](#dateltreferencedateexp-date)\n- [`$dateLte(referenceDateExp, date)`](#dateltereferencedateexp-date)\n- [`$dateEq(referenceDateExp, compareUnitExp, date)`](#dateeqreferencedateexp-compareunitexp-date)\n- [`$dateMoveForward(duration, date)`](#datemoveforwardduration-date)\n- [`$dateMoveBackward(duration, date)`](#datemovebackwardduration-date)\n\n\n##### `DateFormat`\n\nArguments to be forwarded to Luxon corresponding DateTime parser.\nIf a `string`, will be considered as the name of the format.\nIf an `Array`, will be considered as a tuple consisting of\n[format, formatOptions].\nRecognized formats (exported as constants `DATE_{FORMAT_IN_CONSTANT_CASE}`):\n- `ISO`\n- `ISODate`\n- `ISOWeekDate`\n- `ISOTime`\n- `RFC2822`\n- `HTTP`\n- `SQL`\n- `SQLTime`\n- `SQLTime`\n- `UnixEpochMs`\n- `UnixEpochS`\n- `JSDate`\n- `PlainObject`\n- `LuxonDateTime`\n\n\n\n##### `ISODate`\n\nString in the full ISO 8601 format:\n`2017-04-20T11:32:00.000-04:00`\n\n\n\n##### `Duration`\n\nDuration represented in an object format:\n\n- `duration` {Object}\n  - `years` {number}\n  - `quarters` {number}\n  - `months` {number}\n  - `weeks` {number}\n  - `days` {number}\n  - `hours` {number}\n  - `minutes` {number}\n  - `seconds` {number}\n  - `milliseconds` {number}\n\n##### `$date(parseFmtArgs, serializeFmtArgs, date)`\n\nParses a date from a given input format and serializes it into\nanother format. Use this expression to convert date formats into\nyour requirements. E.g. `UnixEpochMs` into `ISO`.\n\n- `parseFmtArgs` {[DateFormat](#dateformat)}\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- `date` {string | number | Object | Date}\n- Returns: `date` {string | number | Object | Date} Output will vary according to `serializeFmtArgs`\n\n##### `$dateNow(serializeFmtArgs)`\n\nGenerates a ISO date string from `Date.now`\n\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- Returns: `date` {string | number | Object | Date} \n\n##### `$dateIsValid()`\n\nVerifies whether the given date is valid.\nFrom Luxon docs:\n> The most common way to do that is to over- or underflow some unit:\n> - February 40th\n> - 28:00\n> - 4 pm\n> - etc\nSee https://github.com/moment/luxon/blob/master/docs/validity.md\n\n- `` {[ISODate](#isodate)}\n- Returns: `isValid` {boolean} \n\n##### `$dateStartOf(unitExp, date)`\n\nReturns the date at the start of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateEndOf(unitExp, date)`\n\nReturns the date at the end of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateSet(valuesExp, dateExp)`\n\nModifies date specific `units` and returns resulting date.\nSee [`DateTime#set`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-set)\nand [`DateTime.fromObject`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#static-method-fromObject)\n\n- `valuesExp` {Object}\n  - `year` {number}\n  - `month` {number}\n  - `day` {number}\n  - `ordinal` {number}\n  - `weekYear` {number}\n  - `weekNumber` {number}\n  - `weekday` {number}\n  - `hour` {number}\n  - `minute` {number}\n  - `second` {number}\n  - `millisecond` {number}\n- `dateExp` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$$dateSetConfig(configExp, date)`\n\nModifies a configurations of the date.\n\n- `configExp` {Object}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateGt(referenceDateExp, date)`\n\nGreater than `date > reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateGte(referenceDateExp, date)`\n\nGreater than or equal `date >= reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLt(referenceDateExp, date)`\n\nLesser than `date < reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLte(referenceDateExp, date)`\n\nLesser than or equal `date <= reference`\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateEq(referenceDateExp, compareUnitExp, date)`\n\n`date == reference`\nConverts both `date` and `reference` and compares their\nspecified `compareUnit`. By default compares `millisecond` unit\nso that checks whether are exactly the same millisecond in time,\nbut could be used to compare other units, such as whether two dates\nare within the same `day`, `month` or `year`.\n\n- `referenceDateExp` {[ISODate](#isodate)}\n- `compareUnitExp` {string}\n- `date` {[ISODate](#isodate)}\n- Returns: {boolean} \n\n##### `$dateMoveForward(duration, date)`\n\nModifies the date by moving it forward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n##### `$dateMoveBackward(duration, date)`\n\nModifies the date by moving it backward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[ISODate](#isodate)}\n- Returns: `date` {[ISODate](#isodate)} \n\n\n## Functional\n\n- [`$pipe(expressionsExp)`](#pipeexpressionsexp)\n\n\n##### `$pipe(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(casesExp, defaultExp)`](#switchcasesexp-defaultexp)\n- [`$switchKey(casesExp, defaultExp, ValueExp)`](#switchkeycasesexp-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {ArrayExpression}\n- Returns: {boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {BooleanExpression}\n- `expressionB` {BooleanExpression}\n- Returns: {boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {BooleanExpression}\n- `thenExp` {Expression}\n- `elseExp` {Expression}\n- Returns: `result` {*} \n\n##### `$switch(casesExp, defaultExp)`\n\n- `casesExp` {ArrayExpression}\n- `defaultExp` {Expression}\n- Returns: `result` {*} \n\n##### `$switchKey(casesExp, defaultExp, ValueExp)`\n\n- `casesExp` {Cases[]}\n  - `0` {string}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathAbs(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathRound(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathFloor(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathCeil(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {number}\n- `value` {*}\n- Returns: {number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPathExp, valueExp)`](#objectmatchescriteriabypathexp-valueexp)\n- [`$objectFormat(formatExp, sourceExp)`](#objectformatformatexp-sourceexp)\n- [`$objectDefaults(defaultValuesExp, baseExp)`](#objectdefaultsdefaultvaluesexp-baseexp)\n- [`$objectAssign(valuesExp, baseExp)`](#objectassignvaluesexp-baseexp)\n\n\n##### `$objectMatches(criteriaByPathExp, valueExp)`\n\n- `criteriaByPathExp` {Object}\n- `valueExp` {Object}\n- Returns: `matches` {boolean} \n\n##### `$objectFormat(formatExp, sourceExp)`\n\n- `formatExp` {Object | Array}\n- `sourceExp` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, baseExp)`\n\n- `defaultValuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(valuesExp, baseExp)`\n\n- `valuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n\n## String\n\n- [`$string(valueExp)`](#stringvalueexp)\n- [`$stringStartsWith(query, strExp)`](#stringstartswithquery-strexp)\n- [`$stringLength(strExp)`](#stringlengthstrexp)\n- [`$stringSubstr(startExp, endExp, strExp)`](#stringsubstrstartexp-endexp-strexp)\n- [`$stringConcat(concatExp, baseExp)`](#stringconcatconcatexp-baseexp)\n- [`$stringTrim(strExp)`](#stringtrimstrexp)\n- [`$stringPadStart(targetLengthExp, padStringExp, strExp)`](#stringpadstarttargetlengthexp-padstringexp-strexp)\n- [`$stringPadEnd(targetLengthExp, padStringExp, strExp)`](#stringpadendtargetlengthexp-padstringexp-strexp)\n- [`$stringMatch(regExpExp, valueExp)`](#stringmatchregexpexp-valueexp)\n- [`$stringTest(regExpExp, valueExp)`](#stringtestregexpexp-valueexp)\n- [`$stringReplace(searchExp, replacementExp)`](#stringreplacesearchexp-replacementexp)\n- [`$stringToUpperCase(valueExp)`](#stringtouppercasevalueexp)\n- [`$stringToLowerCase(valueExp)`](#stringtolowercasevalueexp)\n\n\n##### `$string(valueExp)`\n\n- `valueExp` {*}\n- Returns: {string} \n\n##### `$stringStartsWith(query, strExp)`\n\n- `query` {string}\n- `strExp` {string}\n- Returns: {boolean} \n\n##### `$stringLength(strExp)`\n\n- `strExp` {string}\n- Returns: {number} \n\n##### `$stringSubstr(startExp, endExp, strExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `strExp` {string}\n\n##### `$stringConcat(concatExp, baseExp)`\n\n- `concatExp` {string}\n- `baseExp` {string}\n- Returns: {string} \n\n##### `$stringTrim(strExp)`\n\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringMatch(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {string[]} \n\n##### `$stringTest(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {boolean} \n\n##### `$stringReplace(searchExp, replacementExp)`\n\n- `searchExp` {string | [string, string?]}\n- `replacementExp` {string | StringExpression}\n- Returns: {string} \n\n##### `$stringToUpperCase(valueExp)`\n\n- `valueExp` {string}\n- Returns: {string} \n\n##### `$stringToLowerCase(valueExp)`\n\n- `valueExp` {string}\n- Returns: {string} \n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {string} \n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {string}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {Expression}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"readme.md","gitHead":"6d655193769de76c628c4ab5cad9a336cf7f6b99","_id":"@orioro/expression@2.3.1","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-tItAcpwEBQMTXG6HlTLbo5fEQH0VP9lT+6/8FexPuluwqCDEGe4/otMd3cAiMRF4kapKKjGxQZ7MottrRoxtpA==","shasum":"30528c3153a944c6aee23fe8eb6c1c24b7018862","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-2.3.1.tgz","fileCount":39,"unpackedSize":211075,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgJZpvCRA9TVsSAnZWagAA47oQAIT13jJtRKPtF6gK9wU0\nXphAfId5y/ZVJtHhy1Nj9xe1EorVanYiDn2zINtFwYz1bvWILx6wagp6jf2t\no0T1dozVeIWP5QbIWcULjTFKHUruu0gbM5jq04ROKimwX/fFJpLP5oQgtAkK\n+nFVtmmxBWhGbKKZkFfE5URrEzE8srcFWH5TM1hkiszN5O5w0eSor+iouw6o\ny1QkP9HabK8gfi+ZKdqQGrrlz/L2GkRo0A1cIwF3LhjR4MBt9Q4fbUnVyR4y\np0jn8GcMxOj2oYwo2x8ffwbxXyGd1baRzxRu3foRUF2x4+jFd4ECHdQILvXk\nf3mnAN61GC07MHLsTL1EFGVB6xdSg4krzBL7SfXuc7yhd2C/0IvYDkrmK0pX\ncRU/MBhmZqap62GuDqMcn45ZPTnC266zx0u3CmuakKVuhrGbhZWrx0xr7aa6\ntu+VWWUQ4DeIkXlgc8QZmRZ+hSJ01q1FmIvduuYWlFGK1B4bkUgYIsQIAIBY\njk55FGOhs1LrMpgKhKdQsqeP1lXiS0mjH4gbYktGGcJ39wNUzxQd7rTRzKl9\nI0B8PtiXdfKcFZOj0pVMO1xlPDzRB5vwI3t544+pjQgudQ5H95RqYxTaz1br\njbJraMp5i5PFVSIsq2tMWSSvkfTouxv51VrvKc0iSeYui/SIrFCWh0N9GtmZ\nRD4y\r\n=IpIv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDrNVJTUHeIxEOsSa3r8hp0/7rmzZkdZGFC8fPUPI8JKAIgBtFmj5Rxg3WmQSTddIZv7lmYhJCM5bF4DytkLILC62s="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_2.3.1_1613077103355_0.6252285757286729"},"_hasShrinkwrap":false},"2.4.0":{"name":"@orioro/expression","version":"2.4.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","dev:readme":"readme --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepare":"npm run build && readme","update-dependencies":"npx npm-check-updates -u","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","commit":"cz"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","jest":"^26.4.2","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/validate-type":"^1.0.0","lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n## Array\n\n- [`$arrayIncludes(searchValueExp, arrayExp)`](#arrayincludessearchvalueexp-arrayexp)\n- [`$arrayIncludesAll(searchValuesExp, arrayExp)`](#arrayincludesallsearchvaluesexp-arrayexp)\n- [`$arrayIncludesAny(searchValueExp, arrayExp)`](#arrayincludesanysearchvalueexp-arrayexp)\n- [`$arrayLength(arrayExp)`](#arraylengtharrayexp)\n- [`$arrayReduce(reduceExp, startExp, arrayExp)`](#arrayreducereduceexp-startexp-arrayexp)\n- [`$arrayMap(mapExp, arrayExp)`](#arraymapmapexp-arrayexp)\n- [`$arrayEvery(everyExp, arrayExp)`](#arrayeveryeveryexp-arrayexp)\n- [`$arraySome(someExp, arrayExp)`](#arraysomesomeexp-arrayexp)\n- [`$arrayFilter(queryExp, arrayExp)`](#arrayfilterqueryexp-arrayexp)\n- [`$arrayFindIndex(queryExp, arrayExp)`](#arrayfindindexqueryexp-arrayexp)\n- [`$arrayIndexOf(value, arrayExp)`](#arrayindexofvalue-arrayexp)\n- [`$arrayFind(queryExp, arrayExp)`](#arrayfindqueryexp-arrayexp)\n- [`$arrayReverse(arrayExp)`](#arrayreversearrayexp)\n- [`$arraySort(sortExp, arrayExp)`](#arraysortsortexp-arrayexp)\n- [`$arrayPush(arrayExp)`](#arraypusharrayexp)\n- [`$arrayUnshift(valueExp, arrayExp)`](#arrayunshiftvalueexp-arrayexp)\n- [`$arrayShift(arrayExp)`](#arrayshiftarrayexp)\n- [`$arraySlice(startExp, endExp, arrayExp)`](#arrayslicestartexp-endexp-arrayexp)\n- [`$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`](#arraysubstitutestartexp-endexp-valuesexp-arrayexp)\n- [`$arrayAddAt(indexExp, valuesExp, arrayExp)`](#arrayaddatindexexp-valuesexp-arrayexp)\n- [`$arrayRemoveAt(indexExp, countExp, arrayExp)`](#arrayremoveatindexexp-countexp-arrayexp)\n- [`$arrayJoin(separatorExp, arrayExp)`](#arrayjoinseparatorexp-arrayexp)\n- [`$arrayAt(indexExp, arrayExp)`](#arrayatindexexp-arrayexp)\n\n\n##### `$arrayIncludes(searchValueExp, arrayExp)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValueExp` {*}\n- `arrayExp` {Array}\n- Returns: `includes` {boolean} \n\n##### `$arrayIncludesAll(searchValuesExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAll` {boolean} \n\n##### `$arrayIncludesAny(searchValueExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValueExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAny` {boolean} \n\n##### `$arrayLength(arrayExp)`\n\n- `arrayExp` {Array}\n- Returns: `length` {number} \n\n##### `$arrayReduce(reduceExp, startExp, arrayExp)`\n\n- `reduceExp` {[Expression](#expression)}\n- `startExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayMap(mapExp, arrayExp)`\n\n- `mapExp` {[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arrayEvery(everyExp, arrayExp)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arraySome(someExp, arrayExp)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arrayFilter(queryExp, arrayExp)`\n\n- `queryExp` {Boolean[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arrayFindIndex(queryExp, arrayExp)`\n\n- `queryExp` {Boolean[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arrayIndexOf(value, arrayExp)`\n\n- `value` {*}\n- `arrayExp` {Array}\n\n##### `$arrayFind(queryExp, arrayExp)`\n\n- `queryExp` {Boolean[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arrayReverse(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySort(sortExp, arrayExp)`\n\n- `sortExp` {number}\n- `arrayExp` {Array}\n\n##### `$arrayPush(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arrayUnshift(valueExp, arrayExp)`\n\n- `valueExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayShift(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySlice(startExp, endExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(indexExp, valuesExp, arrayExp)`\n\nAdds items at the given position.\n\n- `indexExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(indexExp, countExp, arrayExp)`\n\n- `indexExp` {number}\n- `countExp` {number}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separatorExp, arrayExp)`\n\n- `separatorExp` {String[Expression](#expression)}\n- `arrayExp` {Array}\n- Returns: {string} \n\n##### `$arrayAt(indexExp, arrayExp)`\n\n- `indexExp` {number}\n- `arrayExp` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(valueExp)`](#booleanvalueexp)\n\n\n##### `$boolean(valueExp)`\n\n- `valueExp` {*}\n- Returns: {boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {number}\n- Returns: {boolean} \n\n\n## Date\n\nSet of expressions aimed at solving common date-related operations: \nparse, format, compare, validate, manipulate (e.g. move forward, move back).\nMost (if not all) operations are based on and built with [`Luxon`](https://github.com/moment/luxon/) `DateTime`. If not stated otherwise, date operations return a `string` in ISO 8601 format (`2021-01-27T20:38:12.807Z`).\n\n- [`DateFormat`](#dateformat)\n- [`ISODate`](#isodate)\n- [`Duration`](#duration)\n- [`$date(parseFmtArgs, serializeFmtArgs, date)`](#dateparsefmtargs-serializefmtargs-date)\n- [`$dateNow(serializeFmtArgs)`](#datenowserializefmtargs)\n- [`$dateIsValid()`](#dateisvalid)\n- [`$dateStartOf(unitExp, date)`](#datestartofunitexp-date)\n- [`$dateEndOf(unitExp, date)`](#dateendofunitexp-date)\n- [`$dateSet(valuesExp, dateExp)`](#datesetvaluesexp-dateexp)\n- [`$$dateSetConfig(configExp, date)`](#datesetconfigconfigexp-date)\n- [`$dateGt(referenceDateExp, date)`](#dategtreferencedateexp-date)\n- [`$dateGte(referenceDateExp, date)`](#dategtereferencedateexp-date)\n- [`$dateLt(referenceDateExp, date)`](#dateltreferencedateexp-date)\n- [`$dateLte(referenceDateExp, date)`](#dateltereferencedateexp-date)\n- [`$dateEq(referenceDateExp, compareUnitExp, date)`](#dateeqreferencedateexp-compareunitexp-date)\n- [`$dateMoveForward(duration, date)`](#datemoveforwardduration-date)\n- [`$dateMoveBackward(duration, date)`](#datemovebackwardduration-date)\n\n\n##### `DateFormat`\n\nArguments to be forwarded to Luxon corresponding DateTime parser.\nIf a `string`, will be considered as the name of the format.\nIf an `Array`, will be considered as a tuple consisting of\n[format, formatOptions].\nRecognized formats (exported as constants `DATE_{FORMAT_IN_CONSTANT_CASE}`):\n- `ISO`\n- `ISODate`\n- `ISOWeekDate`\n- `ISOTime`\n- `RFC2822`\n- `HTTP`\n- `SQL`\n- `SQLTime`\n- `SQLTime`\n- `UnixEpochMs`\n- `UnixEpochS`\n- `JSDate`\n- `PlainObject`\n- `LuxonDateTime`\n\n\n\n##### `ISODate`\n\nString in the full ISO 8601 format:\n`2017-04-20T11:32:00.000-04:00`\n\n\n\n##### `Duration`\n\nDuration represented in an object format:\n\n- `duration` {Object}\n  - `years` {number}\n  - `quarters` {number}\n  - `months` {number}\n  - `weeks` {number}\n  - `days` {number}\n  - `hours` {number}\n  - `minutes` {number}\n  - `seconds` {number}\n  - `milliseconds` {number}\n\n##### `$date(parseFmtArgs, serializeFmtArgs, date)`\n\nParses a date from a given input format and serializes it into\nanother format. Use this expression to convert date formats into\nyour requirements. E.g. `UnixEpochMs` into `ISO`.\n\n- `parseFmtArgs` {[DateFormat](#dateformat)}\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- `date` {string | number | Object | Date}\n- Returns: `date` {string | number | Object | Date} Output will vary according to `serializeFmtArgs`\n\n##### `$dateNow(serializeFmtArgs)`\n\nGenerates a ISO date string from `Date.now`\n\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- Returns: `date` {string | number | Object | Date} \n\n##### `$dateIsValid()`\n\nVerifies whether the given date is valid.\nFrom Luxon docs:\n> The most common way to do that is to over- or underflow some unit:\n> - February 40th\n> - 28:00\n> - 4 pm\n> - etc\nSee https://github.com/moment/luxon/blob/master/docs/validity.md\n\n- `` {[[ISODate](#isodate)](#isodate)}\n- Returns: `isValid` {boolean} \n\n##### `$dateStartOf(unitExp, date)`\n\nReturns the date at the start of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateEndOf(unitExp, date)`\n\nReturns the date at the end of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateSet(valuesExp, dateExp)`\n\nModifies date specific `units` and returns resulting date.\nSee [`DateTime#set`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-set)\nand [`DateTime.fromObject`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#static-method-fromObject)\n\n- `valuesExp` {Object}\n  - `year` {number}\n  - `month` {number}\n  - `day` {number}\n  - `ordinal` {number}\n  - `weekYear` {number}\n  - `weekNumber` {number}\n  - `weekday` {number}\n  - `hour` {number}\n  - `minute` {number}\n  - `second` {number}\n  - `millisecond` {number}\n- `dateExp` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$$dateSetConfig(configExp, date)`\n\nModifies a configurations of the date.\n\n- `configExp` {Object}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateGt(referenceDateExp, date)`\n\nGreater than `date > reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {boolean} \n\n##### `$dateGte(referenceDateExp, date)`\n\nGreater than or equal `date >= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLt(referenceDateExp, date)`\n\nLesser than `date < reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLte(referenceDateExp, date)`\n\nLesser than or equal `date <= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {boolean} \n\n##### `$dateEq(referenceDateExp, compareUnitExp, date)`\n\n`date == reference`\nConverts both `date` and `reference` and compares their\nspecified `compareUnit`. By default compares `millisecond` unit\nso that checks whether are exactly the same millisecond in time,\nbut could be used to compare other units, such as whether two dates\nare within the same `day`, `month` or `year`.\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `compareUnitExp` {string}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {boolean} \n\n##### `$dateMoveForward(duration, date)`\n\nModifies the date by moving it forward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateMoveBackward(duration, date)`\n\nModifies the date by moving it backward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n\n## Functional\n\n- [`$pipe(expressionsExp)`](#pipeexpressionsexp)\n\n\n##### `$pipe(expressionsExp)`\n\n- `expressionsExp` {Array[Expression](#expression)}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(casesExp, defaultExp)`](#switchcasesexp-defaultexp)\n- [`$switchKey(casesExp, defaultExp, ValueExp)`](#switchkeycasesexp-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array[Expression](#expression)}\n- Returns: {boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array[Expression](#expression)}\n- Returns: {boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array[Expression](#expression)}\n- Returns: {boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array[Expression](#expression)}\n- Returns: {boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean[Expression](#expression)}\n- `expressionB` {Boolean[Expression](#expression)}\n- Returns: {boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean[Expression](#expression)}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(casesExp, defaultExp)`\n\n- `casesExp` {Array[Expression](#expression)}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(casesExp, defaultExp, ValueExp)`\n\n- `casesExp` {Cases[]}\n  - `0` {string}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathAbs(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathRound(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathFloor(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathCeil(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {number}\n- `value` {*}\n- Returns: {number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPathExp, valueExp)`](#objectmatchescriteriabypathexp-valueexp)\n- [`$objectFormat(formatExp, sourceExp)`](#objectformatformatexp-sourceexp)\n- [`$objectDefaults(defaultValuesExp, baseExp)`](#objectdefaultsdefaultvaluesexp-baseexp)\n- [`$objectAssign(valuesExp, baseExp)`](#objectassignvaluesexp-baseexp)\n\n\n##### `$objectMatches(criteriaByPathExp, valueExp)`\n\n- `criteriaByPathExp` {Object}\n- `valueExp` {Object}\n- Returns: `matches` {boolean} \n\n##### `$objectFormat(formatExp, sourceExp)`\n\n- `formatExp` {Object | Array}\n- `sourceExp` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, baseExp)`\n\n- `defaultValuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(valuesExp, baseExp)`\n\n- `valuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n\n## String\n\n- [`$string(valueExp)`](#stringvalueexp)\n- [`$stringStartsWith(query, strExp)`](#stringstartswithquery-strexp)\n- [`$stringLength(strExp)`](#stringlengthstrexp)\n- [`$stringSubstr(startExp, endExp, strExp)`](#stringsubstrstartexp-endexp-strexp)\n- [`$stringConcat(concatExp, baseExp)`](#stringconcatconcatexp-baseexp)\n- [`$stringTrim(strExp)`](#stringtrimstrexp)\n- [`$stringPadStart(targetLengthExp, padStringExp, strExp)`](#stringpadstarttargetlengthexp-padstringexp-strexp)\n- [`$stringPadEnd(targetLengthExp, padStringExp, strExp)`](#stringpadendtargetlengthexp-padstringexp-strexp)\n- [`$stringMatch(regExpExp, valueExp)`](#stringmatchregexpexp-valueexp)\n- [`$stringTest(regExpExp, valueExp)`](#stringtestregexpexp-valueexp)\n- [`$stringReplace(searchExp, replacementExp)`](#stringreplacesearchexp-replacementexp)\n- [`$stringToUpperCase(valueExp)`](#stringtouppercasevalueexp)\n- [`$stringToLowerCase(valueExp)`](#stringtolowercasevalueexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(valueExp)`\n\n- `valueExp` {*}\n- Returns: {string} \n\n##### `$stringStartsWith(query, strExp)`\n\n- `query` {string}\n- `strExp` {string}\n- Returns: {boolean} \n\n##### `$stringLength(strExp)`\n\n- `strExp` {string}\n- Returns: {number} \n\n##### `$stringSubstr(startExp, endExp, strExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `strExp` {string}\n\n##### `$stringConcat(concatExp, baseExp)`\n\n- `concatExp` {string}\n- `baseExp` {string}\n- Returns: {string} \n\n##### `$stringTrim(strExp)`\n\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringMatch(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {string[]} \n\n##### `$stringTest(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {boolean} \n\n##### `$stringReplace(searchExp, replacementExp)`\n\n- `searchExp` {string | [string, string?]}\n- `replacementExp` {string | String[Expression](#expression)}\n- Returns: {string} \n\n##### `$stringToUpperCase(valueExp)`\n\n- `valueExp` {string}\n- Returns: {string} \n\n##### `$stringToLowerCase(valueExp)`\n\n- `valueExp` {string}\n- Returns: {string} \n\n##### `$stringInterpolate(data, template)`\n\n- `data` {object | array}\n- `template` {string}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {string} \n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {string}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {[Expression](#expression)}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"readme.md","gitHead":"b29e15432a8dcf070c7e65fbe513aee1617b685d","_id":"@orioro/expression@2.4.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-A7wHFvYrVgP7N3Caj/jlSSO3BtMrDud/yU7NJQNKiMQFc3IdfWvedeW+nzLaFrK/Yp27LjXmIeI+Q2qIslOR2g==","shasum":"14b2d95cfa4ce57aed7b10b71989ba867ec9b4d5","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-2.4.0.tgz","fileCount":39,"unpackedSize":218498,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgJlhXCRA9TVsSAnZWagAAYd4P/2R/Et1IMzt/GFpmmoRv\nyjselHOtq5gvqWD2JdnQFEiOWM89TRQZnHr9PyDwZX1cZliRZgdvCHFxwfcQ\n60rJFNtN9bKEF/bww7ehu5rAeACuIR/X2a36rpToEy23jSWfgcseNFHnwmNe\ni4dzCFtradzSnMmJ/oyWb8FCxzDOh9orWGuB9hSW1UqKqkH1pO1tr0j+hZkg\nRsAQKHN/lT9hlIEH3x5R9xlWzFCtv/Q4qd/OUDOqz56YVuH2UTHAAcDQXHQq\nTkDJLQptHsYvhglytawvalf4QvA9yrhhX5mTL0rw6F6KNiVSGsvPm0jeCwBu\ntuad/AJWd6pqgnBX6RwqN8F+cwBlyTtX/qIG11E8A7aLpGZlUA1SC5v3/htE\nGai+gHib9M+dLj3C3/R0GodFXCUlju+sRbm7HG8RYuBPsxLj/vi0x3EIZI6u\nCRxuFGsS6ta84hHfmWxVRqPwuQeSrKjjaf6wZHHSDlUDKY+EUR0Oe8agDqW9\nu/hPMMPqaZkhfZBChi7SR/JrKH2UYKbs2BQ04qe7UOf8WKCXaKcKpO7O/8sp\n8tAghGAbMtTZv1SEaOLIVI2yBgHj8CGVOuOCE6cKNO0lOwGOq/GoWRnE9z3O\nrQEh8Yujq/K9/OJBWK2sQuGJRbvoe2dUl0EUXHggWhyULxtzR6bVSAoYNIgk\n9pI2\r\n=VpVG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAq8zJxPt5nkvjR5WxZ5kudWSKbh0CkG+5VWR5ci660IAiEAvfkU+HKR0YxdTPzZRGwQhTvLs85JfPZB4mNE7e2hGtM="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_2.4.0_1613125718794_0.8117989507449235"},"_hasShrinkwrap":false},"2.5.0":{"name":"@orioro/expression","version":"2.5.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","dev:readme":"readme --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && npm run tsc-declaration","prepare":"npm run build && readme","update-dependencies":"npx npm-check-updates -u","tsc-declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","commit":"cz"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","jest":"^26.4.2","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/validate-type":"^1.0.0","lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n## Array\n\n- [`$arrayIncludes(searchValueExp, arrayExp)`](#arrayincludessearchvalueexp-arrayexp)\n- [`$arrayIncludesAll(searchValuesExp, arrayExp)`](#arrayincludesallsearchvaluesexp-arrayexp)\n- [`$arrayIncludesAny(searchValueExp, arrayExp)`](#arrayincludesanysearchvalueexp-arrayexp)\n- [`$arrayLength(arrayExp)`](#arraylengtharrayexp)\n- [`$arrayReduce(reduceExp, startExp, arrayExp)`](#arrayreducereduceexp-startexp-arrayexp)\n- [`$arrayMap(mapExp, arrayExp)`](#arraymapmapexp-arrayexp)\n- [`$arrayEvery(everyExp, arrayExp)`](#arrayeveryeveryexp-arrayexp)\n- [`$arraySome(someExp, arrayExp)`](#arraysomesomeexp-arrayexp)\n- [`$arrayFilter(queryExp, arrayExp)`](#arrayfilterqueryexp-arrayexp)\n- [`$arrayFindIndex(queryExp, arrayExp)`](#arrayfindindexqueryexp-arrayexp)\n- [`$arrayIndexOf(value, arrayExp)`](#arrayindexofvalue-arrayexp)\n- [`$arrayFind(queryExp, arrayExp)`](#arrayfindqueryexp-arrayexp)\n- [`$arrayReverse(arrayExp)`](#arrayreversearrayexp)\n- [`$arraySort(sortExp, arrayExp)`](#arraysortsortexp-arrayexp)\n- [`$arrayPush(arrayExp)`](#arraypusharrayexp)\n- [`$arrayUnshift(valueExp, arrayExp)`](#arrayunshiftvalueexp-arrayexp)\n- [`$arrayShift(arrayExp)`](#arrayshiftarrayexp)\n- [`$arraySlice(startExp, endExp, arrayExp)`](#arrayslicestartexp-endexp-arrayexp)\n- [`$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`](#arraysubstitutestartexp-endexp-valuesexp-arrayexp)\n- [`$arrayAddAt(indexExp, valuesExp, arrayExp)`](#arrayaddatindexexp-valuesexp-arrayexp)\n- [`$arrayRemoveAt(indexExp, countExp, arrayExp)`](#arrayremoveatindexexp-countexp-arrayexp)\n- [`$arrayJoin(separatorExp, arrayExp)`](#arrayjoinseparatorexp-arrayexp)\n- [`$arrayAt(indexExp, arrayExp)`](#arrayatindexexp-arrayexp)\n\n\n##### `$arrayIncludes(searchValueExp, arrayExp)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValueExp` {*}\n- `arrayExp` {Array}\n- Returns: `includes` {boolean} \n\n##### `$arrayIncludesAll(searchValuesExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAll` {boolean} \n\n##### `$arrayIncludesAny(searchValueExp, arrayExp)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValueExp` {Array}\n- `arrayExp` {Array}\n- Returns: `includesAny` {boolean} \n\n##### `$arrayLength(arrayExp)`\n\n- `arrayExp` {Array}\n- Returns: `length` {number} \n\n##### `$arrayReduce(reduceExp, startExp, arrayExp)`\n\n- `reduceExp` {[Expression](#expression)}\n- `startExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayMap(mapExp, arrayExp)`\n\n- `mapExp` {[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arrayEvery(everyExp, arrayExp)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arraySome(someExp, arrayExp)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arrayFilter(queryExp, arrayExp)`\n\n- `queryExp` {Boolean[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arrayFindIndex(queryExp, arrayExp)`\n\n- `queryExp` {Boolean[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arrayIndexOf(value, arrayExp)`\n\n- `value` {*}\n- `arrayExp` {Array}\n\n##### `$arrayFind(queryExp, arrayExp)`\n\n- `queryExp` {Boolean[Expression](#expression)}\n- `arrayExp` {Array}\n\n##### `$arrayReverse(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySort(sortExp, arrayExp)`\n\n- `sortExp` {number}\n- `arrayExp` {Array}\n\n##### `$arrayPush(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arrayUnshift(valueExp, arrayExp)`\n\n- `valueExp` {*}\n- `arrayExp` {Array}\n\n##### `$arrayShift(arrayExp)`\n\n- `arrayExp` {Array}\n\n##### `$arraySlice(startExp, endExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arraySubstitute(startExp, endExp, valuesExp, arrayExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(indexExp, valuesExp, arrayExp)`\n\nAdds items at the given position.\n\n- `indexExp` {number}\n- `valuesExp` {Array}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(indexExp, countExp, arrayExp)`\n\n- `indexExp` {number}\n- `countExp` {number}\n- `arrayExp` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separatorExp, arrayExp)`\n\n- `separatorExp` {String[Expression](#expression)}\n- `arrayExp` {Array}\n- Returns: {string} \n\n##### `$arrayAt(indexExp, arrayExp)`\n\n- `indexExp` {number}\n- `arrayExp` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(valueExp)`](#booleanvalueexp)\n\n\n##### `$boolean(valueExp)`\n\n- `valueExp` {*}\n- Returns: {boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {number}\n- `valueExp` {number}\n- Returns: {boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {number}\n- Returns: {boolean} \n\n\n## Date\n\nSet of expressions aimed at solving common date-related operations: \nparse, format, compare, validate, manipulate (e.g. move forward, move back).\nMost (if not all) operations are based on and built with [`Luxon`](https://github.com/moment/luxon/) `DateTime`. If not stated otherwise, date operations return a `string` in ISO 8601 format (`2021-01-27T20:38:12.807Z`).\n\n- [`DateFormat`](#dateformat)\n- [`ISODate`](#isodate)\n- [`Duration`](#duration)\n- [`$date(parseFmtArgs, serializeFmtArgs, date)`](#dateparsefmtargs-serializefmtargs-date)\n- [`$dateNow(serializeFmtArgs)`](#datenowserializefmtargs)\n- [`$dateIsValid()`](#dateisvalid)\n- [`$dateStartOf(unitExp, date)`](#datestartofunitexp-date)\n- [`$dateEndOf(unitExp, date)`](#dateendofunitexp-date)\n- [`$dateSet(valuesExp, dateExp)`](#datesetvaluesexp-dateexp)\n- [`$$dateSetConfig(configExp, date)`](#datesetconfigconfigexp-date)\n- [`$dateGt(referenceDateExp, date)`](#dategtreferencedateexp-date)\n- [`$dateGte(referenceDateExp, date)`](#dategtereferencedateexp-date)\n- [`$dateLt(referenceDateExp, date)`](#dateltreferencedateexp-date)\n- [`$dateLte(referenceDateExp, date)`](#dateltereferencedateexp-date)\n- [`$dateEq(referenceDateExp, compareUnitExp, date)`](#dateeqreferencedateexp-compareunitexp-date)\n- [`$dateMoveForward(duration, date)`](#datemoveforwardduration-date)\n- [`$dateMoveBackward(duration, date)`](#datemovebackwardduration-date)\n\n\n##### `DateFormat`\n\nArguments to be forwarded to Luxon corresponding DateTime parser.\nIf a `string`, will be considered as the name of the format.\nIf an `Array`, will be considered as a tuple consisting of\n[format, formatOptions].\nRecognized formats (exported as constants `DATE_{FORMAT_IN_CONSTANT_CASE}`):\n- `ISO`\n- `ISODate`\n- `ISOWeekDate`\n- `ISOTime`\n- `RFC2822`\n- `HTTP`\n- `SQL`\n- `SQLTime`\n- `SQLTime`\n- `UnixEpochMs`\n- `UnixEpochS`\n- `JSDate`\n- `PlainObject`\n- `LuxonDateTime`\n\n\n\n##### `ISODate`\n\nString in the full ISO 8601 format:\n`2017-04-20T11:32:00.000-04:00`\n\n\n\n##### `Duration`\n\nDuration represented in an object format:\n\n- `duration` {Object}\n  - `years` {number}\n  - `quarters` {number}\n  - `months` {number}\n  - `weeks` {number}\n  - `days` {number}\n  - `hours` {number}\n  - `minutes` {number}\n  - `seconds` {number}\n  - `milliseconds` {number}\n\n##### `$date(parseFmtArgs, serializeFmtArgs, date)`\n\nParses a date from a given input format and serializes it into\nanother format. Use this expression to convert date formats into\nyour requirements. E.g. `UnixEpochMs` into `ISO`.\n\n- `parseFmtArgs` {[DateFormat](#dateformat)}\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- `date` {string | number | Object | Date}\n- Returns: `date` {string | number | Object | Date} Output will vary according to `serializeFmtArgs`\n\n##### `$dateNow(serializeFmtArgs)`\n\nGenerates a ISO date string from `Date.now`\n\n- `serializeFmtArgs` {[DateFormat](#dateformat)}\n- Returns: `date` {string | number | Object | Date} \n\n##### `$dateIsValid()`\n\nVerifies whether the given date is valid.\nFrom Luxon docs:\n> The most common way to do that is to over- or underflow some unit:\n> - February 40th\n> - 28:00\n> - 4 pm\n> - etc\nSee https://github.com/moment/luxon/blob/master/docs/validity.md\n\n- `` {[[ISODate](#isodate)](#isodate)}\n- Returns: `isValid` {boolean} \n\n##### `$dateStartOf(unitExp, date)`\n\nReturns the date at the start of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateEndOf(unitExp, date)`\n\nReturns the date at the end of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {string}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateSet(valuesExp, dateExp)`\n\nModifies date specific `units` and returns resulting date.\nSee [`DateTime#set`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-set)\nand [`DateTime.fromObject`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#static-method-fromObject)\n\n- `valuesExp` {Object}\n  - `year` {number}\n  - `month` {number}\n  - `day` {number}\n  - `ordinal` {number}\n  - `weekYear` {number}\n  - `weekNumber` {number}\n  - `weekday` {number}\n  - `hour` {number}\n  - `minute` {number}\n  - `second` {number}\n  - `millisecond` {number}\n- `dateExp` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$$dateSetConfig(configExp, date)`\n\nModifies a configurations of the date.\n\n- `configExp` {Object}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateGt(referenceDateExp, date)`\n\nGreater than `date > reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {boolean} \n\n##### `$dateGte(referenceDateExp, date)`\n\nGreater than or equal `date >= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLt(referenceDateExp, date)`\n\nLesser than `date < reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {boolean} \n\n##### `$dateLte(referenceDateExp, date)`\n\nLesser than or equal `date <= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {boolean} \n\n##### `$dateEq(referenceDateExp, compareUnitExp, date)`\n\n`date == reference`\nConverts both `date` and `reference` and compares their\nspecified `compareUnit`. By default compares `millisecond` unit\nso that checks whether are exactly the same millisecond in time,\nbut could be used to compare other units, such as whether two dates\nare within the same `day`, `month` or `year`.\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `compareUnitExp` {string}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {boolean} \n\n##### `$dateMoveForward(duration, date)`\n\nModifies the date by moving it forward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateMoveBackward(duration, date)`\n\nModifies the date by moving it backward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n\n## Functional\n\n- [`$pipe(expressionsExp)`](#pipeexpressionsexp)\n\n\n##### `$pipe(expressionsExp)`\n\n- `expressionsExp` {Array[Expression](#expression)}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(casesExp, defaultExp)`](#switchcasesexp-defaultexp)\n- [`$switchKey(casesExp, defaultExp, ValueExp)`](#switchkeycasesexp-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array[Expression](#expression)}\n- Returns: {boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array[Expression](#expression)}\n- Returns: {boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array[Expression](#expression)}\n- Returns: {boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array[Expression](#expression)}\n- Returns: {boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean[Expression](#expression)}\n- `expressionB` {Boolean[Expression](#expression)}\n- Returns: {boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean[Expression](#expression)}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(casesExp, defaultExp)`\n\n- `casesExp` {Array[Expression](#expression)}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(casesExp, defaultExp, ValueExp)`\n\n- `casesExp` {Cases[]}\n  - `0` {string}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {number}\n- `dividend` {number}\n- Returns: `result` {number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {number}\n- `base` {number}\n- Returns: `result` {number} \n\n##### `$mathAbs(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {number}\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathRound(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathFloor(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n##### `$mathCeil(value)`\n\n- `value` {number}\n- Returns: `result` {number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {number}\n- `value` {*}\n- Returns: {number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPathExp, valueExp)`](#objectmatchescriteriabypathexp-valueexp)\n- [`$objectFormat(formatExp, sourceExp)`](#objectformatformatexp-sourceexp)\n- [`$objectDefaults(defaultValuesExp, baseExp)`](#objectdefaultsdefaultvaluesexp-baseexp)\n- [`$objectAssign(valuesExp, baseExp)`](#objectassignvaluesexp-baseexp)\n\n\n##### `$objectMatches(criteriaByPathExp, valueExp)`\n\n- `criteriaByPathExp` {Object}\n- `valueExp` {Object}\n- Returns: `matches` {boolean} \n\n##### `$objectFormat(formatExp, sourceExp)`\n\n- `formatExp` {Object | Array}\n- `sourceExp` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, baseExp)`\n\n- `defaultValuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(valuesExp, baseExp)`\n\n- `valuesExp` {Object}\n- `baseExp` {Object}\n- Returns: {Object} \n\n\n## String\n\n- [`$string(valueExp)`](#stringvalueexp)\n- [`$stringStartsWith(query, strExp)`](#stringstartswithquery-strexp)\n- [`$stringLength(strExp)`](#stringlengthstrexp)\n- [`$stringSubstr(startExp, endExp, strExp)`](#stringsubstrstartexp-endexp-strexp)\n- [`$stringConcat(concatExp, baseExp)`](#stringconcatconcatexp-baseexp)\n- [`$stringTrim(strExp)`](#stringtrimstrexp)\n- [`$stringPadStart(targetLengthExp, padStringExp, strExp)`](#stringpadstarttargetlengthexp-padstringexp-strexp)\n- [`$stringPadEnd(targetLengthExp, padStringExp, strExp)`](#stringpadendtargetlengthexp-padstringexp-strexp)\n- [`$stringMatch(regExpExp, valueExp)`](#stringmatchregexpexp-valueexp)\n- [`$stringTest(regExpExp, valueExp)`](#stringtestregexpexp-valueexp)\n- [`$stringReplace(searchExp, replacementExp)`](#stringreplacesearchexp-replacementexp)\n- [`$stringToUpperCase(valueExp)`](#stringtouppercasevalueexp)\n- [`$stringToLowerCase(valueExp)`](#stringtolowercasevalueexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(valueExp)`\n\n- `valueExp` {*}\n- Returns: {string} \n\n##### `$stringStartsWith(query, strExp)`\n\n- `query` {string}\n- `strExp` {string}\n- Returns: {boolean} \n\n##### `$stringLength(strExp)`\n\n- `strExp` {string}\n- Returns: {number} \n\n##### `$stringSubstr(startExp, endExp, strExp)`\n\n- `startExp` {number}\n- `endExp` {number}\n- `strExp` {string}\n\n##### `$stringConcat(concatExp, baseExp)`\n\n- `concatExp` {string}\n- `baseExp` {string}\n- Returns: {string} \n\n##### `$stringTrim(strExp)`\n\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {number}\n- `padStringExp` {string}\n- `strExp` {string}\n- Returns: {string} \n\n##### `$stringMatch(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {string[]} \n\n##### `$stringTest(regExpExp, valueExp)`\n\n- `regExpExp` {string}\n- `valueExp` {string}\n- Returns: {boolean} \n\n##### `$stringReplace(searchExp, replacementExp)`\n\n- `searchExp` {string | [string, string?]}\n- `replacementExp` {string | String[Expression](#expression)}\n- Returns: {string} \n\n##### `$stringToUpperCase(valueExp)`\n\n- `valueExp` {string}\n- Returns: {string} \n\n##### `$stringToLowerCase(valueExp)`\n\n- `valueExp` {string}\n- Returns: {string} \n\n##### `$stringInterpolate(data, template)`\n\n- `data` {object | array}\n- `template` {string}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {string} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {string}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {[Expression](#expression)}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"readme.md","gitHead":"6d11dffd0510a8c570a219b040f4196e2cc4721b","_id":"@orioro/expression@2.5.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-euB+yJTDU0KFZ907ZK7bKiNnyyiWPDi+Yu7zsAG4eViiM+kHFGMHc0FykMaTan+JuTHfzd3F29ygtxR3zPWfoQ==","shasum":"925dbcc2c52a98a2a3988a87964edf966c800959","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-2.5.0.tgz","fileCount":39,"unpackedSize":219227,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgJntDCRA9TVsSAnZWagAATUUP+gOscuET5Ymsz1ydFG96\nmcBF1LXQghrVw/oOY2ve5D1ghrm3KXo89MGp0rXJa2R1dCmtMhRPRxY2u0HV\nGVZAFrtWrYpSIlXNWqg7kd3SrDrHPC9KvFtAuJoXUrPP9+BXj8ZIikzX9jCw\nmjq4DO3OHYOPRmSYWCLk3UEId8F3MN92EfJRFmS4OVgDFxAtz+Pi2j+Uz3n+\nvbY3JxayODkvUHKKbpnWblTUmZpk7WMZp+yxNQ+zDqi9iksQh1E0EGmp5+Ik\nbP7XEGGk0RDIkjYVCoo2Iz6LI4/ogRWC09L8Ux++o15dp6akAdE4eB+AG3NI\nGmY4FyJ9yL6G2HlTT49p31XtQIi6i1qA9S60+hP8oNXHeJuuwafM6TyGAi+u\ndNM08k+DUOv5IeflHcYjl6TSyd0fPGg8tjhG5bbZvmrHRTzxnNM/ri3g8BPG\nnbCD7lhIm02+kcx2HZETTpJMC5OlI5gbcVnQ0XxjQt7lUK7uyMWLW/weMDp8\nn3rRH+2VVv8eIj+1jiomqyNHcQQLSjHVOngeSoDaqTyLds0mwHarGyPWJb38\n8W53ZCa7N/8rilGVHdR+tCLzOB44f2d+/2Y8+L7Mbzfw+jbsIpmCiKW+QBR+\nt9D8Hnt2tTzT7dcNf43dpy0pylPBdsK+uFx9024fiu+UGA4on99lEa6anag4\nvO5Y\r\n=+Vto\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDU6XEzUIPUFxDgqJ0c4hk6Ahd5SHxNeW1qKtbp9OPeKAIhAKs2dZnnV6ZDlzgmnF2KWppWQUedNyudviKUUM9TlEGW"}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_2.5.0_1613134658883_0.6902726215410591"},"_hasShrinkwrap":false},"2.6.0":{"name":"@orioro/expression","version":"2.6.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build && readme","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/validate-type":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(everyExp, array)`](#arrayeveryeveryexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sortExp, array)`](#arraysortsortexp-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arraySubstitute(start, end, values, array)`](#arraysubstitutestart-end-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(everyExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sortExp, array)`\n\n- `sortExp` {Number}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arraySubstitute(start, end, values, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Date\n\nSet of expressions aimed at solving common date-related operations: \nparse, format, compare, validate, manipulate (e.g. move forward, move back).\nMost (if not all) operations are based on and built with [`Luxon`](https://github.com/moment/luxon/) `DateTime`. If not stated otherwise, date operations return a `string` in ISO 8601 format (`2021-01-27T20:38:12.807Z`).\n\n- [`DateValue`](#datevalue)\n- [`DateFormat`](#dateformat)\n- [`ISODate`](#isodate)\n- [`Duration`](#duration)\n- [`$date(parseFmtArgs, serializeFormat, date)`](#dateparsefmtargs-serializeformat-date)\n- [`$dateNow(serializeFormat)`](#datenowserializeformat)\n- [`$dateIsValid()`](#dateisvalid)\n- [`$dateStartOf(unitExp, date)`](#datestartofunitexp-date)\n- [`$dateEndOf(unitExp, date)`](#dateendofunitexp-date)\n- [`$dateSet(valuesExp, dateExp)`](#datesetvaluesexp-dateexp)\n- [`$dateSetConfig(configExp, date)`](#datesetconfigconfigexp-date)\n- [`$dateGt(referenceDateExp, date)`](#dategtreferencedateexp-date)\n- [`$dateGte(referenceDateExp, date)`](#dategtereferencedateexp-date)\n- [`$dateLt(referenceDateExp, date)`](#dateltreferencedateexp-date)\n- [`$dateLte(referenceDateExp, date)`](#dateltereferencedateexp-date)\n- [`$dateEq(referenceDateExp, compareUnitExp, date)`](#dateeqreferencedateexp-compareunitexp-date)\n- [`$dateMoveForward(duration, date)`](#datemoveforwardduration-date)\n- [`$dateMoveBackward(duration, date)`](#datemovebackwardduration-date)\n\n\n##### `DateValue`\n\nDate input for all $date expressions\n\n\n\n##### `DateFormat`\n\nArguments to be forwarded to Luxon corresponding DateTime parser.\nIf a `string`, will be considered as the name of the format.\nIf an `Array`, will be considered as a tuple consisting of\n[format, formatOptions].\nRecognized formats (exported as constants `DATE_{FORMAT_IN_CONSTANT_CASE}`):\n- `ISO`\n- `ISODate`\n- `ISOWeekDate`\n- `ISOTime`\n- `RFC2822`\n- `HTTP`\n- `SQL`\n- `SQLTime`\n- `SQLTime`\n- `UnixEpochMs`\n- `UnixEpochS`\n- `JSDate`\n- `PlainObject`\n- `LuxonDateTime`\n\n\n\n##### `ISODate`\n\nString in the full ISO 8601 format:\n`2017-04-20T11:32:00.000-04:00`\n\n\n\n##### `Duration`\n\nDuration represented in an object format:\n\n- `duration` {Object}\n  - `years` {Number}\n  - `quarters` {Number}\n  - `months` {Number}\n  - `weeks` {Number}\n  - `days` {Number}\n  - `hours` {Number}\n  - `minutes` {Number}\n  - `seconds` {Number}\n  - `milliseconds` {Number}\n\n##### `$date(parseFmtArgs, serializeFormat, date)`\n\nParses a date from a given input format and serializes it into\nanother format. Use this expression to convert date formats into\nyour requirements. E.g. `UnixEpochMs` into `ISO`.\n\n- `parseFmtArgs` {[DateFormat](#dateformat)}\n- `serializeFormat` {[DateFormat](#dateformat)}\n- `date` {String | Number | Object | Date}\n- Returns: `date` {String | Number | Object | Date} Output will vary according to `serializeFormat`\n\n##### `$dateNow(serializeFormat)`\n\nGenerates a ISO date string from `Date.now`\n\n- `serializeFormat` {[DateFormat](#dateformat)}\n- Returns: `date` {String | Number | Object | Date} \n\n##### `$dateIsValid()`\n\nVerifies whether the given date is valid.\nFrom Luxon docs:\n> The most common way to do that is to over- or underflow some unit:\n> - February 40th\n> - 28:00\n> - 4 pm\n> - etc\nSee https://github.com/moment/luxon/blob/master/docs/validity.md\n\n- `` {*}\n- Returns: `isValid` {Boolean} \n\n##### `$dateStartOf(unitExp, date)`\n\nReturns the date at the start of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateEndOf(unitExp, date)`\n\nReturns the date at the end of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateSet(valuesExp, dateExp)`\n\nModifies date specific `units` and returns resulting date.\nSee [`DateTime#set`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-set)\nand [`DateTime.fromObject`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#static-method-fromObject)\n\n- `valuesExp` {Object}\n  - `year` {Number}\n  - `month` {Number}\n  - `day` {Number}\n  - `ordinal` {Number}\n  - `weekYear` {Number}\n  - `weekNumber` {Number}\n  - `weekday` {Number}\n  - `hour` {Number}\n  - `minute` {Number}\n  - `second` {Number}\n  - `millisecond` {Number}\n- `dateExp` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateSetConfig(configExp, date)`\n\nModifies a configurations of the date.\n\n- `configExp` {Object}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateGt(referenceDateExp, date)`\n\nGreater than `date > reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateGte(referenceDateExp, date)`\n\nGreater than or equal `date >= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateLt(referenceDateExp, date)`\n\nLesser than `date < reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateLte(referenceDateExp, date)`\n\nLesser than or equal `date <= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateEq(referenceDateExp, compareUnitExp, date)`\n\n`date == reference`\nConverts both `date` and `reference` and compares their\nspecified `compareUnit`. By default compares `millisecond` unit\nso that checks whether are exactly the same millisecond in time,\nbut could be used to compare other units, such as whether two dates\nare within the same `day`, `month` or `year`.\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `compareUnitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateMoveForward(duration, date)`\n\nModifies the date by moving it forward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateMoveBackward(duration, date)`\n\nModifies the date by moving it backward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, strExp)`](#stringstartswithquery-strexp)\n- [`$stringLength(strExp)`](#stringlengthstrexp)\n- [`$stringSubstr(startExp, endExp, strExp)`](#stringsubstrstartexp-endexp-strexp)\n- [`$stringConcat(concatExp, baseExp)`](#stringconcatconcatexp-baseexp)\n- [`$stringTrim(strExp)`](#stringtrimstrexp)\n- [`$stringPadStart(targetLengthExp, padStringExp, strExp)`](#stringpadstarttargetlengthexp-padstringexp-strexp)\n- [`$stringPadEnd(targetLengthExp, padStringExp, strExp)`](#stringpadendtargetlengthexp-padstringexp-strexp)\n- [`$stringMatch(regExp, valueExp)`](#stringmatchregexp-valueexp)\n- [`$stringTest(regExp, valueExp)`](#stringtestregexp-valueexp)\n- [`$stringReplace(searchExp, replacementExp)`](#stringreplacesearchexp-replacementexp)\n- [`$stringToUpperCase(valueExp)`](#stringtouppercasevalueexp)\n- [`$stringToLowerCase(valueExp)`](#stringtolowercasevalueexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, strExp)`\n\n- `query` {String}\n- `strExp` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(strExp)`\n\n- `strExp` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(startExp, endExp, strExp)`\n\n- `startExp` {Number}\n- `endExp` {Number}\n- `strExp` {String}\n\n##### `$stringConcat(concatExp, baseExp)`\n\n- `concatExp` {String}\n- `baseExp` {String}\n- Returns: {String} \n\n##### `$stringTrim(strExp)`\n\n- `strExp` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `strExp` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `strExp` {String}\n- Returns: {String} \n\n##### `$stringMatch(regExp, valueExp)`\n\n- `regExp` {String | [String, String?]}\n- `valueExp` {String}\n- Returns: {String[]} \n\n##### `$stringTest(regExp, valueExp)`\n\n- `regExp` {String | [String, String?]}\n- `valueExp` {String}\n- Returns: {Boolean} \n\n##### `$stringReplace(searchExp, replacementExp)`\n\n- `searchExp` {String | [String, String?]}\n- `replacementExp` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(valueExp)`\n\n- `valueExp` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(valueExp)`\n\n- `valueExp` {String}\n- Returns: {String} \n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {[Expression](#expression)}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"readme.md","gitHead":"dc442cb168e5fc7bec877854bab12100206f4d04","_id":"@orioro/expression@2.6.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-SWsu8YHupdhtPm0ZHYPX8VJwqUvl1j3hbj/bJqj+jSOCqDinDZ0ndmOUYHgpXvbTTKC6BQ+V5JuK4ivopABW8A==","shasum":"f6b0c8de1d02887a1127f8aa40c4efab67a34ab3","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-2.6.0.tgz","fileCount":42,"unpackedSize":203810,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKZ0PCRA9TVsSAnZWagAAl24P/Azerq3/j8bFNEMIkoVA\nypj0u5M+P8lqGvqPVAxMi4dXqFE46kY4waUhavB+zonFxaQ99d1LkTp4LhyJ\nwSDLZ4o3B8NWmR6Qiwkmh3Gv/Wh0WRpDHHyp8fXTFPfpTJPx3Fs+Jze6Ix21\nx0LJehJk7z7WfYhjFIKotWbQsPjZ83pH+x70H/t9HdAjDIW4qecqTfDI1NtZ\nF9Dvq9D1Z1s2VdBc8mK6AQR6wTlNRcM4wz9XiW+XZXcIAIGrD3nTLewMmP2y\nbGw9sdCHyEkqDapkDNRoDxtexZfoJnRGYgU+py9Vt8kGpVOGamZ5RbNtlJJo\nK2cmcnsAHrcbYQFBv5n7esoqUCeEFTEn+0BvLk47OKLJpJNJVSE1d7NcCbRD\njHyZSBao4cDR0WrJ8Vr/Rug+iaANvXzj16HzwvcbB7NHY7H3aHjSiiFzTNi4\n8aDEGyYfPg7CO/zDlAaF4o8K9k64twWFbhCx8uOFxOPQ2x893b02Pntl8aJe\nt0gd4K5JPDXe8NCmjZSWO68PgqSw82ouGripn5C7pJuJMtPSDXEg8dGme2dZ\nnvusRcgAUgVFNVnPNrR4zBZeeQqoQOAi3VCg4L/TvKgFL+gT64eaER51soX6\n8QD1iPOHL/vE23gqC80f4YIsSg4MqbHo5gEHD2rQ8i/EpGxtVsEbAD9dNsBl\nzfeB\r\n=YhGn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDGpePEH2UzXkjeHC9+p4lHmD+R9gj4L4ntPCkTQfhK3gIhAK/t/UK2tN1njSr+N36P614rh0l0xX1TTKoZR2+SEleP"}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_2.6.0_1613339918586_0.21864779768930198"},"_hasShrinkwrap":false},"2.7.0":{"name":"@orioro/expression","version":"2.7.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build && readme","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/validate-type":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(everyExp, array)`](#arrayeveryeveryexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sortExp, array)`](#arraysortsortexp-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arraySubstitute(start, end, values, array)`](#arraysubstitutestart-end-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(everyExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sortExp, array)`\n\n- `sortExp` {Number}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arraySubstitute(start, end, values, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Date\n\nSet of expressions aimed at solving common date-related operations: \nparse, format, compare, validate, manipulate (e.g. move forward, move back).\nMost (if not all) operations are based on and built with [`Luxon`](https://github.com/moment/luxon/) `DateTime`. If not stated otherwise, date operations return a `string` in ISO 8601 format (`2021-01-27T20:38:12.807Z`).\n\n- [`DateValue`](#datevalue)\n- [`DateFormat`](#dateformat)\n- [`ISODate`](#isodate)\n- [`Duration`](#duration)\n- [`$date(parseFmtArgs, serializeFormat, date)`](#dateparsefmtargs-serializeformat-date)\n- [`$dateNow(serializeFormat)`](#datenowserializeformat)\n- [`$dateIsValid()`](#dateisvalid)\n- [`$dateStartOf(unitExp, date)`](#datestartofunitexp-date)\n- [`$dateEndOf(unitExp, date)`](#dateendofunitexp-date)\n- [`$dateSet(valuesExp, dateExp)`](#datesetvaluesexp-dateexp)\n- [`$dateSetConfig(configExp, date)`](#datesetconfigconfigexp-date)\n- [`$dateGt(referenceDateExp, date)`](#dategtreferencedateexp-date)\n- [`$dateGte(referenceDateExp, date)`](#dategtereferencedateexp-date)\n- [`$dateLt(referenceDateExp, date)`](#dateltreferencedateexp-date)\n- [`$dateLte(referenceDateExp, date)`](#dateltereferencedateexp-date)\n- [`$dateEq(referenceDateExp, compareUnitExp, date)`](#dateeqreferencedateexp-compareunitexp-date)\n- [`$dateMoveForward(duration, date)`](#datemoveforwardduration-date)\n- [`$dateMoveBackward(duration, date)`](#datemovebackwardduration-date)\n\n\n##### `DateValue`\n\nDate input for all $date expressions\n\n\n\n##### `DateFormat`\n\nArguments to be forwarded to Luxon corresponding DateTime parser.\nIf a `string`, will be considered as the name of the format.\nIf an `Array`, will be considered as a tuple consisting of\n[format, formatOptions].\nRecognized formats (exported as constants `DATE_{FORMAT_IN_CONSTANT_CASE}`):\n- `ISO`\n- `ISODate`\n- `ISOWeekDate`\n- `ISOTime`\n- `RFC2822`\n- `HTTP`\n- `SQL`\n- `SQLTime`\n- `SQLTime`\n- `UnixEpochMs`\n- `UnixEpochS`\n- `JSDate`\n- `PlainObject`\n- `LuxonDateTime`\n\n\n\n##### `ISODate`\n\nString in the full ISO 8601 format:\n`2017-04-20T11:32:00.000-04:00`\n\n\n\n##### `Duration`\n\nDuration represented in an object format:\n\n- `duration` {Object}\n  - `years` {Number}\n  - `quarters` {Number}\n  - `months` {Number}\n  - `weeks` {Number}\n  - `days` {Number}\n  - `hours` {Number}\n  - `minutes` {Number}\n  - `seconds` {Number}\n  - `milliseconds` {Number}\n\n##### `$date(parseFmtArgs, serializeFormat, date)`\n\nParses a date from a given input format and serializes it into\nanother format. Use this expression to convert date formats into\nyour requirements. E.g. `UnixEpochMs` into `ISO`.\n\n- `parseFmtArgs` {[DateFormat](#dateformat)}\n- `serializeFormat` {[DateFormat](#dateformat)}\n- `date` {String | Number | Object | Date}\n- Returns: `date` {String | Number | Object | Date} Output will vary according to `serializeFormat`\n\n##### `$dateNow(serializeFormat)`\n\nGenerates a ISO date string from `Date.now`\n\n- `serializeFormat` {[DateFormat](#dateformat)}\n- Returns: `date` {String | Number | Object | Date} \n\n##### `$dateIsValid()`\n\nVerifies whether the given date is valid.\nFrom Luxon docs:\n> The most common way to do that is to over- or underflow some unit:\n> - February 40th\n> - 28:00\n> - 4 pm\n> - etc\nSee https://github.com/moment/luxon/blob/master/docs/validity.md\n\n- `` {*}\n- Returns: `isValid` {Boolean} \n\n##### `$dateStartOf(unitExp, date)`\n\nReturns the date at the start of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateEndOf(unitExp, date)`\n\nReturns the date at the end of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateSet(valuesExp, dateExp)`\n\nModifies date specific `units` and returns resulting date.\nSee [`DateTime#set`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-set)\nand [`DateTime.fromObject`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#static-method-fromObject)\n\n- `valuesExp` {Object}\n  - `year` {Number}\n  - `month` {Number}\n  - `day` {Number}\n  - `ordinal` {Number}\n  - `weekYear` {Number}\n  - `weekNumber` {Number}\n  - `weekday` {Number}\n  - `hour` {Number}\n  - `minute` {Number}\n  - `second` {Number}\n  - `millisecond` {Number}\n- `dateExp` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateSetConfig(configExp, date)`\n\nModifies a configurations of the date.\n\n- `configExp` {Object}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateGt(referenceDateExp, date)`\n\nGreater than `date > reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateGte(referenceDateExp, date)`\n\nGreater than or equal `date >= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateLt(referenceDateExp, date)`\n\nLesser than `date < reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateLte(referenceDateExp, date)`\n\nLesser than or equal `date <= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateEq(referenceDateExp, compareUnitExp, date)`\n\n`date == reference`\nConverts both `date` and `reference` and compares their\nspecified `compareUnit`. By default compares `millisecond` unit\nso that checks whether are exactly the same millisecond in time,\nbut could be used to compare other units, such as whether two dates\nare within the same `day`, `month` or `year`.\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `compareUnitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateMoveForward(duration, date)`\n\nModifies the date by moving it forward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateMoveBackward(duration, date)`\n\nModifies the date by moving it backward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, strExp)`](#stringstartswithquery-strexp)\n- [`$stringLength(strExp)`](#stringlengthstrexp)\n- [`$stringSubstr(startExp, endExp, strExp)`](#stringsubstrstartexp-endexp-strexp)\n- [`$stringConcat(concatExp, baseExp)`](#stringconcatconcatexp-baseexp)\n- [`$stringTrim(strExp)`](#stringtrimstrexp)\n- [`$stringPadStart(targetLengthExp, padStringExp, strExp)`](#stringpadstarttargetlengthexp-padstringexp-strexp)\n- [`$stringPadEnd(targetLengthExp, padStringExp, strExp)`](#stringpadendtargetlengthexp-padstringexp-strexp)\n- [`$stringMatch(regExp, valueExp)`](#stringmatchregexp-valueexp)\n- [`$stringTest(regExp, valueExp)`](#stringtestregexp-valueexp)\n- [`$stringReplace(searchExp, replacementExp)`](#stringreplacesearchexp-replacementexp)\n- [`$stringToUpperCase(valueExp)`](#stringtouppercasevalueexp)\n- [`$stringToLowerCase(valueExp)`](#stringtolowercasevalueexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, strExp)`\n\n- `query` {String}\n- `strExp` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(strExp)`\n\n- `strExp` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(startExp, endExp, strExp)`\n\n- `startExp` {Number}\n- `endExp` {Number}\n- `strExp` {String}\n\n##### `$stringConcat(concatExp, baseExp)`\n\n- `concatExp` {String}\n- `baseExp` {String}\n- Returns: {String} \n\n##### `$stringTrim(strExp)`\n\n- `strExp` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `strExp` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, strExp)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `strExp` {String}\n- Returns: {String} \n\n##### `$stringMatch(regExp, valueExp)`\n\n- `regExp` {String | [String, String?]}\n- `valueExp` {String}\n- Returns: {String[]} \n\n##### `$stringTest(regExp, valueExp)`\n\n- `regExp` {String | [String, String?]}\n- `valueExp` {String}\n- Returns: {Boolean} \n\n##### `$stringReplace(searchExp, replacementExp)`\n\n- `searchExp` {String | [String, String?]}\n- `replacementExp` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(valueExp)`\n\n- `valueExp` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(valueExp)`\n\n- `valueExp` {String}\n- Returns: {String} \n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {[Expression](#expression)}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"readme.md","gitHead":"4ed0d83916a24c689b5d58750b37e16729d9c0c3","_id":"@orioro/expression@2.7.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-f62ubczctNmgCPJgxyUu0rAhzrZJKwjiHfVzLVjv53QXBpGJzAlCPTieiJQfrMaHcXpUHxYE3zEAl7GaaBK2YA==","shasum":"3832c083becb147c5e50528118cf074d03694430","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-2.7.0.tgz","fileCount":42,"unpackedSize":203585,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKaPdCRA9TVsSAnZWagAA2FEP/jgumTZRwVk87yRv/wtN\nZTrnaw/K5pOIoZvV2taVnwYF3jP4foH79Nl1nerWLLY88zX/J91cS8u6lq8j\nODVv87f8CuLz9Ihgg2rJpPhhEms6Ic12NboKosqamP12cyBCCqK1X4Q4ygHM\nInVTiYUjwU4uBHQfI5pVcgQuELILgVmfMV/7MsoZQ9q4LiT/0GLIFI9khI94\nkWmGEoWAIEN6kUeG65fqPa3u+DpNpGASZ3J5SDyk+2lVkoaU5s76NoeuHsmR\n2AlG/ARF/UoPrEPuE0xhRlwD+1YhxUobcsmOgGIYphgICE9XHjCgGqyigXjR\ne1fxkmrdU3eKhCwrkNq9hl5iwuHLniu2zud3KvzCd2WqLCqUeaUpa1FHh76W\n62/Rr+X+OHZzt2yU4B5ZOgaD/19+ocyKgGlfAzBb4l+FBMlXaOmJqBHT95Z6\nGP/ExEdPDrlOwVqEIzbeHcd3sCc+MReGtlnT5W6XEKjRHViGkWfMoTvmIyGB\n50EG5tSCjd6wIrB6MoYmszuKvpNs2DDuK9spRV6uhEAUG7eZx68mqWaOSiWu\n0vM2CJ1N5QiMTJgswNhLYYDbV3KYGmJfBcE9V3mhAycsEk+RPahd8c61FQWJ\nW02uFhwn6OFFO36fmW3cwku7CMEOlGwUgi+8wyp1JyoY39Q4zLkJxzji+N2X\nnYcj\r\n=NCzO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDwg1n5L6soAmW+rH1j4mJnI5vHvAKFp87N23IHzyUlqAIhANb6Pa+X2K+2ZXybtGQIpwK6Q3mgYy5t8fSFfHkdFHum"}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_2.7.0_1613341660928_0.9682436310142895"},"_hasShrinkwrap":false},"2.7.1":{"name":"@orioro/expression","version":"2.7.1","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build && readme","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/validate-type":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"gitHead":"d16c3b5abee2b33d27c0bfee8f355575e476cf00","_id":"@orioro/expression@2.7.1","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-Xx0mHf/xOVXln6ZqoVTX3uAvFJ6K8I7e7s0OOybYTld4LZHGgc5sYdVf0n++VC9QHnwPsnVOsMsRIYbvNwr8+Q==","shasum":"f090ea3142c4cacff54d36b9b3f8b42dee0f0623","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-2.7.1.tgz","fileCount":42,"unpackedSize":203597,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKagUCRA9TVsSAnZWagAArREP/2XEs4TnNpw7Lk4a/jwq\nUtmRibPjRX18ahi7zXcbC+8SBAFSxYpzp2QG7bSSik10cw3VWhcTcY2criF4\n4Am+Dt9SVj1udRC3ixgxRS5FcuM53Np+ZwFOkLBLeE9fV6EV4NK1TABTLJPQ\n3um7dHGtAVYjTuf2B5ltuUlRJzslprduh6iZD5I6DQ/468H9H9hJ/pOXW7UJ\nhsaAnoBaE13WGDsKfq/i7Bd3dZFGtSXLSQtN5gQeBZDOXPlrLKV+brD2qamB\ngwiqBEQ7uWYnz7TIdL9SqbLeydButl2a+M0jO2mdXOh0FCmjQgFm9rajHT1P\n5srWbxdQRXrOPaVZetW/wX5UgazLrdHR3g0LhmYWrX83kxJnNCg2MmKVswXa\nwCbEGSiEcUAONPfP+rgH4pOfkwVdApmTRlP10u9s4MhYaRYvN9zmd3DkB8wD\nkW6d03UU537uXySSwCfjnNGe7cemAVSTjBu+CC3nDbQWi84DhtAwoOzSBeXN\nV4iljsEF1kbTbzMB01Vi2AFePGiXw8ZCPm0O+ZDT7oGgKr24KZAC8DZsISal\nX1LVsCDFSADyE44oiRAXNwEfPQM8/vN5ZTgxgpdwfBmCcUW91wShlgiewUYs\nBnpf0RiZglPCulhb+CdiUwN3Q1Oi6Xo5Yyx9LxHBLurV3F0VT3AxuefsEgHl\nWhk6\r\n=1BPk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDK0weBMPU4vYLpsTm2bv/IeBqyZFdkgTzWA9K0KLvGegIgNZfZL7J+iF9XHHB68WD9uQ7Rl0S1N6f1ZpcgL/doM18="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_2.7.1_1613342740421_0.13360927163274838"},"_hasShrinkwrap":false},"2.7.2":{"name":"@orioro/expression","version":"2.7.2","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build && readme","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/validate-type":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"gitHead":"b0e4615b108c2f6236516e40b69fa02855ba95b9","_id":"@orioro/expression@2.7.2","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-q7Uk6D51KKZ+4Frp01Ij4yQFf7YMz4Dl6ufBEhyX723tL8yBC2MMpbK5Nqsvc6JPOSvo2BNPVDJmQxJjyNE7xg==","shasum":"4a8b548bf2420aef9d32a771487ce0c812654676","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-2.7.2.tgz","fileCount":42,"unpackedSize":204320,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKkvnCRA9TVsSAnZWagAAdGEP/23dziY9BVZNHuaJ5/AE\njwnunOB1GZBVXoo5sgDvqAuYiK+P5e8e6J5nhfEvwbD7sWG3E4vQfdWrag2K\nCTSaAnxQkZIhzmdos6SShV/qXBFd9uynpUDSnXambU7Hs6hug55dDyhhdZzq\nPgj8r4ETfhjoGdGCDWbfXphHXjhvks6nUj4v1BPzy2XVnsnCxxjBnp0YTzaN\nES6wNV4OC2hSoocQOMSZywq+9KU7V9x+aEsy3UajkNHLYTN4eeC6g3zgQY4V\nx05/Iiz+K1c4zSugNthh2C9ftcsmBLUsrwICxM2/GBWFpkCo8LqgCEVors9l\nmf1RGbtxxuYAsgWsQPbHlMOJtG43hb6c1pQye8KA3tpvjBLa254uc9DuNZMS\nMPcrxciEHwU/ry1ePcP1WQlcH4IiDL/hh4miETUEx4zggFHSvHxvKU4r4BrQ\ni7Lp/1Ult/sevdZXZEB+WLZkQ04H0vH6Oq7I+SuJjT5ZD2SKCKwuOJja3i9E\n8lk+uLz81YdiE6xMn3phS0xMmWj1L/b18FO6YNcc8ETmNZ5RD2hfU3i/8Hxn\nrPTPBr56ndl0Mpf3Cmmgt9A6xNopGm3rYj8p5iQRfpF2FXBAVZXUb/6tx+QP\nv8BpcrhXN9sf3wp6FjFk1CmsSKwRdRFP1XDRbIZ2CH3k92pZDkL8XLFm6VZ9\nl/i7\r\n=JOK8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDPik6vEVvpB4IU753y5BBjMyOCbmTn60OwPI8u4hgwCgIgO7PjqMeUvmAZFLz2X7/40LQd+5xw/tbjZsNzTwBcm8Y="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_2.7.2_1613384678828_0.9282584479026004"},"_hasShrinkwrap":false},"3.0.0":{"name":"@orioro/expression","version":"3.0.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build && readme","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/validate-type":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(everyExp, array)`](#arrayeveryeveryexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(everyExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Date\n\nSet of expressions aimed at solving common date-related operations: \nparse, format, compare, validate, manipulate (e.g. move forward, move back).\nMost (if not all) operations are based on and built with [`Luxon`](https://github.com/moment/luxon/) `DateTime`. If not stated otherwise, date operations return a `string` in ISO 8601 format (`2021-01-27T20:38:12.807Z`).\n\n- [`DateValue`](#datevalue)\n- [`DateFormat`](#dateformat)\n- [`ISODate`](#isodate)\n- [`Duration`](#duration)\n- [`$date(parseFmtArgs, serializeFormat, date)`](#dateparsefmtargs-serializeformat-date)\n- [`$dateNow(serializeFormat)`](#datenowserializeformat)\n- [`$dateIsValid()`](#dateisvalid)\n- [`$dateStartOf(unitExp, date)`](#datestartofunitexp-date)\n- [`$dateEndOf(unitExp, date)`](#dateendofunitexp-date)\n- [`$dateSet(valuesExp, dateExp)`](#datesetvaluesexp-dateexp)\n- [`$dateSetConfig(configExp, date)`](#datesetconfigconfigexp-date)\n- [`$dateGt(referenceDateExp, date)`](#dategtreferencedateexp-date)\n- [`$dateGte(referenceDateExp, date)`](#dategtereferencedateexp-date)\n- [`$dateLt(referenceDateExp, date)`](#dateltreferencedateexp-date)\n- [`$dateLte(referenceDateExp, date)`](#dateltereferencedateexp-date)\n- [`$dateEq(referenceDateExp, compareUnitExp, date)`](#dateeqreferencedateexp-compareunitexp-date)\n- [`$dateMoveForward(duration, date)`](#datemoveforwardduration-date)\n- [`$dateMoveBackward(duration, date)`](#datemovebackwardduration-date)\n\n\n##### `DateValue`\n\nDate input for all $date expressions\n\n\n\n##### `DateFormat`\n\nArguments to be forwarded to Luxon corresponding DateTime parser.\nIf a `string`, will be considered as the name of the format.\nIf an `Array`, will be considered as a tuple consisting of\n[format, formatOptions].\nRecognized formats (exported as constants `DATE_{FORMAT_IN_CONSTANT_CASE}`):\n- `ISO`\n- `ISODate`\n- `ISOWeekDate`\n- `ISOTime`\n- `RFC2822`\n- `HTTP`\n- `SQL`\n- `SQLTime`\n- `SQLTime`\n- `UnixEpochMs`\n- `UnixEpochS`\n- `JSDate`\n- `PlainObject`\n- `LuxonDateTime`\n\n\n\n##### `ISODate`\n\nString in the full ISO 8601 format:\n`2017-04-20T11:32:00.000-04:00`\n\n\n\n##### `Duration`\n\nDuration represented in an object format:\n\n- `duration` {Object}\n  - `years` {Number}\n  - `quarters` {Number}\n  - `months` {Number}\n  - `weeks` {Number}\n  - `days` {Number}\n  - `hours` {Number}\n  - `minutes` {Number}\n  - `seconds` {Number}\n  - `milliseconds` {Number}\n\n##### `$date(parseFmtArgs, serializeFormat, date)`\n\nParses a date from a given input format and serializes it into\nanother format. Use this expression to convert date formats into\nyour requirements. E.g. `UnixEpochMs` into `ISO`.\n\n- `parseFmtArgs` {[DateFormat](#dateformat)}\n- `serializeFormat` {[DateFormat](#dateformat)}\n- `date` {String | Number | Object | Date}\n- Returns: `date` {String | Number | Object | Date} Output will vary according to `serializeFormat`\n\n##### `$dateNow(serializeFormat)`\n\nGenerates a ISO date string from `Date.now`\n\n- `serializeFormat` {[DateFormat](#dateformat)}\n- Returns: `date` {String | Number | Object | Date} \n\n##### `$dateIsValid()`\n\nVerifies whether the given date is valid.\nFrom Luxon docs:\n> The most common way to do that is to over- or underflow some unit:\n> - February 40th\n> - 28:00\n> - 4 pm\n> - etc\nSee https://github.com/moment/luxon/blob/master/docs/validity.md\n\n- `` {*}\n- Returns: `isValid` {Boolean} \n\n##### `$dateStartOf(unitExp, date)`\n\nReturns the date at the start of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateEndOf(unitExp, date)`\n\nReturns the date at the end of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateSet(valuesExp, dateExp)`\n\nModifies date specific `units` and returns resulting date.\nSee [`DateTime#set`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-set)\nand [`DateTime.fromObject`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#static-method-fromObject)\n\n- `valuesExp` {Object}\n  - `year` {Number}\n  - `month` {Number}\n  - `day` {Number}\n  - `ordinal` {Number}\n  - `weekYear` {Number}\n  - `weekNumber` {Number}\n  - `weekday` {Number}\n  - `hour` {Number}\n  - `minute` {Number}\n  - `second` {Number}\n  - `millisecond` {Number}\n- `dateExp` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateSetConfig(configExp, date)`\n\nModifies a configurations of the date.\n\n- `configExp` {Object}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateGt(referenceDateExp, date)`\n\nGreater than `date > reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateGte(referenceDateExp, date)`\n\nGreater than or equal `date >= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateLt(referenceDateExp, date)`\n\nLesser than `date < reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateLte(referenceDateExp, date)`\n\nLesser than or equal `date <= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateEq(referenceDateExp, compareUnitExp, date)`\n\n`date == reference`\nConverts both `date` and `reference` and compares their\nspecified `compareUnit`. By default compares `millisecond` unit\nso that checks whether are exactly the same millisecond in time,\nbut could be used to compare other units, such as whether two dates\nare within the same `day`, `month` or `year`.\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `compareUnitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateMoveForward(duration, date)`\n\nModifies the date by moving it forward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateMoveBackward(duration, date)`\n\nModifies the date by moving it backward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {[Expression](#expression)}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"readme.md","gitHead":"55e873e230d5f443bcf9ba69fceae4bbed34762d","_id":"@orioro/expression@3.0.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-jxIXXCrsaXtTc3ANiJ7tQ88kqEd1AybGIaQeYV3eEM+ysh/rtjYGzGUyUfs0vk1+HjlRq1XBh7k+1f9LUVa4Ww==","shasum":"639c10b3374c1727bb3c2f3a9e5c9da188ac34fe","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-3.0.0.tgz","fileCount":43,"unpackedSize":234784,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKyItCRA9TVsSAnZWagAANuoP/3QmN7x5xc0V77WXFNrm\n616a5CzmKtJQPh72Bu+2TTPTTNBQfZ8QtxFSCxhF1I3T7xg0Y8qnueA0PDyD\nt/v5/iT0LDmaSmL8hS31GppXmkukZLjo01Km9lvE4EWVofS0LJnH0n89kluW\nGE3g+J1XJmcCWypGiH7Rj2ygQsEmoY6yBBrWdBY/DsOajucCnB1/rUT74PLY\nNsm6rAJJlsP60TwNdxaG0mYlp6+ES+WKWKkVd3wcFEmDHTHeYDXHg2JR3+7m\nD/PDMCp437+Lz7G58HvwUKCyiZU5r6ZBSxEKu1RuEKE/HN3cLWV+mWvrnwXN\nvNMFyllENg/ldfZR8f2ABM6IrCP1pCtaUe3qXBIn1IeucL5QYXni8VVTvxUj\nRKSZz3cxPA219dr4mKxs1YLUimT48sYZzRPSFw9xmBhr1Utj4TshzcuEFYZQ\n7BLCcvAPQdvcYB34RNAAwG8NvKJ2Ig4mFNROahaWlrN/hy+FFikhUHdpam46\n7ul2uUppY/0tnX8v21q+2IOqrXJTKP9gb6ZELwsBGXDgyfQynfA88nFZa4rQ\nKm8McsJVpJsPUCW0zC7onWS1UD6nlyKGiExFHl1AlbmyqfHSmJQ5uQl0nO+i\njvSk59koOnXNknbSLaXN1paVteKq4awHqgCEZTysZNu1y+lx07LDmXwRwkwY\n2DLS\r\n=r3Go\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsqMrisdugtbbu7ya6RDmBrGo9IEhZs5MvmE8L9OYusQIgB/toc0u2gIpELJjuURBPC4w4EMkdpLkl1SWtBtvYYNI="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_3.0.0_1613439533389_0.7128328622000288"},"_hasShrinkwrap":false},"3.1.0":{"name":"@orioro/expression","version":"3.1.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build && readme","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^0.3.2","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/validate-type":"^1.1.0","lodash":"^4.17.20","luxon":"^1.25.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(everyExp, array)`](#arrayeveryeveryexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(everyExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Date\n\nSet of expressions aimed at solving common date-related operations: \nparse, format, compare, validate, manipulate (e.g. move forward, move back).\nMost (if not all) operations are based on and built with [`Luxon`](https://github.com/moment/luxon/) `DateTime`. If not stated otherwise, date operations return a `string` in ISO 8601 format (`2021-01-27T20:38:12.807Z`).\n\n- [`DateValue`](#datevalue)\n- [`DateFormat`](#dateformat)\n- [`ISODate`](#isodate)\n- [`Duration`](#duration)\n- [`$date(parseFmtArgs, serializeFormat, date)`](#dateparsefmtargs-serializeformat-date)\n- [`$dateNow(serializeFormat)`](#datenowserializeformat)\n- [`$dateIsValid()`](#dateisvalid)\n- [`$dateStartOf(unitExp, date)`](#datestartofunitexp-date)\n- [`$dateEndOf(unitExp, date)`](#dateendofunitexp-date)\n- [`$dateSet(valuesExp, dateExp)`](#datesetvaluesexp-dateexp)\n- [`$dateSetConfig(configExp, date)`](#datesetconfigconfigexp-date)\n- [`$dateGt(referenceDateExp, date)`](#dategtreferencedateexp-date)\n- [`$dateGte(referenceDateExp, date)`](#dategtereferencedateexp-date)\n- [`$dateLt(referenceDateExp, date)`](#dateltreferencedateexp-date)\n- [`$dateLte(referenceDateExp, date)`](#dateltereferencedateexp-date)\n- [`$dateEq(referenceDateExp, compareUnitExp, date)`](#dateeqreferencedateexp-compareunitexp-date)\n- [`$dateMoveForward(duration, date)`](#datemoveforwardduration-date)\n- [`$dateMoveBackward(duration, date)`](#datemovebackwardduration-date)\n\n\n##### `DateValue`\n\nDate input for all $date expressions\n\n\n\n##### `DateFormat`\n\nArguments to be forwarded to Luxon corresponding DateTime parser.\nIf a `string`, will be considered as the name of the format.\nIf an `Array`, will be considered as a tuple consisting of\n[format, formatOptions].\nRecognized formats (exported as constants `DATE_{FORMAT_IN_CONSTANT_CASE}`):\n- `ISO`\n- `ISODate`\n- `ISOWeekDate`\n- `ISOTime`\n- `RFC2822`\n- `HTTP`\n- `SQL`\n- `SQLTime`\n- `SQLTime`\n- `UnixEpochMs`\n- `UnixEpochS`\n- `JSDate`\n- `PlainObject`\n- `LuxonDateTime`\n\n\n\n##### `ISODate`\n\nString in the full ISO 8601 format:\n`2017-04-20T11:32:00.000-04:00`\n\n\n\n##### `Duration`\n\nDuration represented in an object format:\n\n- `duration` {Object}\n  - `years` {Number}\n  - `quarters` {Number}\n  - `months` {Number}\n  - `weeks` {Number}\n  - `days` {Number}\n  - `hours` {Number}\n  - `minutes` {Number}\n  - `seconds` {Number}\n  - `milliseconds` {Number}\n\n##### `$date(parseFmtArgs, serializeFormat, date)`\n\nParses a date from a given input format and serializes it into\nanother format. Use this expression to convert date formats into\nyour requirements. E.g. `UnixEpochMs` into `ISO`.\n\n- `parseFmtArgs` {[DateFormat](#dateformat)}\n- `serializeFormat` {[DateFormat](#dateformat)}\n- `date` {String | Number | Object | Date}\n- Returns: `date` {String | Number | Object | Date} Output will vary according to `serializeFormat`\n\n##### `$dateNow(serializeFormat)`\n\nGenerates a ISO date string from `Date.now`\n\n- `serializeFormat` {[DateFormat](#dateformat)}\n- Returns: `date` {String | Number | Object | Date} \n\n##### `$dateIsValid()`\n\nVerifies whether the given date is valid.\nFrom Luxon docs:\n> The most common way to do that is to over- or underflow some unit:\n> - February 40th\n> - 28:00\n> - 4 pm\n> - etc\nSee https://github.com/moment/luxon/blob/master/docs/validity.md\n\n- `` {*}\n- Returns: `isValid` {Boolean} \n\n##### `$dateStartOf(unitExp, date)`\n\nReturns the date at the start of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateEndOf(unitExp, date)`\n\nReturns the date at the end of the given `unit` (e.g. `day`, `month`).\n\n- `unitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateSet(valuesExp, dateExp)`\n\nModifies date specific `units` and returns resulting date.\nSee [`DateTime#set`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-set)\nand [`DateTime.fromObject`](https://moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#static-method-fromObject)\n\n- `valuesExp` {Object}\n  - `year` {Number}\n  - `month` {Number}\n  - `day` {Number}\n  - `ordinal` {Number}\n  - `weekYear` {Number}\n  - `weekNumber` {Number}\n  - `weekday` {Number}\n  - `hour` {Number}\n  - `minute` {Number}\n  - `second` {Number}\n  - `millisecond` {Number}\n- `dateExp` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateSetConfig(configExp, date)`\n\nModifies a configurations of the date.\n\n- `configExp` {Object}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateGt(referenceDateExp, date)`\n\nGreater than `date > reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateGte(referenceDateExp, date)`\n\nGreater than or equal `date >= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateLt(referenceDateExp, date)`\n\nLesser than `date < reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateLte(referenceDateExp, date)`\n\nLesser than or equal `date <= reference`\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateEq(referenceDateExp, compareUnitExp, date)`\n\n`date == reference`\nConverts both `date` and `reference` and compares their\nspecified `compareUnit`. By default compares `millisecond` unit\nso that checks whether are exactly the same millisecond in time,\nbut could be used to compare other units, such as whether two dates\nare within the same `day`, `month` or `year`.\n\n- `referenceDateExp` {[[ISODate](#isodate)](#isodate)}\n- `compareUnitExp` {String}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: {Boolean} \n\n##### `$dateMoveForward(duration, date)`\n\nModifies the date by moving it forward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n##### `$dateMoveBackward(duration, date)`\n\nModifies the date by moving it backward the duration specified.\n\n- `duration` {[Duration](#duration)}\n- `date` {[[ISODate](#isodate)](#isodate)}\n- Returns: `date` {[[ISODate](#isodate)](#isodate)} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {[Expression](#expression)}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"readme.md","gitHead":"e8930cf7decadd89754f35e9b3a9eaab9b596d4b","_id":"@orioro/expression@3.1.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-N0a7O2Z8werzBhxAVDUOuUl5j4wV8t0poYImvtCeyS1GjKiYiO9M5mN8alTljhX4E6ZyQ7gYH170lQgWD9MJEw==","shasum":"a29837aafc2412046c134b3e2c094592738654a1","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-3.1.0.tgz","fileCount":43,"unpackedSize":234646,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgNEgzCRA9TVsSAnZWagAAXTQP/RIdIAjXYaTP9UJZvg0S\nIHM3f+T2INoqEFRMQDu9wGrPiNAI8VE9FkYg0XE/g9aTraHinqkqIDZScQWH\nM9Xt39/BpoWFcdoXiEyQXXykc6SmPzKxHrjX/OomYk9azt/UUTDFC+C3K19T\nUlCjALlOGqTHMD+AxQM6XQh7aEtq9SrkCLltVJm4skahsDfjaQ+6IFlEqdFE\nDwvGfHSr7tryqnSyvHE7LxCdcrd9/gvVuXx/uQ9V5o55pE6sprIgkiAMNJUS\nnxN6/FVD6sacYTIYwXtYiUb+xO3TgucX7bnnzRKapof5N4dqqvZ4YIGpUvZv\ntuhCQoMpx+TtWDA4Udp3dNeW/NnOUPR6PtN7G5Q+NHbML8GmKoPuAxHBrvPb\ntADmMSmr5O+jU/03TraQKawc5GWYeas8pdXfm9FfhBlhjwVVYTqzO2/CatHK\ny6oc3V3D3HU68+aQ7+nRXw3NlrQQN3rTaxxr97U24LjL/aDvZ6FUfLq9H49o\nevOIzCml0y74dVOY+U4ZSwpfDCUTdNWtF5g94bTCcNHzmBnqjjhT0Y1twA26\nLIGs/P8+UFjkYYZ0Cb62/mEHPid/5jeTiTFkujYl0LpW5pLFBHS7CjYE4CFQ\n5NOR8beNHHYG6KahYdMUGGoNc6Ws9jO8+O5XJoxjzxVuvrmdtlJwkjM/Xomi\nibOH\r\n=Jv1s\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOUXalOa5IKHImhKnApdQ7di4XoBwrFBJOsdXU8dT95gIgRgLHDzB/BosLNoChPgGRIlaKxzkFXzBKdRCblK55p74="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_3.1.0_1614039090761_0.5787149247317709"},"_hasShrinkwrap":false},"4.0.0":{"name":"@orioro/expression","version":"4.0.0","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/validate-type":"^1.3.1","lodash":"^4.17.20"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(everyExp, array)`](#arrayeveryeveryexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(everyExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {[Expression](#expression)}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"4c0fe4db8abe67bcce03531806a992a7dab85b54","_id":"@orioro/expression@4.0.0","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-OXlltXWUu8wKdaBUg/5CYNBLcziGdP6pbUxacmDsKdfVUXpR6u+cKSbUaZ9ZG4Tq3h+a1K35XjSQJkA5XL6HkQ==","shasum":"64f38c82a1dcfa7efb027e8ab3d1195e66157ea1","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-4.0.0.tgz","fileCount":41,"unpackedSize":183100,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgNU1TCRA9TVsSAnZWagAAgCMP/1YVVAsmZv+/JYJJedjj\ncNEh4R5WA6MZ1XhVL7+t9IYqjrjQr36NmiSYDqFLO04SxOHpQVPsOTjURer7\n2Qw34e2ErZYiCm+VWCvZPsVwMSEUjA9Q4xQfGCrh/CFAQ4yjyNVVqze6gmD7\nCDT4I9sjBu8cn2239eLkj8tJ0tBFQhwPdgXqP91ScLzewSgY1Iu0Bz5mJCcI\naJjuHnZXDTCT92eK9AbQKB49nVqluXgVLmGwD7mioxAjc+IrlM/n3KwpypkL\nRQptzUrOuJsXCk2ycuSGEiJw+VD3s3zXyRtFHJ9tp/jL7ifdm6OGV67kbNCY\n49+RcqcLgS/nsUMf+zf/QNjY56tC/G4pry0xtXntvunZa5dP2fnwgZUdJkOT\noDY072mcd644+9ospaJ3bSvx4f6jjV9SkitGvLYpprA8r/fkvlJ8GHH5+7gR\npFQ9OQooyYXY5lwgRINsnBrdwWbRlYvxAL8S0nDpeP6GP2qK5gKlo5nxrFsj\niePD0P46AMNCehD/ipi9pc1j/CTpyjZkWYq+gsmcHgv83n61wgcTL8SeQI0U\nU8oU5FH2KHd3VS/5rSMQmkWDzKnAqZIGA/G0pk1tpeY/byftJQM4LuUOdIM6\nJM89f8GSAegofX14kUxc81QLB4voxyT6dqiPmIGWPleiQCwUezsh7u71+nIw\nhJI0\r\n=441y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMTeIueaazfEGg6m/Ho5JqlIw5cmTNNpIaNkk7ZAlCLAIgLfyXrgT4kasLuTbbdDXGJ7LceCd0kfLn2In6bHYltWg="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_4.0.0_1614105938510_0.15992693404692404"},"_hasShrinkwrap":false},"4.0.1":{"name":"@orioro/expression","version":"4.0.1","description":"``` npm install @orioro/expression ```","main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/validate-type":"^1.4.0","lodash":"^4.17.20"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(everyExp, array)`](#arrayeveryeveryexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(everyExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {[Expression](#expression)}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"cfb3c8c94b18a97bd571686df9b1468ccc1d1092","_id":"@orioro/expression@4.0.1","_nodeVersion":"12.20.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-k18+WtotheGD9CSYBI6flspwJETk6RouoJcNze+2u96IQRTUk1G6B8IbbUWj2t/QpqTK7j5D7WvGPQSpQ1xTyA==","shasum":"5c50eccde0f14f74d4dde7346c649710cd304c1e","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-4.0.1.tgz","fileCount":41,"unpackedSize":182877,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgNZnaCRA9TVsSAnZWagAApIEP/jYhRUO4bp+4svX1ufC4\nDmoyRXqVISZQYm0PZhgqWijXHb8voooZH4KtLeDCmUhp80QmounYjpK1ausm\n1CuzotC0+sBg5gBTLR7O4figDfgrHD8cwCPPTSVsKmPbmxUEDIOy4kEsHf97\nPnrsvUf8ijTcL//w2so0nt1zz3fBgO2oGxz5AQ5dhfNp2rpel4tZpJLVIqm+\nzhfCzHWiwKdmd1E0tVCVhVOz2hq3YpQ2L3eDkxeAXCqr1VWnPEaAepG10cxr\nyrLwFZimVW6KFCepHMjkD6AVvw5UA+f5kLkDVdwsl1QAksRugD9oCJ9hyzkn\ncF0ScEJ/VjpJUEVTl5n4Nh12PpXERVTraxdrhRJP1IxkTMImW7JJsCZc9KXQ\nz7XV85rHRlBSiVpyTUK5+qLSRL62m9jKNkmuVG4ofbm9y02hR8bygef+O/Hv\n6EMZUcr20AFg/Wis6Rl3i5wJXBfvEX5vWAcIF2O57Jktt6xYyznJdDQeGAXm\nibPNnpV6OVhu7L5fCDRD9jWvUnWN8ng9H1eNB3nfRg120I9N6r2mDidvMIkP\n1ODYQrJqy0rncYX9bVzILmdjcM705Efz+p4zKUuYn4Xd8bkGmnY/kRtnsGU/\njWLZ5hu6z0KAKuGHTQPRV/KHTQCtCCgSy5YI0z3UYSOO2rCS+m/ey5e6zOsy\nPFtu\r\n=hz5k\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDbGg8D1hQWXH/sSlrjVfDawdkKvzAZLGFPmywdf13tPAiBKIkwPwyKBtafsRJEAnJi5VGnpYpeDc7N+UIO27yNHzQ=="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_4.0.1_1614125529667_0.15369666580871133"},"_hasShrinkwrap":false},"4.1.0":{"name":"@orioro/expression","version":"4.1.0","description":"Framework of expression interpreters","keywords":["expression","eval","conditional"],"homepage":"https://github.com/orioro/node-expression","bugs":{"url":"https://github.com/orioro/node-expression/issues"},"repository":{"type":"git","url":"git+https://github.com/orioro/node-expression.git"},"main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/jest-util":"^1.2.0","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/typing":"^3.0.0","lodash":"^4.17.20"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\nFramework of expression interpreters.\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(everyExp, array)`](#arrayeveryeveryexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(everyExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n- [`$isType(type, value)`](#istypetype-value)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n##### `$isType(type, value)`\n\n- `type` {ExpectedType}\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {[Expression](#expression)}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"f71ff16879c0efe9bac71cc76b406af8ddcc97f1","_id":"@orioro/expression@4.1.0","_nodeVersion":"12.20.2","_npmVersion":"6.14.11","dist":{"integrity":"sha512-vV17VvaHOpAx4NhDyj+y65MLENr77fIxwVVdfwKkauoApOEHI9PNwZVTLtamnwAYk8zl9xJLzLsG7T7pv2T9pA==","shasum":"b0900b593560cd27dd07a82a4e43d20924c38ae8","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-4.1.0.tgz","fileCount":33,"unpackedSize":149738,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgOocmCRA9TVsSAnZWagAAdNIP/0uS9xJy+D/VqLOLpU6V\ngogShDcqLeNCUiPy2IQbd3QvPZWlFJk84cxPkP5ZlADQE7jEGFH8cBBG07MI\nY1lQ+qdJXVLFzxtZvBHtzz68y2p7wAHBkyfGOmfvtQMUSGiJWQ2Lo8vGlAex\nYAhNCSaF6H/juvkuoPXp6zTOX0diN+Eu1JZAdbX/1z04wP394tgcyWxrfnqz\ndUQCF8dRlpCuskg1mIBkZADLtS6kbLmLEi67BtW3bnc/OWzdEMLGXWn+UJFO\n7kfPHI7w71N/t7quVO5RDik5hipkZVvsAemYeKbYSOyjYkGzuaKcRn5E55f4\nda96B5QTdqGOrD97rYsR1/t0inuE3V0sWa77hHf+8ZSCThWGFwhtBkd7HjHl\n0oryd2ShKbgdJigp1TOX672LD0MNTHK8JXkDHAPhgafeBGJqm1ABvIKl4hvU\nhoF7MwJib1DKB7uA876IiLJLeF5gRqzT9DnGL/NnxmXSZdnki+wEng8RxXo7\nW98dF3VZwf126BY6DXMIAeCA8Xi5NF0UzVGtYC5pa1NjKjD50j9s7cERoMzm\nBSAIypD65cKl1Ew5cW6IPglg+Pod6BuQEOR7Y4n86BUqw2jZKlxvPQjKifBG\nFBKNS1V1WbvfNnIYqdtgpgjoTl7nliKmvQpzw53qYbCC6IAMs5TvGFNDO98p\ne2Pf\r\n=v921\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG85PdCB2BDjCS1BIkdIOwYIUsIIExXppvihDja/5WrlAiAHsnDFtCHBJwOHFx2LxdsR5lY9Z5GytpqLKMmxiZ+wqA=="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_4.1.0_1614448421847_0.9892924344431662"},"_hasShrinkwrap":false},"4.2.0":{"name":"@orioro/expression","version":"4.2.0","description":"Framework of expression interpreters","keywords":["expression","eval","conditional"],"homepage":"https://github.com/orioro/node-expression","bugs":{"url":"https://github.com/orioro/node-expression/issues"},"repository":{"type":"git","url":"git+https://github.com/orioro/node-expression.git"},"main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/jest-util":"^1.2.0","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@semantic-release/changelog":"^5.0.1","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/typing":"^3.0.0","lodash":"^4.17.20"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/changelog","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\nFramework of expression interpreters.\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(everyExp, array)`](#arrayeveryeveryexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(everyExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n- [`$isType(type, value)`](#istypetype-value)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n##### `$isType(type, value)`\n\n- `type` {ExpectedType}\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {[Expression](#expression)}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"4290c29a0b50eaca4f37b70e7ae559392961b935","_id":"@orioro/expression@4.2.0","_nodeVersion":"12.20.2","_npmVersion":"6.14.11","dist":{"integrity":"sha512-q6UhIIC0LyQrp7LP5wThjmyDH5o2ac2p72HQ5GuV/N3bjfSgJLUOyUAxkcub5tcJ13vKcrvEWnpWgzLtVrg6nQ==","shasum":"5fa801ca626684f77b348852a86ce129b077a09a","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-4.2.0.tgz","fileCount":33,"unpackedSize":149900,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgOo9FCRA9TVsSAnZWagAAf2EP/3wfnlaxvUNLpWye4zZo\nvd4D7BkoujU2iWwRVHxzKgWuvx68NFclYP5m5bNDsvtFalD8XDXqJw8uoLLl\nCJRds80KuhHPBvxETbMHpRH/BwJcSg6uaQlU9hojzlzZeJPmr9PSwV1dJfW6\nB2Q8mWB3HLyMp15ZPjcktB/Ykkj3x+zXMIPlYD9cG6vyBwuFn/by2Vg2xfr8\nDP05EDQ3bgiMAh3htjwlX1mQHZg7+VVuuQjQBYnXs7Be61ZVxYefvD3zQz5E\nVF1DvcBGd+7H88NwL2apJg/kBoeFIlDcCvt2F9w9Qc6hQQqZFEyEbHh2UejE\na9kls/yV7Ap5iHdHDXlNqncCmW1eyudeaZJkl4Es7dou7v6HrMT/+vv1cT7j\nZ6u7LymjwR/uHtB9ZkpbhYzyU7A2SVJ6LoBndhANTWgbcceR+xSNWYlw+ij7\nIUCwk09NKn1vA1Nv2heUwqZmaKI9hWI8OUiusYpfOZet8av8vBrD039bqb1J\ngBDL90NXUktdlwVmGxjA3iP8YG+udSXeZuEyEx5mxbe9wJ6nJZrpy5ikw5Uu\ncC8Hgs06q3/dHmyMeDRKLeTTySU2qW0ir+fSggoM4Gq99GZNuxSS75A8VNTX\n2ax5hmNobMxi1hSQ5N0LKkxpVkrPQG6E1lD/5HiTrL2ehy+tkiUwlJZLkL3Y\nq46j\r\n=ctZi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAC9EVZj+fhD0Qq+Skt3OzN2kTwyDubycBISKWUlU+dBAiEAqwuYo8zyh+gXWTbVo2qK3zs3F3iYtK6VRYB5iz67NvA="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_4.2.0_1614450501049_0.3255769341381638"},"_hasShrinkwrap":false},"5.0.0":{"name":"@orioro/expression","version":"5.0.0","description":"Framework of expression interpreters","keywords":["expression","eval","conditional"],"homepage":"https://github.com/orioro/node-expression","bugs":{"url":"https://github.com/orioro/node-expression/issues"},"repository":{"type":"git","url":"git+https://github.com/orioro/node-expression.git"},"main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/jest-util":"^1.3.0","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/typing":"^3.0.0","lodash":"^4.17.20"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\nFramework of expression interpreters.\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(everyExp, array)`](#arrayeveryeveryexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(everyExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `everyExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n- [`$isType(type, value)`](#istypetype-value)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n##### `$isType(type, value)`\n\n- `type` {ExpectedType}\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Value\n\n- [`$value(pathExp, defaultExp)`](#valuepathexp-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expExp, scopeExp)`](#evaluateexpexp-scopeexp)\n\n\n##### `$value(pathExp, defaultExp)`\n\n- `pathExp` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expExp, scopeExp)`\n\n- `expExp` {[Expression](#expression)}\n- `scopeExp` {Object | null}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"bde02387082862a42ef1fd099b5a44e41da7230c","_id":"@orioro/expression@5.0.0","_nodeVersion":"12.20.2","_npmVersion":"6.14.11","dist":{"integrity":"sha512-ZvL46DDMmMsh+w0xR+PxAxIndLKR3jny0R3vYf35rgi1TUykn9ApV88PvYDUsdyo2H8Z3c1B17GcWV5Esd2HGQ==","shasum":"74ea558bdf3a8428e11250f2fc56b576e058fc28","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-5.0.0.tgz","fileCount":33,"unpackedSize":150863,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgP/NkCRA9TVsSAnZWagAA5+AQAIWeai0X/0djQ1Ddy+nX\nqgai5L4qZQdtjdXYHGsXoHuzTegfEij06EKbqA5rX6M1Wr1pmMimjCDHUmk8\nv1X+B8Fl533moHOS3ej4LQwzlWidg2t8qpGn0l7/F/v9cPidpmHdOYy+grwm\nqbMfbcqQ3S9m5wMlraBSaLMxM6kQI1ns5Wtagspv+OEO9iT4lLCjfNA2vQp/\nVWTsuX95J9Tp5Dlun10bFHhInmv3vxfnUDO8Y10rMvhthSva+mm0nF2Y0pvb\n46s9PHIXwr2pwyb/8bOGrqkNPyLXoWtg3qK7zFv+uE/1Zuewo+45ikk6A/Jb\n7y2pFop5onVYPeKGB6q9Q5J0uK0o8uIjbw4K0MLPSS0+ta+saV/jyLe3qlfO\nGWqh5JTeQSjyM+uqmX4OjcM3spIK2rc4GRWBTGvmEm6T1oT4wJTugHhMhB0v\nXKkPVYOoSCLp/iGFH3Pv6wqG+V1mn88v8EX0tu5jBgIlslpHoRGxH2Byu3bV\nGDG2U5LCkqMuOoj3PkSI4jU54WYkrneUrnOujb1DUIBju6uQclfOmA+up7+P\nXOqL2Eo3fecnHUqZumFAY9JFKYCz3VsG8yRSWog+woMk9er/QGgPr8LEhwfy\n6ibPpJYQO+iYCadjP01gAP5cweVBN0ZOZYNqGP3tr7SRr88CpIQd+F2iMyZf\nNOkI\r\n=LjHd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDrs9qXonE/pBGSDKJa4JT4m5h/WKNAaTkp782DFybmNAiEA6/ukoSAGcYeNzEDglcx72P0kARN9+yHKzFlDLQ4dFng="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_5.0.0_1614803811718_0.3697622369896898"},"_hasShrinkwrap":false},"6.0.0":{"name":"@orioro/expression","version":"6.0.0","description":"Framework of expression interpreters","keywords":["expression","eval","conditional"],"homepage":"https://github.com/orioro/node-expression","bugs":{"url":"https://github.com/orioro/node-expression/issues"},"repository":{"type":"git","url":"git+https://github.com/orioro/node-expression.git"},"main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/jest-util":"^1.5.0","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/typing":"^4.2.0","lodash":"^4.17.20"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\nFramework of expression interpreters.\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(testExp, array)`](#arrayeverytestexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(testExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `testExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n- [`$isType(type, value)`](#istypetype-value)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n##### `$isType(type, value)`\n\n- `type` {ExpectedType}\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Value\n\n- [`$value(path, defaultExp)`](#valuepath-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expression, scope)`](#evaluateexpression-scope)\n\n\n##### `$value(path, defaultExp)`\n\n- `path` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expression, scope)`\n\n- `expression` {[Expression](#expression)}\n- `scope` {Object}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"81609cc42e9fde9bc92c4b097d5eb6a0c0202c6a","_id":"@orioro/expression@6.0.0","_nodeVersion":"12.21.0","_npmVersion":"6.14.11","dist":{"integrity":"sha512-GWmdfjriBOfPFmm2u4/b+aaXuHXsQpPTjS4vzzCW2N2/KBfNhY86Odo5df84AyQTL/hV9fHnXl3rpgMJSupdXw==","shasum":"acd296977e46e914cf61969bc6e159c730a26529","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-6.0.0.tgz","fileCount":45,"unpackedSize":190838,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgTiTECRA9TVsSAnZWagAAORAP/jhM6sKHZxvE9WfOgCzg\n5tT0I2ky4CAqVRxFKDrFrNy+6zkGpyWIjWLQqdtyV1YK+o/8ERKhAxli1FQY\nKLoQ72VC88n79z2QMn1abAkmc12/jHtRIRGDHJRAC2LWsYGQP9jwMRE5zBQ4\nG2JbtDAoVP7DUTz58gEA2MwMfNhk2aYdK8+82jiU/G2Fuh/s5pb31fpcnQhl\nPmeyaF7oFIu1MUcwmNdZ2pGsvH1NF9JMknjt1CEOtEDmsKORZnc/p35MmamL\nGNvOzHbnS4/ivM71joKVm1O7PJKhaJk4f0rn8SolX71nB6fO+ZhYhL9hP3Pd\n7K5Xqrnfkfpu4dtw7juS1sWSdjBGFb5qeSu+WDV1tTZylAsM/p/d0s7PgETq\nGpwo1j8Mcwkd9pw90KQA+I7JJDFwtr4XYybUU4pUreYk8DoucToCNmPv2IH8\ngrbJErB4W1imllk5bfxIRd07+VHSC+fizWDStzXnVHNTnUyRwfazCD05EWa5\nrvp+tfARMEMnGdS+e2TxT2a8RoEha5kwcoYh9ayTFeA2/KmEQbbyxBR87QDT\ngSSMPW5OLo82JDoadNMqeJJeUAVCdwNvwFR55qjlF+Tplnh4Q6ldhZdQcZst\nuKxyoqMI9UlLNcPBzWAKRhtGyGn5zkZvk55hxYYq2s4dayn90qJvP6FBDCwy\nEdjZ\r\n=++7s\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBR4VJ6i/YmTcnrR5M81WYkc45XAJzg8JzKW2Z9KmwsvAiEA7rExfLQTW/qgP++uMIOPhwp4/lHsfKgjqoCCwcXPELw="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_6.0.0_1615733955491_0.047079097535617453"},"_hasShrinkwrap":false},"6.1.0":{"name":"@orioro/expression","version":"6.1.0","description":"Framework of expression interpreters","keywords":["expression","eval","conditional"],"homepage":"https://github.com/orioro/node-expression","bugs":{"url":"https://github.com/orioro/node-expression/issues"},"repository":{"type":"git","url":"git+https://github.com/orioro/node-expression.git"},"main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/jest-util":"^1.5.0","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","regenerator-runtime":"^0.13.7","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/typing":"^4.4.0","lodash":"^4.17.20","mem":"^8.0.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\nFramework of expression interpreters.\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(testExp, array)`](#arrayeverytestexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(testExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `testExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n- [`$isType(type, value)`](#istypetype-value)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n##### `$isType(type, value)`\n\n- `type` {ExpectedType}\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Value\n\n- [`$value(path, defaultExp)`](#valuepath-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expression, scope)`](#evaluateexpression-scope)\n\n\n##### `$value(path, defaultExp)`\n\n- `path` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expression, scope)`\n\n- `expression` {[Expression](#expression)}\n- `scope` {Object}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"fc65f6af78805b5164e4d2ad05285d4615c5ad93","_id":"@orioro/expression@6.1.0","_nodeVersion":"12.21.0","_npmVersion":"6.14.11","dist":{"integrity":"sha512-8FgbZmIp004uCLAASn5ZH37WpQLDepdL3XIS5uQ6i01Fs4b9HtVsGPRE4vguTN6UExFNwZbBybs27yGHUR/A+w==","shasum":"ff38a3055d55631cac315cd0f374b97239381014","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-6.1.0.tgz","fileCount":47,"unpackedSize":197384,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgUnMLCRA9TVsSAnZWagAApfYP/ijQL3AcGoL2Vd2NXsmO\nlc4riHRmBSVeRL/9X74LD1fk2z+kpIoTtDqsxp9pJnqhHLs9ZgYZzhtbk7jg\n7J18nM0RY5xN4c0EoyEl6vPcCdcsn/90rk6Qo/21KydQOz883ALUs0MwKOY/\nEOlBKFcL3V19JNogtzPPeCtWYLqK80yR/4BonJR4lwGpXQrKI/6eVEsvNCnv\nfW1V7GDTb4/ZPgCw0NR7PXoPpVGguuml4mA1+hLGzoQlxb3LN6pags28qww2\n5kpGg7o2OC6J5sHvb7LXJMbMArfi27pWK3f5HY/niw4N0pzAkMJgkqpV2dxF\nagNBeKl2OB0tT2hCKCJzY9dQmAtBy+/jxWPhICf7RPCQF0ffiSl8vCkknimu\nmsJSeSZh/UoH5xSQQksh3D7CP1pYUCDNwR1lexQuP7mfqPQnYDimGAlSWn4c\nVQTIKlppIB7MJhBcqGqt7o4EwEF7xIra/8L7mO3DIkMDiGT6RUzQtZxIbe/N\nZRlvlbDqhWudecTRFfO1eNXjNNkqYG7gfpy7CuChqGpfUowLQnbsy9HwoGuU\nPVfvS4vaorU4uUOp1yLatSH1VuDtV3jw7sn4iM+YsLDmzRtRPpI3CNEdcJ9V\nzOKfLxQSrXLVgVOQFM8+/9IBwGHY5G5uA3w1CHRNU/spMHJEXnBRRoGX+n1l\neSe4\r\n=ArlZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHIya/9F8R5O4OCWnVkh41nwx+yK6DhpHSw25X1sGuhnAiB5WxXE+LjK9j+xd5O4BCTRApO4QvgU/14N/iVEcPxbSg=="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_6.1.0_1616016138566_0.053470639093470496"},"_hasShrinkwrap":false},"6.2.0":{"name":"@orioro/expression","version":"6.2.0","description":"Framework of expression interpreters","keywords":["expression","eval","conditional"],"homepage":"https://github.com/orioro/node-expression","bugs":{"url":"https://github.com/orioro/node-expression/issues"},"repository":{"type":"git","url":"git+https://github.com/orioro/node-expression.git"},"main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/jest-util":"^1.5.0","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","regenerator-runtime":"^0.13.7","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/typing":"^4.4.0","lodash":"^4.17.20","mem":"^8.0.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\nFramework of expression interpreters.\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(testExp, array)`](#arrayeverytestexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(testExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `testExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n- [`$isType(type, value)`](#istypetype-value)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n##### `$isType(type, value)`\n\n- `type` {ExpectedType}\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Value\n\n- [`$value(path, defaultExp)`](#valuepath-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expression, scope)`](#evaluateexpression-scope)\n\n\n##### `$value(path, defaultExp)`\n\n- `path` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expression, scope)`\n\n- `expression` {[Expression](#expression)}\n- `scope` {Object}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"eaab2f9e0617443a6181a1f81ea6deca9f9ebc10","_id":"@orioro/expression@6.2.0","_nodeVersion":"12.21.0","_npmVersion":"6.14.11","dist":{"integrity":"sha512-DaOEDjqBQjB/ic2k6r4O3X148p1L9S7dB8cTTksFuSpHZPTRgG8ol1H4OXnWFNb8bPywqWXs4yBpPY5wPg4DOQ==","shasum":"59e574189e7a42d7a1521ac8273e7c804d420c2a","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-6.2.0.tgz","fileCount":47,"unpackedSize":197755,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgXlByCRA9TVsSAnZWagAA/vcP/i9ZwmhfGFNgHGDSThyU\nxRFhQswui+8FFw4xVohwJFzdRbHtwF3U999AS9WclAjuO5Ddxq0sTG+WbTW2\nVG66dsaznsZX8f9g5V5OebUdIXUGA8UDar4E2HVn4hGmp7agac4Am09e90T5\nRm0dx0MeqqI/EA0WIPODMWB6+blaXDvKfk6QdDiuuaAZqf5Fw8sIXnbq7ANk\n+MBuWAoBclHsxgaEzoy5SP82ilrvTagTqK60YUSfVyU31Uu/qM/BvfLHg3fj\nOb9EUHhvDmghpa4CgmA8/Gih20y58KkXP+/jaB/hR7nR/celuh4MclnxF9fk\nFr7gwigeiRMmhEi5GE0LchsHNKYOsZ04e2lupO4mRKfvPdhm7gazuyZpMV5V\nqkWO3Zl/jtoMg6ggkfGW0FOVo0g3pOLFiTL/++DAkmsDi+DkSGta/X9KufLr\nvEF78w4ZA8GxC6yg8UCHbwFWGJ4ZBbAnP0j+evpnfKMM1E3reLlL8jMrETPo\n9mlDi0EREj1/LhhGTL4p3+Zi5v29MfVsYj3sBcH/rjfayFws2Drwfh36GSrG\nOSlAupKYi7hhVSO4vTxC7l3NpFPl1seJi87ScbuL5dSspdh81ToNrsl7RCJq\nxEcone/x938ZPVyqMjB/sLD8qQ2wSV2GIBVvI7py5q8V909kah89EG7EwylW\nJn85\r\n=aZwU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCr1+Wk1blu5o5eU+Sn33o0bE7lhQbFG1yHrTL74aaLmQIhAIgYkiSkSKh0Wt2aYi0jJBG1XcVjqzZrLOoO8ZJcPY15"}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_6.2.0_1616793714164_0.4359326317896901"},"_hasShrinkwrap":false},"6.3.0":{"name":"@orioro/expression","version":"6.3.0","description":"Framework of expression interpreters","keywords":["expression","eval","conditional"],"homepage":"https://github.com/orioro/node-expression","bugs":{"url":"https://github.com/orioro/node-expression/issues"},"repository":{"type":"git","url":"git+https://github.com/orioro/node-expression.git"},"main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/jest-util":"^1.5.0","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","regenerator-runtime":"^0.13.7","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/typing":"^4.4.0","lodash":"^4.17.20","mem":"^8.0.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\nFramework of expression interpreters.\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(testExp, array)`](#arrayeverytestexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(testExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `testExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n- [`$isType(type, value)`](#istypetype-value)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n##### `$isType(type, value)`\n\n- `type` {ExpectedType}\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Value\n\n- [`$value(path, defaultExp)`](#valuepath-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expression, scope)`](#evaluateexpression-scope)\n\n\n##### `$value(path, defaultExp)`\n\n- `path` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expression, scope)`\n\n- `expression` {[Expression](#expression)}\n- `scope` {Object}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"444d16243acbba48c0a415416c104b17a76f9c90","_id":"@orioro/expression@6.3.0","_nodeVersion":"12.21.0","_npmVersion":"6.14.11","dist":{"integrity":"sha512-QzHILnHec26l2Mzdb2tNcMeFI75Cs2d/QL+03ozAdXxFqtFcTqtUSrhnE1lO2Ta3uN7rCNjZHxNWJ6GM4nCfFg==","shasum":"0005beed5c290fd70f9ee93fda3882c700c51596","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-6.3.0.tgz","fileCount":47,"unpackedSize":198626,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgY5zZCRA9TVsSAnZWagAAF/sP/3zykSeOrqIg32HUeKMF\nXJXwObHdwna7AcDxEXZhr8R5WR0avZeLfz+N775anXsGbxWL5Yj2BOu3fXfA\nCtNtPkdWnzl4SM+BtPaHXLMz9Pme9S4duT+JIAKrCBPk6sZb+U/Euyaor4U3\nJyj3ivy3kJZNLl2HjzNO6wG/yVFLhsry30IfuQnaasV0PpzQtBJ1btHc4KHm\nMIZvmU5IixuBiGdmbJAE3h+sxOQBBT/IpEvBXeVUf4SwX/HPhVVpDDdFu4Zq\ntIdkOrjs4YiRGQddDm1Kp2VzLWwI92W9FYcjYNRDMZkN5FinhezoV7lvvmtX\n3bPAKlZQ19DLGc0Ey0+hTSSG/eLrAxQpr6gr5p92YPE1XYJsq7UkfQMcJwPn\nCgsunoZA9RIQjwsK5s4KyyIba+npvLjilMv+iUtoyFc6QkS6wQrXsH+VfWwl\noZ+uSWAhoHDkh04rBvhLx5gb1B0/6ZjG7REwuPQlrJXtcjJ4IzAbAdBkwH4C\nXLE9a/0EZUiIJhl1nLIJqAoDTIaj4lU+vLMgkqVeORsSkw1sn8BFqM9d/vvX\nax1icvKGY8NPkvGMFDGOWLr+YuKmI/DgbKdOJUM3xudVCI2fL/OKHofxmuGO\nuflp0VX9eAEBzqB+QLtOPWNsVhqi6G8eBDt9cWoG/KLZmhkrKDNUu4t+EPpX\nvecE\r\n=Zxdj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA766NY+QvICCh6k51dzIUyKOEP7QIZa5gL+P44A7MZ7AiAMvS/eiSwVSCegyCylxP3K75W/3+iYDDfQV3tT+OBbEw=="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_6.3.0_1617140953038_0.5715878190925394"},"_hasShrinkwrap":false},"6.4.0":{"name":"@orioro/expression","version":"6.4.0","description":"Framework of expression interpreters","keywords":["expression","eval","conditional"],"homepage":"https://github.com/orioro/node-expression","bugs":{"url":"https://github.com/orioro/node-expression/issues"},"repository":{"type":"git","url":"git+https://github.com/orioro/node-expression.git"},"main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/jest-util":"^1.5.0","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","regenerator-runtime":"^0.13.7","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/typing":"^4.4.0","lodash":"^4.17.20","mem":"^8.0.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\nFramework of expression interpreters.\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(testExp, array)`](#arrayeverytestexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(testExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `testExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n- [`$isType(type, value)`](#istypetype-value)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n##### `$isType(type, value)`\n\n- `type` {ExpectedType}\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Value\n\n- [`$value(path, defaultExp)`](#valuepath-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expression, scope)`](#evaluateexpression-scope)\n\n\n##### `$value(path, defaultExp)`\n\n- `path` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expression, scope)`\n\n- `expression` {[Expression](#expression)}\n- `scope` {Object}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"848251fbfe7dce010bdc29fff3bbec6558cc4f40","_id":"@orioro/expression@6.4.0","_nodeVersion":"12.22.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-Qg9dClNcYGixaZ7DhS9B7nuM5gqRG5AL9JjFloAKnINOEpopxwlAGJnqssTLxbcAmoheS/OhBhCvlZ0MJGzEyw==","shasum":"051401e645af98032369c28a694d76785b87a700","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-6.4.0.tgz","fileCount":47,"unpackedSize":202890,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJggw8pCRA9TVsSAnZWagAARq0QAJ5n20p1bDz68jOxHyF0\nNIpplz2tIJi9BF7i/bcE5pCHyrqHJZhXt14DQzu6h9pTnNSNoRdKfGjoiRvm\n7CGIK7/qsEVWynYIboLXKR3vy54pJNIY/8jaPnjYPQJH273GYsXYexvuwg1U\nlTvXNfS+tyY1qeih4QGNe33AJ4PH3CkxyiSB6drfMIMPqlEmwAfEdW5qy3C3\n7DXb0/RcaqaEqJ5V0SFVr4M7VVQp/Sf+Hr4U7xGga1dk9u86Vww4UvE4Zka6\nIduMLlYbgD1mWWjCGYUki9I+aKYBgUxpsmNRWtit83nKUc/Hr+TQt0uFPB06\nirJPcc6FqYWOeicBplyFu7tFYzXyv0fQGVFe1cGkHQ0NSdGON7+1DvS+aOQI\nop+5FgcaYCIi6LMPHq17Tc/um5yLNmCaBeUB2sWrUbeBXl+ggoHbl1XOW2yH\nmHjeBWJ8J22PuCgXLIHIaUobnEJ4NN4iDrFcZZF3q9Q6GfyKstD0DoaS3h3i\n+nqpAQirnZLOzD579IwZpV+3Hgrlzr+Odwjxk6uo22ATDe/JRvtLtnPGGMmr\ndZiwICEPYinKtlNnyfZ3HyxFUVDraVEelyjj0p7j/m5dGQ+rn+hhJdMHn8LU\nGrNqldStXItQwrCEhLGQKsLh8y33avxaIBhWIhDe/qI5TluTEdlS27b948Ml\nor1L\r\n=/q1t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG/CQRoRY0FzSu7s3/Yub/BaFPaYU9klXrNcuXjWnuYfAiEAmTI592gHUER7huF2bNTc1ck/+oEnCjUSBMbQCK9DwAo="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_6.4.0_1619201832497_0.5084164382945797"},"_hasShrinkwrap":false},"6.4.1":{"name":"@orioro/expression","version":"6.4.1","description":"Framework of expression interpreters","keywords":["expression","eval","conditional"],"homepage":"https://github.com/orioro/node-expression","bugs":{"url":"https://github.com/orioro/node-expression/issues"},"repository":{"type":"git","url":"git+https://github.com/orioro/node-expression.git"},"main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/jest-util":"^1.5.0","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","regenerator-runtime":"^0.13.7","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/typing":"^4.4.0","lodash":"^4.17.20","mem":"^8.0.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\nFramework of expression interpreters.\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(testExp, array)`](#arrayeverytestexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(testExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `testExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n- [`$try(expressionOrValue, catchExpressionOrValue)`](#tryexpressionorvalue-catchexpressionorvalue)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n##### `$try(expressionOrValue, catchExpressionOrValue)`\n\n- `expressionOrValue` {[Expression](#expression) | *}\n- `catchExpressionOrValue` {[Expression](#expression) | *}\n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringEndsWith(query, str)`](#stringendswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringEndsWith(query, str)`\n\n- `query` {String}\n- `str` {string}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n- [`$isType(type, value)`](#istypetype-value)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n##### `$isType(type, value)`\n\n- `type` {ExpectedType}\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Value\n\n- [`$value(path, defaultExp)`](#valuepath-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expression, scope)`](#evaluateexpression-scope)\n\n\n##### `$value(path, defaultExp)`\n\n- `path` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expression, scope)`\n\n- `expression` {[Expression](#expression)}\n- `scope` {Object}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"ac970c5e1bf27f8e35026b0630ada798ff56bed7","_id":"@orioro/expression@6.4.1","_nodeVersion":"12.22.1","_npmVersion":"6.14.11","dist":{"integrity":"sha512-zXomIkozFciRguzmX+z3FS7YsXW9spviHJaixX0R06MNgnn2atLv7g848dvO+zbQnsvk0M4HpJqAGw/ePlOJcQ==","shasum":"7daf5aa6f400cbf373e48ea584d72a38dcf40719","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-6.4.1.tgz","fileCount":47,"unpackedSize":205490,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghxalCRA9TVsSAnZWagAAwq4P/11DA90RvE5mu32JIYjO\n/Y8GmUxegnRFy+xz2A5s94mq6oKQFDr7C2ucJ/PHgGKnDPwNiiCpbb1qiKM7\n/HD5tW3k4Z+d7IIlrDhpKTL6umR94BVJs/p9L5odE+CRaH0+ovmHi7LOdt0q\n8xVrppzCRxOSZBCNLzbUSEYh8Q8AiSMxlDsi24+CSixXIgsW28bLdI6jVYjh\nUp+qsX61qnCNuCPrgmYOZz1MO1OVwzBygyoQ/yW1zfoPEp7dk8FwzxOsd+iL\nZ/vmBJQFNPd4E7Af1Clq7M1/Mfhg65wTwxLPMb4V3rqSBXtw/Ab41Bo+YBjR\n48XeyFkq85FbECvSOnVjH0SDIrffdTeMUU5p6HE4E6nymnkpN0oAyznibgwv\nkaP0Z0ahIQQqn3iULIoQObHhN2lFsUxqgAXS4iWneIZlK9npONxqogBLIVqh\n8+yL1BxRTXRqS2To+io4Ea6qgwEZ2gZLPJA7fwyAmzi/kyJygTT+3MvLezzQ\nbXcU6ZLkER0WD1xeTdMaFPOnTd04rk8n1TA2MFlokJGVIJv6gbjqOjIrUept\n8sQFcJHh/vluG2Ii7XXRrpVzujRcnerHNI3E2NCTdUktxejz+IIPnvIGn/JC\nDKKJpvTnd1P8i1NQ0wiWJZZd1ZJgG0UAxbToZM2jrIMIsQSy1My3RHxEapzY\n1iHk\r\n=5aiP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCKeHvQk34zQYRrweScGFlRUCKM8mfgLbEY20GQoKBD3gIgKZenVfaabtBfivnbbaSwCQ8+EC2LOUlVmSUDhJIEwZk="}]},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_6.4.1_1619465892783_0.44790351776302884"},"_hasShrinkwrap":false},"6.5.0":{"name":"@orioro/expression","version":"6.5.0","description":"Framework of expression interpreters","keywords":["expression","eval","conditional"],"homepage":"https://github.com/orioro/node-expression","bugs":{"url":"https://github.com/orioro/node-expression/issues"},"repository":{"type":"git","url":"git+https://github.com/orioro/node-expression.git"},"main":"dist/index.js","module":"dist/index.mjs","scripts":{"test":"jest --collectCoverage","dev":"jest --watch","build":"rm -rf dist && rollup --config ./rollup/build.config.js && yarn tsc:declaration","prepare":"yarn build","update-dependencies":"npx npm-check-updates -u","tsc:declaration":"tsc --declaration --emitDeclarationOnly --declarationDir dist","tsc:validate":"tsc --noEmit","commit":"cz","lint:eslint":"eslint src","lint:prettier":"prettier src --check","lint":"yarn lint:eslint && yarn lint:prettier","prettier":"prettier src","ci-check":"yarn test && yarn tsc:validate && yarn lint"},"author":"","license":"ISC","publishConfig":{"access":"public"},"devDependencies":{"@babel/core":"^7.11.5","@babel/preset-env":"^7.11.5","@babel/preset-typescript":"^7.10.4","@orioro/jest-util":"^1.5.0","@orioro/readme":"^1.0.1","@rollup/plugin-babel":"^5.2.0","@rollup/plugin-commonjs":"^15.0.0","@rollup/plugin-node-resolve":"^9.0.0","@types/jest":"^26.0.14","@typescript-eslint/eslint-plugin":"^4.15.0","@typescript-eslint/parser":"^4.15.0","babel-jest":"^26.3.0","commitizen":"^4.2.3","cz-conventional-changelog":"^3.3.0","eslint":"^7.20.0","eslint-config-prettier":"^7.2.0","eslint-plugin-jest":"^24.1.3","husky":"^5.0.9","jest":"^26.4.2","prettier":"2.2.1","regenerator-runtime":"^0.13.7","rollup":"^2.26.8","semantic-release":"^17.3.7","typescript":"^4.0.2"},"dependencies":{"@orioro/typing":"^5.0.2","lodash":"^4.17.20","mem":"^8.0.0"},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"release":{"plugins":["@semantic-release/commit-analyzer","@semantic-release/release-notes-generator","@semantic-release/npm","@semantic-release/github"]},"readme":"# node-expression\n\n```\nnpm install @orioro/expression\n```\n\nFramework of expression interpreters.\n\n# Use cases\n\n## Data querying\n\nMain modules: `comparison` and `object`\n\n```js\nconst person = {\n  givenName: 'João',\n  middleName: 'Cruz',\n  familyName: 'Silva',\n  age: 32,\n  interests: ['sport', 'music', 'books'],\n  mother: {\n    givenName: 'Maria',\n    familyName: 'Cruz',\n    age: 57\n  },\n  father: {\n    givenName: 'Pedro',\n    familyName: 'Silva',\n    age: 56\n  }\n}\n\nconst context = {\n  interpreters,\n  scope: { $$VALUE: person }\n}\n\n// Simple equality comparison\nevaluate(context, ['$objectMatches', { givenName: 'João' }]) // true\nevaluate(context, ['$objectMatches', { givenName: 'Maria' }]) // false\n\n// Use dot (.) path notation to access nested properties\nevaluate(context, ['$objectMatches', {\n  'mother.age': { $gte: 20, $lte: 50 },\n  'father.age': { $gte: 20, $lte: 50 }\n}]) // false\n```\n\n## Tree structure formatting\n\n```js\nTODO\n```\n\n## Conditional evaluation\n```js\nTODO\n// const context = {\n//   interpreters,\n//   scope: {\n//     $$VALUE: {\n//       name: 'João',\n//       interests: ['music', 'sports']\n//       age: 30\n//     }\n//   }\n// }\n\n// const cases = [\n//   [['$objectMatches', {\n//     interests: {\n//       $arrayIncludes: 'music'\n//     }\n//   }]]\n// ]\n```\n\n# API\n\n**Built-in expressions:**\n\n- [Array](#Array)\n- [Boolean](#Boolean)\n- [Comparison](#Comparison)\n- [Date](#Date)\n- [Functional](#Functional)\n- [Logical](#Logical)\n- [Math](#Math)\n- [Number](#Number)\n- [Object](#Object)\n- [String](#String)\n- [Type](#Type)\n- [Value](#Value)\n\n**External expression modules:**\n\n- [Date `@orioro/expression-date`](https://www.npmjs.com/package/@orioro/expression-date)\n- [RegExp `@orioro/expression-regexp`](https://www.npmjs.com/package/@orioro/expression-regexp)\n\n## Array\n\n- [`$arrayIncludes(searchValue, array)`](#arrayincludessearchvalue-array)\n- [`$arrayIncludesAll(searchValues, array)`](#arrayincludesallsearchvalues-array)\n- [`$arrayIncludesAny(searchValue, array)`](#arrayincludesanysearchvalue-array)\n- [`$arrayLength(array)`](#arraylengtharray)\n- [`$arrayReduce(reduceExp, start, array)`](#arrayreducereduceexp-start-array)\n- [`$arrayMap(mapExp, array)`](#arraymapmapexp-array)\n- [`$arrayEvery(testExp, array)`](#arrayeverytestexp-array)\n- [`$arraySome(someExp, array)`](#arraysomesomeexp-array)\n- [`$arrayFilter(queryExp, array)`](#arrayfilterqueryexp-array)\n- [`$arrayFindIndex(queryExp, array)`](#arrayfindindexqueryexp-array)\n- [`$arrayIndexOf(value, array)`](#arrayindexofvalue-array)\n- [`$arrayFind(queryExp, array)`](#arrayfindqueryexp-array)\n- [`$arrayReverse(array)`](#arrayreversearray)\n- [`$arraySort(sort, array)`](#arraysortsort-array)\n- [`$arrayPush(valueExp, array)`](#arraypushvalueexp-array)\n- [`$arrayPop(array)`](#arraypoparray)\n- [`$arrayUnshift(valueExp, array)`](#arrayunshiftvalueexp-array)\n- [`$arrayShift(array)`](#arrayshiftarray)\n- [`$arraySlice(start, end, array)`](#arrayslicestart-end-array)\n- [`$arrayReplace(indexOrRange, values, array)`](#arrayreplaceindexorrange-values-array)\n- [`$arrayAddAt(index, values, array)`](#arrayaddatindex-values-array)\n- [`$arrayRemoveAt(index, countExp, array)`](#arrayremoveatindex-countexp-array)\n- [`$arrayJoin(separator, array)`](#arrayjoinseparator-array)\n- [`$arrayAt(index, array)`](#arrayatindex-array)\n\n\n##### `$arrayIncludes(searchValue, array)`\n\nEquivalent of `Array.prototype.includes`.\n\n- `searchValue` {*}\n- `array` {Array}\n- Returns: `includes` {Boolean} \n\n##### `$arrayIncludesAll(searchValues, array)`\n\nSimilar to `$arrayIncludes`, but receives an array\nof values to be searched for and returns whether the\ncontext array contains all of the searched values.\n\n- `searchValues` {Array}\n- `array` {Array}\n- Returns: `includesAll` {Boolean} \n\n##### `$arrayIncludesAny(searchValue, array)`\n\nSimilar to `$arrayIncludes`, but returns true if\nany of the searched values is in the array.\n\n- `searchValue` {Array}\n- `array` {Array}\n- Returns: `includesAny` {Boolean} \n\n##### `$arrayLength(array)`\n\n- `array` {Array}\n- Returns: `length` {Number} \n\n##### `$arrayReduce(reduceExp, start, array)`\n\n- `reduceExp` {[Expression](#expression)}\n- `start` {*}\n- `array` {Array}\n\n##### `$arrayMap(mapExp, array)`\n\n- `mapExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayEvery(testExp, array)`\n\n`Array.prototype.every`\n\nResult is similar to logical operator `$and`. Main difference\n(and reason for existence as isolate expression) is that\n$arrayEvery exposes array iteration variables:\n`$$PARENT_SCOPE`, `$$VALUE`, `$$INDEX`, `$$ARRAY`\n\n- `testExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arraySome(someExp, array)`\n\n`Array.prototype.some`\n\n- `someExp` {[Expression](#expression)}\n- `array` {Array}\n\n##### `$arrayFilter(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayFindIndex(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayIndexOf(value, array)`\n\n- `value` {*}\n- `array` {Array}\n\n##### `$arrayFind(queryExp, array)`\n\n- `queryExp` {Boolean}\n- `array` {Array}\n\n##### `$arrayReverse(array)`\n\n- `array` {Array}\n\n##### `$arraySort(sort, array)`\n\n- `sort` {String | [Expression](#expression) | [Expression, string]}\n- `array` {Array}\n\n##### `$arrayPush(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayPop(array)`\n\n- `array` {Array}\n\n##### `$arrayUnshift(valueExp, array)`\n\n- `valueExp` {*}\n- `array` {Array}\n\n##### `$arrayShift(array)`\n\n- `array` {Array}\n\n##### `$arraySlice(start, end, array)`\n\n- `start` {Number}\n- `end` {Number}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayReplace(indexOrRange, values, array)`\n\n- `indexOrRange` {Number | [Number, Number]}\n- `values` {Array}\n- `array` {Array}\n- Returns: {Array} \n\n##### `$arrayAddAt(index, values, array)`\n\nAdds items at the given position.\n\n- `index` {Number}\n- `values` {* | Array}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array with items added at position\n\n##### `$arrayRemoveAt(index, countExp, array)`\n\n- `index` {Number}\n- `countExp` {Number}\n- `array` {Array}\n- Returns: `resultingArray` {Array} The array without the removed item\n\n##### `$arrayJoin(separator, array)`\n\n- `separator` {String}\n- `array` {Array}\n- Returns: {String} \n\n##### `$arrayAt(index, array)`\n\n- `index` {Number}\n- `array` {Array}\n- Returns: `value` {*} \n\n\n## Boolean\n\n- [`$boolean(value)`](#booleanvalue)\n\n\n##### `$boolean(value)`\n\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Comparison\n\n- [`$eq(referenceExp, valueExp)`](#eqreferenceexp-valueexp)\n- [`$notEq(referenceExp, valueExp)`](#noteqreferenceexp-valueexp)\n- [`$in(arrayExp, valueExp)`](#inarrayexp-valueexp)\n- [`$notIn(arrayExp, valueExp)`](#notinarrayexp-valueexp)\n- [`$gt(referenceExp, valueExp)`](#gtreferenceexp-valueexp)\n- [`$gte(referenceExp, valueExp)`](#gtereferenceexp-valueexp)\n- [`$lt(referenceExp, valueExp)`](#ltreferenceexp-valueexp)\n- [`$lte(referenceExp, valueExp)`](#ltereferenceexp-valueexp)\n- [`$matches(criteriaExp, valueExp)`](#matchescriteriaexp-valueexp)\n\n\n##### `$eq(referenceExp, valueExp)`\n\nChecks if the two values\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notEq(referenceExp, valueExp)`\n\n- `referenceExp` {*}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$in(arrayExp, valueExp)`\n\nChecks whether the value is in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$notIn(arrayExp, valueExp)`\n\nChecks whether the value is **not** in the given array.\n\n- `arrayExp` {Array}\n- `valueExp` {*}\n- Returns: {Boolean} \n\n##### `$gt(referenceExp, valueExp)`\n\nGreater than `value > threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$gte(referenceExp, valueExp)`\n\nGreater than or equal `value >= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lt(referenceExp, valueExp)`\n\nLesser than `value < threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$lte(referenceExp, valueExp)`\n\nLesser than or equal `value <= threshold`\n\n- `referenceExp` {Number}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n##### `$matches(criteriaExp, valueExp)`\n\nChecks if the value matches the set of criteria.\n\n- `criteriaExp` {Object}\n- `valueExp` {Number}\n- Returns: {Boolean} \n\n\n## Functional\n\n- [`$pipe(expressions)`](#pipeexpressions)\n- [`$try(expressionOrValue, catchExpressionOrValue)`](#tryexpressionorvalue-catchexpressionorvalue)\n\n\n##### `$pipe(expressions)`\n\n- `expressions` {[Expression](#expression)[]}\n- Returns: `pipeResult` {*} \n\n##### `$try(expressionOrValue, catchExpressionOrValue)`\n\n- `expressionOrValue` {[Expression](#expression) | *}\n- `catchExpressionOrValue` {[Expression](#expression) | *}\n\n\n## Logical\n\n- [`$and(expressionsExp)`](#andexpressionsexp)\n- [`$or(expressionsExp)`](#orexpressionsexp)\n- [`$not(expressionsExp)`](#notexpressionsexp)\n- [`$nor(expressionsExp)`](#norexpressionsexp)\n- [`$xor(expressionA, expressionB)`](#xorexpressiona-expressionb)\n- [`$if(conditionExp, thenExp, elseExp)`](#ifconditionexp-thenexp-elseexp)\n- [`$switch(cases, defaultExp)`](#switchcases-defaultexp)\n- [`$switchKey(cases, defaultExp, ValueExp)`](#switchkeycases-defaultexp-valueexp)\n\n\n##### `$and(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$or(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$not(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$nor(expressionsExp)`\n\n- `expressionsExp` {Array}\n- Returns: {Boolean} \n\n##### `$xor(expressionA, expressionB)`\n\n- `expressionA` {Boolean}\n- `expressionB` {Boolean}\n- Returns: {Boolean} \n\n##### `$if(conditionExp, thenExp, elseExp)`\n\n- `conditionExp` {Boolean}\n- `thenExp` {[Expression](#expression)}\n- `elseExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switch(cases, defaultExp)`\n\n- `cases` {Array}\n- `defaultExp` {[Expression](#expression)}\n- Returns: `result` {*} \n\n##### `$switchKey(cases, defaultExp, ValueExp)`\n\n- `cases` {Cases[]}\n  - `0` {String}\n  - `1` {*}\n- `defaultExp` {*}\n- `ValueExp` {String}\n- Returns: {*} \n\n\n## Math\n\n- [`$mathSum(sum, base)`](#mathsumsum-base)\n- [`$mathSub(subtract, base)`](#mathsubsubtract-base)\n- [`$mathMult(multiplier, base)`](#mathmultmultiplier-base)\n- [`$mathDiv(divisor, dividend)`](#mathdivdivisor-dividend)\n- [`$mathMod(divisor, dividend)`](#mathmoddivisor-dividend)\n- [`$mathPow(exponent, base)`](#mathpowexponent-base)\n- [`$mathAbs(value)`](#mathabsvalue)\n- [`$mathMax(otherValue, value)`](#mathmaxothervalue-value)\n- [`$mathMin(otherValue, value)`](#mathminothervalue-value)\n- [`$mathRound(value)`](#mathroundvalue)\n- [`$mathFloor(value)`](#mathfloorvalue)\n- [`$mathCeil(value)`](#mathceilvalue)\n\n\n##### `$mathSum(sum, base)`\n\n- `sum` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathSub(subtract, base)`\n\n- `subtract` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMult(multiplier, base)`\n\n- `multiplier` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathDiv(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMod(divisor, dividend)`\n\n- `divisor` {Number}\n- `dividend` {Number}\n- Returns: `result` {Number} \n\n##### `$mathPow(exponent, base)`\n\n- `exponent` {Number}\n- `base` {Number}\n- Returns: `result` {Number} \n\n##### `$mathAbs(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMax(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathMin(otherValue, value)`\n\n- `otherValue` {Number | Number[]}\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathRound(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathFloor(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n##### `$mathCeil(value)`\n\n- `value` {Number}\n- Returns: `result` {Number} \n\n\n## Number\n\n- [`$numberInt(radix, value)`](#numberintradix-value)\n- [`$numberFloat(value)`](#numberfloatvalue)\n\n\n##### `$numberInt(radix, value)`\n\n- `radix` {Number}\n- `value` {*}\n- Returns: {Number} \n\n##### `$numberFloat(value)`\n\n- `value` {*}\n- Returns: {Number} \n\n\n## Object\n\n- [`$objectMatches(criteriaByPath, value)`](#objectmatchescriteriabypath-value)\n- [`$objectFormat(format, source)`](#objectformatformat-source)\n- [`$objectDefaults(defaultValuesExp, base)`](#objectdefaultsdefaultvaluesexp-base)\n- [`$objectAssign(values, base)`](#objectassignvalues-base)\n- [`$objectKeys(object)`](#objectkeysobject)\n\n\n##### `$objectMatches(criteriaByPath, value)`\n\n- `criteriaByPath` {Object}\n- `value` {Object}\n- Returns: `matches` {Boolean} \n\n##### `$objectFormat(format, source)`\n\n- `format` {Object | Array}\n- `source` {*}\n- Returns: `object` {Object | Array} \n\n##### `$objectDefaults(defaultValuesExp, base)`\n\n- `defaultValuesExp` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectAssign(values, base)`\n\n- `values` {Object}\n- `base` {Object}\n- Returns: {Object} \n\n##### `$objectKeys(object)`\n\n- `object` {Object}\n- Returns: {String[]} \n\n\n## String\n\n- [`$string(value)`](#stringvalue)\n- [`$stringStartsWith(query, str)`](#stringstartswithquery-str)\n- [`$stringEndsWith(query, str)`](#stringendswithquery-str)\n- [`$stringLength(str)`](#stringlengthstr)\n- [`$stringSubstr(start, end, str)`](#stringsubstrstart-end-str)\n- [`$stringConcat(concat, base)`](#stringconcatconcat-base)\n- [`$stringTrim(str)`](#stringtrimstr)\n- [`$stringPadStart(targetLengthExp, padStringExp, str)`](#stringpadstarttargetlengthexp-padstringexp-str)\n- [`$stringPadEnd(targetLengthExp, padStringExp, str)`](#stringpadendtargetlengthexp-padstringexp-str)\n- [`$stringToUpperCase(value)`](#stringtouppercasevalue)\n- [`$stringToLowerCase(value)`](#stringtolowercasevalue)\n- [`INTERPOLATION_REGEXP`](#interpolation_regexp)\n- [`$stringInterpolate(data, template)`](#stringinterpolatedata-template)\n\n\n##### `$string(value)`\n\n- `value` {*}\n- Returns: {String} \n\n##### `$stringStartsWith(query, str)`\n\n- `query` {String}\n- `str` {String}\n- Returns: {Boolean} \n\n##### `$stringEndsWith(query, str)`\n\n- `query` {String}\n- `str` {string}\n- Returns: {Boolean} \n\n##### `$stringLength(str)`\n\n- `str` {String}\n- Returns: {Number} \n\n##### `$stringSubstr(start, end, str)`\n\n- `start` {Number}\n- `end` {Number}\n- `str` {String}\n\n##### `$stringConcat(concat, base)`\n\n- `concat` {String | String[]}\n- `base` {String}\n- Returns: {String} \n\n##### `$stringTrim(str)`\n\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadStart(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringPadEnd(targetLengthExp, padStringExp, str)`\n\n- `targetLengthExp` {Number}\n- `padStringExp` {String}\n- `str` {String}\n- Returns: {String} \n\n##### `$stringToUpperCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `$stringToLowerCase(value)`\n\n- `value` {String}\n- Returns: {String} \n\n##### `INTERPOLATION_REGEXP`\n\n/\\$\\{\\s*([\\w$.]+)\\s*\\}/g\n![](docs/resources/interpolation_regexp.png)\n\nRegExp used for matching interpolation expressions.\nAllows a non-interrupted sequence of alphanumeric chars ([A-Za-z0-9_]),\ndollar signs ($) and dots (.) wrapped in curly braces ({})\nwith or without any number of whitespace chars (' ') between braces and the\nvalue identifier.\n\nSome resources on RegExp safety concerning RegExp Denial of Service (ReDOS)\nthrough Catastrophic backtracking, for future study and reference:\n\n- [Catastrophic backtracking](https://www.regular-expressions.info/catastrophic.html)\n- [Regular expression visualizer](https://github.com/CJex/regulex)\n- [Validator.js](https://github.com/validatorjs/validator.js)\n- [Stack Overflow interesting question](https://stackoverflow.com/questions/63127145/safe-regex-patterns-from-redos-attack)\n- [Catastrophic backtracking - JavaScript Info](https://javascript.info/regexp-catastrophic-backtracking#preventing-backtracking)\n- [Google re2 library](https://github.com/google/re2)\n- [Google re2 for Node.js - re2](https://github.com/uhop/node-re2/)\n\n\n\n##### `$stringInterpolate(data, template)`\n\n- `data` {Object | Array}\n- `template` {String}\n\n\n## Type\n\n- [`$type(valueExp)`](#typevalueexp)\n- [`$isType(type, value)`](#istypetype-value)\n\n\n##### `$type(valueExp)`\n\n- `valueExp` {*}\n- Returns: `type` {String} Possible values:\n  - string\n  - regexp\n  - number\n  - bigint\n  - nan\n  - null\n  - undefined\n  - boolean\n  - function\n  - object\n  - array\n  - date\n  - symbol\n  - map\n  - set\n  - weakmap\n  - weakset\n\n##### `$isType(type, value)`\n\n- `type` {ExpectedType}\n- `value` {*}\n- Returns: {Boolean} \n\n\n## Value\n\n- [`$value(path, defaultExp)`](#valuepath-defaultexp)\n- [`$literal(value)`](#literalvalue)\n- [`$evaluate(expression, scope)`](#evaluateexpression-scope)\n\n\n##### `$value(path, defaultExp)`\n\n- `path` {String}\n- `defaultExp` {*}\n- Returns: `value` {*} \n\n##### `$literal(value)`\n\n- `value` {*}\n- Returns: {*} \n\n##### `$evaluate(expression, scope)`\n\n- `expression` {[Expression](#expression)}\n- `scope` {Object}\n- Returns: {*}\n","readmeFilename":"README.md","gitHead":"de4d77a576afda00de47e1412237941ff84e77e0","_id":"@orioro/expression@6.5.0","_nodeVersion":"12.22.12","_npmVersion":"6.14.11","dist":{"integrity":"sha512-6Faly2RXVyn/mbcbqLWQxMGGQCyKjfYYXwehuFfVprgRGfSt5gmhIC7HoxvtyBlSb9EkBcYTf3oUPDfvWwdKeA==","shasum":"ecb21e2f31b4ba4808cdfe435afa9df177ae9875","tarball":"https://registry.npmjs.org/@orioro/expression/-/expression-6.5.0.tgz","fileCount":47,"unpackedSize":205690,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDqUaQyBDxGGrxHN65CpZzuxekCIuRxZAUUSOXdbbqXQAiBN4Yi1D0WIR4C195ot3c6WLY7i4WXh6c1e/33+vsV29Q=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi+o3tACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrczg//SyxElpeJkLO32Rue31sM9hoZBoBdWIKYf9GLkDodWLYAi2Xt\r\nurS9zrWGfk7Ky0oFTA4in0+0GTaSBdbb2ikwWi5cf3aXyyN/izBaxQPXl1Fh\r\nuW2ANQu/edgD3mH9SZ12vS6Xm7Y0LA1Sm+iaAyLK3zOgdUXe41nBRT0YmEdq\r\n59+NzCXRmXECg7eR2rcRznuhIZbf4kglsepoBWs5GZCRM27V6xJYdILSpwkp\r\nzcvZxDQKFsZM+pm79hgKGyp5OtP7XcNPEW6xIROOPOmo/YBkqZzu1dcc4MZ/\r\nf/+m8drorQM0Nuskb7+5id6Vk9t7CvXTAAYNt2v7BwFRMSoBfHBMOJ+pgVR2\r\nIic+ItgFaJLkunwOXfemZjVB11RzOHG+Q+cWKgetbLqZNWZUWa1E2DG/+YYm\r\n1LhAeTcFVvw75/fWZ4Ad+JyhcMbFBd0HUBlUsCjk/h/l6FfYOBd/WVyEPh6a\r\n0c4svmlpK6vHprQj4oY05RAqPSCGrkdmg7weN5YtwYJUu5xd+QTtVRVEnAV9\r\nWoUA+pBNOXg9Df3YhD9Ho8cvwdLMSIZ11wiPMSo2AjdeVs2RnXZnMDgqr1Y/\r\n7Y2QhM3pKvmhEdq/LKxCjvVX/XWoF36AG46VjHM/qLTlUQIwj5ZzmkgLUogv\r\nXlSnJYCrdtPWc/7zd37pBZjHdGOZ+twgaj4=\r\n=HAqs\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"simonfan","email":"simon@orioro.design"},"directories":{},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/expression_6.5.0_1660587501625_0.6186776277106827"},"_hasShrinkwrap":false}},"time":{"created":"2020-10-23T20:32:25.296Z","0.1.0":"2020-10-23T20:32:25.613Z","modified":"2022-08-15T18:18:37.553Z","1.0.0-alpha.1":"2021-01-20T18:21:03.110Z","1.0.0-alpha.3":"2021-01-21T23:25:02.394Z","1.0.0-alpha.4":"2021-01-21T23:51:10.810Z","1.0.0-alpha.5":"2021-02-02T19:46:40.449Z","1.0.0":"2021-02-03T23:44:01.565Z","2.0.0":"2021-02-08T07:01:56.118Z","2.1.0":"2021-02-08T20:35:47.339Z","2.2.0":"2021-02-09T03:22:56.755Z","2.3.0":"2021-02-11T14:52:34.308Z","2.3.1":"2021-02-11T20:58:23.485Z","2.4.0":"2021-02-12T10:28:38.987Z","2.5.0":"2021-02-12T12:57:39.041Z","2.6.0":"2021-02-14T21:58:38.717Z","2.7.0":"2021-02-14T22:27:41.103Z","2.7.1":"2021-02-14T22:45:40.601Z","2.7.2":"2021-02-15T10:24:39.009Z","3.0.0":"2021-02-16T01:38:53.597Z","3.1.0":"2021-02-23T00:11:30.891Z","4.0.0":"2021-02-23T18:45:38.666Z","4.0.1":"2021-02-24T00:12:09.997Z","4.1.0":"2021-02-27T17:53:42.033Z","4.2.0":"2021-02-27T18:28:21.185Z","5.0.0":"2021-03-03T20:36:51.907Z","6.0.0":"2021-03-14T14:59:15.618Z","6.1.0":"2021-03-17T21:22:18.733Z","6.2.0":"2021-03-26T21:21:54.330Z","6.3.0":"2021-03-30T21:49:13.168Z","6.4.0":"2021-04-23T18:17:12.680Z","6.4.1":"2021-04-26T19:38:12.925Z","6.5.0":"2022-08-15T18:18:21.796Z"},"maintainers":[{"name":"simonfan","email":"simon@orioro.design"}],"license":"ISC","readme":"","readmeFilename":"","description":"``` npm install @orioro/expression ```"}