├── .circleci └── config.yml ├── .eslintrc.json ├── .gitignore ├── CHANGELOG.md ├── README.md ├── index.js ├── package-lock.json ├── package.json └── test ├── array-items.test.js ├── clone_schema.test.js ├── combination_keywords.test.js ├── complex_schemas.test.js ├── const.test.js ├── exclusiveMinMax.test.js ├── helpers.js ├── if-then-else.test.js ├── invalid_types.test.js ├── items.test.js ├── nullable.test.js ├── pattern_properties.test.js ├── properties.test.js ├── readonly_writeonly.test.js ├── schemas ├── address │ ├── json-schema.json │ └── openapi.json ├── basic │ ├── json-schema.json │ └── openapi.json ├── calendar │ ├── json-schema.json │ └── openapi.json ├── example2 │ ├── json-schema.json │ └── openapi.json └── invalid │ └── json-schema.json └── subschema.test.js /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | shared: &shared 3 | docker: 4 | - image: circleci/node:latest 5 | steps: 6 | - checkout 7 | - restore_cache: 8 | key: dependency-cache-{{ checksum "package.json" }} 9 | - run: 10 | name: Update npm 11 | command: 'sudo npm install -g npm@latest' 12 | - run: 13 | name: Install npm dependencies 14 | command: npm install 15 | - save_cache: 16 | key: dependency-cache-{{ checksum "package.json" }} 17 | paths: 18 | - node_modules 19 | - run: 20 | name: Tests 21 | command: npm test 22 | # - run: 23 | # name: Report Coverage 24 | # command: npm run coverage 25 | 26 | jobs: 27 | node-latest: 28 | <<: *shared 29 | 30 | node-10: 31 | docker: 32 | - image: circleci/node:10 33 | <<: *shared 34 | 35 | node-9: 36 | docker: 37 | - image: circleci/node:9 38 | <<: *shared 39 | 40 | node-8: 41 | docker: 42 | - image: circleci/node:8 43 | <<: *shared 44 | 45 | workflows: 46 | version: 2 47 | commit: 48 | jobs: 49 | - node-latest 50 | - node-10 51 | - node-9 52 | - node-8 53 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es6": true, 4 | "node": true 5 | }, 6 | "extends": "eslint:recommended", 7 | "rules": { 8 | "indent": [ 9 | "error", 10 | "tab", 11 | {"SwitchCase": 1} 12 | ], 13 | "linebreak-style": [ 14 | "error", 15 | "unix" 16 | ], 17 | "quotes": [ 18 | "error", 19 | "single" 20 | ], 21 | "semi": [ 22 | "error", 23 | "always" 24 | ] 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build.sh 2 | .coveralls.yml 3 | .node-version 4 | .nyc_output 5 | yarn.lock 6 | resolved.yaml 7 | 8 | # Logs 9 | logs 10 | *.log 11 | npm-debug.log* 12 | 13 | # Directory for instrumented libs generated by jscoverage/JSCover 14 | lib-cov 15 | 16 | # Coverage directory used by tools like istanbul 17 | coverage 18 | 19 | # Grunt intermediate storage 20 | # (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) 5 | and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). 6 | 7 | ## [Unreleased] 8 | 9 | ## [0.3.0] - 2018-12-18 10 | ### Added 11 | - Create empty items, as it must always be present for type: array 12 | - Rewrite exclusiveMinimum/exclusiveMaximum 13 | - Rewrite if/then/else as oneOf + allOf 14 | - Rewrite const as single element enum 15 | 16 | ## [0.2.0] - 2018-05-10 17 | ### Fixed 18 | - Implemented [@cloudflare/json-schema-walker] to make sure all subschemas are 19 | processed 20 | 21 | [@cloudflare/json-schema-walker]: https://github.com/cloudflare/json-schema-tools#cloudflarejson-schema-walker 22 | 23 | ## [0.1.1] - 2018-04-09 24 | ### Added 25 | - Convert `dependencies` to an allOf + oneOf OpenAPI-valid equivalent 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JSON Schema to OpenAPI Schema 2 | 3 | A little NodeJS package to convert JSON Schema to [OpenAPI Schema Objects](https://swagger.io/specification/#schemaObject). 4 | 5 | ## Features 6 | 7 | * converts JSON Schema Draft 00 Wright (a.k.a draft v5) to OpenAPI 3.0 Schema Object 8 | * switches `type: ['foo', 'null']` to `type: foo` and `nullable: true` 9 | * supports deep structures with nested `allOf`s etc. 10 | * switches `patternProperties` to `x-patternProperties` 11 | * converts `dependencies` to an allOf + oneOf OpenAPI-valid equivalent 12 | 13 | ## Installation 14 | 15 | ``` 16 | npm install --save json-schema-to-openapi-schema 17 | ``` 18 | 19 | ## Usage 20 | 21 | Here's a small example to get the idea: 22 | 23 | ```js 24 | const toOpenApi = require('json-schema-to-openapi-schema'); 25 | 26 | const schema = { 27 | '$schema': 'http://json-schema.org/draft-04/schema#', 28 | type: ['string', 'null'], 29 | format: 'date-time', 30 | }; 31 | 32 | const convertedSchema = toOpenApi(schema); 33 | 34 | console.log(convertedSchema); 35 | ``` 36 | 37 | The example prints out 38 | 39 | ```js 40 | { 41 | type: 'string', 42 | format: 'date-time', 43 | nullable: true 44 | } 45 | ``` 46 | 47 | **NOTE**: `$ref`s are not dereferenced. Use a dereferencer such as [json-schema-ref-parser](https://www.npmjs.com/package/json-schema-ref-parser) prior to using this package. 48 | 49 | ### Options 50 | 51 | The function accepts `options` object as the second argument. 52 | 53 | #### `cloneSchema` (boolean) 54 | 55 | If set to `false`, converts the provided schema in place. If `true`, clones the schema by converting it to JSON and back. The overhead of the cloning is usually negligible. Defaults to `true`. 56 | 57 | 58 | ## Why? 59 | 60 | OpenAPI is often described as an extension of JSON Schema, but both specs have changed over time and grown independently. OpenAPI v2 was based on JSON Schema draft v4 with a long list of deviations, but OpenAPI v3 shrank that list, upping their support to draft v4 and making the list of discrepancies shorter. Despite OpenAPI v3 closing the gap, the issue of JSON Schema divergence has not been resolved fully. 61 | 62 | ![Diagram showing data model (the objects, payload bodies, etc) and service model (endpoints, headers, metadata, etc)](https://cdn-images-1.medium.com/max/1600/0*hijIL-3Xa5EFZ783.png) 63 | 64 | Carefully writing JSON Schema for your data model kiiiinda works, but it is possible to write JSON Schema that creates invalid OpenAPI, and vice versa. For more on this, read the article [_OpenAPI and JSON Schema Divergence_](https://blog.apisyouwonthate.com/openapi-and-json-schema-divergence-part-1-1daf6678d86e). 65 | 66 | This tool sets out to allow folks to convert from JSON Schema (their one source of truth for everything) to OpenAPI (a thing for HTML docs and making SDKs). 67 | 68 | ## Versions 69 | 70 | - **From:** [JSON Schema Draft v5 †](http://json-schema.org/specification-links.html#draft-5) 71 | - **To:** [OpenAPI 3.0](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md) 72 | 73 | _† Draft v5 is also known as Draft Wright 00, as the drafts are often named after the author, and this was the first one by A. Wright. Amongst other things, draft v5 aimed to rewrite the meta files, but the experiment failed, meaning we need to continue to use the draft v4 metafiles. Ugh._ 74 | 75 | ## TODO 76 | 77 | - [ ] Support later JSON Schema drafts via [cloudflare/json-schema-transformer] when it adds that functionality 78 | 79 | ## Converting Back 80 | 81 | To convert the other way, check out [openapi-schema-to-json-schema], which this package was based on. 82 | 83 | ## Tests 84 | 85 | To run the test-suite: 86 | 87 | ```shell 88 | npm test 89 | ``` 90 | 91 | ## Credits 92 | 93 | - [mikunn] for creating [openapi-schema-to-json-schema] which this is based on 94 | - [Phil Sturgeon] for flipping that conversion script about face 95 | - [All Contributors][link-contributors] 96 | 97 | [mikunn]: https://github.com/mikunn 98 | [Phil Sturgeon]: https://github.com/philsturgeon 99 | [openapi-schema-to-json-schema]: https://github.com/mikunn/openapi-schema-to-json-schema 100 | [link-contributors]: https://github.com/wework/json-schema-to-openapi-schema/graphs/contributors 101 | [cloudflare/json-schema-transformer]: https://github.com/cloudflare/json-schema-tools/blob/master/workspaces/json-schema-transform/README.md 102 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const schemaWalker = require('@cloudflare/json-schema-walker'); 2 | 3 | function InvalidTypeError(message) { 4 | this.name = 'InvalidTypeError'; 5 | this.message = message; 6 | } 7 | 8 | InvalidTypeError.prototype = new Error(); 9 | 10 | function convert(schema, options = {}) { 11 | const { cloneSchema = true } = options; 12 | 13 | if (cloneSchema) { 14 | schema = JSON.parse(JSON.stringify(schema)); 15 | } 16 | 17 | const vocab = schemaWalker.getVocabulary(schema, schemaWalker.vocabularies.DRAFT_04); 18 | schemaWalker.schemaWalk(schema, convertSchema, null, vocab); 19 | return schema; 20 | } 21 | 22 | function stripIllegalKeywords(schema) { 23 | delete schema['$schema']; 24 | delete schema['$id']; 25 | delete schema['id']; 26 | return schema; 27 | } 28 | 29 | function convertSchema(schema, path, parent, parentPath) { 30 | schema = stripIllegalKeywords(schema); 31 | schema = convertTypes(schema); 32 | schema = rewriteConst(schema); 33 | schema = convertDependencies(schema); 34 | schema = rewriteIfThenElse(schema); 35 | schema = rewriteExclusiveMinMax(schema); 36 | 37 | if (typeof schema['patternProperties'] === 'object') { 38 | schema = convertPatternProperties(schema); 39 | } 40 | 41 | if (schema.type === 'array' && typeof schema.items === 'undefined') { 42 | schema.items = {}; 43 | } 44 | 45 | return schema; 46 | } 47 | 48 | function validateType(type) { 49 | const validTypes = ['null', 'boolean', 'object', 'array', 'number', 'string', 'integer']; 50 | const types = Array.isArray(type) ? type : [type]; 51 | types.forEach(type => { 52 | if (validTypes.indexOf(type) < 0 && type !== undefined) 53 | throw new InvalidTypeError('Type "' + type + '" is not a valid type'); 54 | }); 55 | } 56 | 57 | function convertDependencies(schema) { 58 | const deps = schema.dependencies; 59 | if (typeof deps !== 'object') { 60 | return schema; 61 | } 62 | 63 | // Turns the dependencies keyword into an allOf of oneOf's 64 | // "dependencies": { 65 | // "post-office-box": ["street-address"] 66 | // }, 67 | // 68 | // becomes 69 | // 70 | // "allOf": [ 71 | // { 72 | // "oneOf": [ 73 | // {"not": {"required": ["post-office-box"]}}, 74 | // {"required": ["post-office-box", "street-address"]} 75 | // ] 76 | // } 77 | // 78 | 79 | delete schema['dependencies']; 80 | if (!Array.isArray(schema.allOf)) { 81 | schema.allOf = []; 82 | } 83 | 84 | for (const key in deps) { 85 | const foo = { 86 | 'oneOf': [ 87 | { 88 | 'not': { 89 | 'required': [key] 90 | } 91 | }, 92 | { 93 | 'required': [].concat(key, deps[key]) 94 | } 95 | ] 96 | }; 97 | schema.allOf.push(foo); 98 | } 99 | return schema; 100 | } 101 | 102 | function convertTypes(schema) { 103 | if (schema.type === undefined) { 104 | return schema; 105 | } 106 | 107 | validateType(schema.type); 108 | 109 | if (Array.isArray(schema.type)) { 110 | 111 | if (schema.type.length > 2 || !schema.type.includes('null')) { 112 | throw new Error('Type of ' + schema.type.join(',') + ' is too confusing for OpenAPI to understand. Found in ' + JSON.stringify(schema)); 113 | } 114 | 115 | switch (schema.type.length) { 116 | case 0: 117 | delete schema.type; 118 | break; 119 | 120 | case 1: 121 | if (schema.type === 'null') { 122 | schema.nullable = true; 123 | } 124 | else { 125 | schema.type = schema.type[0]; 126 | } 127 | break; 128 | 129 | default: 130 | schema.type = schema.type.find(type => type !== 'null'); 131 | schema.nullable = true; 132 | } 133 | } 134 | else if (schema.type === 'null') { 135 | delete schema.type; 136 | schema.nullable = true; 137 | } 138 | 139 | return schema; 140 | } 141 | 142 | // "patternProperties did not make it into OpenAPI v3.0" 143 | // https://github.com/OAI/OpenAPI-Specification/issues/687 144 | function convertPatternProperties(schema) { 145 | schema['x-patternProperties'] = schema['patternProperties']; 146 | delete schema['patternProperties']; 147 | if (typeof schema.additionalProperties === 'undefined') schema.additionalProperties = true; 148 | return schema; 149 | } 150 | 151 | function rewriteConst(schema) { 152 | if (schema.const) { 153 | schema.enum = [ schema.const ]; 154 | delete schema.const; 155 | } 156 | return schema; 157 | } 158 | 159 | function rewriteIfThenElse(schema) { 160 | /* @handrews https://github.com/OAI/OpenAPI-Specification/pull/1766#issuecomment-442652805 161 | if and the *Of keywords 162 | 163 | There is a really easy solution for implementations, which is that 164 | 165 | if: X, then: Y, else: Z 166 | 167 | is equivalent to 168 | 169 | oneOf: [allOf: [X, Y], allOf: [not: X, Z]] 170 | */ 171 | if (schema.if && schema.then) { 172 | schema.oneOf = [ { allOf: [ schema.if, schema.then ] }, 173 | { allOf: [ { not: schema.if }, schema.else ] } ]; 174 | delete schema.if; 175 | delete schema.then; 176 | delete schema.else; 177 | } 178 | return schema; 179 | } 180 | 181 | function rewriteExclusiveMinMax(schema) { 182 | if (typeof schema.exclusiveMaximum === 'number') { 183 | schema.maximum = schema.exclusiveMaximum; 184 | schema.exclusiveMaximum = true; 185 | } 186 | if (typeof schema.exclusiveMinimum === 'number') { 187 | schema.minimum = schema.exclusiveMinimum; 188 | schema.exclusiveMinimum = true; 189 | } 190 | return schema; 191 | } 192 | 193 | module.exports = convert; 194 | 195 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "json-schema-to-openapi-schema", 3 | "version": "0.3.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@cloudflare/json-schema-walker": { 8 | "version": "0.1.1", 9 | "resolved": "https://registry.npmjs.org/@cloudflare/json-schema-walker/-/json-schema-walker-0.1.1.tgz", 10 | "integrity": "sha512-P3n0hEgk1m6uKWgL4Yb1owzXVG4pM70G4kRnDQxZXiVvfCRtaqiHu+ZRiRPzmwGBiLTO1LWc2yR1M8oz0YkXww==" 11 | }, 12 | "ajv": { 13 | "version": "6.6.2", 14 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", 15 | "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", 16 | "dev": true, 17 | "requires": { 18 | "fast-deep-equal": "^2.0.1", 19 | "fast-json-stable-stringify": "^2.0.0", 20 | "json-schema-traverse": "^0.4.1", 21 | "uri-js": "^4.2.2" 22 | } 23 | }, 24 | "argparse": { 25 | "version": "1.0.10", 26 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 27 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 28 | "dev": true, 29 | "requires": { 30 | "sprintf-js": "~1.0.2" 31 | } 32 | }, 33 | "asn1": { 34 | "version": "0.2.4", 35 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 36 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 37 | "dev": true, 38 | "requires": { 39 | "safer-buffer": "~2.1.0" 40 | } 41 | }, 42 | "assert-plus": { 43 | "version": "1.0.0", 44 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 45 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 46 | "dev": true 47 | }, 48 | "asynckit": { 49 | "version": "0.4.0", 50 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 51 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 52 | "dev": true 53 | }, 54 | "aws-sign2": { 55 | "version": "0.7.0", 56 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 57 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 58 | "dev": true 59 | }, 60 | "aws4": { 61 | "version": "1.8.0", 62 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 63 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 64 | "dev": true 65 | }, 66 | "balanced-match": { 67 | "version": "1.0.0", 68 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 69 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 70 | "dev": true 71 | }, 72 | "bcrypt-pbkdf": { 73 | "version": "1.0.2", 74 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 75 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 76 | "dev": true, 77 | "requires": { 78 | "tweetnacl": "^0.14.3" 79 | } 80 | }, 81 | "brace-expansion": { 82 | "version": "1.1.8", 83 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 84 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 85 | "dev": true, 86 | "requires": { 87 | "balanced-match": "^1.0.0", 88 | "concat-map": "0.0.1" 89 | } 90 | }, 91 | "browser-stdout": { 92 | "version": "1.3.1", 93 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 94 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 95 | "dev": true 96 | }, 97 | "caseless": { 98 | "version": "0.12.0", 99 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 100 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 101 | "dev": true 102 | }, 103 | "combined-stream": { 104 | "version": "1.0.7", 105 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 106 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 107 | "dev": true, 108 | "requires": { 109 | "delayed-stream": "~1.0.0" 110 | } 111 | }, 112 | "commander": { 113 | "version": "2.11.0", 114 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 115 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 116 | "dev": true 117 | }, 118 | "concat-map": { 119 | "version": "0.0.1", 120 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 121 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 122 | "dev": true 123 | }, 124 | "core-util-is": { 125 | "version": "1.0.2", 126 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 127 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 128 | "dev": true 129 | }, 130 | "coveralls": { 131 | "version": "3.0.0", 132 | "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.0.tgz", 133 | "integrity": "sha512-ZppXR9y5PraUOrf/DzHJY6gzNUhXYE3b9D43xEXs4QYZ7/Oe0Gy0CS+IPKWFfvQFXB3RG9QduaQUFehzSpGAFw==", 134 | "dev": true, 135 | "requires": { 136 | "js-yaml": "^3.6.1", 137 | "lcov-parse": "^0.0.10", 138 | "log-driver": "^1.2.5", 139 | "minimist": "^1.2.0", 140 | "request": "^2.79.0" 141 | } 142 | }, 143 | "dashdash": { 144 | "version": "1.14.1", 145 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 146 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 147 | "dev": true, 148 | "requires": { 149 | "assert-plus": "^1.0.0" 150 | } 151 | }, 152 | "debug": { 153 | "version": "3.1.0", 154 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 155 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 156 | "dev": true, 157 | "requires": { 158 | "ms": "2.0.0" 159 | } 160 | }, 161 | "delayed-stream": { 162 | "version": "1.0.0", 163 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 164 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 165 | "dev": true 166 | }, 167 | "diff": { 168 | "version": "3.5.0", 169 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 170 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 171 | "dev": true 172 | }, 173 | "ecc-jsbn": { 174 | "version": "0.1.2", 175 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 176 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 177 | "dev": true, 178 | "requires": { 179 | "jsbn": "~0.1.0", 180 | "safer-buffer": "^2.1.0" 181 | } 182 | }, 183 | "escape-string-regexp": { 184 | "version": "1.0.5", 185 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 186 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 187 | "dev": true 188 | }, 189 | "esprima": { 190 | "version": "4.0.0", 191 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 192 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", 193 | "dev": true 194 | }, 195 | "extend": { 196 | "version": "3.0.2", 197 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 198 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 199 | "dev": true 200 | }, 201 | "extsprintf": { 202 | "version": "1.3.0", 203 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 204 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 205 | "dev": true 206 | }, 207 | "fast-deep-equal": { 208 | "version": "2.0.1", 209 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 210 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 211 | "dev": true 212 | }, 213 | "fast-json-stable-stringify": { 214 | "version": "2.0.0", 215 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 216 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 217 | "dev": true 218 | }, 219 | "forever-agent": { 220 | "version": "0.6.1", 221 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 222 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 223 | "dev": true 224 | }, 225 | "form-data": { 226 | "version": "2.3.3", 227 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 228 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 229 | "dev": true, 230 | "requires": { 231 | "asynckit": "^0.4.0", 232 | "combined-stream": "^1.0.6", 233 | "mime-types": "^2.1.12" 234 | } 235 | }, 236 | "fs.realpath": { 237 | "version": "1.0.0", 238 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 239 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 240 | "dev": true 241 | }, 242 | "getpass": { 243 | "version": "0.1.7", 244 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 245 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 246 | "dev": true, 247 | "requires": { 248 | "assert-plus": "^1.0.0" 249 | } 250 | }, 251 | "glob": { 252 | "version": "7.1.2", 253 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 254 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 255 | "dev": true, 256 | "requires": { 257 | "fs.realpath": "^1.0.0", 258 | "inflight": "^1.0.4", 259 | "inherits": "2", 260 | "minimatch": "^3.0.4", 261 | "once": "^1.3.0", 262 | "path-is-absolute": "^1.0.0" 263 | } 264 | }, 265 | "growl": { 266 | "version": "1.10.3", 267 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", 268 | "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", 269 | "dev": true 270 | }, 271 | "har-schema": { 272 | "version": "2.0.0", 273 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 274 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 275 | "dev": true 276 | }, 277 | "har-validator": { 278 | "version": "5.1.3", 279 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 280 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 281 | "dev": true, 282 | "requires": { 283 | "ajv": "^6.5.5", 284 | "har-schema": "^2.0.0" 285 | } 286 | }, 287 | "has-flag": { 288 | "version": "2.0.0", 289 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 290 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 291 | "dev": true 292 | }, 293 | "he": { 294 | "version": "1.1.1", 295 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 296 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 297 | "dev": true 298 | }, 299 | "http-signature": { 300 | "version": "1.2.0", 301 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 302 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 303 | "dev": true, 304 | "requires": { 305 | "assert-plus": "^1.0.0", 306 | "jsprim": "^1.2.2", 307 | "sshpk": "^1.7.0" 308 | } 309 | }, 310 | "inflight": { 311 | "version": "1.0.6", 312 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 313 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 314 | "dev": true, 315 | "requires": { 316 | "once": "^1.3.0", 317 | "wrappy": "1" 318 | } 319 | }, 320 | "inherits": { 321 | "version": "2.0.3", 322 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 323 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 324 | "dev": true 325 | }, 326 | "is-typedarray": { 327 | "version": "1.0.0", 328 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 329 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 330 | "dev": true 331 | }, 332 | "isstream": { 333 | "version": "0.1.2", 334 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 335 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 336 | "dev": true 337 | }, 338 | "js-yaml": { 339 | "version": "3.11.0", 340 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", 341 | "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", 342 | "dev": true, 343 | "requires": { 344 | "argparse": "^1.0.7", 345 | "esprima": "^4.0.0" 346 | } 347 | }, 348 | "jsbn": { 349 | "version": "0.1.1", 350 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 351 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 352 | "dev": true 353 | }, 354 | "json-schema": { 355 | "version": "0.2.3", 356 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 357 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 358 | "dev": true 359 | }, 360 | "json-schema-traverse": { 361 | "version": "0.4.1", 362 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 363 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 364 | "dev": true 365 | }, 366 | "json-stringify-safe": { 367 | "version": "5.0.1", 368 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 369 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 370 | "dev": true 371 | }, 372 | "jsprim": { 373 | "version": "1.4.1", 374 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 375 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 376 | "dev": true, 377 | "requires": { 378 | "assert-plus": "1.0.0", 379 | "extsprintf": "1.3.0", 380 | "json-schema": "0.2.3", 381 | "verror": "1.10.0" 382 | } 383 | }, 384 | "lcov-parse": { 385 | "version": "0.0.10", 386 | "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", 387 | "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", 388 | "dev": true 389 | }, 390 | "log-driver": { 391 | "version": "1.2.7", 392 | "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", 393 | "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", 394 | "dev": true 395 | }, 396 | "mime-db": { 397 | "version": "1.37.0", 398 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 399 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", 400 | "dev": true 401 | }, 402 | "mime-types": { 403 | "version": "2.1.21", 404 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 405 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 406 | "dev": true, 407 | "requires": { 408 | "mime-db": "~1.37.0" 409 | } 410 | }, 411 | "minimatch": { 412 | "version": "3.0.4", 413 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 414 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 415 | "dev": true, 416 | "requires": { 417 | "brace-expansion": "^1.1.7" 418 | } 419 | }, 420 | "minimist": { 421 | "version": "1.2.0", 422 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 423 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 424 | "dev": true 425 | }, 426 | "mkdirp": { 427 | "version": "0.5.1", 428 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 429 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 430 | "dev": true, 431 | "requires": { 432 | "minimist": "0.0.8" 433 | }, 434 | "dependencies": { 435 | "minimist": { 436 | "version": "0.0.8", 437 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 438 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 439 | "dev": true 440 | } 441 | } 442 | }, 443 | "mocha": { 444 | "version": "5.0.5", 445 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.5.tgz", 446 | "integrity": "sha512-3MM3UjZ5p8EJrYpG7s+29HAI9G7sTzKEe4+w37Dg0QP7qL4XGsV+Q2xet2cE37AqdgN1OtYQB6Vl98YiPV3PgA==", 447 | "dev": true, 448 | "requires": { 449 | "browser-stdout": "1.3.1", 450 | "commander": "2.11.0", 451 | "debug": "3.1.0", 452 | "diff": "3.5.0", 453 | "escape-string-regexp": "1.0.5", 454 | "glob": "7.1.2", 455 | "growl": "1.10.3", 456 | "he": "1.1.1", 457 | "mkdirp": "0.5.1", 458 | "supports-color": "4.4.0" 459 | }, 460 | "dependencies": { 461 | "supports-color": { 462 | "version": "4.4.0", 463 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 464 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 465 | "dev": true, 466 | "requires": { 467 | "has-flag": "^2.0.0" 468 | } 469 | } 470 | } 471 | }, 472 | "ms": { 473 | "version": "2.0.0", 474 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 475 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 476 | "dev": true 477 | }, 478 | "nyc": { 479 | "version": "11.6.0", 480 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.6.0.tgz", 481 | "integrity": "sha512-ZaXCh0wmbk2aSBH2B5hZGGvK2s9aM8DIm2rVY+BG3Fx8tUS+bpJSswUVZqOD1YfCmnYRFSqgYJSr7UeeUcW0jg==", 482 | "dev": true, 483 | "requires": { 484 | "archy": "^1.0.0", 485 | "arrify": "^1.0.1", 486 | "caching-transform": "^1.0.0", 487 | "convert-source-map": "^1.5.1", 488 | "debug-log": "^1.0.1", 489 | "default-require-extensions": "^1.0.0", 490 | "find-cache-dir": "^0.1.1", 491 | "find-up": "^2.1.0", 492 | "foreground-child": "^1.5.3", 493 | "glob": "^7.0.6", 494 | "istanbul-lib-coverage": "^1.1.2", 495 | "istanbul-lib-hook": "^1.1.0", 496 | "istanbul-lib-instrument": "^1.10.0", 497 | "istanbul-lib-report": "^1.1.3", 498 | "istanbul-lib-source-maps": "^1.2.3", 499 | "istanbul-reports": "^1.1.4", 500 | "md5-hex": "^1.2.0", 501 | "merge-source-map": "^1.0.2", 502 | "micromatch": "^2.3.11", 503 | "mkdirp": "^0.5.0", 504 | "resolve-from": "^2.0.0", 505 | "rimraf": "^2.5.4", 506 | "signal-exit": "^3.0.1", 507 | "spawn-wrap": "^1.4.2", 508 | "test-exclude": "^4.2.0", 509 | "yargs": "11.1.0", 510 | "yargs-parser": "^8.0.0" 511 | }, 512 | "dependencies": { 513 | "align-text": { 514 | "version": "0.1.4", 515 | "bundled": true, 516 | "dev": true, 517 | "requires": { 518 | "kind-of": "^3.0.2", 519 | "longest": "^1.0.1", 520 | "repeat-string": "^1.5.2" 521 | } 522 | }, 523 | "amdefine": { 524 | "version": "1.0.1", 525 | "bundled": true, 526 | "dev": true 527 | }, 528 | "ansi-regex": { 529 | "version": "2.1.1", 530 | "bundled": true, 531 | "dev": true 532 | }, 533 | "ansi-styles": { 534 | "version": "2.2.1", 535 | "bundled": true, 536 | "dev": true 537 | }, 538 | "append-transform": { 539 | "version": "0.4.0", 540 | "bundled": true, 541 | "dev": true, 542 | "requires": { 543 | "default-require-extensions": "^1.0.0" 544 | } 545 | }, 546 | "archy": { 547 | "version": "1.0.0", 548 | "bundled": true, 549 | "dev": true 550 | }, 551 | "arr-diff": { 552 | "version": "2.0.0", 553 | "bundled": true, 554 | "dev": true, 555 | "requires": { 556 | "arr-flatten": "^1.0.1" 557 | } 558 | }, 559 | "arr-flatten": { 560 | "version": "1.1.0", 561 | "bundled": true, 562 | "dev": true 563 | }, 564 | "arr-union": { 565 | "version": "3.1.0", 566 | "bundled": true, 567 | "dev": true 568 | }, 569 | "array-unique": { 570 | "version": "0.2.1", 571 | "bundled": true, 572 | "dev": true 573 | }, 574 | "arrify": { 575 | "version": "1.0.1", 576 | "bundled": true, 577 | "dev": true 578 | }, 579 | "assign-symbols": { 580 | "version": "1.0.0", 581 | "bundled": true, 582 | "dev": true 583 | }, 584 | "async": { 585 | "version": "1.5.2", 586 | "bundled": true, 587 | "dev": true 588 | }, 589 | "atob": { 590 | "version": "2.0.3", 591 | "bundled": true, 592 | "dev": true 593 | }, 594 | "babel-code-frame": { 595 | "version": "6.26.0", 596 | "bundled": true, 597 | "dev": true, 598 | "requires": { 599 | "chalk": "^1.1.3", 600 | "esutils": "^2.0.2", 601 | "js-tokens": "^3.0.2" 602 | } 603 | }, 604 | "babel-generator": { 605 | "version": "6.26.1", 606 | "bundled": true, 607 | "dev": true, 608 | "requires": { 609 | "babel-messages": "^6.23.0", 610 | "babel-runtime": "^6.26.0", 611 | "babel-types": "^6.26.0", 612 | "detect-indent": "^4.0.0", 613 | "jsesc": "^1.3.0", 614 | "lodash": "^4.17.4", 615 | "source-map": "^0.5.7", 616 | "trim-right": "^1.0.1" 617 | } 618 | }, 619 | "babel-messages": { 620 | "version": "6.23.0", 621 | "bundled": true, 622 | "dev": true, 623 | "requires": { 624 | "babel-runtime": "^6.22.0" 625 | } 626 | }, 627 | "babel-runtime": { 628 | "version": "6.26.0", 629 | "bundled": true, 630 | "dev": true, 631 | "requires": { 632 | "core-js": "^2.4.0", 633 | "regenerator-runtime": "^0.11.0" 634 | } 635 | }, 636 | "babel-template": { 637 | "version": "6.26.0", 638 | "bundled": true, 639 | "dev": true, 640 | "requires": { 641 | "babel-runtime": "^6.26.0", 642 | "babel-traverse": "^6.26.0", 643 | "babel-types": "^6.26.0", 644 | "babylon": "^6.18.0", 645 | "lodash": "^4.17.4" 646 | } 647 | }, 648 | "babel-traverse": { 649 | "version": "6.26.0", 650 | "bundled": true, 651 | "dev": true, 652 | "requires": { 653 | "babel-code-frame": "^6.26.0", 654 | "babel-messages": "^6.23.0", 655 | "babel-runtime": "^6.26.0", 656 | "babel-types": "^6.26.0", 657 | "babylon": "^6.18.0", 658 | "debug": "^2.6.8", 659 | "globals": "^9.18.0", 660 | "invariant": "^2.2.2", 661 | "lodash": "^4.17.4" 662 | } 663 | }, 664 | "babel-types": { 665 | "version": "6.26.0", 666 | "bundled": true, 667 | "dev": true, 668 | "requires": { 669 | "babel-runtime": "^6.26.0", 670 | "esutils": "^2.0.2", 671 | "lodash": "^4.17.4", 672 | "to-fast-properties": "^1.0.3" 673 | } 674 | }, 675 | "babylon": { 676 | "version": "6.18.0", 677 | "bundled": true, 678 | "dev": true 679 | }, 680 | "balanced-match": { 681 | "version": "1.0.0", 682 | "bundled": true, 683 | "dev": true 684 | }, 685 | "base": { 686 | "version": "0.11.2", 687 | "bundled": true, 688 | "dev": true, 689 | "requires": { 690 | "cache-base": "^1.0.1", 691 | "class-utils": "^0.3.5", 692 | "component-emitter": "^1.2.1", 693 | "define-property": "^1.0.0", 694 | "isobject": "^3.0.1", 695 | "mixin-deep": "^1.2.0", 696 | "pascalcase": "^0.1.1" 697 | }, 698 | "dependencies": { 699 | "define-property": { 700 | "version": "1.0.0", 701 | "bundled": true, 702 | "dev": true, 703 | "requires": { 704 | "is-descriptor": "^1.0.0" 705 | } 706 | }, 707 | "isobject": { 708 | "version": "3.0.1", 709 | "bundled": true, 710 | "dev": true 711 | } 712 | } 713 | }, 714 | "brace-expansion": { 715 | "version": "1.1.11", 716 | "bundled": true, 717 | "dev": true, 718 | "requires": { 719 | "balanced-match": "^1.0.0", 720 | "concat-map": "0.0.1" 721 | } 722 | }, 723 | "braces": { 724 | "version": "1.8.5", 725 | "bundled": true, 726 | "dev": true, 727 | "requires": { 728 | "expand-range": "^1.8.1", 729 | "preserve": "^0.2.0", 730 | "repeat-element": "^1.1.2" 731 | } 732 | }, 733 | "builtin-modules": { 734 | "version": "1.1.1", 735 | "bundled": true, 736 | "dev": true 737 | }, 738 | "cache-base": { 739 | "version": "1.0.1", 740 | "bundled": true, 741 | "dev": true, 742 | "requires": { 743 | "collection-visit": "^1.0.0", 744 | "component-emitter": "^1.2.1", 745 | "get-value": "^2.0.6", 746 | "has-value": "^1.0.0", 747 | "isobject": "^3.0.1", 748 | "set-value": "^2.0.0", 749 | "to-object-path": "^0.3.0", 750 | "union-value": "^1.0.0", 751 | "unset-value": "^1.0.0" 752 | }, 753 | "dependencies": { 754 | "isobject": { 755 | "version": "3.0.1", 756 | "bundled": true, 757 | "dev": true 758 | } 759 | } 760 | }, 761 | "caching-transform": { 762 | "version": "1.0.1", 763 | "bundled": true, 764 | "dev": true, 765 | "requires": { 766 | "md5-hex": "^1.2.0", 767 | "mkdirp": "^0.5.1", 768 | "write-file-atomic": "^1.1.4" 769 | } 770 | }, 771 | "camelcase": { 772 | "version": "1.2.1", 773 | "bundled": true, 774 | "dev": true, 775 | "optional": true 776 | }, 777 | "center-align": { 778 | "version": "0.1.3", 779 | "bundled": true, 780 | "dev": true, 781 | "optional": true, 782 | "requires": { 783 | "align-text": "^0.1.3", 784 | "lazy-cache": "^1.0.3" 785 | } 786 | }, 787 | "chalk": { 788 | "version": "1.1.3", 789 | "bundled": true, 790 | "dev": true, 791 | "requires": { 792 | "ansi-styles": "^2.2.1", 793 | "escape-string-regexp": "^1.0.2", 794 | "has-ansi": "^2.0.0", 795 | "strip-ansi": "^3.0.0", 796 | "supports-color": "^2.0.0" 797 | } 798 | }, 799 | "class-utils": { 800 | "version": "0.3.6", 801 | "bundled": true, 802 | "dev": true, 803 | "requires": { 804 | "arr-union": "^3.1.0", 805 | "define-property": "^0.2.5", 806 | "isobject": "^3.0.0", 807 | "static-extend": "^0.1.1" 808 | }, 809 | "dependencies": { 810 | "define-property": { 811 | "version": "0.2.5", 812 | "bundled": true, 813 | "dev": true, 814 | "requires": { 815 | "is-descriptor": "^0.1.0" 816 | } 817 | }, 818 | "is-accessor-descriptor": { 819 | "version": "0.1.6", 820 | "bundled": true, 821 | "dev": true, 822 | "requires": { 823 | "kind-of": "^3.0.2" 824 | }, 825 | "dependencies": { 826 | "kind-of": { 827 | "version": "3.2.2", 828 | "bundled": true, 829 | "dev": true, 830 | "requires": { 831 | "is-buffer": "^1.1.5" 832 | } 833 | } 834 | } 835 | }, 836 | "is-data-descriptor": { 837 | "version": "0.1.4", 838 | "bundled": true, 839 | "dev": true, 840 | "requires": { 841 | "kind-of": "^3.0.2" 842 | }, 843 | "dependencies": { 844 | "kind-of": { 845 | "version": "3.2.2", 846 | "bundled": true, 847 | "dev": true, 848 | "requires": { 849 | "is-buffer": "^1.1.5" 850 | } 851 | } 852 | } 853 | }, 854 | "is-descriptor": { 855 | "version": "0.1.6", 856 | "bundled": true, 857 | "dev": true, 858 | "requires": { 859 | "is-accessor-descriptor": "^0.1.6", 860 | "is-data-descriptor": "^0.1.4", 861 | "kind-of": "^5.0.0" 862 | } 863 | }, 864 | "isobject": { 865 | "version": "3.0.1", 866 | "bundled": true, 867 | "dev": true 868 | }, 869 | "kind-of": { 870 | "version": "5.1.0", 871 | "bundled": true, 872 | "dev": true 873 | } 874 | } 875 | }, 876 | "cliui": { 877 | "version": "2.1.0", 878 | "bundled": true, 879 | "dev": true, 880 | "optional": true, 881 | "requires": { 882 | "center-align": "^0.1.1", 883 | "right-align": "^0.1.1", 884 | "wordwrap": "0.0.2" 885 | }, 886 | "dependencies": { 887 | "wordwrap": { 888 | "version": "0.0.2", 889 | "bundled": true, 890 | "dev": true, 891 | "optional": true 892 | } 893 | } 894 | }, 895 | "code-point-at": { 896 | "version": "1.1.0", 897 | "bundled": true, 898 | "dev": true 899 | }, 900 | "collection-visit": { 901 | "version": "1.0.0", 902 | "bundled": true, 903 | "dev": true, 904 | "requires": { 905 | "map-visit": "^1.0.0", 906 | "object-visit": "^1.0.0" 907 | } 908 | }, 909 | "commondir": { 910 | "version": "1.0.1", 911 | "bundled": true, 912 | "dev": true 913 | }, 914 | "component-emitter": { 915 | "version": "1.2.1", 916 | "bundled": true, 917 | "dev": true 918 | }, 919 | "concat-map": { 920 | "version": "0.0.1", 921 | "bundled": true, 922 | "dev": true 923 | }, 924 | "convert-source-map": { 925 | "version": "1.5.1", 926 | "bundled": true, 927 | "dev": true 928 | }, 929 | "copy-descriptor": { 930 | "version": "0.1.1", 931 | "bundled": true, 932 | "dev": true 933 | }, 934 | "core-js": { 935 | "version": "2.5.3", 936 | "bundled": true, 937 | "dev": true 938 | }, 939 | "cross-spawn": { 940 | "version": "4.0.2", 941 | "bundled": true, 942 | "dev": true, 943 | "requires": { 944 | "lru-cache": "^4.0.1", 945 | "which": "^1.2.9" 946 | } 947 | }, 948 | "debug": { 949 | "version": "2.6.9", 950 | "bundled": true, 951 | "dev": true, 952 | "requires": { 953 | "ms": "2.0.0" 954 | } 955 | }, 956 | "debug-log": { 957 | "version": "1.0.1", 958 | "bundled": true, 959 | "dev": true 960 | }, 961 | "decamelize": { 962 | "version": "1.2.0", 963 | "bundled": true, 964 | "dev": true 965 | }, 966 | "decode-uri-component": { 967 | "version": "0.2.0", 968 | "bundled": true, 969 | "dev": true 970 | }, 971 | "default-require-extensions": { 972 | "version": "1.0.0", 973 | "bundled": true, 974 | "dev": true, 975 | "requires": { 976 | "strip-bom": "^2.0.0" 977 | } 978 | }, 979 | "define-property": { 980 | "version": "2.0.2", 981 | "bundled": true, 982 | "dev": true, 983 | "requires": { 984 | "is-descriptor": "^1.0.2", 985 | "isobject": "^3.0.1" 986 | }, 987 | "dependencies": { 988 | "isobject": { 989 | "version": "3.0.1", 990 | "bundled": true, 991 | "dev": true 992 | } 993 | } 994 | }, 995 | "detect-indent": { 996 | "version": "4.0.0", 997 | "bundled": true, 998 | "dev": true, 999 | "requires": { 1000 | "repeating": "^2.0.0" 1001 | } 1002 | }, 1003 | "error-ex": { 1004 | "version": "1.3.1", 1005 | "bundled": true, 1006 | "dev": true, 1007 | "requires": { 1008 | "is-arrayish": "^0.2.1" 1009 | } 1010 | }, 1011 | "escape-string-regexp": { 1012 | "version": "1.0.5", 1013 | "bundled": true, 1014 | "dev": true 1015 | }, 1016 | "esutils": { 1017 | "version": "2.0.2", 1018 | "bundled": true, 1019 | "dev": true 1020 | }, 1021 | "execa": { 1022 | "version": "0.7.0", 1023 | "bundled": true, 1024 | "dev": true, 1025 | "requires": { 1026 | "cross-spawn": "^5.0.1", 1027 | "get-stream": "^3.0.0", 1028 | "is-stream": "^1.1.0", 1029 | "npm-run-path": "^2.0.0", 1030 | "p-finally": "^1.0.0", 1031 | "signal-exit": "^3.0.0", 1032 | "strip-eof": "^1.0.0" 1033 | }, 1034 | "dependencies": { 1035 | "cross-spawn": { 1036 | "version": "5.1.0", 1037 | "bundled": true, 1038 | "dev": true, 1039 | "requires": { 1040 | "lru-cache": "^4.0.1", 1041 | "shebang-command": "^1.2.0", 1042 | "which": "^1.2.9" 1043 | } 1044 | } 1045 | } 1046 | }, 1047 | "expand-brackets": { 1048 | "version": "0.1.5", 1049 | "bundled": true, 1050 | "dev": true, 1051 | "requires": { 1052 | "is-posix-bracket": "^0.1.0" 1053 | } 1054 | }, 1055 | "expand-range": { 1056 | "version": "1.8.2", 1057 | "bundled": true, 1058 | "dev": true, 1059 | "requires": { 1060 | "fill-range": "^2.1.0" 1061 | } 1062 | }, 1063 | "extend-shallow": { 1064 | "version": "3.0.2", 1065 | "bundled": true, 1066 | "dev": true, 1067 | "requires": { 1068 | "assign-symbols": "^1.0.0", 1069 | "is-extendable": "^1.0.1" 1070 | }, 1071 | "dependencies": { 1072 | "is-extendable": { 1073 | "version": "1.0.1", 1074 | "bundled": true, 1075 | "dev": true, 1076 | "requires": { 1077 | "is-plain-object": "^2.0.4" 1078 | } 1079 | } 1080 | } 1081 | }, 1082 | "extglob": { 1083 | "version": "0.3.2", 1084 | "bundled": true, 1085 | "dev": true, 1086 | "requires": { 1087 | "is-extglob": "^1.0.0" 1088 | } 1089 | }, 1090 | "filename-regex": { 1091 | "version": "2.0.1", 1092 | "bundled": true, 1093 | "dev": true 1094 | }, 1095 | "fill-range": { 1096 | "version": "2.2.3", 1097 | "bundled": true, 1098 | "dev": true, 1099 | "requires": { 1100 | "is-number": "^2.1.0", 1101 | "isobject": "^2.0.0", 1102 | "randomatic": "^1.1.3", 1103 | "repeat-element": "^1.1.2", 1104 | "repeat-string": "^1.5.2" 1105 | } 1106 | }, 1107 | "find-cache-dir": { 1108 | "version": "0.1.1", 1109 | "bundled": true, 1110 | "dev": true, 1111 | "requires": { 1112 | "commondir": "^1.0.1", 1113 | "mkdirp": "^0.5.1", 1114 | "pkg-dir": "^1.0.0" 1115 | } 1116 | }, 1117 | "find-up": { 1118 | "version": "2.1.0", 1119 | "bundled": true, 1120 | "dev": true, 1121 | "requires": { 1122 | "locate-path": "^2.0.0" 1123 | } 1124 | }, 1125 | "for-in": { 1126 | "version": "1.0.2", 1127 | "bundled": true, 1128 | "dev": true 1129 | }, 1130 | "for-own": { 1131 | "version": "0.1.5", 1132 | "bundled": true, 1133 | "dev": true, 1134 | "requires": { 1135 | "for-in": "^1.0.1" 1136 | } 1137 | }, 1138 | "foreground-child": { 1139 | "version": "1.5.6", 1140 | "bundled": true, 1141 | "dev": true, 1142 | "requires": { 1143 | "cross-spawn": "^4", 1144 | "signal-exit": "^3.0.0" 1145 | } 1146 | }, 1147 | "fragment-cache": { 1148 | "version": "0.2.1", 1149 | "bundled": true, 1150 | "dev": true, 1151 | "requires": { 1152 | "map-cache": "^0.2.2" 1153 | } 1154 | }, 1155 | "fs.realpath": { 1156 | "version": "1.0.0", 1157 | "bundled": true, 1158 | "dev": true 1159 | }, 1160 | "get-caller-file": { 1161 | "version": "1.0.2", 1162 | "bundled": true, 1163 | "dev": true 1164 | }, 1165 | "get-stream": { 1166 | "version": "3.0.0", 1167 | "bundled": true, 1168 | "dev": true 1169 | }, 1170 | "get-value": { 1171 | "version": "2.0.6", 1172 | "bundled": true, 1173 | "dev": true 1174 | }, 1175 | "glob": { 1176 | "version": "7.1.2", 1177 | "bundled": true, 1178 | "dev": true, 1179 | "requires": { 1180 | "fs.realpath": "^1.0.0", 1181 | "inflight": "^1.0.4", 1182 | "inherits": "2", 1183 | "minimatch": "^3.0.4", 1184 | "once": "^1.3.0", 1185 | "path-is-absolute": "^1.0.0" 1186 | } 1187 | }, 1188 | "glob-base": { 1189 | "version": "0.3.0", 1190 | "bundled": true, 1191 | "dev": true, 1192 | "requires": { 1193 | "glob-parent": "^2.0.0", 1194 | "is-glob": "^2.0.0" 1195 | } 1196 | }, 1197 | "glob-parent": { 1198 | "version": "2.0.0", 1199 | "bundled": true, 1200 | "dev": true, 1201 | "requires": { 1202 | "is-glob": "^2.0.0" 1203 | } 1204 | }, 1205 | "globals": { 1206 | "version": "9.18.0", 1207 | "bundled": true, 1208 | "dev": true 1209 | }, 1210 | "graceful-fs": { 1211 | "version": "4.1.11", 1212 | "bundled": true, 1213 | "dev": true 1214 | }, 1215 | "handlebars": { 1216 | "version": "4.0.11", 1217 | "bundled": true, 1218 | "dev": true, 1219 | "requires": { 1220 | "async": "^1.4.0", 1221 | "optimist": "^0.6.1", 1222 | "source-map": "^0.4.4", 1223 | "uglify-js": "^2.6" 1224 | }, 1225 | "dependencies": { 1226 | "source-map": { 1227 | "version": "0.4.4", 1228 | "bundled": true, 1229 | "dev": true, 1230 | "requires": { 1231 | "amdefine": ">=0.0.4" 1232 | } 1233 | } 1234 | } 1235 | }, 1236 | "has-ansi": { 1237 | "version": "2.0.0", 1238 | "bundled": true, 1239 | "dev": true, 1240 | "requires": { 1241 | "ansi-regex": "^2.0.0" 1242 | } 1243 | }, 1244 | "has-flag": { 1245 | "version": "1.0.0", 1246 | "bundled": true, 1247 | "dev": true 1248 | }, 1249 | "has-value": { 1250 | "version": "1.0.0", 1251 | "bundled": true, 1252 | "dev": true, 1253 | "requires": { 1254 | "get-value": "^2.0.6", 1255 | "has-values": "^1.0.0", 1256 | "isobject": "^3.0.0" 1257 | }, 1258 | "dependencies": { 1259 | "isobject": { 1260 | "version": "3.0.1", 1261 | "bundled": true, 1262 | "dev": true 1263 | } 1264 | } 1265 | }, 1266 | "has-values": { 1267 | "version": "1.0.0", 1268 | "bundled": true, 1269 | "dev": true, 1270 | "requires": { 1271 | "is-number": "^3.0.0", 1272 | "kind-of": "^4.0.0" 1273 | }, 1274 | "dependencies": { 1275 | "is-number": { 1276 | "version": "3.0.0", 1277 | "bundled": true, 1278 | "dev": true, 1279 | "requires": { 1280 | "kind-of": "^3.0.2" 1281 | }, 1282 | "dependencies": { 1283 | "kind-of": { 1284 | "version": "3.2.2", 1285 | "bundled": true, 1286 | "dev": true, 1287 | "requires": { 1288 | "is-buffer": "^1.1.5" 1289 | } 1290 | } 1291 | } 1292 | }, 1293 | "kind-of": { 1294 | "version": "4.0.0", 1295 | "bundled": true, 1296 | "dev": true, 1297 | "requires": { 1298 | "is-buffer": "^1.1.5" 1299 | } 1300 | } 1301 | } 1302 | }, 1303 | "hosted-git-info": { 1304 | "version": "2.6.0", 1305 | "bundled": true, 1306 | "dev": true 1307 | }, 1308 | "imurmurhash": { 1309 | "version": "0.1.4", 1310 | "bundled": true, 1311 | "dev": true 1312 | }, 1313 | "inflight": { 1314 | "version": "1.0.6", 1315 | "bundled": true, 1316 | "dev": true, 1317 | "requires": { 1318 | "once": "^1.3.0", 1319 | "wrappy": "1" 1320 | } 1321 | }, 1322 | "inherits": { 1323 | "version": "2.0.3", 1324 | "bundled": true, 1325 | "dev": true 1326 | }, 1327 | "invariant": { 1328 | "version": "2.2.3", 1329 | "bundled": true, 1330 | "dev": true, 1331 | "requires": { 1332 | "loose-envify": "^1.0.0" 1333 | } 1334 | }, 1335 | "invert-kv": { 1336 | "version": "1.0.0", 1337 | "bundled": true, 1338 | "dev": true 1339 | }, 1340 | "is-accessor-descriptor": { 1341 | "version": "1.0.0", 1342 | "bundled": true, 1343 | "dev": true, 1344 | "requires": { 1345 | "kind-of": "^6.0.0" 1346 | }, 1347 | "dependencies": { 1348 | "kind-of": { 1349 | "version": "6.0.2", 1350 | "bundled": true, 1351 | "dev": true 1352 | } 1353 | } 1354 | }, 1355 | "is-arrayish": { 1356 | "version": "0.2.1", 1357 | "bundled": true, 1358 | "dev": true 1359 | }, 1360 | "is-buffer": { 1361 | "version": "1.1.6", 1362 | "bundled": true, 1363 | "dev": true 1364 | }, 1365 | "is-builtin-module": { 1366 | "version": "1.0.0", 1367 | "bundled": true, 1368 | "dev": true, 1369 | "requires": { 1370 | "builtin-modules": "^1.0.0" 1371 | } 1372 | }, 1373 | "is-data-descriptor": { 1374 | "version": "1.0.0", 1375 | "bundled": true, 1376 | "dev": true, 1377 | "requires": { 1378 | "kind-of": "^6.0.0" 1379 | }, 1380 | "dependencies": { 1381 | "kind-of": { 1382 | "version": "6.0.2", 1383 | "bundled": true, 1384 | "dev": true 1385 | } 1386 | } 1387 | }, 1388 | "is-descriptor": { 1389 | "version": "1.0.2", 1390 | "bundled": true, 1391 | "dev": true, 1392 | "requires": { 1393 | "is-accessor-descriptor": "^1.0.0", 1394 | "is-data-descriptor": "^1.0.0", 1395 | "kind-of": "^6.0.2" 1396 | }, 1397 | "dependencies": { 1398 | "kind-of": { 1399 | "version": "6.0.2", 1400 | "bundled": true, 1401 | "dev": true 1402 | } 1403 | } 1404 | }, 1405 | "is-dotfile": { 1406 | "version": "1.0.3", 1407 | "bundled": true, 1408 | "dev": true 1409 | }, 1410 | "is-equal-shallow": { 1411 | "version": "0.1.3", 1412 | "bundled": true, 1413 | "dev": true, 1414 | "requires": { 1415 | "is-primitive": "^2.0.0" 1416 | } 1417 | }, 1418 | "is-extendable": { 1419 | "version": "0.1.1", 1420 | "bundled": true, 1421 | "dev": true 1422 | }, 1423 | "is-extglob": { 1424 | "version": "1.0.0", 1425 | "bundled": true, 1426 | "dev": true 1427 | }, 1428 | "is-finite": { 1429 | "version": "1.0.2", 1430 | "bundled": true, 1431 | "dev": true, 1432 | "requires": { 1433 | "number-is-nan": "^1.0.0" 1434 | } 1435 | }, 1436 | "is-fullwidth-code-point": { 1437 | "version": "2.0.0", 1438 | "bundled": true, 1439 | "dev": true 1440 | }, 1441 | "is-glob": { 1442 | "version": "2.0.1", 1443 | "bundled": true, 1444 | "dev": true, 1445 | "requires": { 1446 | "is-extglob": "^1.0.0" 1447 | } 1448 | }, 1449 | "is-number": { 1450 | "version": "2.1.0", 1451 | "bundled": true, 1452 | "dev": true, 1453 | "requires": { 1454 | "kind-of": "^3.0.2" 1455 | } 1456 | }, 1457 | "is-odd": { 1458 | "version": "2.0.0", 1459 | "bundled": true, 1460 | "dev": true, 1461 | "requires": { 1462 | "is-number": "^4.0.0" 1463 | }, 1464 | "dependencies": { 1465 | "is-number": { 1466 | "version": "4.0.0", 1467 | "bundled": true, 1468 | "dev": true 1469 | } 1470 | } 1471 | }, 1472 | "is-plain-object": { 1473 | "version": "2.0.4", 1474 | "bundled": true, 1475 | "dev": true, 1476 | "requires": { 1477 | "isobject": "^3.0.1" 1478 | }, 1479 | "dependencies": { 1480 | "isobject": { 1481 | "version": "3.0.1", 1482 | "bundled": true, 1483 | "dev": true 1484 | } 1485 | } 1486 | }, 1487 | "is-posix-bracket": { 1488 | "version": "0.1.1", 1489 | "bundled": true, 1490 | "dev": true 1491 | }, 1492 | "is-primitive": { 1493 | "version": "2.0.0", 1494 | "bundled": true, 1495 | "dev": true 1496 | }, 1497 | "is-stream": { 1498 | "version": "1.1.0", 1499 | "bundled": true, 1500 | "dev": true 1501 | }, 1502 | "is-utf8": { 1503 | "version": "0.2.1", 1504 | "bundled": true, 1505 | "dev": true 1506 | }, 1507 | "is-windows": { 1508 | "version": "1.0.2", 1509 | "bundled": true, 1510 | "dev": true 1511 | }, 1512 | "isarray": { 1513 | "version": "1.0.0", 1514 | "bundled": true, 1515 | "dev": true 1516 | }, 1517 | "isexe": { 1518 | "version": "2.0.0", 1519 | "bundled": true, 1520 | "dev": true 1521 | }, 1522 | "isobject": { 1523 | "version": "2.1.0", 1524 | "bundled": true, 1525 | "dev": true, 1526 | "requires": { 1527 | "isarray": "1.0.0" 1528 | } 1529 | }, 1530 | "istanbul-lib-coverage": { 1531 | "version": "1.2.0", 1532 | "bundled": true, 1533 | "dev": true 1534 | }, 1535 | "istanbul-lib-hook": { 1536 | "version": "1.1.0", 1537 | "bundled": true, 1538 | "dev": true, 1539 | "requires": { 1540 | "append-transform": "^0.4.0" 1541 | } 1542 | }, 1543 | "istanbul-lib-instrument": { 1544 | "version": "1.10.1", 1545 | "bundled": true, 1546 | "dev": true, 1547 | "requires": { 1548 | "babel-generator": "^6.18.0", 1549 | "babel-template": "^6.16.0", 1550 | "babel-traverse": "^6.18.0", 1551 | "babel-types": "^6.18.0", 1552 | "babylon": "^6.18.0", 1553 | "istanbul-lib-coverage": "^1.2.0", 1554 | "semver": "^5.3.0" 1555 | } 1556 | }, 1557 | "istanbul-lib-report": { 1558 | "version": "1.1.3", 1559 | "bundled": true, 1560 | "dev": true, 1561 | "requires": { 1562 | "istanbul-lib-coverage": "^1.1.2", 1563 | "mkdirp": "^0.5.1", 1564 | "path-parse": "^1.0.5", 1565 | "supports-color": "^3.1.2" 1566 | }, 1567 | "dependencies": { 1568 | "supports-color": { 1569 | "version": "3.2.3", 1570 | "bundled": true, 1571 | "dev": true, 1572 | "requires": { 1573 | "has-flag": "^1.0.0" 1574 | } 1575 | } 1576 | } 1577 | }, 1578 | "istanbul-lib-source-maps": { 1579 | "version": "1.2.3", 1580 | "bundled": true, 1581 | "dev": true, 1582 | "requires": { 1583 | "debug": "^3.1.0", 1584 | "istanbul-lib-coverage": "^1.1.2", 1585 | "mkdirp": "^0.5.1", 1586 | "rimraf": "^2.6.1", 1587 | "source-map": "^0.5.3" 1588 | }, 1589 | "dependencies": { 1590 | "debug": { 1591 | "version": "3.1.0", 1592 | "bundled": true, 1593 | "dev": true, 1594 | "requires": { 1595 | "ms": "2.0.0" 1596 | } 1597 | } 1598 | } 1599 | }, 1600 | "istanbul-reports": { 1601 | "version": "1.3.0", 1602 | "bundled": true, 1603 | "dev": true, 1604 | "requires": { 1605 | "handlebars": "^4.0.3" 1606 | } 1607 | }, 1608 | "js-tokens": { 1609 | "version": "3.0.2", 1610 | "bundled": true, 1611 | "dev": true 1612 | }, 1613 | "jsesc": { 1614 | "version": "1.3.0", 1615 | "bundled": true, 1616 | "dev": true 1617 | }, 1618 | "kind-of": { 1619 | "version": "3.2.2", 1620 | "bundled": true, 1621 | "dev": true, 1622 | "requires": { 1623 | "is-buffer": "^1.1.5" 1624 | } 1625 | }, 1626 | "lazy-cache": { 1627 | "version": "1.0.4", 1628 | "bundled": true, 1629 | "dev": true, 1630 | "optional": true 1631 | }, 1632 | "lcid": { 1633 | "version": "1.0.0", 1634 | "bundled": true, 1635 | "dev": true, 1636 | "requires": { 1637 | "invert-kv": "^1.0.0" 1638 | } 1639 | }, 1640 | "load-json-file": { 1641 | "version": "1.1.0", 1642 | "bundled": true, 1643 | "dev": true, 1644 | "requires": { 1645 | "graceful-fs": "^4.1.2", 1646 | "parse-json": "^2.2.0", 1647 | "pify": "^2.0.0", 1648 | "pinkie-promise": "^2.0.0", 1649 | "strip-bom": "^2.0.0" 1650 | } 1651 | }, 1652 | "locate-path": { 1653 | "version": "2.0.0", 1654 | "bundled": true, 1655 | "dev": true, 1656 | "requires": { 1657 | "p-locate": "^2.0.0", 1658 | "path-exists": "^3.0.0" 1659 | }, 1660 | "dependencies": { 1661 | "path-exists": { 1662 | "version": "3.0.0", 1663 | "bundled": true, 1664 | "dev": true 1665 | } 1666 | } 1667 | }, 1668 | "lodash": { 1669 | "version": "4.17.5", 1670 | "bundled": true, 1671 | "dev": true 1672 | }, 1673 | "longest": { 1674 | "version": "1.0.1", 1675 | "bundled": true, 1676 | "dev": true 1677 | }, 1678 | "loose-envify": { 1679 | "version": "1.3.1", 1680 | "bundled": true, 1681 | "dev": true, 1682 | "requires": { 1683 | "js-tokens": "^3.0.0" 1684 | } 1685 | }, 1686 | "lru-cache": { 1687 | "version": "4.1.2", 1688 | "bundled": true, 1689 | "dev": true, 1690 | "requires": { 1691 | "pseudomap": "^1.0.2", 1692 | "yallist": "^2.1.2" 1693 | } 1694 | }, 1695 | "map-cache": { 1696 | "version": "0.2.2", 1697 | "bundled": true, 1698 | "dev": true 1699 | }, 1700 | "map-visit": { 1701 | "version": "1.0.0", 1702 | "bundled": true, 1703 | "dev": true, 1704 | "requires": { 1705 | "object-visit": "^1.0.0" 1706 | } 1707 | }, 1708 | "md5-hex": { 1709 | "version": "1.3.0", 1710 | "bundled": true, 1711 | "dev": true, 1712 | "requires": { 1713 | "md5-o-matic": "^0.1.1" 1714 | } 1715 | }, 1716 | "md5-o-matic": { 1717 | "version": "0.1.1", 1718 | "bundled": true, 1719 | "dev": true 1720 | }, 1721 | "mem": { 1722 | "version": "1.1.0", 1723 | "bundled": true, 1724 | "dev": true, 1725 | "requires": { 1726 | "mimic-fn": "^1.0.0" 1727 | } 1728 | }, 1729 | "merge-source-map": { 1730 | "version": "1.1.0", 1731 | "bundled": true, 1732 | "dev": true, 1733 | "requires": { 1734 | "source-map": "^0.6.1" 1735 | }, 1736 | "dependencies": { 1737 | "source-map": { 1738 | "version": "0.6.1", 1739 | "bundled": true, 1740 | "dev": true 1741 | } 1742 | } 1743 | }, 1744 | "micromatch": { 1745 | "version": "2.3.11", 1746 | "bundled": true, 1747 | "dev": true, 1748 | "requires": { 1749 | "arr-diff": "^2.0.0", 1750 | "array-unique": "^0.2.1", 1751 | "braces": "^1.8.2", 1752 | "expand-brackets": "^0.1.4", 1753 | "extglob": "^0.3.1", 1754 | "filename-regex": "^2.0.0", 1755 | "is-extglob": "^1.0.0", 1756 | "is-glob": "^2.0.1", 1757 | "kind-of": "^3.0.2", 1758 | "normalize-path": "^2.0.1", 1759 | "object.omit": "^2.0.0", 1760 | "parse-glob": "^3.0.4", 1761 | "regex-cache": "^0.4.2" 1762 | } 1763 | }, 1764 | "mimic-fn": { 1765 | "version": "1.2.0", 1766 | "bundled": true, 1767 | "dev": true 1768 | }, 1769 | "minimatch": { 1770 | "version": "3.0.4", 1771 | "bundled": true, 1772 | "dev": true, 1773 | "requires": { 1774 | "brace-expansion": "^1.1.7" 1775 | } 1776 | }, 1777 | "minimist": { 1778 | "version": "0.0.8", 1779 | "bundled": true, 1780 | "dev": true 1781 | }, 1782 | "mixin-deep": { 1783 | "version": "1.3.1", 1784 | "bundled": true, 1785 | "dev": true, 1786 | "requires": { 1787 | "for-in": "^1.0.2", 1788 | "is-extendable": "^1.0.1" 1789 | }, 1790 | "dependencies": { 1791 | "is-extendable": { 1792 | "version": "1.0.1", 1793 | "bundled": true, 1794 | "dev": true, 1795 | "requires": { 1796 | "is-plain-object": "^2.0.4" 1797 | } 1798 | } 1799 | } 1800 | }, 1801 | "mkdirp": { 1802 | "version": "0.5.1", 1803 | "bundled": true, 1804 | "dev": true, 1805 | "requires": { 1806 | "minimist": "0.0.8" 1807 | } 1808 | }, 1809 | "ms": { 1810 | "version": "2.0.0", 1811 | "bundled": true, 1812 | "dev": true 1813 | }, 1814 | "nanomatch": { 1815 | "version": "1.2.9", 1816 | "bundled": true, 1817 | "dev": true, 1818 | "requires": { 1819 | "arr-diff": "^4.0.0", 1820 | "array-unique": "^0.3.2", 1821 | "define-property": "^2.0.2", 1822 | "extend-shallow": "^3.0.2", 1823 | "fragment-cache": "^0.2.1", 1824 | "is-odd": "^2.0.0", 1825 | "is-windows": "^1.0.2", 1826 | "kind-of": "^6.0.2", 1827 | "object.pick": "^1.3.0", 1828 | "regex-not": "^1.0.0", 1829 | "snapdragon": "^0.8.1", 1830 | "to-regex": "^3.0.1" 1831 | }, 1832 | "dependencies": { 1833 | "arr-diff": { 1834 | "version": "4.0.0", 1835 | "bundled": true, 1836 | "dev": true 1837 | }, 1838 | "array-unique": { 1839 | "version": "0.3.2", 1840 | "bundled": true, 1841 | "dev": true 1842 | }, 1843 | "kind-of": { 1844 | "version": "6.0.2", 1845 | "bundled": true, 1846 | "dev": true 1847 | } 1848 | } 1849 | }, 1850 | "normalize-package-data": { 1851 | "version": "2.4.0", 1852 | "bundled": true, 1853 | "dev": true, 1854 | "requires": { 1855 | "hosted-git-info": "^2.1.4", 1856 | "is-builtin-module": "^1.0.0", 1857 | "semver": "2 || 3 || 4 || 5", 1858 | "validate-npm-package-license": "^3.0.1" 1859 | } 1860 | }, 1861 | "normalize-path": { 1862 | "version": "2.1.1", 1863 | "bundled": true, 1864 | "dev": true, 1865 | "requires": { 1866 | "remove-trailing-separator": "^1.0.1" 1867 | } 1868 | }, 1869 | "npm-run-path": { 1870 | "version": "2.0.2", 1871 | "bundled": true, 1872 | "dev": true, 1873 | "requires": { 1874 | "path-key": "^2.0.0" 1875 | } 1876 | }, 1877 | "number-is-nan": { 1878 | "version": "1.0.1", 1879 | "bundled": true, 1880 | "dev": true 1881 | }, 1882 | "object-assign": { 1883 | "version": "4.1.1", 1884 | "bundled": true, 1885 | "dev": true 1886 | }, 1887 | "object-copy": { 1888 | "version": "0.1.0", 1889 | "bundled": true, 1890 | "dev": true, 1891 | "requires": { 1892 | "copy-descriptor": "^0.1.0", 1893 | "define-property": "^0.2.5", 1894 | "kind-of": "^3.0.3" 1895 | }, 1896 | "dependencies": { 1897 | "define-property": { 1898 | "version": "0.2.5", 1899 | "bundled": true, 1900 | "dev": true, 1901 | "requires": { 1902 | "is-descriptor": "^0.1.0" 1903 | } 1904 | }, 1905 | "is-accessor-descriptor": { 1906 | "version": "0.1.6", 1907 | "bundled": true, 1908 | "dev": true, 1909 | "requires": { 1910 | "kind-of": "^3.0.2" 1911 | } 1912 | }, 1913 | "is-data-descriptor": { 1914 | "version": "0.1.4", 1915 | "bundled": true, 1916 | "dev": true, 1917 | "requires": { 1918 | "kind-of": "^3.0.2" 1919 | } 1920 | }, 1921 | "is-descriptor": { 1922 | "version": "0.1.6", 1923 | "bundled": true, 1924 | "dev": true, 1925 | "requires": { 1926 | "is-accessor-descriptor": "^0.1.6", 1927 | "is-data-descriptor": "^0.1.4", 1928 | "kind-of": "^5.0.0" 1929 | }, 1930 | "dependencies": { 1931 | "kind-of": { 1932 | "version": "5.1.0", 1933 | "bundled": true, 1934 | "dev": true 1935 | } 1936 | } 1937 | } 1938 | } 1939 | }, 1940 | "object-visit": { 1941 | "version": "1.0.1", 1942 | "bundled": true, 1943 | "dev": true, 1944 | "requires": { 1945 | "isobject": "^3.0.0" 1946 | }, 1947 | "dependencies": { 1948 | "isobject": { 1949 | "version": "3.0.1", 1950 | "bundled": true, 1951 | "dev": true 1952 | } 1953 | } 1954 | }, 1955 | "object.omit": { 1956 | "version": "2.0.1", 1957 | "bundled": true, 1958 | "dev": true, 1959 | "requires": { 1960 | "for-own": "^0.1.4", 1961 | "is-extendable": "^0.1.1" 1962 | } 1963 | }, 1964 | "object.pick": { 1965 | "version": "1.3.0", 1966 | "bundled": true, 1967 | "dev": true, 1968 | "requires": { 1969 | "isobject": "^3.0.1" 1970 | }, 1971 | "dependencies": { 1972 | "isobject": { 1973 | "version": "3.0.1", 1974 | "bundled": true, 1975 | "dev": true 1976 | } 1977 | } 1978 | }, 1979 | "once": { 1980 | "version": "1.4.0", 1981 | "bundled": true, 1982 | "dev": true, 1983 | "requires": { 1984 | "wrappy": "1" 1985 | } 1986 | }, 1987 | "optimist": { 1988 | "version": "0.6.1", 1989 | "bundled": true, 1990 | "dev": true, 1991 | "requires": { 1992 | "minimist": "~0.0.1", 1993 | "wordwrap": "~0.0.2" 1994 | } 1995 | }, 1996 | "os-homedir": { 1997 | "version": "1.0.2", 1998 | "bundled": true, 1999 | "dev": true 2000 | }, 2001 | "os-locale": { 2002 | "version": "2.1.0", 2003 | "bundled": true, 2004 | "dev": true, 2005 | "requires": { 2006 | "execa": "^0.7.0", 2007 | "lcid": "^1.0.0", 2008 | "mem": "^1.1.0" 2009 | } 2010 | }, 2011 | "p-finally": { 2012 | "version": "1.0.0", 2013 | "bundled": true, 2014 | "dev": true 2015 | }, 2016 | "p-limit": { 2017 | "version": "1.2.0", 2018 | "bundled": true, 2019 | "dev": true, 2020 | "requires": { 2021 | "p-try": "^1.0.0" 2022 | } 2023 | }, 2024 | "p-locate": { 2025 | "version": "2.0.0", 2026 | "bundled": true, 2027 | "dev": true, 2028 | "requires": { 2029 | "p-limit": "^1.1.0" 2030 | } 2031 | }, 2032 | "p-try": { 2033 | "version": "1.0.0", 2034 | "bundled": true, 2035 | "dev": true 2036 | }, 2037 | "parse-glob": { 2038 | "version": "3.0.4", 2039 | "bundled": true, 2040 | "dev": true, 2041 | "requires": { 2042 | "glob-base": "^0.3.0", 2043 | "is-dotfile": "^1.0.0", 2044 | "is-extglob": "^1.0.0", 2045 | "is-glob": "^2.0.0" 2046 | } 2047 | }, 2048 | "parse-json": { 2049 | "version": "2.2.0", 2050 | "bundled": true, 2051 | "dev": true, 2052 | "requires": { 2053 | "error-ex": "^1.2.0" 2054 | } 2055 | }, 2056 | "pascalcase": { 2057 | "version": "0.1.1", 2058 | "bundled": true, 2059 | "dev": true 2060 | }, 2061 | "path-exists": { 2062 | "version": "2.1.0", 2063 | "bundled": true, 2064 | "dev": true, 2065 | "requires": { 2066 | "pinkie-promise": "^2.0.0" 2067 | } 2068 | }, 2069 | "path-is-absolute": { 2070 | "version": "1.0.1", 2071 | "bundled": true, 2072 | "dev": true 2073 | }, 2074 | "path-key": { 2075 | "version": "2.0.1", 2076 | "bundled": true, 2077 | "dev": true 2078 | }, 2079 | "path-parse": { 2080 | "version": "1.0.5", 2081 | "bundled": true, 2082 | "dev": true 2083 | }, 2084 | "path-type": { 2085 | "version": "1.1.0", 2086 | "bundled": true, 2087 | "dev": true, 2088 | "requires": { 2089 | "graceful-fs": "^4.1.2", 2090 | "pify": "^2.0.0", 2091 | "pinkie-promise": "^2.0.0" 2092 | } 2093 | }, 2094 | "pify": { 2095 | "version": "2.3.0", 2096 | "bundled": true, 2097 | "dev": true 2098 | }, 2099 | "pinkie": { 2100 | "version": "2.0.4", 2101 | "bundled": true, 2102 | "dev": true 2103 | }, 2104 | "pinkie-promise": { 2105 | "version": "2.0.1", 2106 | "bundled": true, 2107 | "dev": true, 2108 | "requires": { 2109 | "pinkie": "^2.0.0" 2110 | } 2111 | }, 2112 | "pkg-dir": { 2113 | "version": "1.0.0", 2114 | "bundled": true, 2115 | "dev": true, 2116 | "requires": { 2117 | "find-up": "^1.0.0" 2118 | }, 2119 | "dependencies": { 2120 | "find-up": { 2121 | "version": "1.1.2", 2122 | "bundled": true, 2123 | "dev": true, 2124 | "requires": { 2125 | "path-exists": "^2.0.0", 2126 | "pinkie-promise": "^2.0.0" 2127 | } 2128 | } 2129 | } 2130 | }, 2131 | "posix-character-classes": { 2132 | "version": "0.1.1", 2133 | "bundled": true, 2134 | "dev": true 2135 | }, 2136 | "preserve": { 2137 | "version": "0.2.0", 2138 | "bundled": true, 2139 | "dev": true 2140 | }, 2141 | "pseudomap": { 2142 | "version": "1.0.2", 2143 | "bundled": true, 2144 | "dev": true 2145 | }, 2146 | "randomatic": { 2147 | "version": "1.1.7", 2148 | "bundled": true, 2149 | "dev": true, 2150 | "requires": { 2151 | "is-number": "^3.0.0", 2152 | "kind-of": "^4.0.0" 2153 | }, 2154 | "dependencies": { 2155 | "is-number": { 2156 | "version": "3.0.0", 2157 | "bundled": true, 2158 | "dev": true, 2159 | "requires": { 2160 | "kind-of": "^3.0.2" 2161 | }, 2162 | "dependencies": { 2163 | "kind-of": { 2164 | "version": "3.2.2", 2165 | "bundled": true, 2166 | "dev": true, 2167 | "requires": { 2168 | "is-buffer": "^1.1.5" 2169 | } 2170 | } 2171 | } 2172 | }, 2173 | "kind-of": { 2174 | "version": "4.0.0", 2175 | "bundled": true, 2176 | "dev": true, 2177 | "requires": { 2178 | "is-buffer": "^1.1.5" 2179 | } 2180 | } 2181 | } 2182 | }, 2183 | "read-pkg": { 2184 | "version": "1.1.0", 2185 | "bundled": true, 2186 | "dev": true, 2187 | "requires": { 2188 | "load-json-file": "^1.0.0", 2189 | "normalize-package-data": "^2.3.2", 2190 | "path-type": "^1.0.0" 2191 | } 2192 | }, 2193 | "read-pkg-up": { 2194 | "version": "1.0.1", 2195 | "bundled": true, 2196 | "dev": true, 2197 | "requires": { 2198 | "find-up": "^1.0.0", 2199 | "read-pkg": "^1.0.0" 2200 | }, 2201 | "dependencies": { 2202 | "find-up": { 2203 | "version": "1.1.2", 2204 | "bundled": true, 2205 | "dev": true, 2206 | "requires": { 2207 | "path-exists": "^2.0.0", 2208 | "pinkie-promise": "^2.0.0" 2209 | } 2210 | } 2211 | } 2212 | }, 2213 | "regenerator-runtime": { 2214 | "version": "0.11.1", 2215 | "bundled": true, 2216 | "dev": true 2217 | }, 2218 | "regex-cache": { 2219 | "version": "0.4.4", 2220 | "bundled": true, 2221 | "dev": true, 2222 | "requires": { 2223 | "is-equal-shallow": "^0.1.3" 2224 | } 2225 | }, 2226 | "regex-not": { 2227 | "version": "1.0.2", 2228 | "bundled": true, 2229 | "dev": true, 2230 | "requires": { 2231 | "extend-shallow": "^3.0.2", 2232 | "safe-regex": "^1.1.0" 2233 | } 2234 | }, 2235 | "remove-trailing-separator": { 2236 | "version": "1.1.0", 2237 | "bundled": true, 2238 | "dev": true 2239 | }, 2240 | "repeat-element": { 2241 | "version": "1.1.2", 2242 | "bundled": true, 2243 | "dev": true 2244 | }, 2245 | "repeat-string": { 2246 | "version": "1.6.1", 2247 | "bundled": true, 2248 | "dev": true 2249 | }, 2250 | "repeating": { 2251 | "version": "2.0.1", 2252 | "bundled": true, 2253 | "dev": true, 2254 | "requires": { 2255 | "is-finite": "^1.0.0" 2256 | } 2257 | }, 2258 | "require-directory": { 2259 | "version": "2.1.1", 2260 | "bundled": true, 2261 | "dev": true 2262 | }, 2263 | "require-main-filename": { 2264 | "version": "1.0.1", 2265 | "bundled": true, 2266 | "dev": true 2267 | }, 2268 | "resolve-from": { 2269 | "version": "2.0.0", 2270 | "bundled": true, 2271 | "dev": true 2272 | }, 2273 | "resolve-url": { 2274 | "version": "0.2.1", 2275 | "bundled": true, 2276 | "dev": true 2277 | }, 2278 | "ret": { 2279 | "version": "0.1.15", 2280 | "bundled": true, 2281 | "dev": true 2282 | }, 2283 | "right-align": { 2284 | "version": "0.1.3", 2285 | "bundled": true, 2286 | "dev": true, 2287 | "optional": true, 2288 | "requires": { 2289 | "align-text": "^0.1.1" 2290 | } 2291 | }, 2292 | "rimraf": { 2293 | "version": "2.6.2", 2294 | "bundled": true, 2295 | "dev": true, 2296 | "requires": { 2297 | "glob": "^7.0.5" 2298 | } 2299 | }, 2300 | "safe-regex": { 2301 | "version": "1.1.0", 2302 | "bundled": true, 2303 | "dev": true, 2304 | "requires": { 2305 | "ret": "~0.1.10" 2306 | } 2307 | }, 2308 | "semver": { 2309 | "version": "5.5.0", 2310 | "bundled": true, 2311 | "dev": true 2312 | }, 2313 | "set-blocking": { 2314 | "version": "2.0.0", 2315 | "bundled": true, 2316 | "dev": true 2317 | }, 2318 | "set-value": { 2319 | "version": "2.0.0", 2320 | "bundled": true, 2321 | "dev": true, 2322 | "requires": { 2323 | "extend-shallow": "^2.0.1", 2324 | "is-extendable": "^0.1.1", 2325 | "is-plain-object": "^2.0.3", 2326 | "split-string": "^3.0.1" 2327 | }, 2328 | "dependencies": { 2329 | "extend-shallow": { 2330 | "version": "2.0.1", 2331 | "bundled": true, 2332 | "dev": true, 2333 | "requires": { 2334 | "is-extendable": "^0.1.0" 2335 | } 2336 | } 2337 | } 2338 | }, 2339 | "shebang-command": { 2340 | "version": "1.2.0", 2341 | "bundled": true, 2342 | "dev": true, 2343 | "requires": { 2344 | "shebang-regex": "^1.0.0" 2345 | } 2346 | }, 2347 | "shebang-regex": { 2348 | "version": "1.0.0", 2349 | "bundled": true, 2350 | "dev": true 2351 | }, 2352 | "signal-exit": { 2353 | "version": "3.0.2", 2354 | "bundled": true, 2355 | "dev": true 2356 | }, 2357 | "slide": { 2358 | "version": "1.1.6", 2359 | "bundled": true, 2360 | "dev": true 2361 | }, 2362 | "snapdragon": { 2363 | "version": "0.8.2", 2364 | "bundled": true, 2365 | "dev": true, 2366 | "requires": { 2367 | "base": "^0.11.1", 2368 | "debug": "^2.2.0", 2369 | "define-property": "^0.2.5", 2370 | "extend-shallow": "^2.0.1", 2371 | "map-cache": "^0.2.2", 2372 | "source-map": "^0.5.6", 2373 | "source-map-resolve": "^0.5.0", 2374 | "use": "^3.1.0" 2375 | }, 2376 | "dependencies": { 2377 | "define-property": { 2378 | "version": "0.2.5", 2379 | "bundled": true, 2380 | "dev": true, 2381 | "requires": { 2382 | "is-descriptor": "^0.1.0" 2383 | } 2384 | }, 2385 | "extend-shallow": { 2386 | "version": "2.0.1", 2387 | "bundled": true, 2388 | "dev": true, 2389 | "requires": { 2390 | "is-extendable": "^0.1.0" 2391 | } 2392 | }, 2393 | "is-accessor-descriptor": { 2394 | "version": "0.1.6", 2395 | "bundled": true, 2396 | "dev": true, 2397 | "requires": { 2398 | "kind-of": "^3.0.2" 2399 | }, 2400 | "dependencies": { 2401 | "kind-of": { 2402 | "version": "3.2.2", 2403 | "bundled": true, 2404 | "dev": true, 2405 | "requires": { 2406 | "is-buffer": "^1.1.5" 2407 | } 2408 | } 2409 | } 2410 | }, 2411 | "is-data-descriptor": { 2412 | "version": "0.1.4", 2413 | "bundled": true, 2414 | "dev": true, 2415 | "requires": { 2416 | "kind-of": "^3.0.2" 2417 | }, 2418 | "dependencies": { 2419 | "kind-of": { 2420 | "version": "3.2.2", 2421 | "bundled": true, 2422 | "dev": true, 2423 | "requires": { 2424 | "is-buffer": "^1.1.5" 2425 | } 2426 | } 2427 | } 2428 | }, 2429 | "is-descriptor": { 2430 | "version": "0.1.6", 2431 | "bundled": true, 2432 | "dev": true, 2433 | "requires": { 2434 | "is-accessor-descriptor": "^0.1.6", 2435 | "is-data-descriptor": "^0.1.4", 2436 | "kind-of": "^5.0.0" 2437 | } 2438 | }, 2439 | "kind-of": { 2440 | "version": "5.1.0", 2441 | "bundled": true, 2442 | "dev": true 2443 | } 2444 | } 2445 | }, 2446 | "snapdragon-node": { 2447 | "version": "2.1.1", 2448 | "bundled": true, 2449 | "dev": true, 2450 | "requires": { 2451 | "define-property": "^1.0.0", 2452 | "isobject": "^3.0.0", 2453 | "snapdragon-util": "^3.0.1" 2454 | }, 2455 | "dependencies": { 2456 | "define-property": { 2457 | "version": "1.0.0", 2458 | "bundled": true, 2459 | "dev": true, 2460 | "requires": { 2461 | "is-descriptor": "^1.0.0" 2462 | } 2463 | }, 2464 | "isobject": { 2465 | "version": "3.0.1", 2466 | "bundled": true, 2467 | "dev": true 2468 | } 2469 | } 2470 | }, 2471 | "snapdragon-util": { 2472 | "version": "3.0.1", 2473 | "bundled": true, 2474 | "dev": true, 2475 | "requires": { 2476 | "kind-of": "^3.2.0" 2477 | } 2478 | }, 2479 | "source-map": { 2480 | "version": "0.5.7", 2481 | "bundled": true, 2482 | "dev": true 2483 | }, 2484 | "source-map-resolve": { 2485 | "version": "0.5.1", 2486 | "bundled": true, 2487 | "dev": true, 2488 | "requires": { 2489 | "atob": "^2.0.0", 2490 | "decode-uri-component": "^0.2.0", 2491 | "resolve-url": "^0.2.1", 2492 | "source-map-url": "^0.4.0", 2493 | "urix": "^0.1.0" 2494 | } 2495 | }, 2496 | "source-map-url": { 2497 | "version": "0.4.0", 2498 | "bundled": true, 2499 | "dev": true 2500 | }, 2501 | "spawn-wrap": { 2502 | "version": "1.4.2", 2503 | "bundled": true, 2504 | "dev": true, 2505 | "requires": { 2506 | "foreground-child": "^1.5.6", 2507 | "mkdirp": "^0.5.0", 2508 | "os-homedir": "^1.0.1", 2509 | "rimraf": "^2.6.2", 2510 | "signal-exit": "^3.0.2", 2511 | "which": "^1.3.0" 2512 | } 2513 | }, 2514 | "spdx-correct": { 2515 | "version": "3.0.0", 2516 | "bundled": true, 2517 | "dev": true, 2518 | "requires": { 2519 | "spdx-expression-parse": "^3.0.0", 2520 | "spdx-license-ids": "^3.0.0" 2521 | } 2522 | }, 2523 | "spdx-exceptions": { 2524 | "version": "2.1.0", 2525 | "bundled": true, 2526 | "dev": true 2527 | }, 2528 | "spdx-expression-parse": { 2529 | "version": "3.0.0", 2530 | "bundled": true, 2531 | "dev": true, 2532 | "requires": { 2533 | "spdx-exceptions": "^2.1.0", 2534 | "spdx-license-ids": "^3.0.0" 2535 | } 2536 | }, 2537 | "spdx-license-ids": { 2538 | "version": "3.0.0", 2539 | "bundled": true, 2540 | "dev": true 2541 | }, 2542 | "split-string": { 2543 | "version": "3.1.0", 2544 | "bundled": true, 2545 | "dev": true, 2546 | "requires": { 2547 | "extend-shallow": "^3.0.0" 2548 | } 2549 | }, 2550 | "static-extend": { 2551 | "version": "0.1.2", 2552 | "bundled": true, 2553 | "dev": true, 2554 | "requires": { 2555 | "define-property": "^0.2.5", 2556 | "object-copy": "^0.1.0" 2557 | }, 2558 | "dependencies": { 2559 | "define-property": { 2560 | "version": "0.2.5", 2561 | "bundled": true, 2562 | "dev": true, 2563 | "requires": { 2564 | "is-descriptor": "^0.1.0" 2565 | } 2566 | }, 2567 | "is-accessor-descriptor": { 2568 | "version": "0.1.6", 2569 | "bundled": true, 2570 | "dev": true, 2571 | "requires": { 2572 | "kind-of": "^3.0.2" 2573 | }, 2574 | "dependencies": { 2575 | "kind-of": { 2576 | "version": "3.2.2", 2577 | "bundled": true, 2578 | "dev": true, 2579 | "requires": { 2580 | "is-buffer": "^1.1.5" 2581 | } 2582 | } 2583 | } 2584 | }, 2585 | "is-data-descriptor": { 2586 | "version": "0.1.4", 2587 | "bundled": true, 2588 | "dev": true, 2589 | "requires": { 2590 | "kind-of": "^3.0.2" 2591 | }, 2592 | "dependencies": { 2593 | "kind-of": { 2594 | "version": "3.2.2", 2595 | "bundled": true, 2596 | "dev": true, 2597 | "requires": { 2598 | "is-buffer": "^1.1.5" 2599 | } 2600 | } 2601 | } 2602 | }, 2603 | "is-descriptor": { 2604 | "version": "0.1.6", 2605 | "bundled": true, 2606 | "dev": true, 2607 | "requires": { 2608 | "is-accessor-descriptor": "^0.1.6", 2609 | "is-data-descriptor": "^0.1.4", 2610 | "kind-of": "^5.0.0" 2611 | } 2612 | }, 2613 | "kind-of": { 2614 | "version": "5.1.0", 2615 | "bundled": true, 2616 | "dev": true 2617 | } 2618 | } 2619 | }, 2620 | "string-width": { 2621 | "version": "2.1.1", 2622 | "bundled": true, 2623 | "dev": true, 2624 | "requires": { 2625 | "is-fullwidth-code-point": "^2.0.0", 2626 | "strip-ansi": "^4.0.0" 2627 | }, 2628 | "dependencies": { 2629 | "ansi-regex": { 2630 | "version": "3.0.0", 2631 | "bundled": true, 2632 | "dev": true 2633 | }, 2634 | "strip-ansi": { 2635 | "version": "4.0.0", 2636 | "bundled": true, 2637 | "dev": true, 2638 | "requires": { 2639 | "ansi-regex": "^3.0.0" 2640 | } 2641 | } 2642 | } 2643 | }, 2644 | "strip-ansi": { 2645 | "version": "3.0.1", 2646 | "bundled": true, 2647 | "dev": true, 2648 | "requires": { 2649 | "ansi-regex": "^2.0.0" 2650 | } 2651 | }, 2652 | "strip-bom": { 2653 | "version": "2.0.0", 2654 | "bundled": true, 2655 | "dev": true, 2656 | "requires": { 2657 | "is-utf8": "^0.2.0" 2658 | } 2659 | }, 2660 | "strip-eof": { 2661 | "version": "1.0.0", 2662 | "bundled": true, 2663 | "dev": true 2664 | }, 2665 | "supports-color": { 2666 | "version": "2.0.0", 2667 | "bundled": true, 2668 | "dev": true 2669 | }, 2670 | "test-exclude": { 2671 | "version": "4.2.1", 2672 | "bundled": true, 2673 | "dev": true, 2674 | "requires": { 2675 | "arrify": "^1.0.1", 2676 | "micromatch": "^3.1.8", 2677 | "object-assign": "^4.1.0", 2678 | "read-pkg-up": "^1.0.1", 2679 | "require-main-filename": "^1.0.1" 2680 | }, 2681 | "dependencies": { 2682 | "arr-diff": { 2683 | "version": "4.0.0", 2684 | "bundled": true, 2685 | "dev": true 2686 | }, 2687 | "array-unique": { 2688 | "version": "0.3.2", 2689 | "bundled": true, 2690 | "dev": true 2691 | }, 2692 | "braces": { 2693 | "version": "2.3.1", 2694 | "bundled": true, 2695 | "dev": true, 2696 | "requires": { 2697 | "arr-flatten": "^1.1.0", 2698 | "array-unique": "^0.3.2", 2699 | "define-property": "^1.0.0", 2700 | "extend-shallow": "^2.0.1", 2701 | "fill-range": "^4.0.0", 2702 | "isobject": "^3.0.1", 2703 | "kind-of": "^6.0.2", 2704 | "repeat-element": "^1.1.2", 2705 | "snapdragon": "^0.8.1", 2706 | "snapdragon-node": "^2.0.1", 2707 | "split-string": "^3.0.2", 2708 | "to-regex": "^3.0.1" 2709 | }, 2710 | "dependencies": { 2711 | "define-property": { 2712 | "version": "1.0.0", 2713 | "bundled": true, 2714 | "dev": true, 2715 | "requires": { 2716 | "is-descriptor": "^1.0.0" 2717 | } 2718 | }, 2719 | "extend-shallow": { 2720 | "version": "2.0.1", 2721 | "bundled": true, 2722 | "dev": true, 2723 | "requires": { 2724 | "is-extendable": "^0.1.0" 2725 | } 2726 | } 2727 | } 2728 | }, 2729 | "expand-brackets": { 2730 | "version": "2.1.4", 2731 | "bundled": true, 2732 | "dev": true, 2733 | "requires": { 2734 | "debug": "^2.3.3", 2735 | "define-property": "^0.2.5", 2736 | "extend-shallow": "^2.0.1", 2737 | "posix-character-classes": "^0.1.0", 2738 | "regex-not": "^1.0.0", 2739 | "snapdragon": "^0.8.1", 2740 | "to-regex": "^3.0.1" 2741 | }, 2742 | "dependencies": { 2743 | "define-property": { 2744 | "version": "0.2.5", 2745 | "bundled": true, 2746 | "dev": true, 2747 | "requires": { 2748 | "is-descriptor": "^0.1.0" 2749 | } 2750 | }, 2751 | "extend-shallow": { 2752 | "version": "2.0.1", 2753 | "bundled": true, 2754 | "dev": true, 2755 | "requires": { 2756 | "is-extendable": "^0.1.0" 2757 | } 2758 | }, 2759 | "is-descriptor": { 2760 | "version": "0.1.6", 2761 | "bundled": true, 2762 | "dev": true, 2763 | "requires": { 2764 | "is-accessor-descriptor": "^0.1.6", 2765 | "is-data-descriptor": "^0.1.4", 2766 | "kind-of": "^5.0.0" 2767 | } 2768 | }, 2769 | "kind-of": { 2770 | "version": "5.1.0", 2771 | "bundled": true, 2772 | "dev": true 2773 | } 2774 | } 2775 | }, 2776 | "extglob": { 2777 | "version": "2.0.4", 2778 | "bundled": true, 2779 | "dev": true, 2780 | "requires": { 2781 | "array-unique": "^0.3.2", 2782 | "define-property": "^1.0.0", 2783 | "expand-brackets": "^2.1.4", 2784 | "extend-shallow": "^2.0.1", 2785 | "fragment-cache": "^0.2.1", 2786 | "regex-not": "^1.0.0", 2787 | "snapdragon": "^0.8.1", 2788 | "to-regex": "^3.0.1" 2789 | }, 2790 | "dependencies": { 2791 | "define-property": { 2792 | "version": "1.0.0", 2793 | "bundled": true, 2794 | "dev": true, 2795 | "requires": { 2796 | "is-descriptor": "^1.0.0" 2797 | } 2798 | }, 2799 | "extend-shallow": { 2800 | "version": "2.0.1", 2801 | "bundled": true, 2802 | "dev": true, 2803 | "requires": { 2804 | "is-extendable": "^0.1.0" 2805 | } 2806 | } 2807 | } 2808 | }, 2809 | "fill-range": { 2810 | "version": "4.0.0", 2811 | "bundled": true, 2812 | "dev": true, 2813 | "requires": { 2814 | "extend-shallow": "^2.0.1", 2815 | "is-number": "^3.0.0", 2816 | "repeat-string": "^1.6.1", 2817 | "to-regex-range": "^2.1.0" 2818 | }, 2819 | "dependencies": { 2820 | "extend-shallow": { 2821 | "version": "2.0.1", 2822 | "bundled": true, 2823 | "dev": true, 2824 | "requires": { 2825 | "is-extendable": "^0.1.0" 2826 | } 2827 | } 2828 | } 2829 | }, 2830 | "is-accessor-descriptor": { 2831 | "version": "0.1.6", 2832 | "bundled": true, 2833 | "dev": true, 2834 | "requires": { 2835 | "kind-of": "^3.0.2" 2836 | }, 2837 | "dependencies": { 2838 | "kind-of": { 2839 | "version": "3.2.2", 2840 | "bundled": true, 2841 | "dev": true, 2842 | "requires": { 2843 | "is-buffer": "^1.1.5" 2844 | } 2845 | } 2846 | } 2847 | }, 2848 | "is-data-descriptor": { 2849 | "version": "0.1.4", 2850 | "bundled": true, 2851 | "dev": true, 2852 | "requires": { 2853 | "kind-of": "^3.0.2" 2854 | }, 2855 | "dependencies": { 2856 | "kind-of": { 2857 | "version": "3.2.2", 2858 | "bundled": true, 2859 | "dev": true, 2860 | "requires": { 2861 | "is-buffer": "^1.1.5" 2862 | } 2863 | } 2864 | } 2865 | }, 2866 | "is-number": { 2867 | "version": "3.0.0", 2868 | "bundled": true, 2869 | "dev": true, 2870 | "requires": { 2871 | "kind-of": "^3.0.2" 2872 | }, 2873 | "dependencies": { 2874 | "kind-of": { 2875 | "version": "3.2.2", 2876 | "bundled": true, 2877 | "dev": true, 2878 | "requires": { 2879 | "is-buffer": "^1.1.5" 2880 | } 2881 | } 2882 | } 2883 | }, 2884 | "isobject": { 2885 | "version": "3.0.1", 2886 | "bundled": true, 2887 | "dev": true 2888 | }, 2889 | "kind-of": { 2890 | "version": "6.0.2", 2891 | "bundled": true, 2892 | "dev": true 2893 | }, 2894 | "micromatch": { 2895 | "version": "3.1.9", 2896 | "bundled": true, 2897 | "dev": true, 2898 | "requires": { 2899 | "arr-diff": "^4.0.0", 2900 | "array-unique": "^0.3.2", 2901 | "braces": "^2.3.1", 2902 | "define-property": "^2.0.2", 2903 | "extend-shallow": "^3.0.2", 2904 | "extglob": "^2.0.4", 2905 | "fragment-cache": "^0.2.1", 2906 | "kind-of": "^6.0.2", 2907 | "nanomatch": "^1.2.9", 2908 | "object.pick": "^1.3.0", 2909 | "regex-not": "^1.0.0", 2910 | "snapdragon": "^0.8.1", 2911 | "to-regex": "^3.0.1" 2912 | } 2913 | } 2914 | } 2915 | }, 2916 | "to-fast-properties": { 2917 | "version": "1.0.3", 2918 | "bundled": true, 2919 | "dev": true 2920 | }, 2921 | "to-object-path": { 2922 | "version": "0.3.0", 2923 | "bundled": true, 2924 | "dev": true, 2925 | "requires": { 2926 | "kind-of": "^3.0.2" 2927 | } 2928 | }, 2929 | "to-regex": { 2930 | "version": "3.0.2", 2931 | "bundled": true, 2932 | "dev": true, 2933 | "requires": { 2934 | "define-property": "^2.0.2", 2935 | "extend-shallow": "^3.0.2", 2936 | "regex-not": "^1.0.2", 2937 | "safe-regex": "^1.1.0" 2938 | } 2939 | }, 2940 | "to-regex-range": { 2941 | "version": "2.1.1", 2942 | "bundled": true, 2943 | "dev": true, 2944 | "requires": { 2945 | "is-number": "^3.0.0", 2946 | "repeat-string": "^1.6.1" 2947 | }, 2948 | "dependencies": { 2949 | "is-number": { 2950 | "version": "3.0.0", 2951 | "bundled": true, 2952 | "dev": true, 2953 | "requires": { 2954 | "kind-of": "^3.0.2" 2955 | } 2956 | } 2957 | } 2958 | }, 2959 | "trim-right": { 2960 | "version": "1.0.1", 2961 | "bundled": true, 2962 | "dev": true 2963 | }, 2964 | "uglify-js": { 2965 | "version": "2.8.29", 2966 | "bundled": true, 2967 | "dev": true, 2968 | "optional": true, 2969 | "requires": { 2970 | "source-map": "~0.5.1", 2971 | "uglify-to-browserify": "~1.0.0", 2972 | "yargs": "~3.10.0" 2973 | }, 2974 | "dependencies": { 2975 | "yargs": { 2976 | "version": "3.10.0", 2977 | "bundled": true, 2978 | "dev": true, 2979 | "optional": true, 2980 | "requires": { 2981 | "camelcase": "^1.0.2", 2982 | "cliui": "^2.1.0", 2983 | "decamelize": "^1.0.0", 2984 | "window-size": "0.1.0" 2985 | } 2986 | } 2987 | } 2988 | }, 2989 | "uglify-to-browserify": { 2990 | "version": "1.0.2", 2991 | "bundled": true, 2992 | "dev": true, 2993 | "optional": true 2994 | }, 2995 | "union-value": { 2996 | "version": "1.0.0", 2997 | "bundled": true, 2998 | "dev": true, 2999 | "requires": { 3000 | "arr-union": "^3.1.0", 3001 | "get-value": "^2.0.6", 3002 | "is-extendable": "^0.1.1", 3003 | "set-value": "^0.4.3" 3004 | }, 3005 | "dependencies": { 3006 | "extend-shallow": { 3007 | "version": "2.0.1", 3008 | "bundled": true, 3009 | "dev": true, 3010 | "requires": { 3011 | "is-extendable": "^0.1.0" 3012 | } 3013 | }, 3014 | "set-value": { 3015 | "version": "0.4.3", 3016 | "bundled": true, 3017 | "dev": true, 3018 | "requires": { 3019 | "extend-shallow": "^2.0.1", 3020 | "is-extendable": "^0.1.1", 3021 | "is-plain-object": "^2.0.1", 3022 | "to-object-path": "^0.3.0" 3023 | } 3024 | } 3025 | } 3026 | }, 3027 | "unset-value": { 3028 | "version": "1.0.0", 3029 | "bundled": true, 3030 | "dev": true, 3031 | "requires": { 3032 | "has-value": "^0.3.1", 3033 | "isobject": "^3.0.0" 3034 | }, 3035 | "dependencies": { 3036 | "has-value": { 3037 | "version": "0.3.1", 3038 | "bundled": true, 3039 | "dev": true, 3040 | "requires": { 3041 | "get-value": "^2.0.3", 3042 | "has-values": "^0.1.4", 3043 | "isobject": "^2.0.0" 3044 | }, 3045 | "dependencies": { 3046 | "isobject": { 3047 | "version": "2.1.0", 3048 | "bundled": true, 3049 | "dev": true, 3050 | "requires": { 3051 | "isarray": "1.0.0" 3052 | } 3053 | } 3054 | } 3055 | }, 3056 | "has-values": { 3057 | "version": "0.1.4", 3058 | "bundled": true, 3059 | "dev": true 3060 | }, 3061 | "isobject": { 3062 | "version": "3.0.1", 3063 | "bundled": true, 3064 | "dev": true 3065 | } 3066 | } 3067 | }, 3068 | "urix": { 3069 | "version": "0.1.0", 3070 | "bundled": true, 3071 | "dev": true 3072 | }, 3073 | "use": { 3074 | "version": "3.1.0", 3075 | "bundled": true, 3076 | "dev": true, 3077 | "requires": { 3078 | "kind-of": "^6.0.2" 3079 | }, 3080 | "dependencies": { 3081 | "kind-of": { 3082 | "version": "6.0.2", 3083 | "bundled": true, 3084 | "dev": true 3085 | } 3086 | } 3087 | }, 3088 | "validate-npm-package-license": { 3089 | "version": "3.0.3", 3090 | "bundled": true, 3091 | "dev": true, 3092 | "requires": { 3093 | "spdx-correct": "^3.0.0", 3094 | "spdx-expression-parse": "^3.0.0" 3095 | } 3096 | }, 3097 | "which": { 3098 | "version": "1.3.0", 3099 | "bundled": true, 3100 | "dev": true, 3101 | "requires": { 3102 | "isexe": "^2.0.0" 3103 | } 3104 | }, 3105 | "which-module": { 3106 | "version": "2.0.0", 3107 | "bundled": true, 3108 | "dev": true 3109 | }, 3110 | "window-size": { 3111 | "version": "0.1.0", 3112 | "bundled": true, 3113 | "dev": true, 3114 | "optional": true 3115 | }, 3116 | "wordwrap": { 3117 | "version": "0.0.3", 3118 | "bundled": true, 3119 | "dev": true 3120 | }, 3121 | "wrap-ansi": { 3122 | "version": "2.1.0", 3123 | "bundled": true, 3124 | "dev": true, 3125 | "requires": { 3126 | "string-width": "^1.0.1", 3127 | "strip-ansi": "^3.0.1" 3128 | }, 3129 | "dependencies": { 3130 | "is-fullwidth-code-point": { 3131 | "version": "1.0.0", 3132 | "bundled": true, 3133 | "dev": true, 3134 | "requires": { 3135 | "number-is-nan": "^1.0.0" 3136 | } 3137 | }, 3138 | "string-width": { 3139 | "version": "1.0.2", 3140 | "bundled": true, 3141 | "dev": true, 3142 | "requires": { 3143 | "code-point-at": "^1.0.0", 3144 | "is-fullwidth-code-point": "^1.0.0", 3145 | "strip-ansi": "^3.0.0" 3146 | } 3147 | } 3148 | } 3149 | }, 3150 | "wrappy": { 3151 | "version": "1.0.2", 3152 | "bundled": true, 3153 | "dev": true 3154 | }, 3155 | "write-file-atomic": { 3156 | "version": "1.3.4", 3157 | "bundled": true, 3158 | "dev": true, 3159 | "requires": { 3160 | "graceful-fs": "^4.1.11", 3161 | "imurmurhash": "^0.1.4", 3162 | "slide": "^1.1.5" 3163 | } 3164 | }, 3165 | "y18n": { 3166 | "version": "3.2.1", 3167 | "bundled": true, 3168 | "dev": true 3169 | }, 3170 | "yallist": { 3171 | "version": "2.1.2", 3172 | "bundled": true, 3173 | "dev": true 3174 | }, 3175 | "yargs": { 3176 | "version": "11.1.0", 3177 | "bundled": true, 3178 | "dev": true, 3179 | "requires": { 3180 | "cliui": "^4.0.0", 3181 | "decamelize": "^1.1.1", 3182 | "find-up": "^2.1.0", 3183 | "get-caller-file": "^1.0.1", 3184 | "os-locale": "^2.0.0", 3185 | "require-directory": "^2.1.1", 3186 | "require-main-filename": "^1.0.1", 3187 | "set-blocking": "^2.0.0", 3188 | "string-width": "^2.0.0", 3189 | "which-module": "^2.0.0", 3190 | "y18n": "^3.2.1", 3191 | "yargs-parser": "^9.0.2" 3192 | }, 3193 | "dependencies": { 3194 | "ansi-regex": { 3195 | "version": "3.0.0", 3196 | "bundled": true, 3197 | "dev": true 3198 | }, 3199 | "camelcase": { 3200 | "version": "4.1.0", 3201 | "bundled": true, 3202 | "dev": true 3203 | }, 3204 | "cliui": { 3205 | "version": "4.0.0", 3206 | "bundled": true, 3207 | "dev": true, 3208 | "requires": { 3209 | "string-width": "^2.1.1", 3210 | "strip-ansi": "^4.0.0", 3211 | "wrap-ansi": "^2.0.0" 3212 | } 3213 | }, 3214 | "strip-ansi": { 3215 | "version": "4.0.0", 3216 | "bundled": true, 3217 | "dev": true, 3218 | "requires": { 3219 | "ansi-regex": "^3.0.0" 3220 | } 3221 | }, 3222 | "yargs-parser": { 3223 | "version": "9.0.2", 3224 | "bundled": true, 3225 | "dev": true, 3226 | "requires": { 3227 | "camelcase": "^4.1.0" 3228 | } 3229 | } 3230 | } 3231 | }, 3232 | "yargs-parser": { 3233 | "version": "8.1.0", 3234 | "bundled": true, 3235 | "dev": true, 3236 | "requires": { 3237 | "camelcase": "^4.1.0" 3238 | }, 3239 | "dependencies": { 3240 | "camelcase": { 3241 | "version": "4.1.0", 3242 | "bundled": true, 3243 | "dev": true 3244 | } 3245 | } 3246 | } 3247 | } 3248 | }, 3249 | "oauth-sign": { 3250 | "version": "0.9.0", 3251 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 3252 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 3253 | "dev": true 3254 | }, 3255 | "once": { 3256 | "version": "1.4.0", 3257 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3258 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 3259 | "dev": true, 3260 | "requires": { 3261 | "wrappy": "1" 3262 | } 3263 | }, 3264 | "path-is-absolute": { 3265 | "version": "1.0.1", 3266 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3267 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 3268 | "dev": true 3269 | }, 3270 | "performance-now": { 3271 | "version": "2.1.0", 3272 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 3273 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 3274 | "dev": true 3275 | }, 3276 | "psl": { 3277 | "version": "1.1.31", 3278 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", 3279 | "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", 3280 | "dev": true 3281 | }, 3282 | "punycode": { 3283 | "version": "2.1.1", 3284 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 3285 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 3286 | "dev": true 3287 | }, 3288 | "qs": { 3289 | "version": "6.5.2", 3290 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 3291 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 3292 | "dev": true 3293 | }, 3294 | "request": { 3295 | "version": "2.88.0", 3296 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 3297 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 3298 | "dev": true, 3299 | "requires": { 3300 | "aws-sign2": "~0.7.0", 3301 | "aws4": "^1.8.0", 3302 | "caseless": "~0.12.0", 3303 | "combined-stream": "~1.0.6", 3304 | "extend": "~3.0.2", 3305 | "forever-agent": "~0.6.1", 3306 | "form-data": "~2.3.2", 3307 | "har-validator": "~5.1.0", 3308 | "http-signature": "~1.2.0", 3309 | "is-typedarray": "~1.0.0", 3310 | "isstream": "~0.1.2", 3311 | "json-stringify-safe": "~5.0.1", 3312 | "mime-types": "~2.1.19", 3313 | "oauth-sign": "~0.9.0", 3314 | "performance-now": "^2.1.0", 3315 | "qs": "~6.5.2", 3316 | "safe-buffer": "^5.1.2", 3317 | "tough-cookie": "~2.4.3", 3318 | "tunnel-agent": "^0.6.0", 3319 | "uuid": "^3.3.2" 3320 | } 3321 | }, 3322 | "safe-buffer": { 3323 | "version": "5.1.2", 3324 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3325 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 3326 | "dev": true 3327 | }, 3328 | "safer-buffer": { 3329 | "version": "2.1.2", 3330 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3331 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 3332 | "dev": true 3333 | }, 3334 | "should": { 3335 | "version": "13.2.1", 3336 | "resolved": "https://registry.npmjs.org/should/-/should-13.2.1.tgz", 3337 | "integrity": "sha512-l+/NwEMO+DcstsHEwPHRHzC9j4UOE3VQwJGcMWSsD/vqpqHbnQ+1iSHy64Ihmmjx1uiRPD9pFadTSc3MJtXAgw==", 3338 | "dev": true, 3339 | "requires": { 3340 | "should-equal": "^2.0.0", 3341 | "should-format": "^3.0.3", 3342 | "should-type": "^1.4.0", 3343 | "should-type-adaptors": "^1.0.1", 3344 | "should-util": "^1.0.0" 3345 | } 3346 | }, 3347 | "should-equal": { 3348 | "version": "2.0.0", 3349 | "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", 3350 | "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", 3351 | "dev": true, 3352 | "requires": { 3353 | "should-type": "^1.4.0" 3354 | } 3355 | }, 3356 | "should-format": { 3357 | "version": "3.0.3", 3358 | "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", 3359 | "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", 3360 | "dev": true, 3361 | "requires": { 3362 | "should-type": "^1.3.0", 3363 | "should-type-adaptors": "^1.0.1" 3364 | } 3365 | }, 3366 | "should-type": { 3367 | "version": "1.4.0", 3368 | "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", 3369 | "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", 3370 | "dev": true 3371 | }, 3372 | "should-type-adaptors": { 3373 | "version": "1.1.0", 3374 | "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", 3375 | "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", 3376 | "dev": true, 3377 | "requires": { 3378 | "should-type": "^1.3.0", 3379 | "should-util": "^1.0.0" 3380 | } 3381 | }, 3382 | "should-util": { 3383 | "version": "1.0.0", 3384 | "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz", 3385 | "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=", 3386 | "dev": true 3387 | }, 3388 | "sprintf-js": { 3389 | "version": "1.0.3", 3390 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3391 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3392 | "dev": true 3393 | }, 3394 | "sshpk": { 3395 | "version": "1.15.2", 3396 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", 3397 | "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", 3398 | "dev": true, 3399 | "requires": { 3400 | "asn1": "~0.2.3", 3401 | "assert-plus": "^1.0.0", 3402 | "bcrypt-pbkdf": "^1.0.0", 3403 | "dashdash": "^1.12.0", 3404 | "ecc-jsbn": "~0.1.1", 3405 | "getpass": "^0.1.1", 3406 | "jsbn": "~0.1.0", 3407 | "safer-buffer": "^2.0.2", 3408 | "tweetnacl": "~0.14.0" 3409 | } 3410 | }, 3411 | "tough-cookie": { 3412 | "version": "2.4.3", 3413 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 3414 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 3415 | "dev": true, 3416 | "requires": { 3417 | "psl": "^1.1.24", 3418 | "punycode": "^1.4.1" 3419 | }, 3420 | "dependencies": { 3421 | "punycode": { 3422 | "version": "1.4.1", 3423 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 3424 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 3425 | "dev": true 3426 | } 3427 | } 3428 | }, 3429 | "tunnel-agent": { 3430 | "version": "0.6.0", 3431 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3432 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3433 | "dev": true, 3434 | "requires": { 3435 | "safe-buffer": "^5.0.1" 3436 | } 3437 | }, 3438 | "tweetnacl": { 3439 | "version": "0.14.5", 3440 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 3441 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 3442 | "dev": true 3443 | }, 3444 | "uri-js": { 3445 | "version": "4.2.2", 3446 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 3447 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 3448 | "dev": true, 3449 | "requires": { 3450 | "punycode": "^2.1.0" 3451 | } 3452 | }, 3453 | "uuid": { 3454 | "version": "3.3.2", 3455 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 3456 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 3457 | "dev": true 3458 | }, 3459 | "verror": { 3460 | "version": "1.10.0", 3461 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 3462 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3463 | "dev": true, 3464 | "requires": { 3465 | "assert-plus": "^1.0.0", 3466 | "core-util-is": "1.0.2", 3467 | "extsprintf": "^1.2.0" 3468 | } 3469 | }, 3470 | "wrappy": { 3471 | "version": "1.0.2", 3472 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3473 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3474 | "dev": true 3475 | } 3476 | } 3477 | } 3478 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "json-schema-to-openapi-schema", 3 | "version": "0.3.0", 4 | "description": "Converts a JSON Schema to OpenAPI Schema Object", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "nyc --reporter=html --reporter=text mocha", 8 | "coverage": "nyc report --reporter=text-lcov | coveralls" 9 | }, 10 | "repository": "github:wework/json-schema-to-openapi-schema", 11 | "author": "Phil Sturgeon ", 12 | "license": "MIT", 13 | "devDependencies": { 14 | "coveralls": "^3.0.0", 15 | "mocha": "^5.0.0", 16 | "nyc": "^11.6.0", 17 | "should": "^13.2.0" 18 | }, 19 | "dependencies": { 20 | "@cloudflare/json-schema-walker": "^0.1.1" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /test/array-items.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('array-items', () => { 7 | const schema = { 8 | $schema: 'http://json-schema.org/draft-04/schema#', 9 | type: 'array', 10 | }; 11 | 12 | const result = convert(schema); 13 | 14 | const expected = { 15 | type: 'array', 16 | items: { 17 | } 18 | }; 19 | 20 | should(result).deepEqual(expected, 'converted'); 21 | }); 22 | -------------------------------------------------------------------------------- /test/clone_schema.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('cloning schema by default', () => { 7 | const schema = { 8 | $schema: 'http://json-schema.org/draft-04/schema#', 9 | type: ['string', 'null'], 10 | }; 11 | 12 | const result = convert(schema); 13 | 14 | const expected = { 15 | type: 'string', 16 | nullable: true, 17 | }; 18 | 19 | should(result).deepEqual(expected, 'result does not match the expected'); 20 | should(result).not.deepEqual(schema, 'the schema was modified in place'); 21 | }); 22 | 23 | it('cloning schema with cloneSchema option', () => { 24 | const schema = { 25 | $schema: 'http://json-schema.org/draft-04/schema#', 26 | type: ['string', 'null'], 27 | }; 28 | 29 | const result = convert(schema, { cloneSchema: true }); 30 | 31 | const expected = { 32 | type: 'string', 33 | nullable: true, 34 | }; 35 | 36 | should(result).deepEqual(expected, 'result does not match the expected'); 37 | should(result).not.deepEqual(schema, 'the schema was modified in place'); 38 | }); 39 | 40 | it('direct schema modification', () => { 41 | const schema = { 42 | $schema: 'http://json-schema.org/draft-04/schema#', 43 | type: ['string', 'null'], 44 | }; 45 | 46 | const result = convert(schema, { cloneSchema: false }); 47 | 48 | const expected = { 49 | type: 'string', 50 | nullable: true, 51 | }; 52 | 53 | should(result).deepEqual(expected, 'result does not match the expected'); 54 | should(result).deepEqual(schema, 'the schema was not modified in place'); 55 | }); 56 | -------------------------------------------------------------------------------- /test/combination_keywords.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('iterates allOfs and converts types', () => { 7 | const schema = { 8 | $schema: 'http://json-schema.org/draft-04/schema#', 9 | allOf: [ 10 | { 11 | type: 'object', 12 | required: ['foo'], 13 | properties: { 14 | foo: { 15 | type: 'integer', 16 | format: 'int64' 17 | } 18 | } 19 | }, 20 | { 21 | allOf: [ 22 | { 23 | type: 'number', 24 | format: 'double' 25 | } 26 | ] 27 | } 28 | ] 29 | }; 30 | 31 | const result = convert(schema); 32 | 33 | const expected = { 34 | allOf: [ 35 | { 36 | type: 'object', 37 | required: ['foo'], 38 | properties: { 39 | foo: { 40 | type: 'integer', 41 | format: 'int64' 42 | } 43 | } 44 | }, 45 | { 46 | allOf: [ 47 | { 48 | type: 'number', 49 | format: 'double' 50 | } 51 | ] 52 | } 53 | ] 54 | }; 55 | 56 | should(result).deepEqual(expected, 'iterated allOfs'); 57 | }); 58 | 59 | it('iterates anyOfs and converts types', () => { 60 | const schema = { 61 | $schema: 'http://json-schema.org/draft-04/schema#', 62 | anyOf: [ 63 | { 64 | type: 'object', 65 | required: ['foo'], 66 | properties: { 67 | foo: { 68 | type: 'integer', 69 | format: 'int64' 70 | } 71 | } 72 | }, 73 | { 74 | anyOf: [ 75 | { 76 | type: 'object', 77 | properties: { 78 | bar: { 79 | type: 'number', 80 | format: 'double' 81 | } 82 | } 83 | } 84 | ] 85 | } 86 | ] 87 | }; 88 | 89 | const result = convert(schema); 90 | 91 | const expected = { 92 | anyOf: [ 93 | { 94 | type: 'object', 95 | required: ['foo'], 96 | properties: { 97 | foo: { 98 | type: 'integer', 99 | format: 'int64' 100 | } 101 | } 102 | }, 103 | { 104 | anyOf: [ 105 | { 106 | type: 'object', 107 | properties: { 108 | bar: { 109 | type: 'number', 110 | format: 'double' 111 | } 112 | } 113 | } 114 | ] 115 | } 116 | ] 117 | }; 118 | 119 | should(result).deepEqual(expected, 'anyOfs iterated'); 120 | }); 121 | 122 | it('iterates oneOfs and converts types', () => { 123 | const schema = { 124 | $schema: 'http://json-schema.org/draft-04/schema#', 125 | oneOf: [ 126 | { 127 | type: 'object', 128 | required: ['foo'], 129 | properties: { 130 | foo: { 131 | type: ['string', 'null'] 132 | } 133 | } 134 | }, 135 | { 136 | oneOf: [ 137 | { 138 | type: 'object', 139 | properties: { 140 | bar: { 141 | type: ['string', 'null'] 142 | } 143 | } 144 | } 145 | ] 146 | } 147 | ] 148 | }; 149 | 150 | const result = convert(schema); 151 | 152 | const expected = { 153 | oneOf: [ 154 | { 155 | type: 'object', 156 | required: ['foo'], 157 | properties: { 158 | foo: { 159 | type: 'string', 160 | nullable: true 161 | } 162 | } 163 | }, 164 | { 165 | oneOf: [ 166 | { 167 | type: 'object', 168 | properties: { 169 | bar: { 170 | type: 'string', 171 | nullable: true 172 | } 173 | } 174 | } 175 | ] 176 | } 177 | ] 178 | }; 179 | 180 | should(result).deepEqual(expected, 'oneOfs iterated'); 181 | }); 182 | 183 | it('converts types in not', () => { 184 | const schema = { 185 | $schema: 'http://json-schema.org/draft-04/schema#', 186 | type: 'object', 187 | properties: { 188 | not: { 189 | type: ['string', 'null'], 190 | minLength: 8 191 | } 192 | } 193 | }; 194 | 195 | const result = convert(schema); 196 | 197 | const expected = { 198 | type: 'object', 199 | properties: { 200 | not: { 201 | type: 'string', 202 | nullable: true, 203 | minLength: 8 204 | } 205 | } 206 | }; 207 | 208 | should(result).deepEqual(expected, 'not handled'); 209 | }); 210 | 211 | 212 | it('nested combination keywords', () => { 213 | const schema = { 214 | $schema: 'http://json-schema.org/draft-04/schema#', 215 | anyOf: [ 216 | { 217 | allOf: [ 218 | { 219 | type: 'object', 220 | properties: { 221 | foo: { 222 | type: ['string', 'null'] 223 | } 224 | } 225 | }, 226 | { 227 | type: 'object', 228 | properties: { 229 | bar: { 230 | type: ['integer', 'null'] 231 | } 232 | } 233 | } 234 | ] 235 | }, 236 | { 237 | type: 'object', 238 | properties: { 239 | foo: { 240 | type: 'string', 241 | } 242 | } 243 | }, 244 | { 245 | not: { 246 | type: 'string', 247 | example: 'foobar' 248 | } 249 | } 250 | ] 251 | }; 252 | 253 | const result = convert(schema); 254 | 255 | const expected = { 256 | anyOf: [ 257 | { 258 | allOf: [ 259 | { 260 | type: 'object', 261 | properties: { 262 | foo: { 263 | type: 'string', 264 | nullable: true 265 | } 266 | } 267 | }, 268 | { 269 | type: 'object', 270 | properties: { 271 | bar: { 272 | type: 'integer', 273 | nullable: true 274 | } 275 | } 276 | } 277 | ] 278 | }, 279 | { 280 | type: 'object', 281 | properties: { 282 | foo: { 283 | type: 'string', 284 | } 285 | } 286 | }, 287 | { 288 | not: { 289 | type: 'string', 290 | example: 'foobar' 291 | } 292 | } 293 | ] 294 | }; 295 | 296 | should(result).deepEqual(expected, 'nested combination keywords'); 297 | }); 298 | -------------------------------------------------------------------------------- /test/complex_schemas.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | const getSchema = require('./helpers').getSchema; 6 | 7 | ['basic', 'address', 'calendar'].forEach(test => { 8 | it(`converts ${test}/openapi.json`, () => { 9 | const schema = getSchema(test + '/json-schema.json'); 10 | const result = convert(schema); 11 | const expected = getSchema(test + '/openapi.json'); 12 | 13 | should(result).deepEqual(expected, 'converted'); 14 | }); 15 | 16 | it(`converting ${test}/openapi.json in place`, () => { 17 | const schema = getSchema(test + '/json-schema.json'); 18 | const result = convert(schema, { cloneSchema: false }); 19 | const expected = getSchema(test + '/openapi.json'); 20 | 21 | should(schema).deepEqual(result, 'changed schema in place'); 22 | should(result).deepEqual(expected, 'converted'); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /test/const.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('const', () => { 7 | const schema = { 8 | $schema: 'http://json-schema.org/draft-04/schema#', 9 | type: 'string', 10 | const: 'hello' 11 | }; 12 | 13 | const result = convert(schema); 14 | 15 | const expected = { 16 | type: 'string', 17 | enum: [ 'hello' ] 18 | }; 19 | 20 | should(result).deepEqual(expected, 'converted'); 21 | }); 22 | -------------------------------------------------------------------------------- /test/exclusiveMinMax.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('exclusiveMinMax', () => { 7 | const schema = { 8 | $schema: 'http://json-schema.org/draft-04/schema#', 9 | type: 'integer', 10 | exclusiveMaximum: 10, 11 | exclusiveMinimum: 0 12 | }; 13 | 14 | const result = convert(schema); 15 | 16 | const expected = { 17 | type: 'integer', 18 | maximum: 10, 19 | exclusiveMaximum: true, 20 | minimum: 0, 21 | exclusiveMinimum: true 22 | }; 23 | 24 | should(result).deepEqual(expected, 'converted'); 25 | }); 26 | -------------------------------------------------------------------------------- /test/helpers.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const join = require('path').join; 3 | 4 | const getSchema = file => { 5 | const path = join(__dirname, 'schemas', file); 6 | return JSON.parse(fs.readFileSync(path)); 7 | }; 8 | 9 | module.exports = { getSchema }; 10 | -------------------------------------------------------------------------------- /test/if-then-else.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('if-then-else', () => { 7 | const schema = { 8 | $schema: 'http://json-schema.org/draft-04/schema#', 9 | if: { type: 'object' }, 10 | then: { properties: { id: { type: 'string' } } }, 11 | else: { format: 'uuid' } 12 | }; 13 | 14 | const result = convert(schema); 15 | 16 | const expected = { 17 | oneOf: [ 18 | { allOf: [ { type: 'object' }, { properties: { id: { type: 'string' } } } ] }, 19 | { allOf: [ { not: { type: 'object' } }, { format: 'uuid' } ] } 20 | ] 21 | }; 22 | 23 | should(result).deepEqual(expected, 'converted'); 24 | }); 25 | -------------------------------------------------------------------------------- /test/invalid_types.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | const getSchema = require('./helpers').getSchema; 6 | 7 | it('dateTime is invalid type', () => { 8 | const schema = { type: 'dateTime' }; 9 | should.throws(() => { convert(schema); }, /InvalidTypeError/); 10 | }); 11 | 12 | 13 | it('foo is invalid type', () => { 14 | const schema = { type: 'foo' }; 15 | should.throws(() => { convert(schema); }, /InvalidTypeError/); 16 | }); 17 | 18 | it('invalid type inside complex schema', () => { 19 | const schema = getSchema('invalid/json-schema.json'); 20 | should.throws(() => { convert(schema); }, /InvalidTypeError.*invalidtype/); 21 | }); 22 | -------------------------------------------------------------------------------- /test/items.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('items', () => { 7 | const schema = { 8 | $schema: 'http://json-schema.org/draft-04/schema#', 9 | type: 'array', 10 | items: { 11 | type: 'string', 12 | format: 'date-time', 13 | example: '2017-01-01T12:34:56Z' 14 | } 15 | }; 16 | 17 | const result = convert(schema); 18 | 19 | const expected = { 20 | type: 'array', 21 | items: { 22 | type: 'string', 23 | format: 'date-time', 24 | example: '2017-01-01T12:34:56Z' 25 | } 26 | }; 27 | 28 | should(result).deepEqual(expected, 'converted'); 29 | }); 30 | -------------------------------------------------------------------------------- /test/nullable.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('adds `nullable: true` for `type: [string, null]`', () => { 7 | const schema = { 8 | $schema: 'http://json-schema.org/draft-04/schema#', 9 | type: ['string', 'null'], 10 | }; 11 | 12 | const result = convert(schema); 13 | 14 | should(result).deepEqual({ 15 | type: 'string', 16 | nullable: true 17 | }); 18 | }); 19 | 20 | 21 | it('supports nullables inside sub-schemas', () => { 22 | const schema = { 23 | $schema: 'http://json-schema.org/draft-04/schema#', 24 | oneOf: [ 25 | { type: 'string' }, 26 | { type: 'null' } 27 | ] 28 | }; 29 | 30 | const result = convert(schema); 31 | 32 | should(result).deepEqual({ 33 | oneOf: [ 34 | { type: 'string' }, 35 | { nullable: true } 36 | ] 37 | }); 38 | }); 39 | 40 | it('does not add nullable for non null types', () => { 41 | const schema = { 42 | $schema: 'http://json-schema.org/draft-04/schema#', 43 | type: 'string' 44 | }; 45 | 46 | const result = convert(schema); 47 | 48 | should(result).deepEqual({ 49 | type: 'string' 50 | }); 51 | }); 52 | -------------------------------------------------------------------------------- /test/pattern_properties.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('renames patternProperties to x-patternProperties', () => { 7 | const schema = { 8 | $schema: 'http://json-schema.org/draft-04/schema#', 9 | type: 'object', 10 | additionalProperties: { 11 | type: 'string' 12 | }, 13 | patternProperties: { 14 | '^[a-z]*$': { 15 | type: 'string' 16 | } 17 | } 18 | }; 19 | 20 | const result = convert(schema); 21 | 22 | const expected = { 23 | type: 'object', 24 | additionalProperties: { 25 | type: 'string' 26 | }, 27 | 'x-patternProperties': { 28 | '^[a-z]*$': { 29 | type: 'string' 30 | } 31 | } 32 | }; 33 | 34 | should(result).deepEqual(expected); 35 | }); 36 | -------------------------------------------------------------------------------- /test/properties.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('type array', () => { 7 | const schema = { 8 | $schema: 'http://json-schema.org/draft-04/schema#', 9 | type: ['string', 'null'] 10 | }; 11 | 12 | const result = convert(schema); 13 | 14 | const expected = { 15 | type: 'string', 16 | nullable: true 17 | }; 18 | 19 | should(result).deepEqual(expected); 20 | }); 21 | 22 | it('properties', () => { 23 | const schema = { 24 | $schema: 'http://json-schema.org/draft-04/schema#', 25 | type: 'object', 26 | required: ['bar'], 27 | properties: { 28 | foo: { 29 | type: 'string', 30 | }, 31 | bar: { 32 | type: ['string', 'null'] 33 | } 34 | } 35 | }; 36 | 37 | const result = convert(schema); 38 | 39 | const expected = { 40 | type: 'object', 41 | required: ['bar'], 42 | properties: { 43 | foo: { 44 | type: 'string', 45 | }, 46 | bar: { 47 | type: 'string', 48 | nullable: true 49 | } 50 | } 51 | }; 52 | 53 | should(result).deepEqual(expected); 54 | }); 55 | 56 | it('addionalProperties is false', () => { 57 | const schema = { 58 | $schema: 'http://json-schema.org/draft-04/schema#', 59 | type: 'object', 60 | properties: { 61 | foo: { 62 | type: 'string', 63 | } 64 | }, 65 | additionalProperties: false 66 | }; 67 | 68 | const result = convert(schema); 69 | 70 | const expected = { 71 | type: 'object', 72 | properties: { 73 | foo: { 74 | type: 'string', 75 | } 76 | }, 77 | additionalProperties: false 78 | }; 79 | 80 | should(result).deepEqual(expected, 'properties converted'); 81 | }); 82 | 83 | it('addionalProperties is true', () => { 84 | const schema = { 85 | $schema: 'http://json-schema.org/draft-04/schema#', 86 | type: 'object', 87 | properties: { 88 | foo: { 89 | type: 'string', 90 | } 91 | }, 92 | additionalProperties: true 93 | }; 94 | 95 | const result = convert(schema); 96 | 97 | const expected = { 98 | type: 'object', 99 | properties: { 100 | foo: { 101 | type: 'string', 102 | } 103 | }, 104 | additionalProperties: true 105 | }; 106 | 107 | should(result).deepEqual(expected); 108 | }); 109 | 110 | it('addionalProperties is an object', () => { 111 | const schema = { 112 | $schema: 'http://json-schema.org/draft-04/schema#', 113 | type: 'object', 114 | properties: { 115 | foo: { 116 | type: 'string', 117 | } 118 | }, 119 | additionalProperties: { 120 | type: 'object', 121 | properties: { 122 | foo: { 123 | type: 'string', 124 | format: 'date-time' 125 | } 126 | } 127 | } 128 | }; 129 | 130 | const result = convert(schema); 131 | 132 | const expected = { 133 | type: 'object', 134 | properties: { 135 | foo: { 136 | type: 'string' 137 | } 138 | }, 139 | additionalProperties: { 140 | type: 'object', 141 | properties: { 142 | foo: { 143 | type: 'string', 144 | format: 'date-time' 145 | } 146 | } 147 | } 148 | }; 149 | 150 | should(result).deepEqual(expected, 'properties and additionalProperties converted'); 151 | }); 152 | -------------------------------------------------------------------------------- /test/readonly_writeonly.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('maintain readOnly and writeOnly props', () => { 7 | const schema = { 8 | type: 'object', 9 | properties: { 10 | prop1: { 11 | type: 'string', 12 | readOnly: true 13 | }, 14 | prop2: { 15 | type: 'string', 16 | writeOnly: true 17 | } 18 | } 19 | }; 20 | 21 | const result = convert(schema); 22 | 23 | const expected = { 24 | type: 'object', 25 | properties: { 26 | prop1: { 27 | type: 'string', 28 | readOnly: true 29 | }, 30 | prop2: { 31 | type: 'string', 32 | writeOnly: true 33 | } 34 | } 35 | }; 36 | 37 | should(result).deepEqual(expected); 38 | }); 39 | 40 | it('deep schema', () => { 41 | const schema = { 42 | type: 'object', 43 | required: ['prop1', 'prop2'], 44 | properties: { 45 | prop1: { 46 | type: 'string', 47 | readOnly: true 48 | }, 49 | prop2: { 50 | allOf: [ 51 | { 52 | type: 'object', 53 | required: ['prop3'], 54 | properties: { 55 | prop3: { 56 | type: 'object', 57 | readOnly: true 58 | } 59 | } 60 | }, 61 | { 62 | type: 'object', 63 | properties: { 64 | prop4: { 65 | type: 'object', 66 | readOnly: true 67 | } 68 | } 69 | }, 70 | ] 71 | } 72 | } 73 | }; 74 | 75 | const result = convert(schema); 76 | 77 | const expected = { 78 | type: 'object', 79 | required: ['prop1', 'prop2'], 80 | properties: { 81 | prop1: { 82 | type: 'string', 83 | readOnly: true 84 | }, 85 | prop2: { 86 | allOf: [ 87 | { 88 | type: 'object', 89 | required: ['prop3'], 90 | properties: { 91 | prop3: { 92 | type: 'object', 93 | readOnly: true 94 | } 95 | } 96 | }, 97 | { 98 | type: 'object', 99 | properties: { 100 | prop4: { 101 | type: 'object', 102 | readOnly: true 103 | } 104 | } 105 | }, 106 | ] 107 | } 108 | } 109 | }; 110 | 111 | should(result).deepEqual(expected); 112 | }); 113 | -------------------------------------------------------------------------------- /test/schemas/address/json-schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-06/schema#", 3 | "description": "An Address following the convention of http://microformats.org/wiki/hcard", 4 | "type": "object", 5 | "properties": { 6 | "post-office-box": { "type": "string" }, 7 | "extended-address": { "type": "string" }, 8 | "street-address": { "type": "string" }, 9 | "locality":{ "type": "string" }, 10 | "region": { "type": "string" }, 11 | "postal-code": { "type": "string" }, 12 | "country-name": { "type": "string"} 13 | }, 14 | "required": ["locality", "region", "country-name"], 15 | "dependencies": { 16 | "post-office-box": ["street-address"], 17 | "extended-address": ["street-address"] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /test/schemas/address/openapi.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "An Address following the convention of http://microformats.org/wiki/hcard", 3 | "type": "object", 4 | "properties": { 5 | "post-office-box": { "type": "string" }, 6 | "extended-address": { "type": "string" }, 7 | "street-address": { "type": "string" }, 8 | "locality":{ "type": "string" }, 9 | "region": { "type": "string" }, 10 | "postal-code": { "type": "string" }, 11 | "country-name": { "type": "string"} 12 | }, 13 | "required": ["locality", "region", "country-name"], 14 | "allOf": [ 15 | { 16 | "oneOf": [ 17 | {"not": {"required": ["post-office-box"]}}, 18 | {"required": ["post-office-box", "street-address"]} 19 | ] 20 | }, 21 | { 22 | "oneOf": [ 23 | {"not": {"required": ["extended-address"]}}, 24 | {"required": ["extended-address", "street-address"]} 25 | ] 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /test/schemas/basic/json-schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-04/schema#", 3 | "allOf": [ 4 | { 5 | "anyOf": [ 6 | { 7 | "type": "object", 8 | "properties": { 9 | "cats": { 10 | "type": "array", 11 | "items": { 12 | "type": "integer", 13 | "format": "int64", 14 | "example": [ 15 | 1 16 | ] 17 | } 18 | } 19 | } 20 | }, 21 | { 22 | "type": "object", 23 | "properties": { 24 | "dogs": { 25 | "type": "array", 26 | "items": { 27 | "type": "integer", 28 | "format": "int64", 29 | "example": [ 30 | 1 31 | ] 32 | } 33 | } 34 | } 35 | }, 36 | { 37 | "type": "object", 38 | "properties": { 39 | "bring_cats": { 40 | "type": "array", 41 | "items": { 42 | "allOf": [ 43 | { 44 | "type": "object", 45 | "properties": { 46 | "email": { 47 | "type": "string", 48 | "example": "cats@email.com" 49 | }, 50 | "sms": { 51 | "type": [ 52 | "string", 53 | "null" 54 | ], 55 | "example": "+12345678" 56 | }, 57 | "properties": { 58 | "type": "object", 59 | "additionalProperties": { 60 | "type": "string" 61 | }, 62 | "example": { 63 | "name": "Wookie" 64 | } 65 | } 66 | } 67 | }, 68 | { 69 | "required": [ 70 | "email" 71 | ] 72 | } 73 | ] 74 | } 75 | } 76 | } 77 | } 78 | ] 79 | }, 80 | { 81 | "type": "object", 82 | "properties": { 83 | "playground": { 84 | "type": "object", 85 | "required": [ 86 | "feeling", 87 | "child" 88 | ], 89 | "properties": { 90 | "feeling": { 91 | "type": "string", 92 | "example": "Good feeling" 93 | }, 94 | "child": { 95 | "type": "object", 96 | "required": [ 97 | "name", 98 | "age" 99 | ], 100 | "properties": { 101 | "name": { 102 | "type": "string", 103 | "example": "Steven" 104 | }, 105 | "age": { 106 | "type": "integer", 107 | "example": 5 108 | } 109 | } 110 | }, 111 | "toy": { 112 | "type": "object", 113 | "properties": { 114 | "breaks_easily": { 115 | "type": "boolean", 116 | "default": false 117 | }, 118 | "color": { 119 | "type": "string", 120 | "description": "Color of the toy" 121 | }, 122 | "type": { 123 | "type": "string", 124 | "enum": ["bucket", "shovel"], 125 | "description": "Toy type" 126 | } 127 | } 128 | } 129 | } 130 | } 131 | } 132 | } 133 | ] 134 | } 135 | -------------------------------------------------------------------------------- /test/schemas/basic/openapi.json: -------------------------------------------------------------------------------- 1 | { 2 | "allOf": [ 3 | { 4 | "anyOf": [ 5 | { 6 | "type": "object", 7 | "properties": { 8 | "cats": { 9 | "type": "array", 10 | "items": { 11 | "type": "integer", 12 | "format": "int64", 13 | "example": [ 14 | 1 15 | ] 16 | } 17 | } 18 | } 19 | }, 20 | { 21 | "type": "object", 22 | "properties": { 23 | "dogs": { 24 | "type": "array", 25 | "items": { 26 | "type": "integer", 27 | "format": "int64", 28 | "example": [ 29 | 1 30 | ] 31 | } 32 | } 33 | } 34 | }, 35 | { 36 | "type": "object", 37 | "properties": { 38 | "bring_cats": { 39 | "type": "array", 40 | "items": { 41 | "allOf": [ 42 | { 43 | "type": "object", 44 | "properties": { 45 | "email": { 46 | "type": "string", 47 | "example": "cats@email.com" 48 | }, 49 | "sms": { 50 | "type": "string", 51 | "nullable": true, 52 | "example": "+12345678" 53 | }, 54 | "properties": { 55 | "type": "object", 56 | "additionalProperties": { 57 | "type": "string" 58 | }, 59 | "example": { 60 | "name": "Wookie" 61 | } 62 | } 63 | } 64 | }, 65 | { 66 | "required": [ 67 | "email" 68 | ] 69 | } 70 | ] 71 | } 72 | } 73 | } 74 | } 75 | ] 76 | }, 77 | { 78 | "type": "object", 79 | "properties": { 80 | "playground": { 81 | "type": "object", 82 | "required": [ 83 | "feeling", 84 | "child" 85 | ], 86 | "properties": { 87 | "feeling": { 88 | "type": "string", 89 | "example": "Good feeling" 90 | }, 91 | "child": { 92 | "type": "object", 93 | "required": [ 94 | "name", 95 | "age" 96 | ], 97 | "properties": { 98 | "name": { 99 | "type": "string", 100 | "example": "Steven" 101 | }, 102 | "age": { 103 | "type": "integer", 104 | "example": 5 105 | } 106 | } 107 | }, 108 | "toy": { 109 | "type": "object", 110 | "properties": { 111 | "breaks_easily": { 112 | "type": "boolean", 113 | "default": false 114 | }, 115 | "color": { 116 | "type": "string", 117 | "description": "Color of the toy" 118 | }, 119 | "type": { 120 | "type": "string", 121 | "enum": ["bucket", "shovel"], 122 | "description": "Toy type" 123 | } 124 | } 125 | } 126 | } 127 | } 128 | } 129 | } 130 | ] 131 | } 132 | -------------------------------------------------------------------------------- /test/schemas/calendar/json-schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-06/schema#", 3 | "description": "A representation of an event", 4 | "type": "object", 5 | "required": [ "dtstart", "summary" ], 6 | "properties": { 7 | "dtstart": { 8 | "format": "date-time", 9 | "type": "string", 10 | "description": "Event starting time" 11 | }, 12 | "dtend": { 13 | "format": "date-time", 14 | "type": "string", 15 | "description": "Event ending time" 16 | }, 17 | "summary": { "type": "string" }, 18 | "location": { "type": "string" }, 19 | "url": { "type": "string", "format": "uri" }, 20 | "duration": { 21 | "format": "time", 22 | "type": "string", 23 | "description": "Event duration" 24 | }, 25 | "rdate": { 26 | "format": "date-time", 27 | "type": "string", 28 | "description": "Recurrence date" 29 | }, 30 | "rrule": { 31 | "type": "string", 32 | "description": "Recurrence rule" 33 | }, 34 | "category": { "type": "string" }, 35 | "description": { "type": "string" }, 36 | "geo": { "$ref": "http://json-schema.org/geo" } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /test/schemas/calendar/openapi.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "A representation of an event", 3 | "type": "object", 4 | "required": [ "dtstart", "summary" ], 5 | "properties": { 6 | "dtstart": { 7 | "format": "date-time", 8 | "type": "string", 9 | "description": "Event starting time" 10 | }, 11 | "dtend": { 12 | "format": "date-time", 13 | "type": "string", 14 | "description": "Event ending time" 15 | }, 16 | "summary": { "type": "string" }, 17 | "location": { "type": "string" }, 18 | "url": { "type": "string", "format": "uri" }, 19 | "duration": { 20 | "format": "time", 21 | "type": "string", 22 | "description": "Event duration" 23 | }, 24 | "rdate": { 25 | "format": "date-time", 26 | "type": "string", 27 | "description": "Recurrence date" 28 | }, 29 | "rrule": { 30 | "type": "string", 31 | "description": "Recurrence rule" 32 | }, 33 | "category": { "type": "string" }, 34 | "description": { "type": "string" }, 35 | "geo": { "$ref": "http://json-schema.org/geo" } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /test/schemas/example2/json-schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "http://some.site.somewhere/entry-schema#", 3 | "$schema": "http://json-schema.org/draft-06/schema#", 4 | "description": "schema for an fstab entry", 5 | "type": "object", 6 | "required": [ "storage" ], 7 | "properties": { 8 | "storage": { 9 | "type": "object", 10 | "oneOf": [ 11 | { "$ref": "#/definitions/diskDevice" }, 12 | { "$ref": "#/definitions/diskUUID" }, 13 | { "$ref": "#/definitions/nfs" }, 14 | { "$ref": "#/definitions/tmpfs" } 15 | ] 16 | }, 17 | "fstype": { 18 | "enum": [ "ext3", "ext4", "btrfs" ] 19 | }, 20 | "options": { 21 | "type": "array", 22 | "minItems": 1, 23 | "items": { "type": "string" }, 24 | "uniqueItems": true 25 | }, 26 | "readonly": { "type": "boolean" } 27 | }, 28 | "definitions": { 29 | "diskDevice": { 30 | "properties": { 31 | "type": { "enum": [ "disk" ] }, 32 | "device": { 33 | "type": "string", 34 | "pattern": "^/dev/[^/]+(/[^/]+)*$" 35 | } 36 | }, 37 | "required": [ "type", "device" ], 38 | "additionalProperties": false 39 | }, 40 | "diskUUID": { 41 | "properties": { 42 | "type": { "enum": [ "disk" ] }, 43 | "label": { 44 | "type": "string", 45 | "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" 46 | } 47 | }, 48 | "required": [ "type", "label" ], 49 | "additionalProperties": false 50 | }, 51 | "nfs": { 52 | "properties": { 53 | "type": { "enum": [ "nfs" ] }, 54 | "remotePath": { 55 | "type": "string", 56 | "pattern": "^(/[^/]+)+$" 57 | }, 58 | "server": { 59 | "type": "string", 60 | "oneOf": [ 61 | { "format": "hostname" }, 62 | { "format": "ipv4" }, 63 | { "format": "ipv6" } 64 | ] 65 | } 66 | }, 67 | "required": [ "type", "server", "remotePath" ], 68 | "additionalProperties": false 69 | }, 70 | "tmpfs": { 71 | "properties": { 72 | "type": { "enum": [ "tmpfs" ] }, 73 | "sizeInMB": { 74 | "type": "integer", 75 | "minimum": 16, 76 | "maximum": 512 77 | } 78 | }, 79 | "required": [ "type", "sizeInMB" ], 80 | "additionalProperties": false 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /test/schemas/example2/openapi.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "schema for an fstab entry", 3 | "type": "object", 4 | "required": [ "storage" ], 5 | "properties": { 6 | "storage": { 7 | "type": "object", 8 | "oneOf": [ 9 | { "$ref": "#/definitions/diskDevice" }, 10 | { "$ref": "#/definitions/diskUUID" }, 11 | { "$ref": "#/definitions/nfs" }, 12 | { "$ref": "#/definitions/tmpfs" } 13 | ] 14 | }, 15 | "fstype": { 16 | "enum": [ "ext3", "ext4", "btrfs" ] 17 | }, 18 | "options": { 19 | "type": "array", 20 | "minItems": 1, 21 | "items": { "type": "string" }, 22 | "uniqueItems": true 23 | }, 24 | "readonly": { "type": "boolean" } 25 | }, 26 | "definitions": { 27 | "diskDevice": { 28 | "properties": { 29 | "type": { "enum": [ "disk" ] }, 30 | "device": { 31 | "type": "string", 32 | "pattern": "^/dev/[^/]+(/[^/]+)*$" 33 | } 34 | }, 35 | "required": [ "type", "device" ], 36 | "additionalProperties": false 37 | }, 38 | "diskUUID": { 39 | "properties": { 40 | "type": { "enum": [ "disk" ] }, 41 | "label": { 42 | "type": "string", 43 | "pattern": "^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$" 44 | } 45 | }, 46 | "required": [ "type", "label" ], 47 | "additionalProperties": false 48 | }, 49 | "nfs": { 50 | "properties": { 51 | "type": { "enum": [ "nfs" ] }, 52 | "remotePath": { 53 | "type": "string", 54 | "pattern": "^(/[^/]+)+$" 55 | }, 56 | "server": { 57 | "type": "string", 58 | "oneOf": [ 59 | { "format": "hostname" }, 60 | { "format": "ipv4" }, 61 | { "format": "ipv6" } 62 | ] 63 | } 64 | }, 65 | "required": [ "type", "server", "remotePath" ], 66 | "additionalProperties": false 67 | }, 68 | "tmpfs": { 69 | "properties": { 70 | "type": { "enum": [ "tmpfs" ] }, 71 | "sizeInMB": { 72 | "type": "integer", 73 | "minimum": 16, 74 | "maximum": 512 75 | } 76 | }, 77 | "required": [ "type", "sizeInMB" ], 78 | "additionalProperties": false 79 | } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /test/schemas/invalid/json-schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "allOf": [ 3 | { 4 | "anyOf": [ 5 | { 6 | "type": "object", 7 | "properties": { 8 | "cats": { 9 | "type": "array", 10 | "items": { 11 | "type": "integer", 12 | "format": "int64", 13 | "example": [ 14 | 1 15 | ] 16 | } 17 | } 18 | } 19 | }, 20 | { 21 | "type": "object", 22 | "properties": { 23 | "dogs": { 24 | "type": "array", 25 | "items": { 26 | "type": "integer", 27 | "format": "int64", 28 | "example": [ 29 | 1 30 | ] 31 | } 32 | } 33 | } 34 | }, 35 | { 36 | "type": "object", 37 | "properties": { 38 | "bring_cats": { 39 | "type": "array", 40 | "items": { 41 | "allOf": [ 42 | { 43 | "type": "object", 44 | "properties": { 45 | "email": { 46 | "type": "string", 47 | "example": "cats@email.com" 48 | }, 49 | "sms": { 50 | "type": "string", 51 | "nullable": true, 52 | "example": "+12345678" 53 | }, 54 | "properties": { 55 | "type": "object", 56 | "additionalProperties": { 57 | "type": "invalidtype" 58 | }, 59 | "example": { 60 | "name": "Wookie" 61 | } 62 | } 63 | } 64 | }, 65 | { 66 | "required": [ 67 | "email" 68 | ] 69 | } 70 | ] 71 | } 72 | } 73 | } 74 | } 75 | ] 76 | }, 77 | { 78 | "type": "object", 79 | "properties": { 80 | "playground": { 81 | "type": "object", 82 | "required": [ 83 | "feeling", 84 | "child" 85 | ], 86 | "properties": { 87 | "feeling": { 88 | "type": "string", 89 | "example": "Good feeling" 90 | }, 91 | "child": { 92 | "type": "object", 93 | "required": [ 94 | "name", 95 | "age" 96 | ], 97 | "properties": { 98 | "name": { 99 | "type": "string", 100 | "example": "Steven" 101 | }, 102 | "age": { 103 | "type": "integer", 104 | "example": 5 105 | } 106 | } 107 | }, 108 | "toy": { 109 | "type": "object", 110 | "properties": { 111 | "breaks_easily": { 112 | "type": "boolean", 113 | "default": false 114 | }, 115 | "color": { 116 | "type": "string", 117 | "description": "Color of the toy" 118 | }, 119 | "type": { 120 | "type": "string", 121 | "enum": ["bucket", "shovel"], 122 | "description": "Toy type" 123 | } 124 | } 125 | } 126 | } 127 | } 128 | } 129 | } 130 | ] 131 | } 132 | -------------------------------------------------------------------------------- /test/subschema.test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const convert = require('../'); 4 | const should = require('should'); 5 | 6 | it('strips $id from all subschemas not just root`', () => { 7 | const schema = { 8 | $id: "https://foo/bla", 9 | $schema: "http://json-schema.org/draft-06/schema#", 10 | type: "object", 11 | properties: { 12 | foo: { 13 | $id: "/properties/foo", 14 | type: "array", 15 | items: { 16 | $id: "/properties/foo/items", 17 | type: "object", 18 | properties: { 19 | id: { 20 | $id: "/properties/foo/items/properties/id", 21 | type: "string", 22 | } 23 | } 24 | } 25 | } 26 | } 27 | }; 28 | 29 | const result = convert(schema); 30 | 31 | should(result).deepEqual({ 32 | type: "object", 33 | properties: { 34 | foo: { 35 | type: "array", 36 | items: { 37 | type: "object", 38 | properties: { 39 | id: { 40 | type: "string", 41 | } 42 | } 43 | } 44 | } 45 | } 46 | }); 47 | }); 48 | --------------------------------------------------------------------------------