├── .eslintrc.json ├── .gitignore ├── .npmignore ├── .prettierrc.json ├── LICENSE ├── README.md ├── lib ├── index.ts └── oqo.ts ├── package-lock.json ├── package.json ├── test.js └── tsconfig.json /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true 4 | }, 5 | "parser": "@typescript-eslint/parser", 6 | "parserOptions": { 7 | "ecmaVersion": 6 8 | }, 9 | "extends": [ 10 | "plugin:prettier/recommended", 11 | "plugin:@typescript-eslint/recommended" 12 | ], 13 | "plugins": [ 14 | "prettier", 15 | "@typescript-eslint" 16 | ], 17 | "rules": { 18 | "@typescript-eslint/no-explicit-any": "off", 19 | "@typescript-eslint/explicit-module-boundary-types": "off" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /node_modules 3 | 4 | /dist 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /node_modules 3 | 4 | /lib 5 | tsconfig.json 6 | .eslintrc.json 7 | .prettierrc.json 8 | 9 | test.js 10 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 4, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 rulyox 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JavaScript Object Query Object 2 | 3 | OQO is a package which can help you to query from JavaScript objects. It is inspired by SQL. 4 | 5 | * [npm](https://www.npmjs.com/package/oqo) 6 | * [GitHub](https://github.com/rulyox/oqo) 7 | 8 | ## Installation 9 | 10 | ```shell script 11 | npm install oqo 12 | ``` 13 | 14 | ## Example 15 | 16 | ### Usage 17 | ```javascript 18 | const OQO = require('oqo'); 19 | 20 | const people = [ 21 | { name: 'John', age: 25, gender: 'male' }, 22 | { name: 'Alice', age: 14, gender: 'female' }, 23 | { name: 'Bob', age: 19, gender: 'male' }, 24 | { name: 'Charlie', age: 20, gender: 'female' }, 25 | { name: 'David', age: 21, gender: 'male' } 26 | ]; 27 | 28 | const result = OQO 29 | .select(['name', 'gender']) 30 | .from(people) 31 | .where('age >= 20') 32 | .order('age', 'desc') 33 | .run(); 34 | 35 | console.log(result); 36 | ``` 37 | 38 | ### Result 39 | ```javascript 40 | [ 41 | { name: 'John', gender: 'male' }, 42 | { name: 'David', gender: 'male' }, 43 | { name: 'Charlie', gender: 'female' } 44 | ] 45 | ``` 46 | 47 | ## Details 48 | 49 | ### select 50 | `select` is always needed. An array of keys should be passed. 51 | 52 | ### from 53 | `from` is always needed. A single object or an array of objects is needed. The objects should have the keys listed in `select`. 54 | 55 | ### where 56 | `where` can be used to give a condition. The condition should look like `key operator operand`(2 spaces are necessary). Currently, 5 operators (`>`, `>=`, `=`, `<`, `<=`) are supported. 57 | 58 | ### order 59 | `order` can be used to order the result objects by a key. `asc` or `desc` should be passed as a second value. 60 | 61 | ### run 62 | `run` is used to finish the query and get the results. 63 | -------------------------------------------------------------------------------- /lib/index.ts: -------------------------------------------------------------------------------- 1 | import { OQO } from './oqo'; 2 | 3 | export = new OQO(); 4 | -------------------------------------------------------------------------------- /lib/oqo.ts: -------------------------------------------------------------------------------- 1 | export class OQO { 2 | private selectList: string[]; 3 | private objectList: any[]; 4 | 5 | constructor() { 6 | this.selectList = []; 7 | this.objectList = []; 8 | } 9 | 10 | select(selectList: string[]): OQO { 11 | this.selectList = selectList; 12 | 13 | return this; 14 | } 15 | 16 | from(object: any): OQO { 17 | if (Array.isArray(object)) { 18 | // check if object array 19 | object.forEach((item) => { 20 | if (typeof item !== 'object') 21 | throw new Error( 22 | 'FROM clause needs an object or an array of objects!' 23 | ); 24 | }); 25 | 26 | this.objectList = object; 27 | } else { 28 | // check if single object 29 | if (typeof object === 'object') this.objectList = [object]; 30 | else 31 | throw new Error( 32 | 'FROM clause needs an object or an array of objects!' 33 | ); 34 | } 35 | 36 | return this; 37 | } 38 | 39 | where(condition: string): OQO { 40 | // parse condition 41 | const splitCondition = condition.split(' '); 42 | 43 | if (splitCondition.length !== 3) 44 | throw new Error('WHERE clause needs to have two spaces!'); 45 | 46 | const key = splitCondition[0]; 47 | const operator = splitCondition[1]; 48 | const operand = splitCondition[2]; 49 | 50 | if ( 51 | operator !== '>' && 52 | operator !== '>=' && 53 | operator !== '=' && 54 | operator !== '<' && 55 | operator !== '<=' 56 | ) 57 | throw new Error('WHERE clause needs to have the correct operator!'); 58 | 59 | // create conditional statement 60 | let statement: any; 61 | 62 | switch (operator) { 63 | case '>': 64 | statement = (item: any): boolean => 65 | isNaN(Number(item[`${key}`])) 66 | ? item[`${key}`] > operand 67 | : item[`${key}`] > Number(operand); 68 | 69 | break; 70 | 71 | case '>=': 72 | statement = (item: any): boolean => 73 | isNaN(Number(item[`${key}`])) 74 | ? item[`${key}`] >= operand 75 | : item[`${key}`] >= Number(operand); 76 | 77 | break; 78 | 79 | case '=': 80 | statement = (item: any) => 81 | isNaN(Number(item[`${key}`])) 82 | ? item[`${key}`] === operand 83 | : item[`${key}`] === Number(operand); 84 | 85 | break; 86 | 87 | case '<': 88 | statement = (item: any) => 89 | isNaN(Number(item[`${key}`])) 90 | ? item[`${key}`] < operand 91 | : item[`${key}`] < Number(operand); 92 | 93 | break; 94 | 95 | case '<=': 96 | statement = (item: any) => 97 | isNaN(Number(item[`${key}`])) 98 | ? item[`${key}`] <= operand 99 | : item[`${key}`] <= Number(operand); 100 | 101 | break; 102 | } 103 | 104 | // filter objects 105 | const objectList: any[] = []; 106 | 107 | this.objectList.forEach((item) => { 108 | if (statement(item)) objectList.push(item); 109 | }); 110 | 111 | this.objectList = objectList; 112 | 113 | return this; 114 | } 115 | 116 | order(key: string, type: string): OQO { 117 | if (type !== 'asc' && type !== 'desc') 118 | throw new Error('ORDER clause needs to have the correct type!'); 119 | 120 | const flip = type === 'asc' ? 1 : -1; 121 | const compare = (a: any, b: any): number => { 122 | if (a[`${key}`] < b[`${key}`]) return -1 * flip; 123 | else if (a[`${key}`] > b[`${key}`]) return flip; 124 | else return 0; 125 | }; 126 | 127 | this.objectList = this.objectList.sort(compare); 128 | 129 | return this; 130 | } 131 | 132 | run(): any[] { 133 | const objectList: any[] = []; 134 | 135 | // for all objects 136 | this.objectList.forEach((item) => { 137 | const object: any = {}; 138 | 139 | // filter selected keys 140 | this.selectList.forEach((key) => { 141 | object[`${key}`] = item[`${key}`]; 142 | }); 143 | 144 | objectList.push(object); 145 | }); 146 | 147 | this.objectList = objectList; 148 | 149 | return this.objectList; 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oqo", 3 | "version": "1.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.10.4", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 19 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.10.4", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 25 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.10.4", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | }, 32 | "dependencies": { 33 | "chalk": { 34 | "version": "2.4.2", 35 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 36 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 37 | "dev": true, 38 | "requires": { 39 | "ansi-styles": "^3.2.1", 40 | "escape-string-regexp": "^1.0.5", 41 | "supports-color": "^5.3.0" 42 | } 43 | } 44 | } 45 | }, 46 | "@types/color-name": { 47 | "version": "1.1.1", 48 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 49 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 50 | "dev": true 51 | }, 52 | "@types/eslint-visitor-keys": { 53 | "version": "1.0.0", 54 | "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 55 | "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", 56 | "dev": true 57 | }, 58 | "@types/json-schema": { 59 | "version": "7.0.5", 60 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", 61 | "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", 62 | "dev": true 63 | }, 64 | "@typescript-eslint/eslint-plugin": { 65 | "version": "3.9.0", 66 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.9.0.tgz", 67 | "integrity": "sha512-UD6b4p0/hSe1xdTvRCENSx7iQ+KR6ourlZFfYuPC7FlXEzdHuLPrEmuxZ23b2zW96KJX9Z3w05GE/wNOiEzrVg==", 68 | "dev": true, 69 | "requires": { 70 | "@typescript-eslint/experimental-utils": "3.9.0", 71 | "debug": "^4.1.1", 72 | "functional-red-black-tree": "^1.0.1", 73 | "regexpp": "^3.0.0", 74 | "semver": "^7.3.2", 75 | "tsutils": "^3.17.1" 76 | } 77 | }, 78 | "@typescript-eslint/experimental-utils": { 79 | "version": "3.9.0", 80 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.9.0.tgz", 81 | "integrity": "sha512-/vSHUDYizSOhrOJdjYxPNGfb4a3ibO8zd4nUKo/QBFOmxosT3cVUV7KIg8Dwi6TXlr667G7YPqFK9+VSZOorNA==", 82 | "dev": true, 83 | "requires": { 84 | "@types/json-schema": "^7.0.3", 85 | "@typescript-eslint/types": "3.9.0", 86 | "@typescript-eslint/typescript-estree": "3.9.0", 87 | "eslint-scope": "^5.0.0", 88 | "eslint-utils": "^2.0.0" 89 | } 90 | }, 91 | "@typescript-eslint/parser": { 92 | "version": "3.9.0", 93 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.9.0.tgz", 94 | "integrity": "sha512-rDHOKb6uW2jZkHQniUQVZkixQrfsZGUCNWWbKWep4A5hGhN5dLHMUCNAWnC4tXRlHedXkTDptIpxs6e4Pz8UfA==", 95 | "dev": true, 96 | "requires": { 97 | "@types/eslint-visitor-keys": "^1.0.0", 98 | "@typescript-eslint/experimental-utils": "3.9.0", 99 | "@typescript-eslint/types": "3.9.0", 100 | "@typescript-eslint/typescript-estree": "3.9.0", 101 | "eslint-visitor-keys": "^1.1.0" 102 | } 103 | }, 104 | "@typescript-eslint/types": { 105 | "version": "3.9.0", 106 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.9.0.tgz", 107 | "integrity": "sha512-rb6LDr+dk9RVVXO/NJE8dT1pGlso3voNdEIN8ugm4CWM5w5GimbThCMiMl4da1t5u3YwPWEwOnKAULCZgBtBHg==", 108 | "dev": true 109 | }, 110 | "@typescript-eslint/typescript-estree": { 111 | "version": "3.9.0", 112 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.9.0.tgz", 113 | "integrity": "sha512-N+158NKgN4rOmWVfvKOMoMFV5n8XxAliaKkArm/sOypzQ0bUL8MSnOEBW3VFIeffb/K5ce/cAV0yYhR7U4ALAA==", 114 | "dev": true, 115 | "requires": { 116 | "@typescript-eslint/types": "3.9.0", 117 | "@typescript-eslint/visitor-keys": "3.9.0", 118 | "debug": "^4.1.1", 119 | "glob": "^7.1.6", 120 | "is-glob": "^4.0.1", 121 | "lodash": "^4.17.15", 122 | "semver": "^7.3.2", 123 | "tsutils": "^3.17.1" 124 | } 125 | }, 126 | "@typescript-eslint/visitor-keys": { 127 | "version": "3.9.0", 128 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.9.0.tgz", 129 | "integrity": "sha512-O1qeoGqDbu0EZUC/MZ6F1WHTIzcBVhGqDj3LhTnj65WUA548RXVxUHbYhAW9bZWfb2rnX9QsbbP5nmeJ5Z4+ng==", 130 | "dev": true, 131 | "requires": { 132 | "eslint-visitor-keys": "^1.1.0" 133 | } 134 | }, 135 | "acorn": { 136 | "version": "7.4.0", 137 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", 138 | "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==", 139 | "dev": true 140 | }, 141 | "acorn-jsx": { 142 | "version": "5.2.0", 143 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", 144 | "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", 145 | "dev": true 146 | }, 147 | "ajv": { 148 | "version": "6.12.3", 149 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", 150 | "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", 151 | "dev": true, 152 | "requires": { 153 | "fast-deep-equal": "^3.1.1", 154 | "fast-json-stable-stringify": "^2.0.0", 155 | "json-schema-traverse": "^0.4.1", 156 | "uri-js": "^4.2.2" 157 | } 158 | }, 159 | "ansi-colors": { 160 | "version": "4.1.1", 161 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 162 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 163 | "dev": true 164 | }, 165 | "ansi-regex": { 166 | "version": "5.0.0", 167 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 168 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 169 | "dev": true 170 | }, 171 | "ansi-styles": { 172 | "version": "3.2.1", 173 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 174 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 175 | "dev": true, 176 | "requires": { 177 | "color-convert": "^1.9.0" 178 | } 179 | }, 180 | "argparse": { 181 | "version": "1.0.10", 182 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 183 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 184 | "dev": true, 185 | "requires": { 186 | "sprintf-js": "~1.0.2" 187 | } 188 | }, 189 | "astral-regex": { 190 | "version": "1.0.0", 191 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 192 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 193 | "dev": true 194 | }, 195 | "balanced-match": { 196 | "version": "1.0.0", 197 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 198 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 199 | "dev": true 200 | }, 201 | "brace-expansion": { 202 | "version": "1.1.11", 203 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 204 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 205 | "dev": true, 206 | "requires": { 207 | "balanced-match": "^1.0.0", 208 | "concat-map": "0.0.1" 209 | } 210 | }, 211 | "callsites": { 212 | "version": "3.1.0", 213 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 214 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 215 | "dev": true 216 | }, 217 | "chalk": { 218 | "version": "4.1.0", 219 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 220 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 221 | "dev": true, 222 | "requires": { 223 | "ansi-styles": "^4.1.0", 224 | "supports-color": "^7.1.0" 225 | }, 226 | "dependencies": { 227 | "ansi-styles": { 228 | "version": "4.2.1", 229 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 230 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 231 | "dev": true, 232 | "requires": { 233 | "@types/color-name": "^1.1.1", 234 | "color-convert": "^2.0.1" 235 | } 236 | }, 237 | "color-convert": { 238 | "version": "2.0.1", 239 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 240 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 241 | "dev": true, 242 | "requires": { 243 | "color-name": "~1.1.4" 244 | } 245 | }, 246 | "color-name": { 247 | "version": "1.1.4", 248 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 249 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 250 | "dev": true 251 | }, 252 | "has-flag": { 253 | "version": "4.0.0", 254 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 255 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 256 | "dev": true 257 | }, 258 | "supports-color": { 259 | "version": "7.1.0", 260 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 261 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 262 | "dev": true, 263 | "requires": { 264 | "has-flag": "^4.0.0" 265 | } 266 | } 267 | } 268 | }, 269 | "color-convert": { 270 | "version": "1.9.3", 271 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 272 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 273 | "dev": true, 274 | "requires": { 275 | "color-name": "1.1.3" 276 | } 277 | }, 278 | "color-name": { 279 | "version": "1.1.3", 280 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 281 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 282 | "dev": true 283 | }, 284 | "concat-map": { 285 | "version": "0.0.1", 286 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 287 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 288 | "dev": true 289 | }, 290 | "cross-spawn": { 291 | "version": "7.0.3", 292 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 293 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 294 | "dev": true, 295 | "requires": { 296 | "path-key": "^3.1.0", 297 | "shebang-command": "^2.0.0", 298 | "which": "^2.0.1" 299 | } 300 | }, 301 | "debug": { 302 | "version": "4.1.1", 303 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 304 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 305 | "dev": true, 306 | "requires": { 307 | "ms": "^2.1.1" 308 | } 309 | }, 310 | "deep-is": { 311 | "version": "0.1.3", 312 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 313 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 314 | "dev": true 315 | }, 316 | "doctrine": { 317 | "version": "3.0.0", 318 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 319 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 320 | "dev": true, 321 | "requires": { 322 | "esutils": "^2.0.2" 323 | } 324 | }, 325 | "emoji-regex": { 326 | "version": "7.0.3", 327 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 328 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 329 | "dev": true 330 | }, 331 | "enquirer": { 332 | "version": "2.3.6", 333 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 334 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 335 | "dev": true, 336 | "requires": { 337 | "ansi-colors": "^4.1.1" 338 | } 339 | }, 340 | "escape-string-regexp": { 341 | "version": "1.0.5", 342 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 343 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 344 | "dev": true 345 | }, 346 | "eslint": { 347 | "version": "7.6.0", 348 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.6.0.tgz", 349 | "integrity": "sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w==", 350 | "dev": true, 351 | "requires": { 352 | "@babel/code-frame": "^7.0.0", 353 | "ajv": "^6.10.0", 354 | "chalk": "^4.0.0", 355 | "cross-spawn": "^7.0.2", 356 | "debug": "^4.0.1", 357 | "doctrine": "^3.0.0", 358 | "enquirer": "^2.3.5", 359 | "eslint-scope": "^5.1.0", 360 | "eslint-utils": "^2.1.0", 361 | "eslint-visitor-keys": "^1.3.0", 362 | "espree": "^7.2.0", 363 | "esquery": "^1.2.0", 364 | "esutils": "^2.0.2", 365 | "file-entry-cache": "^5.0.1", 366 | "functional-red-black-tree": "^1.0.1", 367 | "glob-parent": "^5.0.0", 368 | "globals": "^12.1.0", 369 | "ignore": "^4.0.6", 370 | "import-fresh": "^3.0.0", 371 | "imurmurhash": "^0.1.4", 372 | "is-glob": "^4.0.0", 373 | "js-yaml": "^3.13.1", 374 | "json-stable-stringify-without-jsonify": "^1.0.1", 375 | "levn": "^0.4.1", 376 | "lodash": "^4.17.19", 377 | "minimatch": "^3.0.4", 378 | "natural-compare": "^1.4.0", 379 | "optionator": "^0.9.1", 380 | "progress": "^2.0.0", 381 | "regexpp": "^3.1.0", 382 | "semver": "^7.2.1", 383 | "strip-ansi": "^6.0.0", 384 | "strip-json-comments": "^3.1.0", 385 | "table": "^5.2.3", 386 | "text-table": "^0.2.0", 387 | "v8-compile-cache": "^2.0.3" 388 | } 389 | }, 390 | "eslint-config-prettier": { 391 | "version": "6.11.0", 392 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", 393 | "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", 394 | "dev": true, 395 | "requires": { 396 | "get-stdin": "^6.0.0" 397 | } 398 | }, 399 | "eslint-plugin-prettier": { 400 | "version": "3.1.4", 401 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", 402 | "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", 403 | "dev": true, 404 | "requires": { 405 | "prettier-linter-helpers": "^1.0.0" 406 | } 407 | }, 408 | "eslint-scope": { 409 | "version": "5.1.0", 410 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", 411 | "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", 412 | "dev": true, 413 | "requires": { 414 | "esrecurse": "^4.1.0", 415 | "estraverse": "^4.1.1" 416 | } 417 | }, 418 | "eslint-utils": { 419 | "version": "2.1.0", 420 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 421 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 422 | "dev": true, 423 | "requires": { 424 | "eslint-visitor-keys": "^1.1.0" 425 | } 426 | }, 427 | "eslint-visitor-keys": { 428 | "version": "1.3.0", 429 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 430 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 431 | "dev": true 432 | }, 433 | "espree": { 434 | "version": "7.2.0", 435 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", 436 | "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", 437 | "dev": true, 438 | "requires": { 439 | "acorn": "^7.3.1", 440 | "acorn-jsx": "^5.2.0", 441 | "eslint-visitor-keys": "^1.3.0" 442 | } 443 | }, 444 | "esprima": { 445 | "version": "4.0.1", 446 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 447 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 448 | "dev": true 449 | }, 450 | "esquery": { 451 | "version": "1.3.1", 452 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", 453 | "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", 454 | "dev": true, 455 | "requires": { 456 | "estraverse": "^5.1.0" 457 | }, 458 | "dependencies": { 459 | "estraverse": { 460 | "version": "5.2.0", 461 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 462 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 463 | "dev": true 464 | } 465 | } 466 | }, 467 | "esrecurse": { 468 | "version": "4.2.1", 469 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 470 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 471 | "dev": true, 472 | "requires": { 473 | "estraverse": "^4.1.0" 474 | } 475 | }, 476 | "estraverse": { 477 | "version": "4.3.0", 478 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 479 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 480 | "dev": true 481 | }, 482 | "esutils": { 483 | "version": "2.0.3", 484 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 485 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 486 | "dev": true 487 | }, 488 | "fast-deep-equal": { 489 | "version": "3.1.3", 490 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 491 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 492 | "dev": true 493 | }, 494 | "fast-diff": { 495 | "version": "1.2.0", 496 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", 497 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", 498 | "dev": true 499 | }, 500 | "fast-json-stable-stringify": { 501 | "version": "2.1.0", 502 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 503 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 504 | "dev": true 505 | }, 506 | "fast-levenshtein": { 507 | "version": "2.0.6", 508 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 509 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 510 | "dev": true 511 | }, 512 | "file-entry-cache": { 513 | "version": "5.0.1", 514 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 515 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 516 | "dev": true, 517 | "requires": { 518 | "flat-cache": "^2.0.1" 519 | } 520 | }, 521 | "flat-cache": { 522 | "version": "2.0.1", 523 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 524 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 525 | "dev": true, 526 | "requires": { 527 | "flatted": "^2.0.0", 528 | "rimraf": "2.6.3", 529 | "write": "1.0.3" 530 | } 531 | }, 532 | "flatted": { 533 | "version": "2.0.2", 534 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 535 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 536 | "dev": true 537 | }, 538 | "fs.realpath": { 539 | "version": "1.0.0", 540 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 541 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 542 | "dev": true 543 | }, 544 | "functional-red-black-tree": { 545 | "version": "1.0.1", 546 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 547 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 548 | "dev": true 549 | }, 550 | "get-stdin": { 551 | "version": "6.0.0", 552 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", 553 | "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", 554 | "dev": true 555 | }, 556 | "glob": { 557 | "version": "7.1.6", 558 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 559 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 560 | "dev": true, 561 | "requires": { 562 | "fs.realpath": "^1.0.0", 563 | "inflight": "^1.0.4", 564 | "inherits": "2", 565 | "minimatch": "^3.0.4", 566 | "once": "^1.3.0", 567 | "path-is-absolute": "^1.0.0" 568 | } 569 | }, 570 | "glob-parent": { 571 | "version": "5.1.1", 572 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 573 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 574 | "dev": true, 575 | "requires": { 576 | "is-glob": "^4.0.1" 577 | } 578 | }, 579 | "globals": { 580 | "version": "12.4.0", 581 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 582 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 583 | "dev": true, 584 | "requires": { 585 | "type-fest": "^0.8.1" 586 | } 587 | }, 588 | "has-flag": { 589 | "version": "3.0.0", 590 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 591 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 592 | "dev": true 593 | }, 594 | "ignore": { 595 | "version": "4.0.6", 596 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 597 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 598 | "dev": true 599 | }, 600 | "import-fresh": { 601 | "version": "3.2.1", 602 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 603 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 604 | "dev": true, 605 | "requires": { 606 | "parent-module": "^1.0.0", 607 | "resolve-from": "^4.0.0" 608 | } 609 | }, 610 | "imurmurhash": { 611 | "version": "0.1.4", 612 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 613 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 614 | "dev": true 615 | }, 616 | "inflight": { 617 | "version": "1.0.6", 618 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 619 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 620 | "dev": true, 621 | "requires": { 622 | "once": "^1.3.0", 623 | "wrappy": "1" 624 | } 625 | }, 626 | "inherits": { 627 | "version": "2.0.4", 628 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 629 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 630 | "dev": true 631 | }, 632 | "is-extglob": { 633 | "version": "2.1.1", 634 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 635 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 636 | "dev": true 637 | }, 638 | "is-fullwidth-code-point": { 639 | "version": "2.0.0", 640 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 641 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 642 | "dev": true 643 | }, 644 | "is-glob": { 645 | "version": "4.0.1", 646 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 647 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 648 | "dev": true, 649 | "requires": { 650 | "is-extglob": "^2.1.1" 651 | } 652 | }, 653 | "isexe": { 654 | "version": "2.0.0", 655 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 656 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 657 | "dev": true 658 | }, 659 | "js-tokens": { 660 | "version": "4.0.0", 661 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 662 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 663 | "dev": true 664 | }, 665 | "js-yaml": { 666 | "version": "3.14.0", 667 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", 668 | "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", 669 | "dev": true, 670 | "requires": { 671 | "argparse": "^1.0.7", 672 | "esprima": "^4.0.0" 673 | } 674 | }, 675 | "json-schema-traverse": { 676 | "version": "0.4.1", 677 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 678 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 679 | "dev": true 680 | }, 681 | "json-stable-stringify-without-jsonify": { 682 | "version": "1.0.1", 683 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 684 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 685 | "dev": true 686 | }, 687 | "levn": { 688 | "version": "0.4.1", 689 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 690 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 691 | "dev": true, 692 | "requires": { 693 | "prelude-ls": "^1.2.1", 694 | "type-check": "~0.4.0" 695 | } 696 | }, 697 | "lodash": { 698 | "version": "4.17.19", 699 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 700 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", 701 | "dev": true 702 | }, 703 | "minimatch": { 704 | "version": "3.0.4", 705 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 706 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 707 | "dev": true, 708 | "requires": { 709 | "brace-expansion": "^1.1.7" 710 | } 711 | }, 712 | "minimist": { 713 | "version": "1.2.5", 714 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 715 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 716 | "dev": true 717 | }, 718 | "mkdirp": { 719 | "version": "0.5.5", 720 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 721 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 722 | "dev": true, 723 | "requires": { 724 | "minimist": "^1.2.5" 725 | } 726 | }, 727 | "ms": { 728 | "version": "2.1.2", 729 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 730 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 731 | "dev": true 732 | }, 733 | "natural-compare": { 734 | "version": "1.4.0", 735 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 736 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 737 | "dev": true 738 | }, 739 | "once": { 740 | "version": "1.4.0", 741 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 742 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 743 | "dev": true, 744 | "requires": { 745 | "wrappy": "1" 746 | } 747 | }, 748 | "optionator": { 749 | "version": "0.9.1", 750 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 751 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 752 | "dev": true, 753 | "requires": { 754 | "deep-is": "^0.1.3", 755 | "fast-levenshtein": "^2.0.6", 756 | "levn": "^0.4.1", 757 | "prelude-ls": "^1.2.1", 758 | "type-check": "^0.4.0", 759 | "word-wrap": "^1.2.3" 760 | } 761 | }, 762 | "parent-module": { 763 | "version": "1.0.1", 764 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 765 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 766 | "dev": true, 767 | "requires": { 768 | "callsites": "^3.0.0" 769 | } 770 | }, 771 | "path-is-absolute": { 772 | "version": "1.0.1", 773 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 774 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 775 | "dev": true 776 | }, 777 | "path-key": { 778 | "version": "3.1.1", 779 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 780 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 781 | "dev": true 782 | }, 783 | "prelude-ls": { 784 | "version": "1.2.1", 785 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 786 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 787 | "dev": true 788 | }, 789 | "prettier": { 790 | "version": "2.0.5", 791 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", 792 | "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", 793 | "dev": true 794 | }, 795 | "prettier-linter-helpers": { 796 | "version": "1.0.0", 797 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 798 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 799 | "dev": true, 800 | "requires": { 801 | "fast-diff": "^1.1.2" 802 | } 803 | }, 804 | "progress": { 805 | "version": "2.0.3", 806 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 807 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 808 | "dev": true 809 | }, 810 | "punycode": { 811 | "version": "2.1.1", 812 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 813 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 814 | "dev": true 815 | }, 816 | "regexpp": { 817 | "version": "3.1.0", 818 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 819 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 820 | "dev": true 821 | }, 822 | "resolve-from": { 823 | "version": "4.0.0", 824 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 825 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 826 | "dev": true 827 | }, 828 | "rimraf": { 829 | "version": "2.6.3", 830 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 831 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 832 | "dev": true, 833 | "requires": { 834 | "glob": "^7.1.3" 835 | } 836 | }, 837 | "semver": { 838 | "version": "7.3.2", 839 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", 840 | "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", 841 | "dev": true 842 | }, 843 | "shebang-command": { 844 | "version": "2.0.0", 845 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 846 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 847 | "dev": true, 848 | "requires": { 849 | "shebang-regex": "^3.0.0" 850 | } 851 | }, 852 | "shebang-regex": { 853 | "version": "3.0.0", 854 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 855 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 856 | "dev": true 857 | }, 858 | "slice-ansi": { 859 | "version": "2.1.0", 860 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 861 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 862 | "dev": true, 863 | "requires": { 864 | "ansi-styles": "^3.2.0", 865 | "astral-regex": "^1.0.0", 866 | "is-fullwidth-code-point": "^2.0.0" 867 | } 868 | }, 869 | "sprintf-js": { 870 | "version": "1.0.3", 871 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 872 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 873 | "dev": true 874 | }, 875 | "string-width": { 876 | "version": "3.1.0", 877 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 878 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 879 | "dev": true, 880 | "requires": { 881 | "emoji-regex": "^7.0.1", 882 | "is-fullwidth-code-point": "^2.0.0", 883 | "strip-ansi": "^5.1.0" 884 | }, 885 | "dependencies": { 886 | "ansi-regex": { 887 | "version": "4.1.0", 888 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 889 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 890 | "dev": true 891 | }, 892 | "strip-ansi": { 893 | "version": "5.2.0", 894 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 895 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 896 | "dev": true, 897 | "requires": { 898 | "ansi-regex": "^4.1.0" 899 | } 900 | } 901 | } 902 | }, 903 | "strip-ansi": { 904 | "version": "6.0.0", 905 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 906 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 907 | "dev": true, 908 | "requires": { 909 | "ansi-regex": "^5.0.0" 910 | } 911 | }, 912 | "strip-json-comments": { 913 | "version": "3.1.1", 914 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 915 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 916 | "dev": true 917 | }, 918 | "supports-color": { 919 | "version": "5.5.0", 920 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 921 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 922 | "dev": true, 923 | "requires": { 924 | "has-flag": "^3.0.0" 925 | } 926 | }, 927 | "table": { 928 | "version": "5.4.6", 929 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 930 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 931 | "dev": true, 932 | "requires": { 933 | "ajv": "^6.10.2", 934 | "lodash": "^4.17.14", 935 | "slice-ansi": "^2.1.0", 936 | "string-width": "^3.0.0" 937 | } 938 | }, 939 | "text-table": { 940 | "version": "0.2.0", 941 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 942 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 943 | "dev": true 944 | }, 945 | "tslib": { 946 | "version": "1.13.0", 947 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 948 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", 949 | "dev": true 950 | }, 951 | "tsutils": { 952 | "version": "3.17.1", 953 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", 954 | "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", 955 | "dev": true, 956 | "requires": { 957 | "tslib": "^1.8.1" 958 | } 959 | }, 960 | "type-check": { 961 | "version": "0.4.0", 962 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 963 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 964 | "dev": true, 965 | "requires": { 966 | "prelude-ls": "^1.2.1" 967 | } 968 | }, 969 | "type-fest": { 970 | "version": "0.8.1", 971 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 972 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 973 | "dev": true 974 | }, 975 | "typescript": { 976 | "version": "3.9.7", 977 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", 978 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", 979 | "dev": true 980 | }, 981 | "uri-js": { 982 | "version": "4.2.2", 983 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 984 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 985 | "dev": true, 986 | "requires": { 987 | "punycode": "^2.1.0" 988 | } 989 | }, 990 | "v8-compile-cache": { 991 | "version": "2.1.1", 992 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", 993 | "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", 994 | "dev": true 995 | }, 996 | "which": { 997 | "version": "2.0.2", 998 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 999 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1000 | "dev": true, 1001 | "requires": { 1002 | "isexe": "^2.0.0" 1003 | } 1004 | }, 1005 | "word-wrap": { 1006 | "version": "1.2.3", 1007 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1008 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1009 | "dev": true 1010 | }, 1011 | "wrappy": { 1012 | "version": "1.0.2", 1013 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1014 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1015 | "dev": true 1016 | }, 1017 | "write": { 1018 | "version": "1.0.3", 1019 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1020 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1021 | "dev": true, 1022 | "requires": { 1023 | "mkdirp": "^0.5.1" 1024 | } 1025 | } 1026 | } 1027 | } 1028 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oqo", 3 | "version": "1.0.1", 4 | "description": "JavaScript Object Query Object", 5 | "keywords": [ 6 | "oqo", 7 | "query" 8 | ], 9 | "author": { 10 | "name": "rulyox", 11 | "email": "email@rulyox.com", 12 | "url": "https://rulyox.com" 13 | }, 14 | "license": "MIT", 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/rulyox/oqo" 18 | }, 19 | "main": "dist/index.js", 20 | "scripts": { 21 | "lint": "eslint lib/** || exit 0", 22 | "fix": "eslint --fix lib/**" 23 | }, 24 | "devDependencies": { 25 | "@typescript-eslint/eslint-plugin": "^3.9.0", 26 | "@typescript-eslint/parser": "^3.9.0", 27 | "eslint": "^7.6.0", 28 | "eslint-config-prettier": "^6.11.0", 29 | "eslint-plugin-prettier": "^3.1.4", 30 | "prettier": "^2.0.5", 31 | "typescript": "^3.9.7" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | const OQO = require('./dist'); 2 | 3 | const people = [ 4 | { name: 'John', age: 25, gender: 'male' }, 5 | { name: 'Alice', age: 14, gender: 'female' }, 6 | { name: 'Bob', age: 19, gender: 'male' }, 7 | { name: 'Charlie', age: 20, gender: 'female' }, 8 | { name: 'David', age: 21, gender: 'male' } 9 | ]; 10 | 11 | const result = OQO 12 | .select(['name', 'gender']) 13 | .from(people) 14 | .where('age >= 20') 15 | .order('age', 'desc') 16 | .run(); 17 | 18 | console.log(result); 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "strict": true, 6 | "declaration": true, 7 | "outDir": "./dist" 8 | } 9 | } 10 | --------------------------------------------------------------------------------