From 568beef49a36badad487b296f09c88789888bf29 Mon Sep 17 00:00:00 2001 From: tommal Date: Thu, 16 Jul 2026 12:27:06 +0200 Subject: [PATCH] all the project copy --- .dockerignore | 8 + .env.example | 20 + .gitignore | 5 + .idea/.gitignore | 5 + .idea/Ticket.iml | 8 + .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + COMMANDS.md | 221 + Dockerfile | 10 + api/ai_index.py | 414 + api/ai_retriever.py | 926 + api/bootstrap_db.py | 66 + api/cockie.py | 2 + api/connection.py | 42 + api/detailTicket.py | 105 + api/limbo/compareText.py | 205 + api/limbo/diff.py | 27 + api/phrase_similarity.py | 64 + conn/config.py | 39 + conn/connection.py | 33 + conn/filters.py | 151 + conn/mysql5.py | 396 + conn/tickets.py | 84 + conn/user.py | 92 + dependencies.txt | 9 + docker-compose.yml | 86 + gifs/welcome.gif | Bin 0 -> 885479 bytes json/empty.txt | 0 node_sid/node_modules/.bin/sshpk-conv | 1 + node_sid/node_modules/.bin/sshpk-sign | 1 + node_sid/node_modules/.bin/sshpk-verify | 1 + node_sid/node_modules/.bin/uuid | 1 + node_sid/node_modules/.package-lock.json | 434 + node_sid/node_modules/ajv/.tonic_example.js | 20 + node_sid/node_modules/ajv/LICENSE | 22 + node_sid/node_modules/ajv/README.md | 1497 ++ node_sid/node_modules/ajv/dist/ajv.bundle.js | 7189 ++++++++ node_sid/node_modules/ajv/dist/ajv.min.js | 3 + node_sid/node_modules/ajv/dist/ajv.min.js.map | 1 + node_sid/node_modules/ajv/lib/ajv.d.ts | 397 + node_sid/node_modules/ajv/lib/ajv.js | 506 + node_sid/node_modules/ajv/lib/cache.js | 26 + .../node_modules/ajv/lib/compile/async.js | 90 + .../node_modules/ajv/lib/compile/equal.js | 5 + .../ajv/lib/compile/error_classes.js | 34 + .../node_modules/ajv/lib/compile/formats.js | 142 + .../node_modules/ajv/lib/compile/index.js | 387 + .../node_modules/ajv/lib/compile/resolve.js | 270 + .../node_modules/ajv/lib/compile/rules.js | 66 + .../ajv/lib/compile/schema_obj.js | 9 + .../ajv/lib/compile/ucs2length.js | 20 + node_sid/node_modules/ajv/lib/compile/util.js | 239 + node_sid/node_modules/ajv/lib/data.js | 49 + .../node_modules/ajv/lib/definition_schema.js | 37 + node_sid/node_modules/ajv/lib/dot/_limit.jst | 113 + .../node_modules/ajv/lib/dot/_limitItems.jst | 12 + .../node_modules/ajv/lib/dot/_limitLength.jst | 12 + .../ajv/lib/dot/_limitProperties.jst | 12 + node_sid/node_modules/ajv/lib/dot/allOf.jst | 32 + node_sid/node_modules/ajv/lib/dot/anyOf.jst | 46 + node_sid/node_modules/ajv/lib/dot/coerce.def | 51 + node_sid/node_modules/ajv/lib/dot/comment.jst | 9 + node_sid/node_modules/ajv/lib/dot/const.jst | 11 + .../node_modules/ajv/lib/dot/contains.jst | 55 + node_sid/node_modules/ajv/lib/dot/custom.jst | 191 + .../node_modules/ajv/lib/dot/defaults.def | 47 + .../node_modules/ajv/lib/dot/definitions.def | 203 + .../node_modules/ajv/lib/dot/dependencies.jst | 79 + node_sid/node_modules/ajv/lib/dot/enum.jst | 30 + node_sid/node_modules/ajv/lib/dot/errors.def | 194 + node_sid/node_modules/ajv/lib/dot/format.jst | 106 + node_sid/node_modules/ajv/lib/dot/if.jst | 73 + node_sid/node_modules/ajv/lib/dot/items.jst | 98 + node_sid/node_modules/ajv/lib/dot/missing.def | 39 + .../node_modules/ajv/lib/dot/multipleOf.jst | 22 + node_sid/node_modules/ajv/lib/dot/not.jst | 43 + node_sid/node_modules/ajv/lib/dot/oneOf.jst | 54 + node_sid/node_modules/ajv/lib/dot/pattern.jst | 14 + .../node_modules/ajv/lib/dot/properties.jst | 245 + .../ajv/lib/dot/propertyNames.jst | 52 + node_sid/node_modules/ajv/lib/dot/ref.jst | 85 + .../node_modules/ajv/lib/dot/required.jst | 108 + .../node_modules/ajv/lib/dot/uniqueItems.jst | 62 + .../node_modules/ajv/lib/dot/validate.jst | 276 + node_sid/node_modules/ajv/lib/dotjs/README.md | 3 + node_sid/node_modules/ajv/lib/dotjs/_limit.js | 163 + .../node_modules/ajv/lib/dotjs/_limitItems.js | 80 + .../ajv/lib/dotjs/_limitLength.js | 85 + .../ajv/lib/dotjs/_limitProperties.js | 80 + node_sid/node_modules/ajv/lib/dotjs/allOf.js | 42 + node_sid/node_modules/ajv/lib/dotjs/anyOf.js | 73 + .../node_modules/ajv/lib/dotjs/comment.js | 14 + node_sid/node_modules/ajv/lib/dotjs/const.js | 56 + .../node_modules/ajv/lib/dotjs/contains.js | 81 + node_sid/node_modules/ajv/lib/dotjs/custom.js | 228 + .../ajv/lib/dotjs/dependencies.js | 168 + node_sid/node_modules/ajv/lib/dotjs/enum.js | 66 + node_sid/node_modules/ajv/lib/dotjs/format.js | 150 + node_sid/node_modules/ajv/lib/dotjs/if.js | 103 + node_sid/node_modules/ajv/lib/dotjs/index.js | 33 + node_sid/node_modules/ajv/lib/dotjs/items.js | 140 + .../node_modules/ajv/lib/dotjs/multipleOf.js | 80 + node_sid/node_modules/ajv/lib/dotjs/not.js | 84 + node_sid/node_modules/ajv/lib/dotjs/oneOf.js | 73 + .../node_modules/ajv/lib/dotjs/pattern.js | 75 + .../node_modules/ajv/lib/dotjs/properties.js | 335 + .../ajv/lib/dotjs/propertyNames.js | 81 + node_sid/node_modules/ajv/lib/dotjs/ref.js | 124 + .../node_modules/ajv/lib/dotjs/required.js | 270 + .../node_modules/ajv/lib/dotjs/uniqueItems.js | 86 + .../node_modules/ajv/lib/dotjs/validate.js | 482 + node_sid/node_modules/ajv/lib/keyword.js | 146 + node_sid/node_modules/ajv/lib/refs/data.json | 17 + .../ajv/lib/refs/json-schema-draft-04.json | 149 + .../ajv/lib/refs/json-schema-draft-06.json | 154 + .../ajv/lib/refs/json-schema-draft-07.json | 168 + .../ajv/lib/refs/json-schema-secure.json | 94 + node_sid/node_modules/ajv/package.json | 106 + .../node_modules/ajv/scripts/.eslintrc.yml | 3 + node_sid/node_modules/ajv/scripts/bundle.js | 61 + .../node_modules/ajv/scripts/compile-dots.js | 73 + node_sid/node_modules/ajv/scripts/info | 10 + .../node_modules/ajv/scripts/prepare-tests | 12 + .../ajv/scripts/publish-built-version | 32 + .../node_modules/ajv/scripts/travis-gh-pages | 23 + node_sid/node_modules/asn1/Jenkinsfile | 65 + node_sid/node_modules/asn1/LICENSE | 19 + node_sid/node_modules/asn1/README.md | 50 + node_sid/node_modules/asn1/lib/ber/errors.js | 13 + node_sid/node_modules/asn1/lib/ber/index.js | 27 + node_sid/node_modules/asn1/lib/ber/reader.js | 262 + node_sid/node_modules/asn1/lib/ber/types.js | 36 + node_sid/node_modules/asn1/lib/ber/writer.js | 317 + node_sid/node_modules/asn1/lib/index.js | 20 + node_sid/node_modules/asn1/package.json | 31 + node_sid/node_modules/assert-plus/AUTHORS | 6 + node_sid/node_modules/assert-plus/CHANGES.md | 14 + node_sid/node_modules/assert-plus/README.md | 162 + node_sid/node_modules/assert-plus/assert.js | 211 + .../node_modules/assert-plus/package.json | 23 + node_sid/node_modules/asynckit/LICENSE | 21 + node_sid/node_modules/asynckit/README.md | 233 + node_sid/node_modules/asynckit/bench.js | 76 + node_sid/node_modules/asynckit/index.js | 6 + node_sid/node_modules/asynckit/lib/abort.js | 29 + node_sid/node_modules/asynckit/lib/async.js | 34 + node_sid/node_modules/asynckit/lib/defer.js | 26 + node_sid/node_modules/asynckit/lib/iterate.js | 75 + .../asynckit/lib/readable_asynckit.js | 91 + .../asynckit/lib/readable_parallel.js | 25 + .../asynckit/lib/readable_serial.js | 25 + .../asynckit/lib/readable_serial_ordered.js | 29 + node_sid/node_modules/asynckit/lib/state.js | 37 + .../node_modules/asynckit/lib/streamify.js | 141 + .../node_modules/asynckit/lib/terminator.js | 29 + node_sid/node_modules/asynckit/package.json | 63 + node_sid/node_modules/asynckit/parallel.js | 43 + node_sid/node_modules/asynckit/serial.js | 17 + .../node_modules/asynckit/serialOrdered.js | 75 + node_sid/node_modules/asynckit/stream.js | 21 + node_sid/node_modules/aws-sign2/LICENSE | 55 + node_sid/node_modules/aws-sign2/README.md | 4 + node_sid/node_modules/aws-sign2/index.js | 212 + node_sid/node_modules/aws-sign2/package.json | 17 + .../node_modules/aws4/.github/FUNDING.yml | 3 + node_sid/node_modules/aws4/.travis.yml | 9 + node_sid/node_modules/aws4/LICENSE | 19 + node_sid/node_modules/aws4/README.md | 183 + node_sid/node_modules/aws4/aws4.js | 373 + node_sid/node_modules/aws4/lru.js | 96 + node_sid/node_modules/aws4/package.json | 17 + .../node_modules/bcrypt-pbkdf/CONTRIBUTING.md | 13 + node_sid/node_modules/bcrypt-pbkdf/LICENSE | 66 + node_sid/node_modules/bcrypt-pbkdf/README.md | 45 + node_sid/node_modules/bcrypt-pbkdf/index.js | 556 + .../node_modules/bcrypt-pbkdf/package.json | 15 + node_sid/node_modules/caseless/LICENSE | 28 + node_sid/node_modules/caseless/README.md | 45 + node_sid/node_modules/caseless/index.js | 67 + node_sid/node_modules/caseless/package.json | 27 + node_sid/node_modules/caseless/test.js | 67 + node_sid/node_modules/combined-stream/License | 19 + .../node_modules/combined-stream/Readme.md | 138 + .../combined-stream/lib/combined_stream.js | 208 + .../node_modules/combined-stream/package.json | 25 + .../node_modules/combined-stream/yarn.lock | 17 + node_sid/node_modules/core-util-is/LICENSE | 19 + node_sid/node_modules/core-util-is/README.md | 3 + .../node_modules/core-util-is/float.patch | 604 + .../node_modules/core-util-is/lib/util.js | 107 + .../node_modules/core-util-is/package.json | 32 + node_sid/node_modules/core-util-is/test.js | 68 + node_sid/node_modules/dashdash/CHANGES.md | 364 + node_sid/node_modules/dashdash/LICENSE.txt | 24 + node_sid/node_modules/dashdash/README.md | 574 + .../dashdash/etc/dashdash.bash_completion.in | 389 + .../node_modules/dashdash/lib/dashdash.js | 1055 ++ node_sid/node_modules/dashdash/package.json | 26 + .../node_modules/delayed-stream/.npmignore | 1 + node_sid/node_modules/delayed-stream/License | 19 + node_sid/node_modules/delayed-stream/Makefile | 7 + .../node_modules/delayed-stream/Readme.md | 141 + .../delayed-stream/lib/delayed_stream.js | 107 + .../node_modules/delayed-stream/package.json | 27 + node_sid/node_modules/ecc-jsbn/LICENSE | 21 + node_sid/node_modules/ecc-jsbn/README.md | 8 + node_sid/node_modules/ecc-jsbn/index.js | 58 + .../node_modules/ecc-jsbn/lib/LICENSE-jsbn | 40 + node_sid/node_modules/ecc-jsbn/lib/ec.js | 561 + node_sid/node_modules/ecc-jsbn/lib/sec.js | 170 + node_sid/node_modules/ecc-jsbn/package.json | 40 + node_sid/node_modules/ecc-jsbn/test.js | 14 + node_sid/node_modules/extend/.editorconfig | 20 + node_sid/node_modules/extend/.eslintrc | 17 + node_sid/node_modules/extend/.jscs.json | 175 + node_sid/node_modules/extend/.travis.yml | 230 + node_sid/node_modules/extend/CHANGELOG.md | 83 + node_sid/node_modules/extend/LICENSE | 23 + node_sid/node_modules/extend/README.md | 81 + node_sid/node_modules/extend/component.json | 32 + node_sid/node_modules/extend/index.js | 117 + node_sid/node_modules/extend/package.json | 42 + node_sid/node_modules/extsprintf/.gitmodules | 0 node_sid/node_modules/extsprintf/.npmignore | 2 + node_sid/node_modules/extsprintf/LICENSE | 19 + node_sid/node_modules/extsprintf/Makefile | 24 + .../node_modules/extsprintf/Makefile.targ | 285 + node_sid/node_modules/extsprintf/README.md | 46 + .../node_modules/extsprintf/jsl.node.conf | 137 + .../node_modules/extsprintf/lib/extsprintf.js | 183 + node_sid/node_modules/extsprintf/package.json | 14 + node_sid/node_modules/fast-deep-equal/LICENSE | 21 + .../node_modules/fast-deep-equal/README.md | 96 + .../fast-deep-equal/es6/index.d.ts | 2 + .../node_modules/fast-deep-equal/es6/index.js | 72 + .../fast-deep-equal/es6/react.d.ts | 2 + .../node_modules/fast-deep-equal/es6/react.js | 79 + .../node_modules/fast-deep-equal/index.d.ts | 4 + .../node_modules/fast-deep-equal/index.js | 46 + .../node_modules/fast-deep-equal/package.json | 61 + .../node_modules/fast-deep-equal/react.d.ts | 2 + .../node_modules/fast-deep-equal/react.js | 53 + .../fast-json-stable-stringify/.eslintrc.yml | 26 + .../.github/FUNDING.yml | 1 + .../fast-json-stable-stringify/.travis.yml | 8 + .../fast-json-stable-stringify/LICENSE | 21 + .../fast-json-stable-stringify/README.md | 131 + .../benchmark/index.js | 31 + .../benchmark/test.json | 137 + .../example/key_cmp.js | 7 + .../example/nested.js | 3 + .../fast-json-stable-stringify/example/str.js | 3 + .../example/value_cmp.js | 7 + .../fast-json-stable-stringify/index.d.ts | 4 + .../fast-json-stable-stringify/index.js | 59 + .../fast-json-stable-stringify/package.json | 52 + .../fast-json-stable-stringify/test/cmp.js | 13 + .../fast-json-stable-stringify/test/nested.js | 44 + .../fast-json-stable-stringify/test/str.js | 46 + .../test/to-json.js | 22 + node_sid/node_modules/forever-agent/LICENSE | 55 + node_sid/node_modules/forever-agent/README.md | 4 + node_sid/node_modules/forever-agent/index.js | 138 + .../node_modules/forever-agent/package.json | 17 + node_sid/node_modules/form-data/License | 19 + node_sid/node_modules/form-data/README.md | 234 + node_sid/node_modules/form-data/README.md.bak | 234 + .../node_modules/form-data/lib/browser.js | 2 + .../node_modules/form-data/lib/form_data.js | 457 + .../node_modules/form-data/lib/populate.js | 10 + node_sid/node_modules/form-data/package.json | 65 + node_sid/node_modules/form-data/yarn.lock | 2662 +++ node_sid/node_modules/getpass/.npmignore | 8 + node_sid/node_modules/getpass/.travis.yml | 9 + node_sid/node_modules/getpass/LICENSE | 18 + node_sid/node_modules/getpass/README.md | 32 + node_sid/node_modules/getpass/lib/index.js | 123 + node_sid/node_modules/getpass/package.json | 18 + node_sid/node_modules/har-schema/LICENSE | 13 + node_sid/node_modules/har-schema/README.md | 49 + .../har-schema/lib/afterRequest.json | 30 + .../har-schema/lib/beforeRequest.json | 30 + .../node_modules/har-schema/lib/browser.json | 20 + .../node_modules/har-schema/lib/cache.json | 21 + .../node_modules/har-schema/lib/content.json | 29 + .../node_modules/har-schema/lib/cookie.json | 36 + .../node_modules/har-schema/lib/creator.json | 20 + .../node_modules/har-schema/lib/entry.json | 53 + node_sid/node_modules/har-schema/lib/har.json | 13 + .../node_modules/har-schema/lib/header.json | 20 + node_sid/node_modules/har-schema/lib/index.js | 22 + node_sid/node_modules/har-schema/lib/log.json | 36 + .../node_modules/har-schema/lib/page.json | 32 + .../har-schema/lib/pageTimings.json | 18 + .../node_modules/har-schema/lib/postData.json | 43 + .../node_modules/har-schema/lib/query.json | 20 + .../node_modules/har-schema/lib/request.json | 57 + .../node_modules/har-schema/lib/response.json | 54 + .../node_modules/har-schema/lib/timings.json | 42 + node_sid/node_modules/har-schema/package.json | 54 + node_sid/node_modules/har-validator/LICENSE | 9 + node_sid/node_modules/har-validator/README.md | 43 + .../node_modules/har-validator/lib/async.js | 105 + .../node_modules/har-validator/lib/error.js | 17 + .../node_modules/har-validator/lib/promise.js | 102 + .../node_modules/har-validator/package.json | 43 + .../http-signature/.dir-locals.el | 6 + .../node_modules/http-signature/.npmignore | 7 + .../node_modules/http-signature/CHANGES.md | 46 + node_sid/node_modules/http-signature/LICENSE | 18 + .../node_modules/http-signature/README.md | 79 + .../http-signature/http_signing.md | 363 + .../node_modules/http-signature/lib/index.js | 29 + .../node_modules/http-signature/lib/parser.js | 315 + .../node_modules/http-signature/lib/signer.js | 401 + .../node_modules/http-signature/lib/utils.js | 112 + .../node_modules/http-signature/lib/verify.js | 88 + .../node_modules/http-signature/package.json | 39 + .../node_modules/is-typedarray/LICENSE.md | 18 + node_sid/node_modules/is-typedarray/README.md | 16 + node_sid/node_modules/is-typedarray/index.js | 41 + .../node_modules/is-typedarray/package.json | 30 + node_sid/node_modules/is-typedarray/test.js | 34 + node_sid/node_modules/isstream/.jshintrc | 59 + node_sid/node_modules/isstream/.npmignore | 1 + node_sid/node_modules/isstream/.travis.yml | 12 + node_sid/node_modules/isstream/LICENSE.md | 11 + node_sid/node_modules/isstream/README.md | 66 + node_sid/node_modules/isstream/isstream.js | 27 + node_sid/node_modules/isstream/package.json | 33 + node_sid/node_modules/isstream/test.js | 168 + node_sid/node_modules/jsbn/.npmignore | 2 + node_sid/node_modules/jsbn/LICENSE | 40 + node_sid/node_modules/jsbn/README.md | 175 + node_sid/node_modules/jsbn/example.html | 12 + node_sid/node_modules/jsbn/example.js | 3 + node_sid/node_modules/jsbn/index.js | 1357 ++ node_sid/node_modules/jsbn/package.json | 21 + .../json-schema-traverse/.eslintrc.yml | 27 + .../json-schema-traverse/.travis.yml | 8 + .../node_modules/json-schema-traverse/LICENSE | 21 + .../json-schema-traverse/README.md | 83 + .../json-schema-traverse/index.js | 89 + .../json-schema-traverse/package.json | 43 + .../json-schema-traverse/spec/.eslintrc.yml | 6 + .../spec/fixtures/schema.js | 125 + .../json-schema-traverse/spec/index.spec.js | 171 + node_sid/node_modules/json-schema/LICENSE | 195 + node_sid/node_modules/json-schema/README.md | 3 + .../node_modules/json-schema/lib/links.js | 65 + .../node_modules/json-schema/lib/validate.js | 271 + .../node_modules/json-schema/package.json | 24 + .../json-stringify-safe/.npmignore | 1 + .../json-stringify-safe/CHANGELOG.md | 14 + .../node_modules/json-stringify-safe/LICENSE | 15 + .../node_modules/json-stringify-safe/Makefile | 35 + .../json-stringify-safe/README.md | 52 + .../json-stringify-safe/package.json | 31 + .../json-stringify-safe/stringify.js | 27 + .../json-stringify-safe/test/mocha.opts | 2 + .../test/stringify_test.js | 246 + node_sid/node_modules/jsprim/CHANGES.md | 53 + node_sid/node_modules/jsprim/CONTRIBUTING.md | 19 + node_sid/node_modules/jsprim/LICENSE | 19 + node_sid/node_modules/jsprim/README.md | 287 + node_sid/node_modules/jsprim/lib/jsprim.js | 735 + node_sid/node_modules/jsprim/package.json | 20 + node_sid/node_modules/mime-db/HISTORY.md | 507 + node_sid/node_modules/mime-db/LICENSE | 23 + node_sid/node_modules/mime-db/README.md | 100 + node_sid/node_modules/mime-db/db.json | 8519 +++++++++ node_sid/node_modules/mime-db/index.js | 12 + node_sid/node_modules/mime-db/package.json | 60 + node_sid/node_modules/mime-types/HISTORY.md | 397 + node_sid/node_modules/mime-types/LICENSE | 23 + node_sid/node_modules/mime-types/README.md | 113 + node_sid/node_modules/mime-types/index.js | 188 + node_sid/node_modules/mime-types/package.json | 44 + node_sid/node_modules/oauth-sign/LICENSE | 55 + node_sid/node_modules/oauth-sign/README.md | 11 + node_sid/node_modules/oauth-sign/index.js | 146 + node_sid/node_modules/oauth-sign/package.json | 23 + .../node_modules/performance-now/.npmignore | 1 + .../performance-now/.tm_properties | 7 + .../node_modules/performance-now/.travis.yml | 6 + .../node_modules/performance-now/README.md | 30 + .../performance-now/lib/performance-now.js | 36 + .../lib/performance-now.js.map | 10 + .../node_modules/performance-now/license.txt | 7 + .../node_modules/performance-now/package.json | 35 + .../performance-now/src/index.d.ts | 8 + .../src/performance-now.coffee | 17 + .../performance-now/test/mocha.opts | 3 + .../test/performance-now.coffee | 43 + .../performance-now/test/scripts.coffee | 27 + .../test/scripts/delayed-call.coffee | 11 + .../test/scripts/delayed-require.coffee | 12 + .../test/scripts/difference.coffee | 6 + .../test/scripts/initial-value.coffee | 10 + node_sid/node_modules/psl/.env | 0 node_sid/node_modules/psl/LICENSE | 9 + node_sid/node_modules/psl/README.md | 211 + .../node_modules/psl/browserstack-logo.svg | 90 + node_sid/node_modules/psl/data/rules.json | 9376 ++++++++++ node_sid/node_modules/psl/dist/psl.js | 10187 +++++++++++ node_sid/node_modules/psl/dist/psl.min.js | 1 + node_sid/node_modules/psl/index.js | 269 + node_sid/node_modules/psl/package.json | 43 + .../node_modules/punycode/LICENSE-MIT.txt | 20 + node_sid/node_modules/punycode/README.md | 122 + node_sid/node_modules/punycode/package.json | 58 + .../node_modules/punycode/punycode.es6.js | 441 + node_sid/node_modules/punycode/punycode.js | 440 + node_sid/node_modules/qs/.editorconfig | 43 + node_sid/node_modules/qs/.eslintrc | 37 + node_sid/node_modules/qs/.github/FUNDING.yml | 12 + node_sid/node_modules/qs/.nycrc | 13 + node_sid/node_modules/qs/CHANGELOG.md | 250 + node_sid/node_modules/qs/LICENSE.md | 29 + node_sid/node_modules/qs/README.md | 510 + node_sid/node_modules/qs/bower.json | 21 + node_sid/node_modules/qs/component.json | 15 + node_sid/node_modules/qs/dist/qs.js | 648 + node_sid/node_modules/qs/lib/formats.js | 18 + node_sid/node_modules/qs/lib/index.js | 11 + node_sid/node_modules/qs/lib/parse.js | 175 + node_sid/node_modules/qs/lib/stringify.js | 217 + node_sid/node_modules/qs/lib/utils.js | 215 + node_sid/node_modules/qs/package.json | 54 + node_sid/node_modules/qs/test/index.js | 7 + node_sid/node_modules/qs/test/parse.js | 649 + node_sid/node_modules/qs/test/stringify.js | 642 + node_sid/node_modules/qs/test/utils.js | 65 + node_sid/node_modules/request/CHANGELOG.md | 717 + node_sid/node_modules/request/LICENSE | 55 + node_sid/node_modules/request/README.md | 1133 ++ node_sid/node_modules/request/index.js | 155 + node_sid/node_modules/request/lib/auth.js | 167 + node_sid/node_modules/request/lib/cookies.js | 38 + .../request/lib/getProxyFromURI.js | 79 + node_sid/node_modules/request/lib/har.js | 205 + node_sid/node_modules/request/lib/hawk.js | 89 + node_sid/node_modules/request/lib/helpers.js | 66 + .../node_modules/request/lib/multipart.js | 112 + node_sid/node_modules/request/lib/oauth.js | 148 + .../node_modules/request/lib/querystring.js | 50 + node_sid/node_modules/request/lib/redirect.js | 154 + node_sid/node_modules/request/lib/tunnel.js | 175 + node_sid/node_modules/request/package.json | 86 + node_sid/node_modules/request/request.js | 1553 ++ node_sid/node_modules/safe-buffer/LICENSE | 21 + node_sid/node_modules/safe-buffer/README.md | 584 + node_sid/node_modules/safe-buffer/index.d.ts | 187 + node_sid/node_modules/safe-buffer/index.js | 65 + .../node_modules/safe-buffer/package.json | 51 + node_sid/node_modules/safer-buffer/LICENSE | 21 + .../safer-buffer/Porting-Buffer.md | 268 + node_sid/node_modules/safer-buffer/Readme.md | 156 + .../node_modules/safer-buffer/dangerous.js | 58 + .../node_modules/safer-buffer/package.json | 34 + node_sid/node_modules/safer-buffer/safer.js | 77 + node_sid/node_modules/safer-buffer/tests.js | 406 + node_sid/node_modules/sshpk/.travis.yml | 11 + node_sid/node_modules/sshpk/Jenkinsfile | 86 + node_sid/node_modules/sshpk/LICENSE | 18 + node_sid/node_modules/sshpk/README.md | 804 + node_sid/node_modules/sshpk/bin/sshpk-conv | 243 + node_sid/node_modules/sshpk/bin/sshpk-sign | 191 + node_sid/node_modules/sshpk/bin/sshpk-verify | 167 + node_sid/node_modules/sshpk/lib/algs.js | 168 + .../node_modules/sshpk/lib/certificate.js | 410 + node_sid/node_modules/sshpk/lib/dhe.js | 397 + node_sid/node_modules/sshpk/lib/ed-compat.js | 92 + node_sid/node_modules/sshpk/lib/errors.js | 84 + .../node_modules/sshpk/lib/fingerprint.js | 220 + .../node_modules/sshpk/lib/formats/auto.js | 124 + .../node_modules/sshpk/lib/formats/dnssec.js | 287 + .../sshpk/lib/formats/openssh-cert.js | 352 + .../node_modules/sshpk/lib/formats/pem.js | 290 + .../node_modules/sshpk/lib/formats/pkcs1.js | 373 + .../node_modules/sshpk/lib/formats/pkcs8.js | 631 + .../node_modules/sshpk/lib/formats/putty.js | 194 + .../node_modules/sshpk/lib/formats/rfc4253.js | 166 + .../sshpk/lib/formats/ssh-private.js | 262 + .../node_modules/sshpk/lib/formats/ssh.js | 115 + .../sshpk/lib/formats/x509-pem.js | 88 + .../node_modules/sshpk/lib/formats/x509.js | 752 + node_sid/node_modules/sshpk/lib/identity.js | 373 + node_sid/node_modules/sshpk/lib/index.js | 40 + node_sid/node_modules/sshpk/lib/key.js | 294 + .../node_modules/sshpk/lib/private-key.js | 247 + node_sid/node_modules/sshpk/lib/signature.js | 314 + node_sid/node_modules/sshpk/lib/ssh-buffer.js | 149 + node_sid/node_modules/sshpk/lib/utils.js | 404 + .../node_modules/sshpk/man/man1/sshpk-conv.1 | 135 + .../node_modules/sshpk/man/man1/sshpk-sign.1 | 81 + .../sshpk/man/man1/sshpk-verify.1 | 68 + node_sid/node_modules/sshpk/package.json | 60 + node_sid/node_modules/tough-cookie/LICENSE | 12 + node_sid/node_modules/tough-cookie/README.md | 527 + .../node_modules/tough-cookie/lib/cookie.js | 1482 ++ .../node_modules/tough-cookie/lib/memstore.js | 181 + .../tough-cookie/lib/pathMatch.js | 61 + .../tough-cookie/lib/permuteDomain.js | 56 + .../tough-cookie/lib/pubsuffix-psl.js | 38 + .../node_modules/tough-cookie/lib/store.js | 75 + .../node_modules/tough-cookie/lib/version.js | 2 + .../node_modules/tough-cookie/package.json | 78 + node_sid/node_modules/tunnel-agent/LICENSE | 55 + node_sid/node_modules/tunnel-agent/README.md | 4 + node_sid/node_modules/tunnel-agent/index.js | 244 + .../node_modules/tunnel-agent/package.json | 22 + node_sid/node_modules/tweetnacl/.npmignore | 4 + node_sid/node_modules/tweetnacl/AUTHORS.md | 28 + node_sid/node_modules/tweetnacl/CHANGELOG.md | 221 + node_sid/node_modules/tweetnacl/LICENSE | 24 + .../tweetnacl/PULL_REQUEST_TEMPLATE.md | 20 + node_sid/node_modules/tweetnacl/README.md | 459 + node_sid/node_modules/tweetnacl/nacl-fast.js | 2388 +++ .../node_modules/tweetnacl/nacl-fast.min.js | 2 + node_sid/node_modules/tweetnacl/nacl.d.ts | 98 + node_sid/node_modules/tweetnacl/nacl.js | 1175 ++ node_sid/node_modules/tweetnacl/nacl.min.js | 1 + node_sid/node_modules/tweetnacl/package.json | 58 + node_sid/node_modules/uri-js/LICENSE | 11 + node_sid/node_modules/uri-js/README.md | 203 + .../node_modules/uri-js/dist/es5/uri.all.d.ts | 59 + .../node_modules/uri-js/dist/es5/uri.all.js | 1443 ++ .../uri-js/dist/es5/uri.all.js.map | 1 + .../uri-js/dist/es5/uri.all.min.d.ts | 59 + .../uri-js/dist/es5/uri.all.min.js | 3 + .../uri-js/dist/es5/uri.all.min.js.map | 1 + .../uri-js/dist/esnext/index.d.ts | 1 + .../node_modules/uri-js/dist/esnext/index.js | 17 + .../uri-js/dist/esnext/index.js.map | 1 + .../uri-js/dist/esnext/regexps-iri.d.ts | 3 + .../uri-js/dist/esnext/regexps-iri.js | 3 + .../uri-js/dist/esnext/regexps-iri.js.map | 1 + .../uri-js/dist/esnext/regexps-uri.d.ts | 4 + .../uri-js/dist/esnext/regexps-uri.js | 42 + .../uri-js/dist/esnext/regexps-uri.js.map | 1 + .../uri-js/dist/esnext/schemes/http.d.ts | 3 + .../uri-js/dist/esnext/schemes/http.js | 28 + .../uri-js/dist/esnext/schemes/http.js.map | 1 + .../uri-js/dist/esnext/schemes/https.d.ts | 3 + .../uri-js/dist/esnext/schemes/https.js | 9 + .../uri-js/dist/esnext/schemes/https.js.map | 1 + .../uri-js/dist/esnext/schemes/mailto.d.ts | 12 + .../uri-js/dist/esnext/schemes/mailto.js | 148 + .../uri-js/dist/esnext/schemes/mailto.js.map | 1 + .../uri-js/dist/esnext/schemes/urn-uuid.d.ts | 7 + .../uri-js/dist/esnext/schemes/urn-uuid.js | 23 + .../dist/esnext/schemes/urn-uuid.js.map | 1 + .../uri-js/dist/esnext/schemes/urn.d.ts | 10 + .../uri-js/dist/esnext/schemes/urn.js | 49 + .../uri-js/dist/esnext/schemes/urn.js.map | 1 + .../uri-js/dist/esnext/schemes/ws.d.ts | 7 + .../uri-js/dist/esnext/schemes/ws.js | 41 + .../uri-js/dist/esnext/schemes/ws.js.map | 1 + .../uri-js/dist/esnext/schemes/wss.d.ts | 3 + .../uri-js/dist/esnext/schemes/wss.js | 9 + .../uri-js/dist/esnext/schemes/wss.js.map | 1 + .../node_modules/uri-js/dist/esnext/uri.d.ts | 59 + .../node_modules/uri-js/dist/esnext/uri.js | 480 + .../uri-js/dist/esnext/uri.js.map | 1 + .../node_modules/uri-js/dist/esnext/util.d.ts | 6 + .../node_modules/uri-js/dist/esnext/util.js | 36 + .../uri-js/dist/esnext/util.js.map | 1 + node_sid/node_modules/uri-js/package.json | 77 + node_sid/node_modules/uri-js/yarn.lock | 2558 +++ node_sid/node_modules/uuid/AUTHORS | 5 + node_sid/node_modules/uuid/CHANGELOG.md | 119 + node_sid/node_modules/uuid/LICENSE.md | 21 + node_sid/node_modules/uuid/README.md | 276 + node_sid/node_modules/uuid/bin/uuid | 65 + node_sid/node_modules/uuid/index.js | 8 + node_sid/node_modules/uuid/lib/bytesToUuid.js | 26 + node_sid/node_modules/uuid/lib/md5-browser.js | 216 + node_sid/node_modules/uuid/lib/md5.js | 25 + node_sid/node_modules/uuid/lib/rng-browser.js | 34 + node_sid/node_modules/uuid/lib/rng.js | 8 + .../node_modules/uuid/lib/sha1-browser.js | 89 + node_sid/node_modules/uuid/lib/sha1.js | 25 + node_sid/node_modules/uuid/lib/v35.js | 57 + node_sid/node_modules/uuid/package.json | 49 + node_sid/node_modules/uuid/v1.js | 109 + node_sid/node_modules/uuid/v3.js | 4 + node_sid/node_modules/uuid/v4.js | 29 + node_sid/node_modules/uuid/v5.js | 3 + node_sid/node_modules/verror/.npmignore | 9 + node_sid/node_modules/verror/CHANGES.md | 28 + node_sid/node_modules/verror/CONTRIBUTING.md | 19 + node_sid/node_modules/verror/LICENSE | 19 + node_sid/node_modules/verror/README.md | 528 + node_sid/node_modules/verror/lib/verror.js | 451 + node_sid/node_modules/verror/package.json | 22 + node_sid/package-lock.json | 772 + node_sid/package.json | 5 + node_sid/sid.js | 48 + node_sid/sid.py | 12 + readme | 69 + telepot/filter.py | 138 + telepot/gifs/welcome.gif | Bin 0 -> 885479 bytes telepot/insertCompetence.py | 16 + telepot/keyboards.py | 48 + telepot/tele.py | 1060 ++ telepot/test.py | 17 + telepot/ticketToday.py | 104 + web/Dockerfile | 30 + web/__init__.py | 1 + web/api/__init__.py | 1 + web/api/app.py | 1054 ++ web/api/requirements.txt | 5 + .../cache/21.2.19/ticket-web/.tsbuildinfo | 1 + .../21.2.19/ticket-web/angular-compiler.db | Bin 0 -> 1470464 bytes .../ticket-web/angular-compiler.db-lock | Bin 0 -> 8272 bytes web/frontend/angular.json | 68 + web/frontend/package-lock.json | 14368 ++++++++++++++++ web/frontend/package.json | 31 + web/frontend/src/app/api.service.ts | 103 + web/frontend/src/app/app.component.html | 645 + web/frontend/src/app/app.component.scss | 644 + web/frontend/src/app/app.component.ts | 670 + web/frontend/src/assets/ticket-icon.svg | 5 + web/frontend/src/index.html | 14 + web/frontend/src/main.ts | 14 + web/frontend/src/styles.scss | 29 + web/frontend/tsconfig.app.json | 9 + web/frontend/tsconfig.json | 29 + 631 files changed, 130346 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/Ticket.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 COMMANDS.md create mode 100644 Dockerfile create mode 100644 api/ai_index.py create mode 100644 api/ai_retriever.py create mode 100644 api/bootstrap_db.py create mode 100644 api/cockie.py create mode 100644 api/connection.py create mode 100644 api/detailTicket.py create mode 100644 api/limbo/compareText.py create mode 100644 api/limbo/diff.py create mode 100644 api/phrase_similarity.py create mode 100644 conn/config.py create mode 100644 conn/connection.py create mode 100644 conn/filters.py create mode 100644 conn/mysql5.py create mode 100644 conn/tickets.py create mode 100644 conn/user.py create mode 100644 dependencies.txt create mode 100644 docker-compose.yml create mode 100644 gifs/welcome.gif create mode 100644 json/empty.txt create mode 120000 node_sid/node_modules/.bin/sshpk-conv create mode 120000 node_sid/node_modules/.bin/sshpk-sign create mode 120000 node_sid/node_modules/.bin/sshpk-verify create mode 120000 node_sid/node_modules/.bin/uuid create mode 100644 node_sid/node_modules/.package-lock.json create mode 100644 node_sid/node_modules/ajv/.tonic_example.js create mode 100644 node_sid/node_modules/ajv/LICENSE create mode 100644 node_sid/node_modules/ajv/README.md create mode 100644 node_sid/node_modules/ajv/dist/ajv.bundle.js create mode 100644 node_sid/node_modules/ajv/dist/ajv.min.js create mode 100644 node_sid/node_modules/ajv/dist/ajv.min.js.map create mode 100644 node_sid/node_modules/ajv/lib/ajv.d.ts create mode 100644 node_sid/node_modules/ajv/lib/ajv.js create mode 100644 node_sid/node_modules/ajv/lib/cache.js create mode 100644 node_sid/node_modules/ajv/lib/compile/async.js create mode 100644 node_sid/node_modules/ajv/lib/compile/equal.js create mode 100644 node_sid/node_modules/ajv/lib/compile/error_classes.js create mode 100644 node_sid/node_modules/ajv/lib/compile/formats.js create mode 100644 node_sid/node_modules/ajv/lib/compile/index.js create mode 100644 node_sid/node_modules/ajv/lib/compile/resolve.js create mode 100644 node_sid/node_modules/ajv/lib/compile/rules.js create mode 100644 node_sid/node_modules/ajv/lib/compile/schema_obj.js create mode 100644 node_sid/node_modules/ajv/lib/compile/ucs2length.js create mode 100644 node_sid/node_modules/ajv/lib/compile/util.js create mode 100644 node_sid/node_modules/ajv/lib/data.js create mode 100644 node_sid/node_modules/ajv/lib/definition_schema.js create mode 100644 node_sid/node_modules/ajv/lib/dot/_limit.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/_limitItems.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/_limitLength.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/_limitProperties.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/allOf.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/anyOf.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/coerce.def create mode 100644 node_sid/node_modules/ajv/lib/dot/comment.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/const.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/contains.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/custom.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/defaults.def create mode 100644 node_sid/node_modules/ajv/lib/dot/definitions.def create mode 100644 node_sid/node_modules/ajv/lib/dot/dependencies.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/enum.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/errors.def create mode 100644 node_sid/node_modules/ajv/lib/dot/format.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/if.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/items.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/missing.def create mode 100644 node_sid/node_modules/ajv/lib/dot/multipleOf.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/not.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/oneOf.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/pattern.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/properties.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/propertyNames.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/ref.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/required.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/uniqueItems.jst create mode 100644 node_sid/node_modules/ajv/lib/dot/validate.jst create mode 100644 node_sid/node_modules/ajv/lib/dotjs/README.md create mode 100644 node_sid/node_modules/ajv/lib/dotjs/_limit.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/_limitItems.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/_limitLength.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/_limitProperties.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/allOf.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/anyOf.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/comment.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/const.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/contains.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/custom.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/dependencies.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/enum.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/format.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/if.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/index.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/items.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/multipleOf.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/not.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/oneOf.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/pattern.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/properties.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/propertyNames.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/ref.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/required.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/uniqueItems.js create mode 100644 node_sid/node_modules/ajv/lib/dotjs/validate.js create mode 100644 node_sid/node_modules/ajv/lib/keyword.js create mode 100644 node_sid/node_modules/ajv/lib/refs/data.json create mode 100644 node_sid/node_modules/ajv/lib/refs/json-schema-draft-04.json create mode 100644 node_sid/node_modules/ajv/lib/refs/json-schema-draft-06.json create mode 100644 node_sid/node_modules/ajv/lib/refs/json-schema-draft-07.json create mode 100644 node_sid/node_modules/ajv/lib/refs/json-schema-secure.json create mode 100644 node_sid/node_modules/ajv/package.json create mode 100644 node_sid/node_modules/ajv/scripts/.eslintrc.yml create mode 100644 node_sid/node_modules/ajv/scripts/bundle.js create mode 100644 node_sid/node_modules/ajv/scripts/compile-dots.js create mode 100644 node_sid/node_modules/ajv/scripts/info create mode 100644 node_sid/node_modules/ajv/scripts/prepare-tests create mode 100644 node_sid/node_modules/ajv/scripts/publish-built-version create mode 100644 node_sid/node_modules/ajv/scripts/travis-gh-pages create mode 100644 node_sid/node_modules/asn1/Jenkinsfile create mode 100644 node_sid/node_modules/asn1/LICENSE create mode 100644 node_sid/node_modules/asn1/README.md create mode 100644 node_sid/node_modules/asn1/lib/ber/errors.js create mode 100644 node_sid/node_modules/asn1/lib/ber/index.js create mode 100644 node_sid/node_modules/asn1/lib/ber/reader.js create mode 100644 node_sid/node_modules/asn1/lib/ber/types.js create mode 100644 node_sid/node_modules/asn1/lib/ber/writer.js create mode 100644 node_sid/node_modules/asn1/lib/index.js create mode 100644 node_sid/node_modules/asn1/package.json create mode 100644 node_sid/node_modules/assert-plus/AUTHORS create mode 100644 node_sid/node_modules/assert-plus/CHANGES.md create mode 100644 node_sid/node_modules/assert-plus/README.md create mode 100644 node_sid/node_modules/assert-plus/assert.js create mode 100644 node_sid/node_modules/assert-plus/package.json create mode 100644 node_sid/node_modules/asynckit/LICENSE create mode 100644 node_sid/node_modules/asynckit/README.md create mode 100644 node_sid/node_modules/asynckit/bench.js create mode 100644 node_sid/node_modules/asynckit/index.js create mode 100644 node_sid/node_modules/asynckit/lib/abort.js create mode 100644 node_sid/node_modules/asynckit/lib/async.js create mode 100644 node_sid/node_modules/asynckit/lib/defer.js create mode 100644 node_sid/node_modules/asynckit/lib/iterate.js create mode 100644 node_sid/node_modules/asynckit/lib/readable_asynckit.js create mode 100644 node_sid/node_modules/asynckit/lib/readable_parallel.js create mode 100644 node_sid/node_modules/asynckit/lib/readable_serial.js create mode 100644 node_sid/node_modules/asynckit/lib/readable_serial_ordered.js create mode 100644 node_sid/node_modules/asynckit/lib/state.js create mode 100644 node_sid/node_modules/asynckit/lib/streamify.js create mode 100644 node_sid/node_modules/asynckit/lib/terminator.js create mode 100644 node_sid/node_modules/asynckit/package.json create mode 100644 node_sid/node_modules/asynckit/parallel.js create mode 100644 node_sid/node_modules/asynckit/serial.js create mode 100644 node_sid/node_modules/asynckit/serialOrdered.js create mode 100644 node_sid/node_modules/asynckit/stream.js create mode 100644 node_sid/node_modules/aws-sign2/LICENSE create mode 100644 node_sid/node_modules/aws-sign2/README.md create mode 100644 node_sid/node_modules/aws-sign2/index.js create mode 100644 node_sid/node_modules/aws-sign2/package.json create mode 100644 node_sid/node_modules/aws4/.github/FUNDING.yml create mode 100644 node_sid/node_modules/aws4/.travis.yml create mode 100644 node_sid/node_modules/aws4/LICENSE create mode 100644 node_sid/node_modules/aws4/README.md create mode 100644 node_sid/node_modules/aws4/aws4.js create mode 100644 node_sid/node_modules/aws4/lru.js create mode 100644 node_sid/node_modules/aws4/package.json create mode 100644 node_sid/node_modules/bcrypt-pbkdf/CONTRIBUTING.md create mode 100644 node_sid/node_modules/bcrypt-pbkdf/LICENSE create mode 100644 node_sid/node_modules/bcrypt-pbkdf/README.md create mode 100644 node_sid/node_modules/bcrypt-pbkdf/index.js create mode 100644 node_sid/node_modules/bcrypt-pbkdf/package.json create mode 100644 node_sid/node_modules/caseless/LICENSE create mode 100644 node_sid/node_modules/caseless/README.md create mode 100644 node_sid/node_modules/caseless/index.js create mode 100644 node_sid/node_modules/caseless/package.json create mode 100644 node_sid/node_modules/caseless/test.js create mode 100644 node_sid/node_modules/combined-stream/License create mode 100644 node_sid/node_modules/combined-stream/Readme.md create mode 100644 node_sid/node_modules/combined-stream/lib/combined_stream.js create mode 100644 node_sid/node_modules/combined-stream/package.json create mode 100644 node_sid/node_modules/combined-stream/yarn.lock create mode 100644 node_sid/node_modules/core-util-is/LICENSE create mode 100644 node_sid/node_modules/core-util-is/README.md create mode 100644 node_sid/node_modules/core-util-is/float.patch create mode 100644 node_sid/node_modules/core-util-is/lib/util.js create mode 100644 node_sid/node_modules/core-util-is/package.json create mode 100644 node_sid/node_modules/core-util-is/test.js create mode 100644 node_sid/node_modules/dashdash/CHANGES.md create mode 100644 node_sid/node_modules/dashdash/LICENSE.txt create mode 100644 node_sid/node_modules/dashdash/README.md create mode 100644 node_sid/node_modules/dashdash/etc/dashdash.bash_completion.in create mode 100644 node_sid/node_modules/dashdash/lib/dashdash.js create mode 100644 node_sid/node_modules/dashdash/package.json create mode 100644 node_sid/node_modules/delayed-stream/.npmignore create mode 100644 node_sid/node_modules/delayed-stream/License create mode 100644 node_sid/node_modules/delayed-stream/Makefile create mode 100644 node_sid/node_modules/delayed-stream/Readme.md create mode 100644 node_sid/node_modules/delayed-stream/lib/delayed_stream.js create mode 100644 node_sid/node_modules/delayed-stream/package.json create mode 100755 node_sid/node_modules/ecc-jsbn/LICENSE create mode 100755 node_sid/node_modules/ecc-jsbn/README.md create mode 100755 node_sid/node_modules/ecc-jsbn/index.js create mode 100755 node_sid/node_modules/ecc-jsbn/lib/LICENSE-jsbn create mode 100755 node_sid/node_modules/ecc-jsbn/lib/ec.js create mode 100755 node_sid/node_modules/ecc-jsbn/lib/sec.js create mode 100755 node_sid/node_modules/ecc-jsbn/package.json create mode 100755 node_sid/node_modules/ecc-jsbn/test.js create mode 100644 node_sid/node_modules/extend/.editorconfig create mode 100644 node_sid/node_modules/extend/.eslintrc create mode 100644 node_sid/node_modules/extend/.jscs.json create mode 100644 node_sid/node_modules/extend/.travis.yml create mode 100644 node_sid/node_modules/extend/CHANGELOG.md create mode 100644 node_sid/node_modules/extend/LICENSE create mode 100644 node_sid/node_modules/extend/README.md create mode 100644 node_sid/node_modules/extend/component.json create mode 100644 node_sid/node_modules/extend/index.js create mode 100644 node_sid/node_modules/extend/package.json create mode 100644 node_sid/node_modules/extsprintf/.gitmodules create mode 100644 node_sid/node_modules/extsprintf/.npmignore create mode 100644 node_sid/node_modules/extsprintf/LICENSE create mode 100644 node_sid/node_modules/extsprintf/Makefile create mode 100644 node_sid/node_modules/extsprintf/Makefile.targ create mode 100644 node_sid/node_modules/extsprintf/README.md create mode 100644 node_sid/node_modules/extsprintf/jsl.node.conf create mode 100644 node_sid/node_modules/extsprintf/lib/extsprintf.js create mode 100644 node_sid/node_modules/extsprintf/package.json create mode 100644 node_sid/node_modules/fast-deep-equal/LICENSE create mode 100644 node_sid/node_modules/fast-deep-equal/README.md create mode 100644 node_sid/node_modules/fast-deep-equal/es6/index.d.ts create mode 100644 node_sid/node_modules/fast-deep-equal/es6/index.js create mode 100644 node_sid/node_modules/fast-deep-equal/es6/react.d.ts create mode 100644 node_sid/node_modules/fast-deep-equal/es6/react.js create mode 100644 node_sid/node_modules/fast-deep-equal/index.d.ts create mode 100644 node_sid/node_modules/fast-deep-equal/index.js create mode 100644 node_sid/node_modules/fast-deep-equal/package.json create mode 100644 node_sid/node_modules/fast-deep-equal/react.d.ts create mode 100644 node_sid/node_modules/fast-deep-equal/react.js create mode 100644 node_sid/node_modules/fast-json-stable-stringify/.eslintrc.yml create mode 100644 node_sid/node_modules/fast-json-stable-stringify/.github/FUNDING.yml create mode 100644 node_sid/node_modules/fast-json-stable-stringify/.travis.yml create mode 100644 node_sid/node_modules/fast-json-stable-stringify/LICENSE create mode 100644 node_sid/node_modules/fast-json-stable-stringify/README.md create mode 100644 node_sid/node_modules/fast-json-stable-stringify/benchmark/index.js create mode 100644 node_sid/node_modules/fast-json-stable-stringify/benchmark/test.json create mode 100644 node_sid/node_modules/fast-json-stable-stringify/example/key_cmp.js create mode 100644 node_sid/node_modules/fast-json-stable-stringify/example/nested.js create mode 100644 node_sid/node_modules/fast-json-stable-stringify/example/str.js create mode 100644 node_sid/node_modules/fast-json-stable-stringify/example/value_cmp.js create mode 100644 node_sid/node_modules/fast-json-stable-stringify/index.d.ts create mode 100644 node_sid/node_modules/fast-json-stable-stringify/index.js create mode 100644 node_sid/node_modules/fast-json-stable-stringify/package.json create mode 100644 node_sid/node_modules/fast-json-stable-stringify/test/cmp.js create mode 100644 node_sid/node_modules/fast-json-stable-stringify/test/nested.js create mode 100644 node_sid/node_modules/fast-json-stable-stringify/test/str.js create mode 100644 node_sid/node_modules/fast-json-stable-stringify/test/to-json.js create mode 100644 node_sid/node_modules/forever-agent/LICENSE create mode 100644 node_sid/node_modules/forever-agent/README.md create mode 100644 node_sid/node_modules/forever-agent/index.js create mode 100644 node_sid/node_modules/forever-agent/package.json create mode 100644 node_sid/node_modules/form-data/License create mode 100644 node_sid/node_modules/form-data/README.md create mode 100644 node_sid/node_modules/form-data/README.md.bak create mode 100644 node_sid/node_modules/form-data/lib/browser.js create mode 100644 node_sid/node_modules/form-data/lib/form_data.js create mode 100644 node_sid/node_modules/form-data/lib/populate.js create mode 100644 node_sid/node_modules/form-data/package.json create mode 100644 node_sid/node_modules/form-data/yarn.lock create mode 100644 node_sid/node_modules/getpass/.npmignore create mode 100644 node_sid/node_modules/getpass/.travis.yml create mode 100644 node_sid/node_modules/getpass/LICENSE create mode 100644 node_sid/node_modules/getpass/README.md create mode 100644 node_sid/node_modules/getpass/lib/index.js create mode 100644 node_sid/node_modules/getpass/package.json create mode 100644 node_sid/node_modules/har-schema/LICENSE create mode 100644 node_sid/node_modules/har-schema/README.md create mode 100644 node_sid/node_modules/har-schema/lib/afterRequest.json create mode 100644 node_sid/node_modules/har-schema/lib/beforeRequest.json create mode 100644 node_sid/node_modules/har-schema/lib/browser.json create mode 100644 node_sid/node_modules/har-schema/lib/cache.json create mode 100644 node_sid/node_modules/har-schema/lib/content.json create mode 100644 node_sid/node_modules/har-schema/lib/cookie.json create mode 100644 node_sid/node_modules/har-schema/lib/creator.json create mode 100644 node_sid/node_modules/har-schema/lib/entry.json create mode 100644 node_sid/node_modules/har-schema/lib/har.json create mode 100644 node_sid/node_modules/har-schema/lib/header.json create mode 100644 node_sid/node_modules/har-schema/lib/index.js create mode 100644 node_sid/node_modules/har-schema/lib/log.json create mode 100644 node_sid/node_modules/har-schema/lib/page.json create mode 100644 node_sid/node_modules/har-schema/lib/pageTimings.json create mode 100644 node_sid/node_modules/har-schema/lib/postData.json create mode 100644 node_sid/node_modules/har-schema/lib/query.json create mode 100644 node_sid/node_modules/har-schema/lib/request.json create mode 100644 node_sid/node_modules/har-schema/lib/response.json create mode 100644 node_sid/node_modules/har-schema/lib/timings.json create mode 100644 node_sid/node_modules/har-schema/package.json create mode 100644 node_sid/node_modules/har-validator/LICENSE create mode 100644 node_sid/node_modules/har-validator/README.md create mode 100644 node_sid/node_modules/har-validator/lib/async.js create mode 100644 node_sid/node_modules/har-validator/lib/error.js create mode 100644 node_sid/node_modules/har-validator/lib/promise.js create mode 100644 node_sid/node_modules/har-validator/package.json create mode 100644 node_sid/node_modules/http-signature/.dir-locals.el create mode 100644 node_sid/node_modules/http-signature/.npmignore create mode 100644 node_sid/node_modules/http-signature/CHANGES.md create mode 100644 node_sid/node_modules/http-signature/LICENSE create mode 100644 node_sid/node_modules/http-signature/README.md create mode 100644 node_sid/node_modules/http-signature/http_signing.md create mode 100644 node_sid/node_modules/http-signature/lib/index.js create mode 100644 node_sid/node_modules/http-signature/lib/parser.js create mode 100644 node_sid/node_modules/http-signature/lib/signer.js create mode 100644 node_sid/node_modules/http-signature/lib/utils.js create mode 100644 node_sid/node_modules/http-signature/lib/verify.js create mode 100644 node_sid/node_modules/http-signature/package.json create mode 100644 node_sid/node_modules/is-typedarray/LICENSE.md create mode 100644 node_sid/node_modules/is-typedarray/README.md create mode 100644 node_sid/node_modules/is-typedarray/index.js create mode 100644 node_sid/node_modules/is-typedarray/package.json create mode 100644 node_sid/node_modules/is-typedarray/test.js create mode 100644 node_sid/node_modules/isstream/.jshintrc create mode 100644 node_sid/node_modules/isstream/.npmignore create mode 100644 node_sid/node_modules/isstream/.travis.yml create mode 100644 node_sid/node_modules/isstream/LICENSE.md create mode 100644 node_sid/node_modules/isstream/README.md create mode 100644 node_sid/node_modules/isstream/isstream.js create mode 100644 node_sid/node_modules/isstream/package.json create mode 100644 node_sid/node_modules/isstream/test.js create mode 100644 node_sid/node_modules/jsbn/.npmignore create mode 100644 node_sid/node_modules/jsbn/LICENSE create mode 100644 node_sid/node_modules/jsbn/README.md create mode 100644 node_sid/node_modules/jsbn/example.html create mode 100644 node_sid/node_modules/jsbn/example.js create mode 100644 node_sid/node_modules/jsbn/index.js create mode 100644 node_sid/node_modules/jsbn/package.json create mode 100644 node_sid/node_modules/json-schema-traverse/.eslintrc.yml create mode 100644 node_sid/node_modules/json-schema-traverse/.travis.yml create mode 100644 node_sid/node_modules/json-schema-traverse/LICENSE create mode 100644 node_sid/node_modules/json-schema-traverse/README.md create mode 100644 node_sid/node_modules/json-schema-traverse/index.js create mode 100644 node_sid/node_modules/json-schema-traverse/package.json create mode 100644 node_sid/node_modules/json-schema-traverse/spec/.eslintrc.yml create mode 100644 node_sid/node_modules/json-schema-traverse/spec/fixtures/schema.js create mode 100644 node_sid/node_modules/json-schema-traverse/spec/index.spec.js create mode 100644 node_sid/node_modules/json-schema/LICENSE create mode 100644 node_sid/node_modules/json-schema/README.md create mode 100644 node_sid/node_modules/json-schema/lib/links.js create mode 100644 node_sid/node_modules/json-schema/lib/validate.js create mode 100644 node_sid/node_modules/json-schema/package.json create mode 100644 node_sid/node_modules/json-stringify-safe/.npmignore create mode 100644 node_sid/node_modules/json-stringify-safe/CHANGELOG.md create mode 100644 node_sid/node_modules/json-stringify-safe/LICENSE create mode 100644 node_sid/node_modules/json-stringify-safe/Makefile create mode 100644 node_sid/node_modules/json-stringify-safe/README.md create mode 100644 node_sid/node_modules/json-stringify-safe/package.json create mode 100644 node_sid/node_modules/json-stringify-safe/stringify.js create mode 100644 node_sid/node_modules/json-stringify-safe/test/mocha.opts create mode 100644 node_sid/node_modules/json-stringify-safe/test/stringify_test.js create mode 100644 node_sid/node_modules/jsprim/CHANGES.md create mode 100644 node_sid/node_modules/jsprim/CONTRIBUTING.md create mode 100644 node_sid/node_modules/jsprim/LICENSE create mode 100644 node_sid/node_modules/jsprim/README.md create mode 100644 node_sid/node_modules/jsprim/lib/jsprim.js create mode 100644 node_sid/node_modules/jsprim/package.json create mode 100644 node_sid/node_modules/mime-db/HISTORY.md create mode 100644 node_sid/node_modules/mime-db/LICENSE create mode 100644 node_sid/node_modules/mime-db/README.md create mode 100644 node_sid/node_modules/mime-db/db.json create mode 100644 node_sid/node_modules/mime-db/index.js create mode 100644 node_sid/node_modules/mime-db/package.json create mode 100644 node_sid/node_modules/mime-types/HISTORY.md create mode 100644 node_sid/node_modules/mime-types/LICENSE create mode 100644 node_sid/node_modules/mime-types/README.md create mode 100644 node_sid/node_modules/mime-types/index.js create mode 100644 node_sid/node_modules/mime-types/package.json create mode 100644 node_sid/node_modules/oauth-sign/LICENSE create mode 100644 node_sid/node_modules/oauth-sign/README.md create mode 100644 node_sid/node_modules/oauth-sign/index.js create mode 100644 node_sid/node_modules/oauth-sign/package.json create mode 100644 node_sid/node_modules/performance-now/.npmignore create mode 100644 node_sid/node_modules/performance-now/.tm_properties create mode 100644 node_sid/node_modules/performance-now/.travis.yml create mode 100644 node_sid/node_modules/performance-now/README.md create mode 100644 node_sid/node_modules/performance-now/lib/performance-now.js create mode 100644 node_sid/node_modules/performance-now/lib/performance-now.js.map create mode 100644 node_sid/node_modules/performance-now/license.txt create mode 100644 node_sid/node_modules/performance-now/package.json create mode 100644 node_sid/node_modules/performance-now/src/index.d.ts create mode 100644 node_sid/node_modules/performance-now/src/performance-now.coffee create mode 100644 node_sid/node_modules/performance-now/test/mocha.opts create mode 100644 node_sid/node_modules/performance-now/test/performance-now.coffee create mode 100644 node_sid/node_modules/performance-now/test/scripts.coffee create mode 100755 node_sid/node_modules/performance-now/test/scripts/delayed-call.coffee create mode 100755 node_sid/node_modules/performance-now/test/scripts/delayed-require.coffee create mode 100755 node_sid/node_modules/performance-now/test/scripts/difference.coffee create mode 100755 node_sid/node_modules/performance-now/test/scripts/initial-value.coffee create mode 100644 node_sid/node_modules/psl/.env create mode 100644 node_sid/node_modules/psl/LICENSE create mode 100644 node_sid/node_modules/psl/README.md create mode 100644 node_sid/node_modules/psl/browserstack-logo.svg create mode 100644 node_sid/node_modules/psl/data/rules.json create mode 100644 node_sid/node_modules/psl/dist/psl.js create mode 100644 node_sid/node_modules/psl/dist/psl.min.js create mode 100644 node_sid/node_modules/psl/index.js create mode 100644 node_sid/node_modules/psl/package.json create mode 100644 node_sid/node_modules/punycode/LICENSE-MIT.txt create mode 100644 node_sid/node_modules/punycode/README.md create mode 100644 node_sid/node_modules/punycode/package.json create mode 100644 node_sid/node_modules/punycode/punycode.es6.js create mode 100644 node_sid/node_modules/punycode/punycode.js create mode 100644 node_sid/node_modules/qs/.editorconfig create mode 100644 node_sid/node_modules/qs/.eslintrc create mode 100644 node_sid/node_modules/qs/.github/FUNDING.yml create mode 100644 node_sid/node_modules/qs/.nycrc create mode 100644 node_sid/node_modules/qs/CHANGELOG.md create mode 100644 node_sid/node_modules/qs/LICENSE.md create mode 100644 node_sid/node_modules/qs/README.md create mode 100644 node_sid/node_modules/qs/bower.json create mode 100644 node_sid/node_modules/qs/component.json create mode 100644 node_sid/node_modules/qs/dist/qs.js create mode 100644 node_sid/node_modules/qs/lib/formats.js create mode 100644 node_sid/node_modules/qs/lib/index.js create mode 100644 node_sid/node_modules/qs/lib/parse.js create mode 100644 node_sid/node_modules/qs/lib/stringify.js create mode 100644 node_sid/node_modules/qs/lib/utils.js create mode 100644 node_sid/node_modules/qs/package.json create mode 100644 node_sid/node_modules/qs/test/index.js create mode 100644 node_sid/node_modules/qs/test/parse.js create mode 100644 node_sid/node_modules/qs/test/stringify.js create mode 100644 node_sid/node_modules/qs/test/utils.js create mode 100644 node_sid/node_modules/request/CHANGELOG.md create mode 100644 node_sid/node_modules/request/LICENSE create mode 100644 node_sid/node_modules/request/README.md create mode 100755 node_sid/node_modules/request/index.js create mode 100644 node_sid/node_modules/request/lib/auth.js create mode 100644 node_sid/node_modules/request/lib/cookies.js create mode 100644 node_sid/node_modules/request/lib/getProxyFromURI.js create mode 100644 node_sid/node_modules/request/lib/har.js create mode 100644 node_sid/node_modules/request/lib/hawk.js create mode 100644 node_sid/node_modules/request/lib/helpers.js create mode 100644 node_sid/node_modules/request/lib/multipart.js create mode 100644 node_sid/node_modules/request/lib/oauth.js create mode 100644 node_sid/node_modules/request/lib/querystring.js create mode 100644 node_sid/node_modules/request/lib/redirect.js create mode 100644 node_sid/node_modules/request/lib/tunnel.js create mode 100644 node_sid/node_modules/request/package.json create mode 100644 node_sid/node_modules/request/request.js create mode 100644 node_sid/node_modules/safe-buffer/LICENSE create mode 100644 node_sid/node_modules/safe-buffer/README.md create mode 100644 node_sid/node_modules/safe-buffer/index.d.ts create mode 100644 node_sid/node_modules/safe-buffer/index.js create mode 100644 node_sid/node_modules/safe-buffer/package.json create mode 100644 node_sid/node_modules/safer-buffer/LICENSE create mode 100644 node_sid/node_modules/safer-buffer/Porting-Buffer.md create mode 100644 node_sid/node_modules/safer-buffer/Readme.md create mode 100644 node_sid/node_modules/safer-buffer/dangerous.js create mode 100644 node_sid/node_modules/safer-buffer/package.json create mode 100644 node_sid/node_modules/safer-buffer/safer.js create mode 100644 node_sid/node_modules/safer-buffer/tests.js create mode 100644 node_sid/node_modules/sshpk/.travis.yml create mode 100644 node_sid/node_modules/sshpk/Jenkinsfile create mode 100644 node_sid/node_modules/sshpk/LICENSE create mode 100644 node_sid/node_modules/sshpk/README.md create mode 100755 node_sid/node_modules/sshpk/bin/sshpk-conv create mode 100755 node_sid/node_modules/sshpk/bin/sshpk-sign create mode 100755 node_sid/node_modules/sshpk/bin/sshpk-verify create mode 100644 node_sid/node_modules/sshpk/lib/algs.js create mode 100644 node_sid/node_modules/sshpk/lib/certificate.js create mode 100644 node_sid/node_modules/sshpk/lib/dhe.js create mode 100644 node_sid/node_modules/sshpk/lib/ed-compat.js create mode 100644 node_sid/node_modules/sshpk/lib/errors.js create mode 100644 node_sid/node_modules/sshpk/lib/fingerprint.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/auto.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/dnssec.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/openssh-cert.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/pem.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/pkcs1.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/pkcs8.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/putty.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/rfc4253.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/ssh-private.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/ssh.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/x509-pem.js create mode 100644 node_sid/node_modules/sshpk/lib/formats/x509.js create mode 100644 node_sid/node_modules/sshpk/lib/identity.js create mode 100644 node_sid/node_modules/sshpk/lib/index.js create mode 100644 node_sid/node_modules/sshpk/lib/key.js create mode 100644 node_sid/node_modules/sshpk/lib/private-key.js create mode 100644 node_sid/node_modules/sshpk/lib/signature.js create mode 100644 node_sid/node_modules/sshpk/lib/ssh-buffer.js create mode 100644 node_sid/node_modules/sshpk/lib/utils.js create mode 100644 node_sid/node_modules/sshpk/man/man1/sshpk-conv.1 create mode 100644 node_sid/node_modules/sshpk/man/man1/sshpk-sign.1 create mode 100644 node_sid/node_modules/sshpk/man/man1/sshpk-verify.1 create mode 100644 node_sid/node_modules/sshpk/package.json create mode 100644 node_sid/node_modules/tough-cookie/LICENSE create mode 100644 node_sid/node_modules/tough-cookie/README.md create mode 100644 node_sid/node_modules/tough-cookie/lib/cookie.js create mode 100644 node_sid/node_modules/tough-cookie/lib/memstore.js create mode 100644 node_sid/node_modules/tough-cookie/lib/pathMatch.js create mode 100644 node_sid/node_modules/tough-cookie/lib/permuteDomain.js create mode 100644 node_sid/node_modules/tough-cookie/lib/pubsuffix-psl.js create mode 100644 node_sid/node_modules/tough-cookie/lib/store.js create mode 100644 node_sid/node_modules/tough-cookie/lib/version.js create mode 100644 node_sid/node_modules/tough-cookie/package.json create mode 100644 node_sid/node_modules/tunnel-agent/LICENSE create mode 100644 node_sid/node_modules/tunnel-agent/README.md create mode 100644 node_sid/node_modules/tunnel-agent/index.js create mode 100644 node_sid/node_modules/tunnel-agent/package.json create mode 100644 node_sid/node_modules/tweetnacl/.npmignore create mode 100644 node_sid/node_modules/tweetnacl/AUTHORS.md create mode 100644 node_sid/node_modules/tweetnacl/CHANGELOG.md create mode 100644 node_sid/node_modules/tweetnacl/LICENSE create mode 100644 node_sid/node_modules/tweetnacl/PULL_REQUEST_TEMPLATE.md create mode 100644 node_sid/node_modules/tweetnacl/README.md create mode 100644 node_sid/node_modules/tweetnacl/nacl-fast.js create mode 100644 node_sid/node_modules/tweetnacl/nacl-fast.min.js create mode 100644 node_sid/node_modules/tweetnacl/nacl.d.ts create mode 100644 node_sid/node_modules/tweetnacl/nacl.js create mode 100644 node_sid/node_modules/tweetnacl/nacl.min.js create mode 100644 node_sid/node_modules/tweetnacl/package.json create mode 100755 node_sid/node_modules/uri-js/LICENSE create mode 100755 node_sid/node_modules/uri-js/README.md create mode 100755 node_sid/node_modules/uri-js/dist/es5/uri.all.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/es5/uri.all.js create mode 100755 node_sid/node_modules/uri-js/dist/es5/uri.all.js.map create mode 100755 node_sid/node_modules/uri-js/dist/es5/uri.all.min.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/es5/uri.all.min.js create mode 100755 node_sid/node_modules/uri-js/dist/es5/uri.all.min.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/index.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/index.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/index.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/regexps-iri.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/regexps-iri.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/regexps-iri.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/regexps-uri.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/regexps-uri.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/regexps-uri.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/http.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/http.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/http.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/https.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/https.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/https.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/mailto.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/mailto.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/mailto.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/urn-uuid.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/urn-uuid.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/urn.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/urn.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/urn.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/ws.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/ws.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/ws.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/wss.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/wss.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/schemes/wss.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/uri.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/uri.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/uri.js.map create mode 100755 node_sid/node_modules/uri-js/dist/esnext/util.d.ts create mode 100755 node_sid/node_modules/uri-js/dist/esnext/util.js create mode 100755 node_sid/node_modules/uri-js/dist/esnext/util.js.map create mode 100755 node_sid/node_modules/uri-js/package.json create mode 100755 node_sid/node_modules/uri-js/yarn.lock create mode 100644 node_sid/node_modules/uuid/AUTHORS create mode 100644 node_sid/node_modules/uuid/CHANGELOG.md create mode 100644 node_sid/node_modules/uuid/LICENSE.md create mode 100644 node_sid/node_modules/uuid/README.md create mode 100755 node_sid/node_modules/uuid/bin/uuid create mode 100644 node_sid/node_modules/uuid/index.js create mode 100644 node_sid/node_modules/uuid/lib/bytesToUuid.js create mode 100644 node_sid/node_modules/uuid/lib/md5-browser.js create mode 100644 node_sid/node_modules/uuid/lib/md5.js create mode 100644 node_sid/node_modules/uuid/lib/rng-browser.js create mode 100644 node_sid/node_modules/uuid/lib/rng.js create mode 100644 node_sid/node_modules/uuid/lib/sha1-browser.js create mode 100644 node_sid/node_modules/uuid/lib/sha1.js create mode 100644 node_sid/node_modules/uuid/lib/v35.js create mode 100644 node_sid/node_modules/uuid/package.json create mode 100644 node_sid/node_modules/uuid/v1.js create mode 100644 node_sid/node_modules/uuid/v3.js create mode 100644 node_sid/node_modules/uuid/v4.js create mode 100644 node_sid/node_modules/uuid/v5.js create mode 100644 node_sid/node_modules/verror/.npmignore create mode 100644 node_sid/node_modules/verror/CHANGES.md create mode 100644 node_sid/node_modules/verror/CONTRIBUTING.md create mode 100644 node_sid/node_modules/verror/LICENSE create mode 100644 node_sid/node_modules/verror/README.md create mode 100644 node_sid/node_modules/verror/lib/verror.js create mode 100644 node_sid/node_modules/verror/package.json create mode 100644 node_sid/package-lock.json create mode 100644 node_sid/package.json create mode 100644 node_sid/sid.js create mode 100644 node_sid/sid.py create mode 100644 readme create mode 100644 telepot/filter.py create mode 100644 telepot/gifs/welcome.gif create mode 100644 telepot/insertCompetence.py create mode 100644 telepot/keyboards.py create mode 100644 telepot/tele.py create mode 100644 telepot/test.py create mode 100644 telepot/ticketToday.py create mode 100644 web/Dockerfile create mode 100644 web/__init__.py create mode 100644 web/api/__init__.py create mode 100644 web/api/app.py create mode 100644 web/api/requirements.txt create mode 100644 web/frontend/.angular/cache/21.2.19/ticket-web/.tsbuildinfo create mode 100644 web/frontend/.angular/cache/21.2.19/ticket-web/angular-compiler.db create mode 100644 web/frontend/.angular/cache/21.2.19/ticket-web/angular-compiler.db-lock create mode 100644 web/frontend/angular.json create mode 100644 web/frontend/package-lock.json create mode 100644 web/frontend/package.json create mode 100644 web/frontend/src/app/api.service.ts create mode 100644 web/frontend/src/app/app.component.html create mode 100644 web/frontend/src/app/app.component.scss create mode 100644 web/frontend/src/app/app.component.ts create mode 100644 web/frontend/src/assets/ticket-icon.svg create mode 100644 web/frontend/src/index.html create mode 100644 web/frontend/src/main.ts create mode 100644 web/frontend/src/styles.scss create mode 100644 web/frontend/tsconfig.app.json create mode 100644 web/frontend/tsconfig.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..36aee04 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +.git +.idea +.venv +**/__pycache__ +**/*.pyc +node_sid/node_modules +web/frontend/node_modules +web/frontend/dist diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..342933d --- /dev/null +++ b/.env.example @@ -0,0 +1,20 @@ +# Copy to .env and fill production values before running docker compose. + +POSTGRES_PASSWORD=localpassword +TICKET_PG_PASSWORD=localpassword + +TICKET_MYSQL_HOST=127.0.0.1 +TICKET_MYSQL_PORT=3307 +TICKET_MYSQL_DATABASE=smits +TICKET_MYSQL_USER=reader +TICKET_MYSQL_PASSWORD=change-me +TICKET_MYSQL_CHARSET=utf8 + +TICKET_TELEGRAM_TOKEN=change-me +TICKET_ADMIN_ID=145645559 +TICKET_ENABLE_NOTIFICATIONS=true + +TICKET_WEB_ADMIN_USERNAME=admin +TICKET_WEB_ADMIN_PASSWORD=change-me-now +TICKET_WEB_COOKIE_SECURE=false +TICKET_WEB_SESSION_DAYS=7 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..caee7d4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +**/__pycache__/ +**/*.pyc +.venv/ +web/frontend/node_modules/ +web/frontend/dist/ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/Ticket.iml b/.idea/Ticket.iml new file mode 100644 index 0000000..d8b3f6c --- /dev/null +++ b/.idea/Ticket.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1d3ce46 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..231841e --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/COMMANDS.md b/COMMANDS.md new file mode 100644 index 0000000..cbc5c95 --- /dev/null +++ b/COMMANDS.md @@ -0,0 +1,221 @@ +# Ticket Telegram Bot Commands + +## Main commands + +`/start` + +Register the Telegram user. New users stay pending until an administrator approves them. + +`/help` + +Show a short command summary in Telegram. + +`/tic ` + +Search similar solved tickets for an existing ticket. If the user has saved filters and the command does not specify an Area/Product/Competence/Client filter, saved filters are applied automatically. + +Examples: + +```text +/tic 658726 +/tic 658726 area +/tic 658726 sottoarea +/tic 658726 prodotto +/tic 658726 competenza +/tic 658726 cliente +/tic 658726 no_cliente +/tic 658726 filtri +/tic 658726 recenti 24 +/tic 658726 codice +/tic 658726 media +/tic 658726 alta +``` + +Filter meanings: + +- `area`: only suggestions in the same Area as the query ticket. +- `sottoarea`: only suggestions in the same Sottoarea as the query ticket. +- `prodotto`: only suggestions with the same Product. +- `competenza`: only suggestions with the same Competence. +- `cliente`: only suggestions from the same Client. +- `no_cliente`: exclude suggestions from the same Client. +- `filtri`: apply or reapply the user's saved Product/Competence/Area/Subarea filters. +- `recenti `: only suggestions opened in the last N months. +- `codice`: require the same detected error/code token. +- `media`: require at least medium confidence. +- `alta`: require high confidence. + +Explicit IDs are also supported: + +```text +/tic 658726 area 12 +/tic 658726 sottoarea 44 +/tic 658726 prodotto 24 +/tic 658726 competenza 8 +/tic 658726 cliente 1234 +``` + +`/cerca ` + +Search similar solved tickets from free text, without needing a source ticket. Saved filters are applied automatically unless the command specifies an Area/Product/Competence/Client filter. + +Examples: + +```text +/cerca errore fiscality password non valida +/cerca --area 12 errore fiscality password non valida +/cerca --prodotto 24 --ultimi-mesi 18 errore importazione +/cerca --filtri --media errore stampa fattura +``` + +Supported `/cerca` flags: + +- `--area ` +- `--sottoarea ` +- `--prodotto ` +- `--competenza ` +- `--cliente ` +- `--filtri` +- `--codice` +- `--ultimi-mesi ` +- `--media` +- `--alta` + +## Inline result buttons + +Every AI result includes inline buttons: + +- `Dettaglio`: open the suggested ticket detail. For `/tic` searches, this also records weak positive feedback as `opened`. +- `Utile`: record useful feedback. +- `Non utile`: record negative feedback. +- `Preferito`: save the suggested ticket in your favorites and record positive feedback. +- `Altri risultati`: fetch the next page of results. +- `Solo area`, `Solo sottoarea`, `Solo prodotto`, `Solo competenza`, `Stesso cliente`, `Escludi cliente`: rerun the search with a stricter filter. +- `Recenti 24m`, `Stesso codice`, `Min media`, `Miei filtri`, `Reset`: rerun the search with the selected control. + +Text feedback commands still work: + +```text +/utile__ +/non_utile__ +``` + +Feedback is used during future AI ranking. `utile`, `preferito`, and opened details count as positive feedback; `non_utile` counts as negative feedback. + +## Ticket detail and favorites + +`/Ticket_dettaglio_` + +Download and send the HTML detail for a ticket. + +`/preferito_` + +Save a ticket in your favorites and notify the administrator. + +`/preferiti` + +Show your saved favorite tickets. The same list is available from the `💜 Preferiti` keyboard button. + +## Saved filters + +The main keyboard exposes: + +- `🖍 Crea filtro x Competenze` +- `📦 Crea filtro x Prodotto` +- `👥 Crea filtro x Area` +- `👥 Crea filtro x Sott.Area` +- `📌 I mie filtri` +- `✖ Cancella filtro` +- `💜 Preferiti` + +Automatic new-ticket notifications use saved filters with AND between different types and OR inside the same type. For example: one Area + one Competence + two Products means Area AND Competence AND (Product 1 OR Product 2). + +Generated filter commands: + +```text +/_id_c_ +/_id_p_ +/_id_area_ +/_id_suba_ +``` + +Generated delete commands: + +```text +/Competen_id_cf_ +/Prodotto_id_cf_ +/Area_id_cf_ +/Sottoarea_id_cf_ +``` + +## Notification controls + +`/notifiche_status` + +Show personal notification settings. + +`/notifiche_on` + +Resume personal notifications. + +`/notifiche_off` + +Pause personal notifications. + +`/silenzio ` + +Set quiet hours. Hours are 0-23. + +Example: + +```text +/silenzio 22 7 +``` + +`/silenzio_off` + +Disable quiet hours. + +`/digest ` + +Send notifications at most once every N minutes. + +Example: + +```text +/digest 30 +``` + +`/digest_off` + +Disable digest throttling. + +`/gravita_alta_on` + +Only notify tickets whose gravity text looks high/urgent/critical/blocking. + +`/gravita_alta_off` + +Notify all gravity levels again. + +## Admin commands + +`/Approval_` + +Approve a pending user. This command is restricted to administrators. + +`/ai_stats` + +Show indexed ticket count, search count, no-result count, average retrieval time, and feedback totals. + +`/ai_no_result` + +Show recent AI searches with zero results. + +`/ai_negative` + +Show recent negative feedback. + +`/ai_top_useful` + +Show tickets with the most positive feedback. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..89fc8ff --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.11.3-slim + +WORKDIR /app + +COPY dependencies.txt . +RUN pip install --no-cache-dir -r dependencies.txt + +COPY . . + +CMD ["sh", "-c", "python ./api/bootstrap_db.py && python ./telepot/tele.py"] diff --git a/api/ai_index.py b/api/ai_index.py new file mode 100644 index 0000000..b1d4b83 --- /dev/null +++ b/api/ai_index.py @@ -0,0 +1,414 @@ +from datetime import datetime +from html import unescape +from pathlib import Path +import re +import sys + +import psycopg2 +from psycopg2.extras import execute_values + + +ROOT_DIR = Path(__file__).resolve().parents[1] +CONN_DIR = ROOT_DIR / "conn" +if str(CONN_DIR) not in sys.path: + sys.path.insert(0, str(CONN_DIR)) + +import config +import mysql5 + + +TAG_RE = re.compile(r"<[^>]+>") +SPACE_RE = re.compile(r"\s+") +CODE_RE = re.compile(r"\b[A-Z]{1,8}[-_/]?\d{2,}[A-Z0-9._/-]*\b|\b[A-Z0-9_]{3,}\.[A-Z0-9_.$-]+\b", re.IGNORECASE) + + +def get_pg_connection(): + return psycopg2.connect(**config.POSTGRES_CONFIG) + + +def clean_text(value): + if value is None: + return "" + text = unescape(str(value)) + text = TAG_RE.sub(" ", text) + text = text.replace("\x00", " ") + return SPACE_RE.sub(" ", text).strip() + + +def short_text(value, max_len=420): + text = clean_text(value) + if len(text) <= max_len: + return text + return text[:max_len].rsplit(" ", 1)[0] + "..." + + +def extract_codes(*values): + codes = set() + for value in values: + for match in CODE_RE.findall(clean_text(value).upper()): + codes.add(match.strip(".,;:()[]{}")) + return sorted(code for code in codes if code) + + +def build_index_document(row): + subject = clean_text(row.get("subject")) + problem = clean_text(row.get("problem")) + solution = clean_text(row.get("solution")) + metadata = " ".join( + clean_text(row.get(name)) + for name in ("competence", "product", "area", "subarea", "client", "gravity", "status", "program", "program_type") + if row.get(name) is not None + ) + codes = extract_codes(subject, problem, solution, metadata) + search_text = " ".join(part for part in (subject, problem, solution, metadata, " ".join(codes)) if part) + return { + "ticket_id": int(row["ticket_id"]), + "subject_text": subject, + "problem_text": problem, + "solution_text": solution, + "solution_preview": short_text(solution), + "metadata_text": metadata, + "search_text": search_text, + "codes": codes, + } + + +def ensure_ai_schema(): + connection = get_pg_connection() + cursor = connection.cursor() + + cursor.execute("CREATE EXTENSION IF NOT EXISTS pg_trgm") + + cursor.execute( + """ + CREATE TABLE IF NOT EXISTS ticket_ai_index ( + ticket_id BIGINT PRIMARY KEY, + subject_text TEXT NOT NULL DEFAULT '', + problem_text TEXT NOT NULL DEFAULT '', + solution_text TEXT NOT NULL DEFAULT '', + solution_preview TEXT NOT NULL DEFAULT '', + metadata_text TEXT NOT NULL DEFAULT '', + search_text TEXT NOT NULL DEFAULT '', + codes TEXT[] NOT NULL DEFAULT '{}', + competence_id INTEGER, + competence TEXT, + product_id INTEGER, + product TEXT, + area_id INTEGER, + area TEXT, + subarea_id INTEGER, + subarea TEXT, + client_id INTEGER, + client TEXT, + gravity_id INTEGER, + gravity TEXT, + status_id INTEGER, + status TEXT, + opened_at TIMESTAMP, + closed_at TIMESTAMP, + program TEXT, + program_type TEXT, + version_id INTEGER, + patch_id INTEGER, + classification_id INTEGER, + os_id INTEGER, + search_vector TSVECTOR, + source_updated_at TIMESTAMP, + indexed_at TIMESTAMP NOT NULL DEFAULT now() + ) + """ + ) + + cursor.execute( + """ + CREATE OR REPLACE FUNCTION ticket_ai_index_search_vector_update() + RETURNS trigger AS $$ + BEGIN + NEW.search_vector := + setweight(to_tsvector('simple', COALESCE(NEW.subject_text, '')), 'A') || + setweight(to_tsvector('simple', COALESCE(NEW.problem_text, '')), 'A') || + setweight(to_tsvector('simple', COALESCE(NEW.solution_text, '')), 'B') || + setweight(to_tsvector('simple', COALESCE(NEW.metadata_text, '')), 'C') || + setweight(to_tsvector('simple', array_to_string(COALESCE(NEW.codes, '{}'), ' ')), 'A'); + RETURN NEW; + END + $$ LANGUAGE plpgsql + """ + ) + + cursor.execute( + """ + DROP TRIGGER IF EXISTS ticket_ai_index_search_vector_trigger ON ticket_ai_index + """ + ) + cursor.execute( + """ + CREATE TRIGGER ticket_ai_index_search_vector_trigger + BEFORE INSERT OR UPDATE ON ticket_ai_index + FOR EACH ROW EXECUTE FUNCTION ticket_ai_index_search_vector_update() + """ + ) + + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_index_search_vector_idx ON ticket_ai_index USING GIN (search_vector)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_index_problem_trgm_idx ON ticket_ai_index USING GIN (problem_text gin_trgm_ops)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_index_subject_trgm_idx ON ticket_ai_index USING GIN (subject_text gin_trgm_ops)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_index_codes_idx ON ticket_ai_index USING GIN (codes)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_index_product_idx ON ticket_ai_index (product_id)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_index_area_idx ON ticket_ai_index (area_id)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_index_subarea_idx ON ticket_ai_index (subarea_id)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_index_competence_idx ON ticket_ai_index (competence_id)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_index_opened_idx ON ticket_ai_index (opened_at)") + + cursor.execute( + """ + CREATE TABLE IF NOT EXISTS ticket_ai_query_log ( + id BIGSERIAL PRIMARY KEY, + created_at TIMESTAMP NOT NULL DEFAULT now(), + user_id BIGINT, + query_ticket_id BIGINT NOT NULL, + suggested_ticket_id BIGINT NOT NULL, + rank INTEGER NOT NULL, + total_score DOUBLE PRECISION NOT NULL, + lexical_score DOUBLE PRECISION NOT NULL DEFAULT 0, + trigram_score DOUBLE PRECISION NOT NULL DEFAULT 0, + code_score DOUBLE PRECISION NOT NULL DEFAULT 0, + metadata_score DOUBLE PRECISION NOT NULL DEFAULT 0, + feedback_score DOUBLE PRECISION NOT NULL DEFAULT 0, + confidence TEXT NOT NULL, + query_text TEXT NOT NULL, + reasons TEXT[] NOT NULL DEFAULT '{}' + ) + """ + ) + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_query_log_query_idx ON ticket_ai_query_log (query_ticket_id)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_query_log_suggestion_idx ON ticket_ai_query_log (suggested_ticket_id)") + cursor.execute("ALTER TABLE ticket_ai_query_log ADD COLUMN IF NOT EXISTS code_score DOUBLE PRECISION NOT NULL DEFAULT 0") + + cursor.execute( + """ + CREATE TABLE IF NOT EXISTS ticket_ai_search_log ( + id BIGSERIAL PRIMARY KEY, + created_at TIMESTAMP NOT NULL DEFAULT now(), + user_id BIGINT, + query_kind TEXT NOT NULL DEFAULT 'ticket', + query_ticket_id BIGINT, + query_text TEXT NOT NULL DEFAULT '', + filters JSONB NOT NULL DEFAULT '{}'::jsonb, + result_count INTEGER NOT NULL DEFAULT 0, + elapsed_ms INTEGER NOT NULL DEFAULT 0 + ) + """ + ) + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_search_log_created_idx ON ticket_ai_search_log (created_at)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_search_log_result_idx ON ticket_ai_search_log (result_count)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_search_log_ticket_idx ON ticket_ai_search_log (query_ticket_id)") + + cursor.execute( + """ + CREATE TABLE IF NOT EXISTS ticket_ai_feedback ( + id BIGSERIAL PRIMARY KEY, + created_at TIMESTAMP NOT NULL DEFAULT now(), + user_id BIGINT, + query_ticket_id BIGINT NOT NULL, + suggested_ticket_id BIGINT NOT NULL, + feedback TEXT NOT NULL CHECK (feedback IN ('useful', 'not_useful', 'favorite', 'opened')), + note TEXT + ) + """ + ) + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_feedback_pair_idx ON ticket_ai_feedback (query_ticket_id, suggested_ticket_id)") + cursor.execute("CREATE INDEX IF NOT EXISTS ticket_ai_feedback_suggestion_idx ON ticket_ai_feedback (suggested_ticket_id)") + + cursor.execute( + """ + CREATE MATERIALIZED VIEW IF NOT EXISTS ticket_ai_feedback_summary AS + SELECT + suggested_ticket_id AS ticket_id, + SUM(CASE WHEN feedback IN ('useful', 'favorite', 'opened') THEN 1 ELSE 0 END) AS positive_count, + SUM(CASE WHEN feedback = 'not_useful' THEN 1 ELSE 0 END) AS negative_count + FROM ticket_ai_feedback + GROUP BY suggested_ticket_id + """ + ) + cursor.execute("CREATE UNIQUE INDEX IF NOT EXISTS ticket_ai_feedback_summary_ticket_idx ON ticket_ai_feedback_summary (ticket_id)") + + cursor.execute( + """ + CREATE TABLE IF NOT EXISTS ticket_bot_user_settings ( + user_id BIGINT PRIMARY KEY, + notifications_enabled BOOLEAN NOT NULL DEFAULT TRUE, + quiet_start_hour INTEGER, + quiet_end_hour INTEGER, + digest_minutes INTEGER NOT NULL DEFAULT 0, + high_gravity_only BOOLEAN NOT NULL DEFAULT FALSE, + last_notification_at TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT now(), + CHECK (quiet_start_hour IS NULL OR (quiet_start_hour >= 0 AND quiet_start_hour <= 23)), + CHECK (quiet_end_hour IS NULL OR (quiet_end_hour >= 0 AND quiet_end_hour <= 23)), + CHECK (digest_minutes >= 0) + ) + """ + ) + + connection.commit() + cursor.close() + connection.close() + + +def _row_values(row): + doc = build_index_document(row) + return ( + doc["ticket_id"], + doc["subject_text"], + doc["problem_text"], + doc["solution_text"], + doc["solution_preview"], + doc["metadata_text"], + doc["search_text"], + doc["codes"], + row.get("competence_id"), + row.get("competence"), + row.get("product_id"), + row.get("product"), + row.get("area_id"), + row.get("area"), + row.get("subarea_id"), + row.get("subarea"), + row.get("client_id"), + row.get("client"), + row.get("gravity_id"), + row.get("gravity"), + row.get("status_id"), + row.get("status"), + row.get("opened_at"), + row.get("closed_at"), + row.get("program"), + row.get("program_type"), + row.get("version_id"), + row.get("patch_id"), + row.get("classification_id"), + row.get("os_id"), + datetime.utcnow(), + ) + + +def upsert_ticket_batch(rows): + if not rows: + return 0 + + values = [_row_values(row) for row in rows] + connection = get_pg_connection() + cursor = connection.cursor() + execute_values( + cursor, + """ + INSERT INTO ticket_ai_index ( + ticket_id, + subject_text, + problem_text, + solution_text, + solution_preview, + metadata_text, + search_text, + codes, + competence_id, + competence, + product_id, + product, + area_id, + area, + subarea_id, + subarea, + client_id, + client, + gravity_id, + gravity, + status_id, + status, + opened_at, + closed_at, + program, + program_type, + version_id, + patch_id, + classification_id, + os_id, + source_updated_at + ) VALUES %s + ON CONFLICT (ticket_id) DO UPDATE SET + subject_text = EXCLUDED.subject_text, + problem_text = EXCLUDED.problem_text, + solution_text = EXCLUDED.solution_text, + solution_preview = EXCLUDED.solution_preview, + metadata_text = EXCLUDED.metadata_text, + search_text = EXCLUDED.search_text, + codes = EXCLUDED.codes, + competence_id = EXCLUDED.competence_id, + competence = EXCLUDED.competence, + product_id = EXCLUDED.product_id, + product = EXCLUDED.product, + area_id = EXCLUDED.area_id, + area = EXCLUDED.area, + subarea_id = EXCLUDED.subarea_id, + subarea = EXCLUDED.subarea, + client_id = EXCLUDED.client_id, + client = EXCLUDED.client, + gravity_id = EXCLUDED.gravity_id, + gravity = EXCLUDED.gravity, + status_id = EXCLUDED.status_id, + status = EXCLUDED.status, + opened_at = EXCLUDED.opened_at, + closed_at = EXCLUDED.closed_at, + program = EXCLUDED.program, + program_type = EXCLUDED.program_type, + version_id = EXCLUDED.version_id, + patch_id = EXCLUDED.patch_id, + classification_id = EXCLUDED.classification_id, + os_id = EXCLUDED.os_id, + source_updated_at = EXCLUDED.source_updated_at, + indexed_at = now() + """, + values, + page_size=500, + ) + connection.commit() + cursor.close() + connection.close() + return len(rows) + + +def rebuild_index(batch_size=1000, max_rows=None): + ensure_ai_schema() + last_ticket = 0 + indexed = 0 + + while True: + rows = mysql5.fetch_solved_ticket_batch(last_ticket=last_ticket, limit=batch_size) + if not rows: + break + upsert_ticket_batch(rows) + indexed += len(rows) + last_ticket = int(rows[-1]["ticket_id"]) + print(f"Indexed {indexed} tickets, last ticket {last_ticket}") + if max_rows is not None and indexed >= max_rows: + break + + refresh_feedback_summary() + return indexed + + +def refresh_feedback_summary(): + connection = get_pg_connection() + cursor = connection.cursor() + cursor.execute("REFRESH MATERIALIZED VIEW ticket_ai_feedback_summary") + connection.commit() + cursor.close() + connection.close() + + +if __name__ == "__main__": + batch_size = int(sys.argv[1]) if len(sys.argv) > 1 else 1000 + max_rows = int(sys.argv[2]) if len(sys.argv) > 2 else None + print(f"Starting AI index rebuild with batch_size={batch_size}, max_rows={max_rows}") + total = rebuild_index(batch_size=batch_size, max_rows=max_rows) + print(f"Finished indexing {total} solved tickets") diff --git a/api/ai_retriever.py b/api/ai_retriever.py new file mode 100644 index 0000000..608ba63 --- /dev/null +++ b/api/ai_retriever.py @@ -0,0 +1,926 @@ +from datetime import datetime +from difflib import SequenceMatcher +from pathlib import Path +import re +import sys +import time +import unicodedata + +import psycopg2 +from psycopg2.extras import DictCursor, Json + + +ROOT_DIR = Path(__file__).resolve().parents[1] +CONN_DIR = ROOT_DIR / "conn" +if str(CONN_DIR) not in sys.path: + sys.path.insert(0, str(CONN_DIR)) + +import config +import mysql5 +from ai_index import clean_text, ensure_ai_schema, extract_codes, refresh_feedback_summary + + +MIN_SCORE = 0.07 +CONFIDENCE_MIN_SCORE = { + "bassa": MIN_SCORE, + "media": 0.18, + "alta": 0.35, +} +DEFAULT_LIMIT = 5 +DIVERSITY_POOL_MULTIPLIER = 8 +MAX_SOLUTION_TOKEN_SIMILARITY = 0.62 +MAX_SOLUTION_TOKEN_OVERLAP = 0.65 +MAX_SOLUTION_TEXT_SIMILARITY = 0.70 +_SCHEMA_READY = False +TOKEN_RE = re.compile(r"\b\w{3,}\b", re.IGNORECASE) +SIGNATURE_SPACE_RE = re.compile(r"\s+") + + +def get_pg_connection(): + return psycopg2.connect(**config.POSTGRES_CONFIG) + + +def ensure_runtime_schema(): + global _SCHEMA_READY + if not _SCHEMA_READY: + ensure_ai_schema() + _SCHEMA_READY = True + + +def _id_value(value): + if value is None or value == "": + return None + try: + return int(value) + except (TypeError, ValueError): + return None + + +def _normalize_int_list(value): + if value is None: + return [] + if not isinstance(value, (list, tuple, set)): + value = [value] + + values = [] + for item in value: + parsed = _id_value(item) + if parsed is not None and parsed not in values: + values.append(parsed) + return values + + +def _query_text(ticket): + parts = [ + ticket.get("subject"), + ticket.get("problem"), + ticket.get("product"), + ticket.get("area"), + ticket.get("subarea"), + ticket.get("competence"), + ticket.get("program"), + ticket.get("program_type"), + ] + codes = extract_codes(*parts) + cleaned = clean_text(" ".join(str(p) for p in parts if p)) + return " ".join(part for part in (cleaned, " ".join(codes)) if part) + + +def _confidence(score): + if score >= CONFIDENCE_MIN_SCORE["alta"]: + return "Alta" + if score >= CONFIDENCE_MIN_SCORE["media"]: + return "Media" + return "Bassa" + + +def _min_score_from_filters(filters): + filters = filters or {} + if filters.get("min_score") is not None: + try: + return float(filters["min_score"]) + except (TypeError, ValueError): + return MIN_SCORE + + confidence = str(filters.get("min_confidence") or "").lower() + return CONFIDENCE_MIN_SCORE.get(confidence, MIN_SCORE) + + +def _solution_tokens(solution): + text = clean_text(solution).lower() + return set(TOKEN_RE.findall(text)) + + +def _solution_signature(solution): + text = clean_text(solution).lower() + text = "".join( + char for char in unicodedata.normalize("NFKD", text) + if not unicodedata.combining(char) + ) + text = re.sub(r"\b(gentile|buongiorno|ciao|salve)\b", " ", text) + text = re.sub(r"\b(cliente|mauro|martina|lisa|cinzia|nadia)\b", " ", text) + return SIGNATURE_SPACE_RE.sub(" ", text).strip() + + +def _jaccard_similarity(left, right): + if not left or not right: + return 0 + return len(left & right) / len(left | right) + + +def _overlap_similarity(left, right): + if not left or not right: + return 0 + return len(left & right) / min(len(left), len(right)) + + +def _matches_filter(row, filters, key, row_key): + values = _normalize_int_list((filters or {}).get(key)) + return values and row.get(row_key) in values + + +def _passes_strict_metadata_filters(row, filters): + filters = filters or {} + filter_columns = ( + ("product_ids", "product_id"), + ("area_ids", "area_id"), + ("subarea_ids", "subarea_id"), + ("competence_ids", "competence_id"), + ("client_ids", "client_id"), + ) + for key, column in filter_columns: + values = _normalize_int_list(filters.get(key)) + if not values: + values = _normalize_int_list(filters.get(column)) + if values and row.get(column) not in values: + return False + + excluded_clients = _normalize_int_list(filters.get("exclude_client_ids")) + if not excluded_clients: + excluded_clients = _normalize_int_list(filters.get("exclude_client_id")) + if excluded_clients and row.get("client_id") in excluded_clients: + return False + + return True + + +def _diverse_suggestions(rows, query_ticket, limit, filters=None): + selected = [] + selected_solution_tokens = [] + selected_solution_signatures = [] + duplicates_skipped = 0 + min_score = _min_score_from_filters(filters) + + for row in rows: + row_dict = dict(row) + if not _passes_strict_metadata_filters(row_dict, filters): + continue + if row_dict["total_score"] < min_score: + continue + + solution_tokens = _solution_tokens(row_dict.get("solution_preview")) + solution_signature = _solution_signature(row_dict.get("solution_preview")) + is_duplicate = any( + _jaccard_similarity(solution_tokens, existing_tokens) >= MAX_SOLUTION_TOKEN_SIMILARITY + or _overlap_similarity(solution_tokens, existing_tokens) >= MAX_SOLUTION_TOKEN_OVERLAP + or SequenceMatcher(None, solution_signature, existing_signature).ratio() >= MAX_SOLUTION_TEXT_SIMILARITY + for existing_tokens, existing_signature in zip(selected_solution_tokens, selected_solution_signatures) + ) + if is_duplicate: + duplicates_skipped += 1 + continue + + row_dict["confidence"] = _confidence(row_dict["total_score"]) + row_dict["reasons"] = _reasons(row_dict, query_ticket, filters) + row_dict["duplicates_skipped_before"] = duplicates_skipped + selected.append(row_dict) + selected_solution_tokens.append(solution_tokens) + selected_solution_signatures.append(solution_signature) + + if len(selected) >= limit: + break + + return selected + + +def _reasons(row, query_ticket=None, filters=None): + query_ticket = query_ticket or {} + filters = filters or {} + reasons = [] + + if row["lexical_score"] >= 0.08: + reasons.append("termini esatti") + if row["trigram_score"] >= 0.12: + reasons.append("testo simile") + if row["code_score"] > 0: + reasons.append("stesso codice") + + if _matches_filter(row, filters, "product_ids", "product_id"): + reasons.append("filtro prodotto") + elif row["product_id"] is not None and row["product_id"] == _id_value(query_ticket.get("product_id")): + reasons.append("stesso prodotto") + + if _matches_filter(row, filters, "subarea_ids", "subarea_id"): + reasons.append("filtro sottoarea") + elif row["subarea_id"] is not None and row["subarea_id"] == _id_value(query_ticket.get("subarea_id")): + reasons.append("stessa sottoarea") + elif _matches_filter(row, filters, "area_ids", "area_id"): + reasons.append("filtro area") + elif row["area_id"] is not None and row["area_id"] == _id_value(query_ticket.get("area_id")): + reasons.append("stessa area") + + if _matches_filter(row, filters, "competence_ids", "competence_id"): + reasons.append("filtro competenza") + elif row["competence_id"] is not None and row["competence_id"] == _id_value(query_ticket.get("competence_id")): + reasons.append("stessa competenza") + + if _matches_filter(row, filters, "client_ids", "client_id"): + reasons.append("stesso cliente") + if row["feedback_score"] > 0: + reasons.append("feedback positivo") + if filters.get("recent_months"): + reasons.append("periodo recente") + if not reasons: + reasons.append("somiglianza generale") + return reasons[:5] + + +def _format_date(value): + if not value: + return "-" + if hasattr(value, "strftime"): + return value.strftime("%Y-%m-%d") + return str(value) + + +def _format_suggestion(query_ticket_id, suggestion, rank): + ticket_id = suggestion["ticket_id"] + link = f"https://tsnew.sanmarcoweb.com/it/ticket/index/index/operation/view/id/{ticket_id}" + product = suggestion.get("product") or "-" + area = suggestion.get("area") or "-" + subarea = suggestion.get("subarea") or "-" + competence = suggestion.get("competence") or "-" + client = suggestion.get("client") or "-" + confidence = suggestion["confidence"] + reasons = ", ".join(suggestion["reasons"]) + solution = suggestion.get("solution_preview") or "Soluzione non disponibile" + diversity_note = "" + if suggestion.get("duplicates_skipped_before"): + diversity_note = f"Alternative simili saltate: {suggestion['duplicates_skipped_before']}\n" + + feedback_line = "" + if query_ticket_id: + feedback_line = f"Feedback: /utile_{query_ticket_id}_{ticket_id} /non_utile_{query_ticket_id}_{ticket_id}\n" + + return ( + f"\n\n----- {rank}. Confidenza {confidence} -----\n" + f"[ /Ticket_dettaglio_{ticket_id} ]\n" + f"{link}\n" + f"Cliente: {client}\n" + f"Prodotto: {product} | Competenza: {competence}\n" + f"Area: {area} | Sottoarea: {subarea}\n" + f"Apertura: {_format_date(suggestion.get('opened_at'))}\n" + f"Perche: {reasons}\n" + f"{diversity_note}" + f"Score: {suggestion['total_score']:.3f}\n" + f"SOLUZIONE: {solution}\n" + f"{feedback_line}" + ) + + +def _has_metadata_filters(filters): + filters = filters or {} + return any( + _normalize_int_list(filters.get(key)) + for key in ("product_ids", "area_ids", "subarea_ids", "competence_ids", "client_ids") + ) + + +def _metadata_candidate_clause(ticket, filters=None): + clauses = [] + params = {} + for field in ("product_id", "area_id", "subarea_id", "competence_id"): + value = _id_value((ticket or {}).get(field)) + params[field] = value + if value is not None: + clauses.append(f"i.{field} = %({field})s") + if _has_metadata_filters(filters): + clauses.append("TRUE") + if not clauses: + clauses.append("FALSE") + return " OR ".join(clauses), params + + +def _strict_filter_clause(filters): + filters = filters or {} + clauses = [] + params = {} + + filter_columns = ( + ("product_ids", "product_id"), + ("area_ids", "area_id"), + ("subarea_ids", "subarea_id"), + ("competence_ids", "competence_id"), + ("client_ids", "client_id"), + ) + for key, column in filter_columns: + values = _normalize_int_list(filters.get(key)) + if not values: + values = _normalize_int_list(filters.get(column)) + if values: + clauses.append(f"i.{column} = ANY(%({key})s::int[])") + params[key] = values + + excluded_clients = _normalize_int_list(filters.get("exclude_client_ids")) + if not excluded_clients: + excluded_clients = _normalize_int_list(filters.get("exclude_client_id")) + if excluded_clients: + clauses.append("NOT (i.client_id = ANY(%(exclude_client_ids)s::int[]))") + params["exclude_client_ids"] = excluded_clients + + if filters.get("require_code_match"): + clauses.append("i.codes && %(query_codes)s::text[]") + + recent_months = _id_value(filters.get("recent_months")) + if recent_months is not None and recent_months > 0: + clauses.append("i.opened_at >= now() - (%(recent_days)s::int * interval '1 day')") + params["recent_days"] = recent_months * 31 + + return " AND ".join(clauses) if clauses else "TRUE", params + + +def _safe_filters(filters): + safe = {} + for key, value in (filters or {}).items(): + if value is None or value is False or value == []: + continue + if isinstance(value, (list, tuple, set)): + safe[key] = list(value) + else: + safe[key] = value + return safe + + +def _search(query_kind, query_text, query_ticket_id=None, query_ticket=None, user_id=None, limit=DEFAULT_LIMIT, offset=0, filters=None, log_results=True): + ensure_runtime_schema() + query_text = clean_text(query_text) + if not query_text: + return [] + + query_ticket = query_ticket or {} + filters = filters or {} + limit = max(int(limit or DEFAULT_LIMIT), 1) + offset = max(int(offset or 0), 0) + pool_target = offset + limit + query_codes = extract_codes(query_text) + metadata_clause, metadata_params = _metadata_candidate_clause(query_ticket, filters) + strict_clause, strict_params = _strict_filter_clause(filters) + + params = { + "query_ticket_id": int(query_ticket_id) if query_ticket_id is not None else None, + "query_text": query_text, + "problem_text": clean_text(query_ticket.get("problem") or query_text), + "subject_text": clean_text(query_ticket.get("subject") or query_text), + "candidate_limit": max(pool_target * 50, 250), + "final_limit": max(pool_target * DIVERSITY_POOL_MULTIPLIER * 2, 40), + "query_product_id": _id_value(query_ticket.get("product_id")), + "query_area_id": _id_value(query_ticket.get("area_id")), + "query_subarea_id": _id_value(query_ticket.get("subarea_id")), + "query_competence_id": _id_value(query_ticket.get("competence_id")), + "query_codes": query_codes, + } + params.update(metadata_params) + params.update(strict_params) + + sql = f""" + WITH q AS ( + SELECT websearch_to_tsquery('simple', %(query_text)s) AS tsq + ), + lexical_candidates AS ( + SELECT i.ticket_id + FROM ticket_ai_index i, q + WHERE (%(query_ticket_id)s IS NULL OR i.ticket_id <> %(query_ticket_id)s) + AND ({strict_clause}) + AND i.search_vector @@ q.tsq + ORDER BY ts_rank_cd(i.search_vector, q.tsq) DESC + LIMIT %(candidate_limit)s + ), + metadata_candidates AS ( + SELECT i.ticket_id + FROM ticket_ai_index i + WHERE (%(query_ticket_id)s IS NULL OR i.ticket_id <> %(query_ticket_id)s) + AND ({strict_clause}) + AND ({metadata_clause}) + ORDER BY i.opened_at DESC NULLS LAST + LIMIT %(candidate_limit)s + ), + code_candidates AS ( + SELECT i.ticket_id + FROM ticket_ai_index i + WHERE (%(query_ticket_id)s IS NULL OR i.ticket_id <> %(query_ticket_id)s) + AND ({strict_clause}) + AND i.codes && %(query_codes)s::text[] + ORDER BY i.opened_at DESC NULLS LAST + LIMIT %(candidate_limit)s + ), + candidate_ids AS ( + SELECT ticket_id FROM lexical_candidates + UNION + SELECT ticket_id FROM code_candidates + UNION + SELECT ticket_id FROM metadata_candidates + ), + scored AS ( + SELECT + i.ticket_id, + i.subject_text, + i.problem_text, + i.solution_preview, + i.competence_id, + i.competence, + i.product_id, + i.product, + i.area_id, + i.area, + i.subarea_id, + i.subarea, + i.client_id, + i.client, + i.opened_at, + ts_rank_cd(i.search_vector, q.tsq) AS lexical_score, + GREATEST( + similarity(i.problem_text, %(problem_text)s), + similarity(i.subject_text, %(subject_text)s) + ) AS trigram_score, + CASE WHEN i.codes && %(query_codes)s::text[] THEN 0.18 ELSE 0 END AS code_score, + ( + CASE WHEN i.product_id IS NOT DISTINCT FROM %(query_product_id)s THEN 0.045 ELSE 0 END + + CASE WHEN i.subarea_id IS NOT DISTINCT FROM %(query_subarea_id)s THEN 0.035 ELSE 0 END + + CASE WHEN i.area_id IS NOT DISTINCT FROM %(query_area_id)s THEN 0.020 ELSE 0 END + + CASE WHEN i.competence_id IS NOT DISTINCT FROM %(query_competence_id)s THEN 0.015 ELSE 0 END + ) AS metadata_score, + LEAST( + GREATEST(COALESCE(fs.positive_count, 0) - COALESCE(fs.negative_count, 0), 0) * 0.015, + 0.12 + ) AS feedback_score + FROM candidate_ids c + JOIN ticket_ai_index i ON i.ticket_id = c.ticket_id + CROSS JOIN q + LEFT JOIN ticket_ai_feedback_summary fs ON fs.ticket_id = i.ticket_id + ) + SELECT + *, + ( + lexical_score * 0.62 + + trigram_score * 0.28 + + code_score + + metadata_score + + feedback_score + ) AS total_score + FROM scored + ORDER BY total_score DESC, lexical_score DESC, opened_at DESC NULLS LAST + LIMIT %(final_limit)s + """ + + started_at = time.perf_counter() + connection = get_pg_connection() + cursor = connection.cursor(cursor_factory=DictCursor) + cursor.execute(sql, params) + rows = cursor.fetchall() + all_suggestions = _diverse_suggestions(rows, query_ticket, pool_target, filters) + suggestions = all_suggestions[offset:offset + limit] + elapsed_ms = int((time.perf_counter() - started_at) * 1000) + + if log_results: + _log_search(cursor, user_id, query_kind, query_ticket_id, query_text, filters, len(all_suggestions), elapsed_ms) + if query_kind == "ticket" and query_ticket_id is not None and suggestions: + _log_suggestions(cursor, user_id, int(query_ticket_id), query_text, suggestions, rank_offset=offset) + connection.commit() + + cursor.close() + connection.close() + return suggestions + + +def search_similar_tickets(query_ticket_id, user_id=None, limit=DEFAULT_LIMIT, offset=0, filters=None, log_results=True): + query_ticket = mysql5.get_ticket_context(query_ticket_id) + if not query_ticket: + return [] + + query_text = _query_text(query_ticket) + return _search( + "ticket", + query_text, + query_ticket_id=int(query_ticket_id), + query_ticket=query_ticket, + user_id=user_id, + limit=limit, + offset=offset, + filters=filters, + log_results=log_results, + ) + + +def search_similar_text(query_text, user_id=None, limit=DEFAULT_LIMIT, offset=0, filters=None, log_results=True): + query_text = clean_text(query_text) + if not query_text: + return [] + return _search( + "text", + query_text, + query_ticket_id=None, + query_ticket={}, + user_id=user_id, + limit=limit, + offset=offset, + filters=filters, + log_results=log_results, + ) + + +def _log_search(cursor, user_id, query_kind, query_ticket_id, query_text, filters, result_count, elapsed_ms): + cursor.execute( + """ + INSERT INTO ticket_ai_search_log ( + user_id, + query_kind, + query_ticket_id, + query_text, + filters, + result_count, + elapsed_ms + ) VALUES (%s, %s, %s, %s, %s, %s, %s) + """, + ( + user_id, + query_kind, + int(query_ticket_id) if query_ticket_id is not None else None, + query_text, + Json(_safe_filters(filters)), + int(result_count), + int(elapsed_ms), + ), + ) + + +def _log_suggestions(cursor, user_id, query_ticket_id, query_text, suggestions, rank_offset=0): + for rank, suggestion in enumerate(suggestions, start=1 + rank_offset): + cursor.execute( + """ + INSERT INTO ticket_ai_query_log ( + user_id, + query_ticket_id, + suggested_ticket_id, + rank, + total_score, + lexical_score, + trigram_score, + code_score, + metadata_score, + feedback_score, + confidence, + query_text, + reasons + ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + """, + ( + user_id, + query_ticket_id, + suggestion["ticket_id"], + rank, + float(suggestion["total_score"]), + float(suggestion["lexical_score"]), + float(suggestion["trigram_score"]), + float(suggestion["code_score"]), + float(suggestion["metadata_score"]), + float(suggestion["feedback_score"]), + suggestion["confidence"], + query_text, + suggestion["reasons"], + ), + ) + + +def record_feedback(user_id, query_ticket_id, suggested_ticket_id, feedback, note=None): + ensure_runtime_schema() + if feedback not in ("useful", "not_useful", "favorite", "opened"): + raise ValueError("feedback must be useful, not_useful, favorite, or opened") + + connection = get_pg_connection() + cursor = connection.cursor() + cursor.execute( + """ + INSERT INTO ticket_ai_feedback ( + user_id, + query_ticket_id, + suggested_ticket_id, + feedback, + note + ) VALUES (%s, %s, %s, %s, %s) + """, + (user_id, int(query_ticket_id), int(suggested_ticket_id), feedback, note), + ) + connection.commit() + cursor.close() + connection.close() + refresh_feedback_summary() + return True + + +def record_favorite(user_id, ticket_id, query_ticket_id=None, note=None): + ensure_runtime_schema() + ticket_id = int(ticket_id) + query_ticket_id = int(query_ticket_id) if query_ticket_id is not None else ticket_id + + connection = get_pg_connection() + cursor = connection.cursor() + cursor.execute( + """ + SELECT 1 + FROM ticket_ai_feedback + WHERE user_id = %s + AND suggested_ticket_id = %s + AND feedback = 'favorite' + LIMIT 1 + """, + (user_id, ticket_id), + ) + if cursor.fetchone(): + cursor.close() + connection.close() + return False + + cursor.execute( + """ + INSERT INTO ticket_ai_feedback ( + user_id, + query_ticket_id, + suggested_ticket_id, + feedback, + note + ) VALUES (%s, %s, %s, 'favorite', %s) + """, + (user_id, query_ticket_id, ticket_id, note), + ) + connection.commit() + cursor.close() + connection.close() + refresh_feedback_summary() + return True + + +def get_user_favorites(user_id, limit=20): + ensure_runtime_schema() + connection = get_pg_connection() + cursor = connection.cursor(cursor_factory=DictCursor) + cursor.execute( + """ + SELECT * + FROM ( + SELECT DISTINCT ON (f.suggested_ticket_id) + f.suggested_ticket_id AS ticket_id, + f.query_ticket_id, + f.created_at, + i.product, + i.area, + i.subject_text + FROM ticket_ai_feedback f + LEFT JOIN ticket_ai_index i ON i.ticket_id = f.suggested_ticket_id + WHERE f.user_id = %s + AND f.feedback = 'favorite' + ORDER BY f.suggested_ticket_id, f.created_at DESC + ) favorites + ORDER BY created_at DESC + LIMIT %s + """, + (user_id, int(limit)), + ) + rows = [dict(row) for row in cursor.fetchall()] + cursor.close() + connection.close() + return rows + + +def get_user_bot_settings(user_id): + ensure_runtime_schema() + connection = get_pg_connection() + cursor = connection.cursor(cursor_factory=DictCursor) + cursor.execute( + """ + INSERT INTO ticket_bot_user_settings (user_id) + VALUES (%s) + ON CONFLICT (user_id) DO NOTHING + """, + (int(user_id),), + ) + cursor.execute( + """ + SELECT * + FROM ticket_bot_user_settings + WHERE user_id = %s + """, + (int(user_id),), + ) + settings = dict(cursor.fetchone()) + connection.commit() + cursor.close() + connection.close() + return settings + + +def update_user_bot_settings(user_id, **updates): + allowed = { + "notifications_enabled", + "quiet_start_hour", + "quiet_end_hour", + "digest_minutes", + "high_gravity_only", + "last_notification_at", + } + clean_updates = {key: value for key, value in updates.items() if key in allowed} + if not clean_updates: + return get_user_bot_settings(user_id) + + get_user_bot_settings(user_id) + assignments = [f"{key} = %s" for key in clean_updates] + values = list(clean_updates.values()) + values.append(int(user_id)) + + connection = get_pg_connection() + cursor = connection.cursor() + cursor.execute( + f""" + UPDATE ticket_bot_user_settings + SET {", ".join(assignments)}, + updated_at = now() + WHERE user_id = %s + """, + values, + ) + connection.commit() + cursor.close() + connection.close() + return get_user_bot_settings(user_id) + + +def set_notifications_enabled(user_id, enabled): + return update_user_bot_settings(user_id, notifications_enabled=bool(enabled)) + + +def set_quiet_hours(user_id, start_hour, end_hour): + return update_user_bot_settings( + user_id, + quiet_start_hour=max(0, min(23, int(start_hour))), + quiet_end_hour=max(0, min(23, int(end_hour))), + ) + + +def clear_quiet_hours(user_id): + return update_user_bot_settings(user_id, quiet_start_hour=None, quiet_end_hour=None) + + +def set_digest_minutes(user_id, minutes): + return update_user_bot_settings(user_id, digest_minutes=max(0, int(minutes))) + + +def set_high_gravity_only(user_id, enabled): + return update_user_bot_settings(user_id, high_gravity_only=bool(enabled)) + + +def _is_quiet_now(settings, now=None): + start = settings.get("quiet_start_hour") + end = settings.get("quiet_end_hour") + if start is None or end is None or start == end: + return False + + hour = (now or datetime.now()).hour + if start < end: + return start <= hour < end + return hour >= start or hour < end + + +def should_send_notifications(user_id, now=None): + settings = get_user_bot_settings(user_id) + now = now or datetime.now() + if not settings.get("notifications_enabled", True): + return False + if _is_quiet_now(settings, now=now): + return False + + digest_minutes = int(settings.get("digest_minutes") or 0) + last_notification_at = settings.get("last_notification_at") + if digest_minutes > 0 and last_notification_at: + elapsed_seconds = (now - last_notification_at).total_seconds() + if elapsed_seconds < digest_minutes * 60: + return False + return True + + +def mark_notification_sent(user_id): + return update_user_bot_settings(user_id, last_notification_at=datetime.now()) + + +def get_ai_stats(): + ensure_runtime_schema() + connection = get_pg_connection() + cursor = connection.cursor(cursor_factory=DictCursor) + cursor.execute("SELECT COUNT(*) AS indexed_count, MAX(indexed_at) AS last_indexed_at FROM ticket_ai_index") + index_stats = dict(cursor.fetchone()) + cursor.execute( + """ + SELECT + COUNT(*) AS search_count, + COALESCE(AVG(elapsed_ms), 0)::integer AS avg_elapsed_ms, + COALESCE(SUM(CASE WHEN result_count = 0 THEN 1 ELSE 0 END), 0) AS no_result_count + FROM ticket_ai_search_log + """ + ) + search_stats = dict(cursor.fetchone()) + cursor.execute("SELECT feedback, COUNT(*) AS count FROM ticket_ai_feedback GROUP BY feedback") + feedback_counts = {row["feedback"]: row["count"] for row in cursor.fetchall()} + cursor.close() + connection.close() + return { + **index_stats, + **search_stats, + "feedback_counts": feedback_counts, + } + + +def get_no_result_searches(limit=10): + ensure_runtime_schema() + connection = get_pg_connection() + cursor = connection.cursor(cursor_factory=DictCursor) + cursor.execute( + """ + SELECT created_at, user_id, query_kind, query_ticket_id, query_text, filters, elapsed_ms + FROM ticket_ai_search_log + WHERE result_count = 0 + ORDER BY created_at DESC + LIMIT %s + """, + (int(limit),), + ) + rows = [dict(row) for row in cursor.fetchall()] + cursor.close() + connection.close() + return rows + + +def get_negative_feedback(limit=10): + ensure_runtime_schema() + connection = get_pg_connection() + cursor = connection.cursor(cursor_factory=DictCursor) + cursor.execute( + """ + SELECT + f.created_at, + f.user_id, + f.query_ticket_id, + f.suggested_ticket_id, + i.product, + i.area, + i.subject_text + FROM ticket_ai_feedback f + LEFT JOIN ticket_ai_index i ON i.ticket_id = f.suggested_ticket_id + WHERE f.feedback = 'not_useful' + ORDER BY f.created_at DESC + LIMIT %s + """, + (int(limit),), + ) + rows = [dict(row) for row in cursor.fetchall()] + cursor.close() + connection.close() + return rows + + +def get_top_useful(limit=10): + ensure_runtime_schema() + connection = get_pg_connection() + cursor = connection.cursor(cursor_factory=DictCursor) + cursor.execute( + """ + SELECT + fs.ticket_id, + fs.positive_count, + fs.negative_count, + i.product, + i.area, + i.subject_text + FROM ticket_ai_feedback_summary fs + LEFT JOIN ticket_ai_index i ON i.ticket_id = fs.ticket_id + ORDER BY fs.positive_count DESC, fs.negative_count ASC + LIMIT %s + """, + (int(limit),), + ) + rows = [dict(row) for row in cursor.fetchall()] + cursor.close() + connection.close() + return rows + + +def start_guessing_manual(ticket, user_id=None, filters=None, limit=DEFAULT_LIMIT, offset=0): + suggestions = search_similar_tickets(ticket, user_id=user_id, limit=limit, offset=offset, filters=filters) + return [_format_suggestion(int(ticket), suggestion, rank + offset) for rank, suggestion in enumerate(suggestions, start=1)] diff --git a/api/bootstrap_db.py b/api/bootstrap_db.py new file mode 100644 index 0000000..36a05d3 --- /dev/null +++ b/api/bootstrap_db.py @@ -0,0 +1,66 @@ +from pathlib import Path +import sys + +import psycopg2 + + +ROOT_DIR = Path(__file__).resolve().parents[1] +CONN_DIR = ROOT_DIR / "conn" +API_DIR = ROOT_DIR / "api" +for path in (CONN_DIR, API_DIR): + if str(path) not in sys.path: + sys.path.insert(0, str(path)) + +import config +from ai_index import ensure_ai_schema + + +BOT_SCHEMA_SQL = """ +CREATE TABLE IF NOT EXISTS users ( + tid BIGINT PRIMARY KEY, + username TEXT, + surname TEXT, + status CHAR(1) NOT NULL DEFAULT 'P', + user_admin BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMP NOT NULL DEFAULT now(), + updated_at TIMESTAMP NOT NULL DEFAULT now(), + CHECK (status IN ('P', 'A')) +); + +CREATE TABLE IF NOT EXISTS filters ( + fid BIGSERIAL PRIMARY KEY, + tid BIGINT NOT NULL REFERENCES users(tid) ON DELETE CASCADE, + sort CHAR(1) NOT NULL, + sort_value TEXT NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT now(), + CHECK (sort IN ('A', 'S', 'C', 'P')), + UNIQUE (tid, sort, sort_value) +); + +CREATE INDEX IF NOT EXISTS filters_tid_idx ON filters (tid); +CREATE INDEX IF NOT EXISTS filters_sort_idx ON filters (sort); + +CREATE TABLE IF NOT EXISTS tickets ( + fid BIGINT NOT NULL REFERENCES filters(fid) ON DELETE CASCADE, + ticket BIGINT NOT NULL, + created_at TIMESTAMP NOT NULL DEFAULT now(), + PRIMARY KEY (fid, ticket) +); + +CREATE INDEX IF NOT EXISTS tickets_ticket_idx ON tickets (ticket); +""" + + +def ensure_bot_schema(): + connection = psycopg2.connect(**config.POSTGRES_CONFIG) + cursor = connection.cursor() + cursor.execute(BOT_SCHEMA_SQL) + connection.commit() + cursor.close() + connection.close() + + +if __name__ == "__main__": + ensure_bot_schema() + ensure_ai_schema() + print("PostgreSQL schema is ready") diff --git a/api/cockie.py b/api/cockie.py new file mode 100644 index 0000000..946a928 --- /dev/null +++ b/api/cockie.py @@ -0,0 +1,2 @@ + +id = "r0gmffchr3kpq77ls6nish7o92" \ No newline at end of file diff --git a/api/connection.py b/api/connection.py new file mode 100644 index 0000000..e914ea0 --- /dev/null +++ b/api/connection.py @@ -0,0 +1,42 @@ +from pathlib import Path +import sys + +import psycopg2 + +ROOT_DIR = Path(__file__).resolve().parents[1] +CONN_DIR = ROOT_DIR / "conn" +if str(CONN_DIR) not in sys.path: + sys.path.insert(0, str(CONN_DIR)) + +import config + + + + + +def conn(): + try: + connection = psycopg2.connect(**config.POSTGRES_CONFIG) + + return connection + # cursor = connection.cursor() + + # postgres_insert_query = """ INSERT INTO mobile (ID, MODEL, PRICE) VALUES (%s,%s,%s)""" + # record_to_insert = (5, 'One Plus 6', 950) + # cursor.execute(postgres_insert_query, record_to_insert) + + # connection.commit() + # count = cursor.rowcount + # print(count, "Record inserted successfully into mobile table") + + except (Exception, psycopg2.Error) as error: + print("Failed to insert record into mobile table", error) + return False + + # finally: + # # closing database connection. + # if connection: + # connection.cursor().close() + # connection.close() + # print("PostgreSQL connection is closed") + diff --git a/api/detailTicket.py b/api/detailTicket.py new file mode 100644 index 0000000..7dd842e --- /dev/null +++ b/api/detailTicket.py @@ -0,0 +1,105 @@ +import requests +import os + + +import traceback +import logging +import cockie +import time + + + + + +def deleteDocs(ticketId): + time.sleep(2) + if os.path.exists("json/detailTicket.html"): + os.remove("json/detailTicket.html") + # os.remove('json/' + str(ticketId)+'_details.pdf') + + +def getDetail(ticketId): + print("arrivato con : " + str(ticketId)) + + pdf_file = "json/" + str(ticketId) + "_details.pdf" + html_file = "json/" + str(ticketId) + "_details.html" + try: + + cookies = { + 'language': 'it', + 'sid': cockie.id, + } + + headers = { + 'Accept': '*/*', + 'Accept-Language': 'it-IT,it;q=0.9,la;q=0.8', + 'Connection': 'keep-alive', + 'Content-Type': 'application/x-www-form-urlencoded', + # Requests sorts cookies= alphabetically + # 'Cookie': 'language=it; sid=89q0fl4j3r54600e2fdbf952t1', + 'Referer': 'https://tsnew.sanmarcoweb.com/it/ticket', + 'Sec-Fetch-Dest': 'empty', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Site': 'same-origin', + 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36', + 'X-Requested-With': 'XMLHttpRequest', + 'sec-ch-ua': '"Chromium";v="104", " Not A;Brand";v="99", "Google Chrome";v="104"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Linux"', + } + + response = requests.get('https://tsnew.sanmarcoweb.com/it/ticket/details/index/id/'+ str(ticketId), cookies=cookies, headers=headers) + + content = response.text + print(html_file) + with open(html_file, 'w') as f: + f.write(str(content.replace('rows="7"', ' rows="10" cols="100" ')).encode('latin1').decode('utf8')) + + # json/" + str(ticketId) + "_details.pdf" + + + # Write the messages + response2 = requests.get('https://tsnew.sanmarcoweb.com/it/ticket/messages/index/id/' + str(ticketId), cookies=cookies, headers=headers) + + content2 = response2.text + + with open(html_file, 'a', encoding='utf-8') as b: + b.write(content2.replace('rows="7"', ' rows="10" cols="100" ').encode('latin1').decode('utf8')) + + # Append notes + response3 = requests.get('https://tsnew.sanmarcoweb.com/it/ticket/notes/index/id/' + str(ticketId), cookies=cookies, headers=headers) + + content3 = response3.text + + with open(html_file, 'a', encoding='utf-8') as c: + c.write(content3.replace('rows="7"', ' rows="10" cols="100" ').encode('latin1').decode('utf8')) + + # Append the attachments + + response4 = requests.get('https://tsnew.sanmarcoweb.com/it/ticket/attachments/index/id/' + str(ticketId), cookies=cookies, headers=headers) + + content4 = response4.text + with open(html_file, 'a', encoding='utf-8') as d: + d.write(content4.replace('rows="7"', ' rows="10" cols="100" ').encode('latin1').decode('utf8')) + + # Convert into pdf + # path_wkhtmltopdf = '/usr/bin/wkhtmltopdf' + # config = pdfkit.configuration(wkhtmltopdf=path_wkhtmltopdf) + # pdfkit.from_file(html_file, pdf_file, configuration=config) + + return True + + except Exception as e: + logging.error(traceback.format_exc()) + return False + + +# getDetail(456427) + +# deleteDocs(456292) + + + + + + diff --git a/api/limbo/compareText.py b/api/limbo/compareText.py new file mode 100644 index 0000000..639e1ac --- /dev/null +++ b/api/limbo/compareText.py @@ -0,0 +1,205 @@ +import requests +import re +import json + +import traceback +import logging +import cockie +import connection +import spacy_match + +import spacy + +nlp = spacy.load('it_core_news_lg') + +def getConn(): + c = connection.conn() + return c + +def closeConnection(connection,cursor): + if connection: + cursor.close() + connection.close() + +file_path = "output.json" + +def extract_text_between_markers(text, start_marker, end_marker): + pattern = re.compile(f'{re.escape(start_marker)}(.*?){re.escape(end_marker)}', re.DOTALL) + match = pattern.search(text) + if match: + return match.group(1).strip() + return None + + + +# Returns all the filters inserted by a user +def getObjectAndDescription(area,prodotto): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = "select descrizione AS result from ticket_big where competenze ='" + str(area) + "' AND prodotto = '" + prodotto + "' " #+ " OR prodotto ='' " + print(postgreSQL_select_Query) + cursor.execute(postgreSQL_select_Query) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + # print(publisher_records) + return publisher_records + + +def getDetail(ticketId): + + try: + + cookies = { + 'language': 'it', + 'sid': cockie.id, + } + + headers = { + 'Accept': '*/*', + 'Accept-Language': 'it-IT,it;q=0.9,la;q=0.8', + 'Connection': 'keep-alive', + 'Content-Type': 'application/x-www-form-urlencoded', + # Requests sorts cookies= alphabetically + # 'Cookie': 'language=it; sid=89q0fl4j3r54600e2fdbf952t1', + 'Referer': 'https://tsnew.sanmarcoweb.com/it/ticket', + 'Sec-Fetch-Dest': 'empty', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Site': 'same-origin', + 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36', + 'X-Requested-With': 'XMLHttpRequest', + 'sec-ch-ua': '"Chromium";v="104", " Not A;Brand";v="99", "Google Chrome";v="104"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Linux"', + } + + response = requests.get('https://tsnew.sanmarcoweb.com/it/ticket/details/index/id/'+ str(ticketId), cookies=cookies, headers=headers) + + oggetto_start = 'name="oggetto" value="' + oggetto_end = '"' + start_marker = 'true,required: false">' + end_marker = '' + competenza_start = '' + competenza_end = '/option>' + competenze_final_start = '" selected="selected">' + competenze_final_end = '<' + soluzione_start = '[]);}">' + soluzione_end = '' + prodotto_start = 'id="prodotto_'+ str(ticketId) + prodotto_end = '/option>' + prodotto_final_start = 'selected="selected">' + prodotto_final_end = '<' + + content = response.text + # print(content) + + oggetto = extract_text_between_markers(content, oggetto_start, oggetto_end) + description = extract_text_between_markers(content, start_marker, end_marker) + competenze = extract_text_between_markers(content, competenza_start, competenza_end) + competenze = extract_text_between_markers(competenze, competenze_final_start, competenze_final_end) + soluzione = extract_text_between_markers(content, soluzione_start, soluzione_end) + prodotto = extract_text_between_markers(content, prodotto_start, prodotto_end) + prodotto = extract_text_between_markers(prodotto, prodotto_final_start, prodotto_final_end) + + print(ticketId+ " --> Cercando --> ", description) + # print("Descrizione: ", description) + # print("Competenze: ", competenze) + # print("Soluzione: ", soluzione) + # print("Prodotto: ", prodotto) + + + # getObjectAndDescription('Assistenza Vinicoli','JExp') + # s_match(description) + + + if not soluzione.replace("\n", ""): + return False + + connection = getConn() + cursor = connection.cursor() + + postgres_insert_query = """ INSERT INTO ticket_big (id, oggetto,descrizione, competenze, soluzione,prodotto) VALUES (%s,%s,%s,%s,%s,%s)""" + record_to_insert = (str(ticketId), oggetto.replace("\n", ""),description.replace("\n", ""), competenze.replace("\n", ""),soluzione.replace("\n", ""),prodotto.replace("\n", "")) + cursor.execute(postgres_insert_query, record_to_insert) + + connection.commit() + count = cursor.rowcount + if count <1: + return False + print(count, "Record inserted successfully into sort table") + closeConnection(connection,cursor) + return True + + except Exception as e: + logging.error(traceback.format_exc()) + return False + + +# for ticket in range(456424,456429): +# getDetail(ticket) + +def get_ids_from_json_file(file_path): + with open(file_path, 'r') as json_file: + data = json.load(json_file) + + ids = [item['id'] for item in data['data']] + return ids + + + +file_path = 'data.json' +ids_list = get_ids_from_json_file("/Users/tommal/Desktop/tickets.json") +# print(ids_list) + + +for ticket in ids_list: + getDetail(ticket) + + +############################################################ + + +def s_match(w_target): + # w_target = "JExp non funziona per un problema delle dogane:Esiste una procedura di emergenza per inviare i DAA?" + + # List of w1 to w500 + # w_list = [ + # ("VIOLAZIONE REGOLA C070 non riusciamo a fare l'EAD"), + # ("L'invio dell'E-ad si blocca per la presenza dell'errore violazione regola C070") + # ] + + w_list = getObjectAndDescription('Assistenza Vinicoli','JExp') + # print("\n\n") + # print(w_list) + # print("\n\n") + w_list = [item[0] for item in w_list] + # w_list = ["tempo bello", "molto", "usciamo fuori"] + + + # Calculate similarity scores for each w in w_list and create a list of tuples + similarity_scores = [(w, nlp(w_target).similarity(nlp(w))) for w in w_list] + + # Sort the list of tuples based on similarity score in descending order + sorted_similarity_scores = sorted(similarity_scores, key=lambda x: x[1], reverse=True) + + # Get the best 5 matches from the sorted list + best_matches = sorted_similarity_scores[:5] + + # Print the best 5 matches + print("\n\n") + print("Top 5 matches:") + for match, similarity_score in best_matches: + print("Match:", match) + print("Similarity score:", similarity_score) + print("\n") + + + + + + + + + + diff --git a/api/limbo/diff.py b/api/limbo/diff.py new file mode 100644 index 0000000..76750ad --- /dev/null +++ b/api/limbo/diff.py @@ -0,0 +1,27 @@ +import difflib +import compareText + +def get_similarity_ratio(s1, s2): + matcher = difflib.SequenceMatcher(None, s1, s2) + return matcher.ratio() + +w_target = "CERTIFICATO DI FIRMA SCADUTO" + +w_list = compareText.getObjectAndDescription('Assistenza Vinicoli','JExp') +w2_list = [item[0] for item in w_list] +w_list = w2_list +# Calculate similarity scores for each w in w_list +similarity_scores = [(w, get_similarity_ratio(w_target, w)) for w in w_list] + +# Sort the list of tuples based on similarity score in descending order +sorted_similarity_scores = sorted(similarity_scores, key=lambda x: x[1], reverse=True) + +# Get the best 5 matches from the sorted list +best_matches = sorted_similarity_scores[:5] + +# Print the best 5 matches +print("Top 5 matches:") +for match, similarity_score in best_matches: + print("Match:", match) + print("Similarity score:", similarity_score) + print() diff --git a/api/phrase_similarity.py b/api/phrase_similarity.py new file mode 100644 index 0000000..e518784 --- /dev/null +++ b/api/phrase_similarity.py @@ -0,0 +1,64 @@ +from pathlib import Path +import sys +import traceback + + +ROOT_DIR = Path(__file__).resolve().parents[1] +CONN_DIR = ROOT_DIR / "conn" +if str(CONN_DIR) not in sys.path: + sys.path.insert(0, str(CONN_DIR)) + +import mysql5 + + +def _legacy_start_guessing_manual(ticket): + try: + from sklearn.feature_extraction.text import TfidfVectorizer + from sklearn.metrics.pairwise import cosine_similarity + except Exception: + traceback.print_exc() + return [] + + competence_origin, product_origin, problem_origin, area_origin, subarea_origin = mysql5.getCompetenceOrProdotto(ticket) + w_list = mysql5.getProblemaBYCompetenzaOrProgramma_manul(competence_origin, product_origin, area_origin, subarea_origin) + + if len(w_list) == 0: + return [] + + phrases = [item[0] for item in w_list] + vectorizer = TfidfVectorizer(analyzer="char_wb", ngram_range=(3, 5), lowercase=True) + tfidf_matrix = vectorizer.fit_transform([problem_origin] + phrases) + similarity_matrix = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:]) + + # Keep the real top five. The old code used [-6:-1], which skipped the best result. + best_matches_indices = similarity_matrix.argsort()[0][-5:][::-1] + + final_list = [] + for i, index in enumerate(best_matches_indices, start=1): + complete_ticket = mysql5.getTicketByProblema(str(phrases[index])) + solution = str(complete_ticket[1]) + if len(solution) > 400: + solution = solution[:400] + "..." + + final_list.append( + f"\n\n----- {i}. Metodo legacy -----\n" + f"[ /Ticket_dettaglio_{complete_ticket[0]} ]\n" + f"https://tsnew.sanmarcoweb.com/it/ticket/index/index/operation/view/id/{complete_ticket[0]}\n" + f"SOLUZIONE: {solution}\n" + ) + return final_list + + +def start_guessing_manual(ticket, user_id=None, filters=None, limit=None, offset=0): + try: + import ai_retriever + + kwargs = {"user_id": user_id, "filters": filters, "offset": offset} + if limit is not None: + kwargs["limit"] = limit + return ai_retriever.start_guessing_manual(ticket, **kwargs) + except Exception: + traceback.print_exc() + if filters: + return [] + return _legacy_start_guessing_manual(ticket) diff --git a/conn/config.py b/conn/config.py new file mode 100644 index 0000000..b81d399 --- /dev/null +++ b/conn/config.py @@ -0,0 +1,39 @@ +import os + + +def _env_int(name, default): + value = os.getenv(name) + if value is None or value == "": + return default + return int(value) + + +def _env_bool(name, default): + value = os.getenv(name) + if value is None or value == "": + return default + return value.strip().lower() in ("1", "true", "yes", "on") + + +MYSQL_CONFIG = { + "host": os.getenv("TICKET_MYSQL_HOST", "127.0.0.1"), + "port": _env_int("TICKET_MYSQL_PORT", 3307), + "database": os.getenv("TICKET_MYSQL_DATABASE", "smits"), + "user": os.getenv("TICKET_MYSQL_USER", "root"), + "password": os.getenv("TICKET_MYSQL_PASSWORD", "localpassword"), + "charset": os.getenv("TICKET_MYSQL_CHARSET", "utf8"), +} + + +POSTGRES_CONFIG = { + "host": os.getenv("TICKET_PG_HOST", "127.0.0.1"), + "port": _env_int("TICKET_PG_PORT", 5433), + "dbname": os.getenv("TICKET_PG_DATABASE", "ticket"), + "user": os.getenv("TICKET_PG_USER", "postgres"), + "password": os.getenv("TICKET_PG_PASSWORD", "localpassword"), +} + + +TELEGRAM_BOT_TOKEN = os.getenv("TICKET_TELEGRAM_TOKEN", os.getenv("TELEGRAM_BOT_TOKEN", "")) +TELEGRAM_ADMIN_ID = _env_int("TICKET_ADMIN_ID", 145645559) +ENABLE_NOTIFICATIONS = _env_bool("TICKET_ENABLE_NOTIFICATIONS", True) diff --git a/conn/connection.py b/conn/connection.py new file mode 100644 index 0000000..a1d67f9 --- /dev/null +++ b/conn/connection.py @@ -0,0 +1,33 @@ +import psycopg2 +import config + + + + + +def conn(): + try: + connection = psycopg2.connect(**config.POSTGRES_CONFIG) + + return connection + # cursor = connection.cursor() + + # postgres_insert_query = """ INSERT INTO mobile (ID, MODEL, PRICE) VALUES (%s,%s,%s)""" + # record_to_insert = (5, 'One Plus 6', 950) + # cursor.execute(postgres_insert_query, record_to_insert) + + # connection.commit() + # count = cursor.rowcount + # print(count, "Record inserted successfully into mobile table") + + except (Exception, psycopg2.Error) as error: + print("Failed to insert record into mobile table", error) + return False + + # finally: + # # closing database connection. + # if connection: + # connection.cursor().close() + # connection.close() + # print("PostgreSQL connection is closed") + diff --git a/conn/filters.py b/conn/filters.py new file mode 100644 index 0000000..0fa78df --- /dev/null +++ b/conn/filters.py @@ -0,0 +1,151 @@ + +import connection + +def getConn(): + c = connection.conn() + return c + +def closeConnection(connection,cursor): + if connection: + cursor.close() + connection.close() + # print("POstgres connection closed successfully") + # print("Connection was closed before") + + + + +# Insert a filter if it does not already exist. +def insertFilter(tid, sort, sort_value ): + if str(sort_value).strip().startswith("_"): + sort_value = "-" + (str(sort_value).strip())[1:] + if getFilterByParam(tid, sort, sort_value): + return False + + connection = getConn() + cursor = connection.cursor() + + postgres_insert_query = """ INSERT INTO filters (tid, sort, sort_value) VALUES (%s,%s,%s)""" + record_to_insert = (tid, sort, sort_value) + cursor.execute(postgres_insert_query, record_to_insert) + + connection.commit() + count = cursor.rowcount + if count <1: + closeConnection(connection,cursor) + return False + print(count, "Record inserted successfully into sort table") + closeConnection(connection,cursor) + return True + +def exists_area_for_user(tid): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = "select * from filters where tid =" + str(tid) + " AND sort = 'A'" + + cursor.execute(postgreSQL_select_Query) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return cursor.rowcount > 0 + +def exists_sub_area_for_user(tid): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = "select * from filters where tid =" + str(tid) + " AND sort = 'S'" + + cursor.execute(postgreSQL_select_Query) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + + return cursor.rowcount > 0 + + + +def get_area_from_tid(tid): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = "select sort_value from filters where sort = 'A' and tid =" + str(tid) + + cursor.execute(postgreSQL_select_Query) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + +# Returns all the filters inserted by a user +def getFilters(tid): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = "select * from filters where tid =" + str(tid) + " order by sort" + + cursor.execute(postgreSQL_select_Query) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + +# Returns all the filters inserted by a user +def getFilterByParam(tid,sort, sort_value): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = """select * from filters where tid = %s and sort= %s and sort_value = %s""" + record_to_insert = (tid, sort, sort_value) + + cursor.execute(postgreSQL_select_Query,record_to_insert) + publisher_records = cursor.fetchall() + filter_exists = cursor.rowcount > 0 + closeConnection(connection,cursor) + return filter_exists + +# Returns all the filters inserted by a user +def getAllFilters(): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = "select * from filters " + + cursor.execute(postgreSQL_select_Query) + publisher_records = cursor.fetchall() + + for row in publisher_records: + print( row, "\n") + + closeConnection(connection,cursor) + return publisher_records + + + +# Delete a single filter +def deleteFilter(telid, id): + connection = getConn() + cursor = connection.cursor() + +# Delete first all the ticket + sql_delete_query = """Delete from tickets where fid = %s""" + cursor.execute(sql_delete_query, (id,)) + connection.commit() + + sql_delete_query = """Delete from filters where tid= %s and fid = %s""" + cursor.execute(sql_delete_query, (telid,id)) + connection.commit() + count = cursor.rowcount + print(count, "Record deleted successfully ") + + closeConnection(connection,cursor) + return count > 0 + + +#insertFilter(965744443, 'competenza','itech') +#getUsers() +#isUserRegisterd(222222) + + +#getFilters(965744443) +#deleteFilter(8) diff --git a/conn/mysql5.py b/conn/mysql5.py new file mode 100644 index 0000000..82ace67 --- /dev/null +++ b/conn/mysql5.py @@ -0,0 +1,396 @@ +import mysql.connector +import config + + +def getMySqlConnection(): + connection = mysql.connector.connect(**config.MYSQL_CONFIG) + return connection + + +def closeConnection(connection,cursor): + if connection: + cursor.close() + connection.close() + + + +def get_areas(): + connection = getMySqlConnection() + cursor = connection.cursor() + + postgreSQL_select_Query = "select * from aree" + + cursor.execute(postgreSQL_select_Query) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + +def get_sub_areas(area): + + connection = getMySqlConnection() + cursor = connection.cursor() + + postgreSQL_select_Query = "select ID,SOTTOAREA,AREA from sottoaree where area = %s" + + cursor.execute(postgreSQL_select_Query, (area,)) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + + + + + +# print(get_sub_areas(2)) + + + +def getCompetences(competence_id=999999): + connection = getMySqlConnection() + cursor = connection.cursor() + + postgreSQL_select_Query = "select * from competenze order by ID" + if competence_id != 999999: + postgreSQL_select_Query += " WHERE ID =" + str(competence_id) + + cursor.execute(postgreSQL_select_Query) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + +def getProducts(product_id=999999): + connection = getMySqlConnection() + cursor = connection.cursor() + + postgreSQL_select_Query = "select * from prodotti order by ID" + if product_id != 999999: + postgreSQL_select_Query += " WHERE ID =" + str(product_id) + + cursor.execute(postgreSQL_select_Query) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + + + + +def getTicket(filter_type="", filter_value=""): + connection = getMySqlConnection() + cursor = connection.cursor() + postgreSQL_select_Query = "" + params = () + if filter_type == "": + postgreSQL_select_Query = "select * from segnalazioni limit 2" + elif filter_type == "C": + postgreSQL_select_Query = "select s.TICKET,cl.INTESTATARIO,s.OGGETTO,g.GRAVITA,c.COMPETENZA,p.PRODOTTO,s.APERTURA from segnalazioni as s join prodotti as p on s.PRODOTTO=p.ID join competenze as c on s.COMPETENZA=c.ID join gravita as g on s.GRAVITA=g.ID join clienti as cl on cl.ID=s.CLIENTE where s.COMPETENZA=%s AND DATE(s.APERTURA)=CURDATE()" + params = (filter_value,) + elif filter_type == "P": + postgreSQL_select_Query = "select s.TICKET,cl.INTESTATARIO,s.OGGETTO,g.GRAVITA,c.COMPETENZA,p.PRODOTTO,s.APERTURA from segnalazioni as s join prodotti as p on s.PRODOTTO=p.ID join gravita as g on s.GRAVITA=g.ID join competenze as c on s.COMPETENZA=c.ID join clienti as cl on cl.ID=s.CLIENTE where s.PRODOTTO=%s AND DATE(s.APERTURA)=CURDATE()" + params = (filter_value,) + elif filter_type == "A": + postgreSQL_select_Query = "select s.TICKET,cl.INTESTATARIO,s.OGGETTO,g.GRAVITA,c.COMPETENZA,p.PRODOTTO,s.APERTURA from segnalazioni as s join prodotti as p on s.PRODOTTO=p.ID join gravita as g on s.GRAVITA=g.ID join competenze as c on s.COMPETENZA=c.ID join clienti as cl on cl.ID=s.CLIENTE where s.AREA=%s AND DATE(s.APERTURA)=CURDATE()" + params = (filter_value,) + elif filter_type == "S": + postgreSQL_select_Query = "select s.TICKET,cl.INTESTATARIO,s.OGGETTO,g.GRAVITA,c.COMPETENZA,p.PRODOTTO,s.APERTURA from segnalazioni as s join prodotti as p on s.PRODOTTO=p.ID join gravita as g on s.GRAVITA=g.ID join competenze as c on s.COMPETENZA=c.ID join clienti as cl on cl.ID=s.CLIENTE where s.SOTTOAREA=%s AND DATE(s.APERTURA)=CURDATE()" + params = (filter_value,) + else: + closeConnection(connection, cursor) + return [] + + cursor.execute(postgreSQL_select_Query, params) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + + +def getTicketsByFilterSet(filter_rows): + filter_values = { + "C": [], + "P": [], + "A": [], + "S": [], + } + for row in filter_rows: + filter_type = str(row[2]) + if filter_type not in filter_values: + continue + try: + filter_value = int(row[3]) + except (TypeError, ValueError): + continue + if filter_value not in filter_values[filter_type]: + filter_values[filter_type].append(filter_value) + + if not any(filter_values.values()): + return [] + + connection = getMySqlConnection() + cursor = connection.cursor() + select_query = """ + select + s.TICKET, + cl.INTESTATARIO, + s.OGGETTO, + g.GRAVITA, + c.COMPETENZA, + p.PRODOTTO, + s.APERTURA + from segnalazioni as s + join prodotti as p on s.PRODOTTO=p.ID + join gravita as g on s.GRAVITA=g.ID + join competenze as c on s.COMPETENZA=c.ID + join clienti as cl on cl.ID=s.CLIENTE + """ + column_map = { + "C": "s.COMPETENZA", + "P": "s.PRODOTTO", + "A": "s.AREA", + "S": "s.SOTTOAREA", + } + where_parts = ["DATE(s.APERTURA)=CURDATE()"] + params = [] + for filter_type, values in filter_values.items(): + if not values: + continue + placeholders = ",".join(["%s"] * len(values)) + where_parts.append(f"{column_map[filter_type]} IN ({placeholders})") + params.extend(values) + + select_query += " where " + " AND ".join(where_parts) + cursor.execute(select_query, tuple(params)) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + + + +def getProductOrCompetence(type_,value_): + connection = getMySqlConnection() + cursor = connection.cursor() + + postgreSQL_select_product = "select prodotto from prodotti WHERE ID="+value_ + postgreSQL_select_competence = "select COMPETENZA from competenze WHERE ID="+value_ + postgreSQL_select_area = "select AREA from aree a where ID="+value_ + postgreSQL_select_sub_area = "select SOTTOAREA from sottoaree where ID="+value_ + + if type_ == "P": + cursor.execute(postgreSQL_select_product) + elif type_ == 'C': + cursor.execute(postgreSQL_select_competence) + elif type_ == 'A': + cursor.execute(postgreSQL_select_area) + elif type_ == 'S': + cursor.execute(postgreSQL_select_sub_area) + + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + # print(publisher_records) + return publisher_records + + +def getCompetenceOrProdotto(ticket): + connection = getMySqlConnection() + cursor = connection.cursor() + + select_problem = "SELECT COMPETENZA, PRODOTTO, PROBLEMA, AREA, SOTTOAREA FROM segnalazioni where TICKET = %s" + cursor.execute(select_problem, (ticket,)) + + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + + if not publisher_records: + return "", "", "", "", "" + + return str(publisher_records[0][0]) ,str(publisher_records[0][1]) ,str(publisher_records[0][2]) , str(publisher_records[0][3]) ,str(publisher_records[0][4]) + +# def getProblemaBYCompetenzaOrProgramma(competence, prodotto): +# connection = getMySqlConnection() +# cursor = connection.cursor() +# # From DB the competence is not null +# if prodotto != None and competence != None: +# select_problem = "SELECT PROBLEMA FROM segnalazioni where COMPETENZA = " + str(competence) + " AND PRODOTTO = " + str(prodotto)+ "" +# elif prodotto == None: +# select_problem = "SELECT PROBLEMA FROM segnalazioni where COMPETENZA = " + str(competence) + "" + +# cursor.execute(select_problem) + +# publisher_records = cursor.fetchall() + +# closeConnection(connection,cursor) +# return publisher_records + +def getProblemaBYCompetenzaOrProgramma_manul(competence, prodotto, area, sottoarea): + connection = getMySqlConnection() + cursor = connection.cursor() + + + where_parts = [] + params = [] + + if prodotto is not None and prodotto.isdigit(): + print("Trovato prodotto: ", prodotto) + where_parts.append("PRODOTTO = %s") + params.append(int(prodotto)) + + if area is not None and area.isdigit(): + print("Trovato area: ", area) + where_parts.append("AREA = %s") + params.append(int(area)) + + + if sottoarea is not None and sottoarea.isdigit(): + print("Trovato sottoarea: ", sottoarea) + where_parts.append("SOTTOAREA = %s") + params.append(int(sottoarea)) + +# If none of the where condition is satisfied + if not where_parts: + if competence is not None and str(competence).isdigit(): + print("Trovato competence: ", competence) + where_parts.append("COMPETENZA = %s") + params.append(int(competence)) + else: + print("Trovato : ", "Nulla") + where_parts.append("FALSE") + + + main_sql = "SELECT PROBLEMA FROM segnalazioni WHERE " + " AND ".join(where_parts) + + print(main_sql) + cursor.execute(main_sql, tuple(params)) + + publisher_records = cursor.fetchall() + count = cursor.rowcount + + closeConnection(connection,cursor) + # if count <1: + # print("FFFFFF") + # return "Non ho trovato ticket con i filtri del ticket principale." + return publisher_records + + +def getTicketByProblema(problem): + connection = getMySqlConnection() + cursor = connection.cursor() + + # Use placeholders for the query and pass the value as a parameter + select_problem = "SELECT TICKET, SOLUZIONE, PROBLEMA FROM segnalazioni WHERE PROBLEMA = %s" + cursor.execute(select_problem, (problem,)) + + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records[0] + + +def get_ticket_context(ticket): + connection = getMySqlConnection() + cursor = connection.cursor(dictionary=True) + + query = """ + SELECT + s.TICKET AS ticket_id, + s.OGGETTO AS subject, + s.PROBLEMA AS problem, + s.SOLUZIONE AS solution, + s.COMPETENZA AS competence_id, + c.COMPETENZA AS competence, + s.PRODOTTO AS product_id, + p.prodotto AS product, + s.AREA AS area_id, + a.AREA AS area, + s.SOTTOAREA AS subarea_id, + sa.SOTTOAREA AS subarea, + s.CLIENTE AS client_id, + cl.INTESTATARIO AS client, + s.GRAVITA AS gravity_id, + g.GRAVITA AS gravity, + s.STATO AS status_id, + st.STATO AS status, + s.APERTURA AS opened_at, + s.CHIUSURA AS closed_at, + s.PROGRAMMA AS program, + s.TIPO_PROGRAMMA AS program_type, + s.VERSIONE AS version_id, + s.PATCH AS patch_id, + s.CLASSIFICAZIONE AS classification_id, + s.SISTEMA_OPERATIVO AS os_id + FROM segnalazioni s + LEFT JOIN competenze c ON c.ID = s.COMPETENZA + LEFT JOIN prodotti p ON p.ID = s.PRODOTTO + LEFT JOIN aree a ON a.ID = s.AREA + LEFT JOIN sottoaree sa ON sa.ID = s.SOTTOAREA + LEFT JOIN clienti cl ON cl.ID = s.CLIENTE + LEFT JOIN gravita g ON g.ID = s.GRAVITA + LEFT JOIN stati st ON st.ID = s.STATO + WHERE s.TICKET = %s + """ + cursor.execute(query, (ticket,)) + records = cursor.fetchall() + closeConnection(connection, cursor) + return records[0] if records else None + + +def fetch_solved_ticket_batch(last_ticket=0, limit=1000): + connection = getMySqlConnection() + cursor = connection.cursor(dictionary=True) + + query = """ + SELECT + s.TICKET AS ticket_id, + s.OGGETTO AS subject, + s.PROBLEMA AS problem, + s.SOLUZIONE AS solution, + s.COMPETENZA AS competence_id, + c.COMPETENZA AS competence, + s.PRODOTTO AS product_id, + p.prodotto AS product, + s.AREA AS area_id, + a.AREA AS area, + s.SOTTOAREA AS subarea_id, + sa.SOTTOAREA AS subarea, + s.CLIENTE AS client_id, + cl.INTESTATARIO AS client, + s.GRAVITA AS gravity_id, + g.GRAVITA AS gravity, + s.STATO AS status_id, + st.STATO AS status, + s.APERTURA AS opened_at, + s.CHIUSURA AS closed_at, + s.PROGRAMMA AS program, + s.TIPO_PROGRAMMA AS program_type, + s.VERSIONE AS version_id, + s.PATCH AS patch_id, + s.CLASSIFICAZIONE AS classification_id, + s.SISTEMA_OPERATIVO AS os_id + FROM segnalazioni s + LEFT JOIN competenze c ON c.ID = s.COMPETENZA + LEFT JOIN prodotti p ON p.ID = s.PRODOTTO + LEFT JOIN aree a ON a.ID = s.AREA + LEFT JOIN sottoaree sa ON sa.ID = s.SOTTOAREA + LEFT JOIN clienti cl ON cl.ID = s.CLIENTE + LEFT JOIN gravita g ON g.ID = s.GRAVITA + LEFT JOIN stati st ON st.ID = s.STATO + WHERE s.TICKET > %s + AND s.SOLUZIONE IS NOT NULL + AND TRIM(s.SOLUZIONE) <> '' + ORDER BY s.TICKET + LIMIT %s + """ + cursor.execute(query, (last_ticket, limit)) + records = cursor.fetchall() + closeConnection(connection, cursor) + return records + + + +# print(getTicketByProblema("CERCA SABRINA")) +# print(getTicketTest("P", "24")) diff --git a/conn/tickets.py b/conn/tickets.py new file mode 100644 index 0000000..f181f1a --- /dev/null +++ b/conn/tickets.py @@ -0,0 +1,84 @@ + +import connection + +def getConn(): + c = connection.conn() + return c + +def closeConnection(connection,cursor): + if connection: + cursor.close() + connection.close() + # print("POstgres connection closed successfully") + # print("Connection was closed before") + + + +# Insert a ticket if not exsists +def insertTicket(fid, ticket): + connection = getConn() + cursor = connection.cursor() + + postgres_insert_query = """ INSERT INTO tickets (fid, ticket) VALUES (%s,%s)""" + record_to_insert = (fid, ticket) + cursor.execute(postgres_insert_query, record_to_insert) + + connection.commit() + count = cursor.rowcount + if count <1: + closeConnection(connection,cursor) + return False + print(count, "Record inserted successfully into ticket table") + + + closeConnection(connection,cursor) + return True + + +def getTicketsByTid(tid): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = """select * from tickets join filters on tickets.fid = filters.fid where filters.tid = %s order by filters.tid""" + record_to_insert = (tid,) + cursor.execute(postgreSQL_select_Query, record_to_insert) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + +# Returns all the ticket by filter id and ticket +def getTickets(fid, ticket): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = """select * from tickets where tickets.fid = %s and tickets.ticket = %s""" + record_to_insert = (fid, ticket) + cursor.execute(postgreSQL_select_Query, record_to_insert) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + + +def getTicketForTid(tid, ticket): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = """ + select tickets.* + from tickets + join filters on tickets.fid = filters.fid + where filters.tid = %s and tickets.ticket = %s + limit 1 + """ + record_to_insert = (tid, ticket) + cursor.execute(postgreSQL_select_Query, record_to_insert) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + + + +# print(getTicketsByTid(145645559)) diff --git a/conn/user.py b/conn/user.py new file mode 100644 index 0000000..f530785 --- /dev/null +++ b/conn/user.py @@ -0,0 +1,92 @@ + +import connection + + + +def getConn(): + c = connection.conn() + return c + +def closeConnection(connection,cursor): + if connection: + cursor.close() + connection.close() + + +'''Insert a telegram user if it doesnt exist + Return True if user has been inserted successfully, False otherwise +''' +def insertUser(tid, name, surname, status='P', admin=False ): + if getUserByTid(tid): + return False + + connection = getConn() + cursor = connection.cursor() + + + postgres_insert_query = """ INSERT INTO users (tid, username, surname, status, user_admin) VALUES (%s,%s,%s,%s,%s)""" + record_to_insert = (tid, name, surname, status, admin) + cursor.execute(postgres_insert_query, record_to_insert) + + connection.commit() + count = cursor.rowcount + + closeConnection(connection,cursor) + + if count <1: + return False + print(count, "Record inserted successfully into users table") + return True + + +# Returns all the user registered on bot +def getUsers(): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = "select users.tid from users" + + cursor.execute(postgreSQL_select_Query) + publisher_records = cursor.fetchall() + closeConnection(connection,cursor) + return publisher_records + +''' Gets the user by telegram id ''' +def getUserByTid(tid): + connection = getConn() + cursor = connection.cursor() + + postgreSQL_select_Query = "select * from users where tid=" + str(tid) + + cursor.execute(postgreSQL_select_Query) + publisher_records = cursor.fetchall() + + closeConnection(connection,cursor) + return publisher_records + # if not publisher_records: + # return False + # else: + # return True + + +def approveUser(tid): + + alreadyApproved = getUserByTid(tid) + connection = getConn() + cursor = connection.cursor() + + postgreSQL_update_Query = "UPDATE users SET status = 'A' WHERE tid = %s" + + cursor.execute(postgreSQL_update_Query, (tid,)) + connection.commit() + count = cursor.rowcount + print(count, "Record updated successfully ") + closeConnection(connection,cursor) + return count > 0, alreadyApproved + + +# insertUser(22222, 'boh','bah') +#getUsers() +# if getUserByTid(145645559): +# print(getUserByTid(145645559)[0][3]) + diff --git a/dependencies.txt b/dependencies.txt new file mode 100644 index 0000000..ba44eaf --- /dev/null +++ b/dependencies.txt @@ -0,0 +1,9 @@ +telepot +psycopg2-binary +requests +pdfkit +mysql-connector-python==8.0.26 +numpy +scipy +scikit-learn +joblib diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5d1cdc5 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,86 @@ +services: + postgres: + image: postgres:17 + container_name: ticket-postgres + restart: unless-stopped + environment: + POSTGRES_DB: ticket + POSTGRES_USER: postgres + POSTGRES_PASSWORD: "${POSTGRES_PASSWORD:-localpassword}" + ports: + - "127.0.0.1:5444:5432" + volumes: + - ticket_postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres -d ticket"] + interval: 5s + timeout: 5s + retries: 10 + start_period: 10s + + bot: + build: . + image: ticket-bot:production + container_name: ticket-bot + restart: unless-stopped + network_mode: host + depends_on: + postgres: + condition: service_healthy + environment: + TZ: Europe/Rome + PYTHONUNBUFFERED: "1" + + TICKET_PG_HOST: "127.0.0.1" + TICKET_PG_PORT: "5444" + TICKET_PG_DATABASE: "ticket" + TICKET_PG_USER: "postgres" + TICKET_PG_PASSWORD: "${TICKET_PG_PASSWORD:-localpassword}" + + TICKET_MYSQL_HOST: "${TICKET_MYSQL_HOST:-127.0.0.1}" + TICKET_MYSQL_PORT: "${TICKET_MYSQL_PORT:-3307}" + TICKET_MYSQL_DATABASE: "${TICKET_MYSQL_DATABASE:-smits}" + TICKET_MYSQL_USER: "${TICKET_MYSQL_USER:-reader}" + TICKET_MYSQL_PASSWORD: "${TICKET_MYSQL_PASSWORD:-localpassword}" + TICKET_MYSQL_CHARSET: "${TICKET_MYSQL_CHARSET:-utf8}" + + TICKET_TELEGRAM_TOKEN: "${TICKET_TELEGRAM_TOKEN:-}" + TICKET_ADMIN_ID: "${TICKET_ADMIN_ID:-145645559}" + TICKET_ENABLE_NOTIFICATIONS: "${TICKET_ENABLE_NOTIFICATIONS:-true}" + + web: + build: + context: . + dockerfile: web/Dockerfile + image: ticket-web:production + container_name: ticket-web + restart: unless-stopped + network_mode: host + depends_on: + postgres: + condition: service_healthy + environment: + TZ: Europe/Rome + PYTHONUNBUFFERED: "1" + + TICKET_PG_HOST: "127.0.0.1" + TICKET_PG_PORT: "5444" + TICKET_PG_DATABASE: "ticket" + TICKET_PG_USER: "postgres" + TICKET_PG_PASSWORD: "${TICKET_PG_PASSWORD:-localpassword}" + + TICKET_MYSQL_HOST: "${TICKET_MYSQL_HOST:-127.0.0.1}" + TICKET_MYSQL_PORT: "${TICKET_MYSQL_PORT:-3307}" + TICKET_MYSQL_DATABASE: "${TICKET_MYSQL_DATABASE:-smits}" + TICKET_MYSQL_USER: "${TICKET_MYSQL_USER:-reader}" + TICKET_MYSQL_PASSWORD: "${TICKET_MYSQL_PASSWORD:-localpassword}" + TICKET_MYSQL_CHARSET: "${TICKET_MYSQL_CHARSET:-utf8}" + + TICKET_WEB_ADMIN_USERNAME: "${TICKET_WEB_ADMIN_USERNAME:-admin}" + TICKET_WEB_ADMIN_PASSWORD: "${TICKET_WEB_ADMIN_PASSWORD:-change-me-now}" + TICKET_WEB_COOKIE_SECURE: "${TICKET_WEB_COOKIE_SECURE:-false}" + TICKET_WEB_SESSION_DAYS: "${TICKET_WEB_SESSION_DAYS:-7}" + TICKET_WEB_STATIC_DIR: "/app/web/static" + +volumes: + ticket_postgres_data: diff --git a/gifs/welcome.gif b/gifs/welcome.gif new file mode 100644 index 0000000000000000000000000000000000000000..0687b950e2fd724fe7ad20d33b7bd75ca6d23d1b GIT binary patch literal 885479 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

~tHF$k8PzGJPc7FMp-)V;OhnIHB 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ϜMY1`@0NMUBC{gO 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

2P#l(xBz$+oM!!o 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

UKFb}i>$gC*xpuj>HCZlJL{g)HPSIYj^U1Qk_T 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�-nq5ny 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

vk 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%0DZojl^_C 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%0AOGaFa029}#V3eKqxX|%W-nV8} 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 TWO7Y{CCqo+0J65ZfB*nHaLqLm literal 0 HcmV?d00001 diff --git a/json/empty.txt b/json/empty.txt new file mode 100644 index 0000000..e69de29 diff --git a/node_sid/node_modules/.bin/sshpk-conv b/node_sid/node_modules/.bin/sshpk-conv new file mode 120000 index 0000000..a2a295c --- /dev/null +++ b/node_sid/node_modules/.bin/sshpk-conv @@ -0,0 +1 @@ +../sshpk/bin/sshpk-conv \ No newline at end of file diff --git a/node_sid/node_modules/.bin/sshpk-sign b/node_sid/node_modules/.bin/sshpk-sign new file mode 120000 index 0000000..766b9b3 --- /dev/null +++ b/node_sid/node_modules/.bin/sshpk-sign @@ -0,0 +1 @@ +../sshpk/bin/sshpk-sign \ No newline at end of file diff --git a/node_sid/node_modules/.bin/sshpk-verify b/node_sid/node_modules/.bin/sshpk-verify new file mode 120000 index 0000000..bfd7e3a --- /dev/null +++ b/node_sid/node_modules/.bin/sshpk-verify @@ -0,0 +1 @@ +../sshpk/bin/sshpk-verify \ No newline at end of file diff --git a/node_sid/node_modules/.bin/uuid b/node_sid/node_modules/.bin/uuid new file mode 120000 index 0000000..b3e45bc --- /dev/null +++ b/node_sid/node_modules/.bin/uuid @@ -0,0 +1 @@ +../uuid/bin/uuid \ No newline at end of file diff --git a/node_sid/node_modules/.package-lock.json b/node_sid/node_modules/.package-lock.json new file mode 100644 index 0000000..069e598 --- /dev/null +++ b/node_sid/node_modules/.package-lock.json @@ -0,0 +1,434 @@ +{ + "name": "node_sid", + "lockfileVersion": 2, + "requires": true, + "packages": { + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + } + } +} diff --git a/node_sid/node_modules/ajv/.tonic_example.js b/node_sid/node_modules/ajv/.tonic_example.js new file mode 100644 index 0000000..aa11812 --- /dev/null +++ b/node_sid/node_modules/ajv/.tonic_example.js @@ -0,0 +1,20 @@ +var Ajv = require('ajv'); +var ajv = new Ajv({allErrors: true}); + +var schema = { + "properties": { + "foo": { "type": "string" }, + "bar": { "type": "number", "maximum": 3 } + } +}; + +var validate = ajv.compile(schema); + +test({"foo": "abc", "bar": 2}); +test({"foo": 2, "bar": 4}); + +function test(data) { + var valid = validate(data); + if (valid) console.log('Valid!'); + else console.log('Invalid: ' + ajv.errorsText(validate.errors)); +} \ No newline at end of file diff --git a/node_sid/node_modules/ajv/LICENSE b/node_sid/node_modules/ajv/LICENSE new file mode 100644 index 0000000..96ee719 --- /dev/null +++ b/node_sid/node_modules/ajv/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015-2017 Evgeny Poberezkin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/node_sid/node_modules/ajv/README.md b/node_sid/node_modules/ajv/README.md new file mode 100644 index 0000000..5aa2078 --- /dev/null +++ b/node_sid/node_modules/ajv/README.md @@ -0,0 +1,1497 @@ +Ajv logo + +# Ajv: Another JSON Schema Validator + +The fastest JSON Schema validator for Node.js and browser. Supports draft-04/06/07. + +[![Build Status](https://travis-ci.org/ajv-validator/ajv.svg?branch=master)](https://travis-ci.org/ajv-validator/ajv) +[![npm](https://img.shields.io/npm/v/ajv.svg)](https://www.npmjs.com/package/ajv) +[![npm (beta)](https://img.shields.io/npm/v/ajv/beta)](https://www.npmjs.com/package/ajv/v/7.0.0-beta.0) +[![npm downloads](https://img.shields.io/npm/dm/ajv.svg)](https://www.npmjs.com/package/ajv) +[![Coverage Status](https://coveralls.io/repos/github/ajv-validator/ajv/badge.svg?branch=master)](https://coveralls.io/github/ajv-validator/ajv?branch=master) +[![Gitter](https://img.shields.io/gitter/room/ajv-validator/ajv.svg)](https://gitter.im/ajv-validator/ajv) +[![GitHub Sponsors](https://img.shields.io/badge/$-sponsors-brightgreen)](https://github.com/sponsors/epoberezkin) + + +## Ajv v7 beta is released + +[Ajv version 7.0.0-beta.0](https://github.com/ajv-validator/ajv/tree/v7-beta) is released with these changes: + +- to reduce the mistakes in JSON schemas and unexpected validation results, [strict mode](./docs/strict-mode.md) is added - it prohibits ignored or ambiguous JSON Schema elements. +- to make code injection from untrusted schemas impossible, [code generation](./docs/codegen.md) is fully re-written to be safe. +- to simplify Ajv extensions, the new keyword API that is used by pre-defined keywords is available to user-defined keywords - it is much easier to define any keywords now, especially with subschemas. +- schemas are compiled to ES6 code (ES5 code generation is supported with an option). +- to improve reliability and maintainability the code is migrated to TypeScript. + +**Please note**: + +- the support for JSON-Schema draft-04 is removed - if you have schemas using "id" attributes you have to replace them with "\$id" (or continue using version 6 that will be supported until 02/28/2021). +- all formats are separated to ajv-formats package - they have to be explicitely added if you use them. + +See [release notes](https://github.com/ajv-validator/ajv/releases/tag/v7.0.0-beta.0) for the details. + +To install the new version: + +```bash +npm install ajv@beta +``` + +See [Getting started with v7](https://github.com/ajv-validator/ajv/tree/v7-beta#usage) for code example. + + +## Mozilla MOSS grant and OpenJS Foundation + +[](https://www.mozilla.org/en-US/moss/)     [](https://openjsf.org/blog/2020/08/14/ajv-joins-openjs-foundation-as-an-incubation-project/) + +Ajv has been awarded a grant from Mozilla’s [Open Source Support (MOSS) program](https://www.mozilla.org/en-US/moss/) in the “Foundational Technology” track! It will sponsor the development of Ajv support of [JSON Schema version 2019-09](https://tools.ietf.org/html/draft-handrews-json-schema-02) and of [JSON Type Definition](https://tools.ietf.org/html/draft-ucarion-json-type-definition-04). + +Ajv also joined [OpenJS Foundation](https://openjsf.org/) – having this support will help ensure the longevity and stability of Ajv for all its users. + +This [blog post](https://www.poberezkin.com/posts/2020-08-14-ajv-json-validator-mozilla-open-source-grant-openjs-foundation.html) has more details. + +I am looking for the long term maintainers of Ajv – working with [ReadySet](https://www.thereadyset.co/), also sponsored by Mozilla, to establish clear guidelines for the role of a "maintainer" and the contribution standards, and to encourage a wider, more inclusive, contribution from the community. + + +## Please [sponsor Ajv development](https://github.com/sponsors/epoberezkin) + +Since I asked to support Ajv development 40 people and 6 organizations contributed via GitHub and OpenCollective - this support helped receiving the MOSS grant! + +Your continuing support is very important - the funds will be used to develop and maintain Ajv once the next major version is released. + +Please sponsor Ajv via: +- [GitHub sponsors page](https://github.com/sponsors/epoberezkin) (GitHub will match it) +- [Ajv Open Collective️](https://opencollective.com/ajv) + +Thank you. + + +#### Open Collective sponsors + + + + + + + + + + + + + + + +## Using version 6 + +[JSON Schema draft-07](http://json-schema.org/latest/json-schema-validation.html) is published. + +[Ajv version 6.0.0](https://github.com/ajv-validator/ajv/releases/tag/v6.0.0) that supports draft-07 is released. It may require either migrating your schemas or updating your code (to continue using draft-04 and v5 schemas, draft-06 schemas will be supported without changes). + +__Please note__: To use Ajv with draft-06 schemas you need to explicitly add the meta-schema to the validator instance: + +```javascript +ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json')); +``` + +To use Ajv with draft-04 schemas in addition to explicitly adding meta-schema you also need to use option schemaId: + +```javascript +var ajv = new Ajv({schemaId: 'id'}); +// If you want to use both draft-04 and draft-06/07 schemas: +// var ajv = new Ajv({schemaId: 'auto'}); +ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-04.json')); +``` + + +## Contents + +- [Performance](#performance) +- [Features](#features) +- [Getting started](#getting-started) +- [Frequently Asked Questions](https://github.com/ajv-validator/ajv/blob/master/FAQ.md) +- [Using in browser](#using-in-browser) + - [Ajv and Content Security Policies (CSP)](#ajv-and-content-security-policies-csp) +- [Command line interface](#command-line-interface) +- Validation + - [Keywords](#validation-keywords) + - [Annotation keywords](#annotation-keywords) + - [Formats](#formats) + - [Combining schemas with $ref](#ref) + - [$data reference](#data-reference) + - NEW: [$merge and $patch keywords](#merge-and-patch-keywords) + - [Defining custom keywords](#defining-custom-keywords) + - [Asynchronous schema compilation](#asynchronous-schema-compilation) + - [Asynchronous validation](#asynchronous-validation) +- [Security considerations](#security-considerations) + - [Security contact](#security-contact) + - [Untrusted schemas](#untrusted-schemas) + - [Circular references in objects](#circular-references-in-javascript-objects) + - [Trusted schemas](#security-risks-of-trusted-schemas) + - [ReDoS attack](#redos-attack) +- Modifying data during validation + - [Filtering data](#filtering-data) + - [Assigning defaults](#assigning-defaults) + - [Coercing data types](#coercing-data-types) +- API + - [Methods](#api) + - [Options](#options) + - [Validation errors](#validation-errors) +- [Plugins](#plugins) +- [Related packages](#related-packages) +- [Some packages using Ajv](#some-packages-using-ajv) +- [Tests, Contributing, Changes history](#tests) +- [Support, Code of conduct, License](#open-source-software-support) + + +## Performance + +Ajv generates code using [doT templates](https://github.com/olado/doT) to turn JSON Schemas into super-fast validation functions that are efficient for v8 optimization. + +Currently Ajv is the fastest and the most standard compliant validator according to these benchmarks: + +- [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark) - 50% faster than the second place +- [jsck benchmark](https://github.com/pandastrike/jsck#benchmarks) - 20-190% faster +- [z-schema benchmark](https://rawgit.com/zaggino/z-schema/master/benchmark/results.html) +- [themis benchmark](https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html) + + +Performance of different validators by [json-schema-benchmark](https://github.com/ebdrup/json-schema-benchmark): + +[![performance](https://chart.googleapis.com/chart?chxt=x,y&cht=bhs&chco=76A4FB&chls=2.0&chbh=32,4,1&chs=600x416&chxl=-1:|djv|ajv|json-schema-validator-generator|jsen|is-my-json-valid|themis|z-schema|jsck|skeemas|json-schema-library|tv4&chd=t:100,98,72.1,66.8,50.1,15.1,6.1,3.8,1.2,0.7,0.2)](https://github.com/ebdrup/json-schema-benchmark/blob/master/README.md#performance) + + +## Features + +- Ajv implements full JSON Schema [draft-06/07](http://json-schema.org/) and draft-04 standards: + - all validation keywords (see [JSON Schema validation keywords](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md)) + - full support of remote refs (remote schemas have to be added with `addSchema` or compiled to be available) + - support of circular references between schemas + - correct string lengths for strings with unicode pairs (can be turned off) + - [formats](#formats) defined by JSON Schema draft-07 standard and custom formats (can be turned off) + - [validates schemas against meta-schema](#api-validateschema) +- supports [browsers](#using-in-browser) and Node.js 0.10-14.x +- [asynchronous loading](#asynchronous-schema-compilation) of referenced schemas during compilation +- "All errors" validation mode with [option allErrors](#options) +- [error messages with parameters](#validation-errors) describing error reasons to allow creating custom error messages +- i18n error messages support with [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) package +- [filtering data](#filtering-data) from additional properties +- [assigning defaults](#assigning-defaults) to missing properties and items +- [coercing data](#coercing-data-types) to the types specified in `type` keywords +- [custom keywords](#defining-custom-keywords) +- draft-06/07 keywords `const`, `contains`, `propertyNames` and `if/then/else` +- draft-06 boolean schemas (`true`/`false` as a schema to always pass/fail). +- keywords `switch`, `patternRequired`, `formatMaximum` / `formatMinimum` and `formatExclusiveMaximum` / `formatExclusiveMinimum` from [JSON Schema extension proposals](https://github.com/json-schema/json-schema/wiki/v5-Proposals) with [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package +- [$data reference](#data-reference) to use values from the validated data as values for the schema keywords +- [asynchronous validation](#asynchronous-validation) of custom formats and keywords + + +## Install + +``` +npm install ajv +``` + + +## Getting started + +Try it in the Node.js REPL: https://tonicdev.com/npm/ajv + + +The fastest validation call: + +```javascript +// Node.js require: +var Ajv = require('ajv'); +// or ESM/TypeScript import +import Ajv from 'ajv'; + +var ajv = new Ajv(); // options can be passed, e.g. {allErrors: true} +var validate = ajv.compile(schema); +var valid = validate(data); +if (!valid) console.log(validate.errors); +``` + +or with less code + +```javascript +// ... +var valid = ajv.validate(schema, data); +if (!valid) console.log(ajv.errors); +// ... +``` + +or + +```javascript +// ... +var valid = ajv.addSchema(schema, 'mySchema') + .validate('mySchema', data); +if (!valid) console.log(ajv.errorsText()); +// ... +``` + +See [API](#api) and [Options](#options) for more details. + +Ajv compiles schemas to functions and caches them in all cases (using schema serialized with [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) or a custom function as a key), so that the next time the same schema is used (not necessarily the same object instance) it won't be compiled again. + +The best performance is achieved when using compiled functions returned by `compile` or `getSchema` methods (there is no additional function call). + +__Please note__: every time a validation function or `ajv.validate` are called `errors` property is overwritten. You need to copy `errors` array reference to another variable if you want to use it later (e.g., in the callback). See [Validation errors](#validation-errors) + +__Note for TypeScript users__: `ajv` provides its own TypeScript declarations +out of the box, so you don't need to install the deprecated `@types/ajv` +module. + + +## Using in browser + +You can require Ajv directly from the code you browserify - in this case Ajv will be a part of your bundle. + +If you need to use Ajv in several bundles you can create a separate UMD bundle using `npm run bundle` script (thanks to [siddo420](https://github.com/siddo420)). + +Then you need to load Ajv in the browser: +```html + +``` + +This bundle can be used with different module systems; it creates global `Ajv` if no module system is found. + +The browser bundle is available on [cdnjs](https://cdnjs.com/libraries/ajv). + +Ajv is tested with these browsers: + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/epoberezkin.svg)](https://saucelabs.com/u/epoberezkin) + +__Please note__: some frameworks, e.g. Dojo, may redefine global require in such way that is not compatible with CommonJS module format. In such case Ajv bundle has to be loaded before the framework and then you can use global Ajv (see issue [#234](https://github.com/ajv-validator/ajv/issues/234)). + + +### Ajv and Content Security Policies (CSP) + +If you're using Ajv to compile a schema (the typical use) in a browser document that is loaded with a Content Security Policy (CSP), that policy will require a `script-src` directive that includes the value `'unsafe-eval'`. +:warning: NOTE, however, that `unsafe-eval` is NOT recommended in a secure CSP[[1]](https://developer.chrome.com/extensions/contentSecurityPolicy#relaxing-eval), as it has the potential to open the document to cross-site scripting (XSS) attacks. + +In order to make use of Ajv without easing your CSP, you can [pre-compile a schema using the CLI](https://github.com/ajv-validator/ajv-cli#compile-schemas). This will transpile the schema JSON into a JavaScript file that exports a `validate` function that works simlarly to a schema compiled at runtime. + +Note that pre-compilation of schemas is performed using [ajv-pack](https://github.com/ajv-validator/ajv-pack) and there are [some limitations to the schema features it can compile](https://github.com/ajv-validator/ajv-pack#limitations). A successfully pre-compiled schema is equivalent to the same schema compiled at runtime. + + +## Command line interface + +CLI is available as a separate npm package [ajv-cli](https://github.com/ajv-validator/ajv-cli). It supports: + +- compiling JSON Schemas to test their validity +- BETA: generating standalone module exporting a validation function to be used without Ajv (using [ajv-pack](https://github.com/ajv-validator/ajv-pack)) +- migrate schemas to draft-07 (using [json-schema-migrate](https://github.com/epoberezkin/json-schema-migrate)) +- validating data file(s) against JSON Schema +- testing expected validity of data against JSON Schema +- referenced schemas +- custom meta-schemas +- files in JSON, JSON5, YAML, and JavaScript format +- all Ajv options +- reporting changes in data after validation in [JSON-patch](https://tools.ietf.org/html/rfc6902) format + + +## Validation keywords + +Ajv supports all validation keywords from draft-07 of JSON Schema standard: + +- [type](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#type) +- [for numbers](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-numbers) - maximum, minimum, exclusiveMaximum, exclusiveMinimum, multipleOf +- [for strings](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-strings) - maxLength, minLength, pattern, format +- [for arrays](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-arrays) - maxItems, minItems, uniqueItems, items, additionalItems, [contains](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#contains) +- [for objects](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-objects) - maxProperties, minProperties, required, properties, patternProperties, additionalProperties, dependencies, [propertyNames](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#propertynames) +- [for all types](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#keywords-for-all-types) - enum, [const](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#const) +- [compound keywords](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#compound-keywords) - not, oneOf, anyOf, allOf, [if/then/else](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#ifthenelse) + +With [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package Ajv also supports validation keywords from [JSON Schema extension proposals](https://github.com/json-schema/json-schema/wiki/v5-Proposals) for JSON Schema standard: + +- [patternRequired](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#patternrequired-proposed) - like `required` but with patterns that some property should match. +- [formatMaximum, formatMinimum, formatExclusiveMaximum, formatExclusiveMinimum](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md#formatmaximum--formatminimum-and-exclusiveformatmaximum--exclusiveformatminimum-proposed) - setting limits for date, time, etc. + +See [JSON Schema validation keywords](https://github.com/ajv-validator/ajv/blob/master/KEYWORDS.md) for more details. + + +## Annotation keywords + +JSON Schema specification defines several annotation keywords that describe schema itself but do not perform any validation. + +- `title` and `description`: information about the data represented by that schema +- `$comment` (NEW in draft-07): information for developers. With option `$comment` Ajv logs or passes the comment string to the user-supplied function. See [Options](#options). +- `default`: a default value of the data instance, see [Assigning defaults](#assigning-defaults). +- `examples` (NEW in draft-06): an array of data instances. Ajv does not check the validity of these instances against the schema. +- `readOnly` and `writeOnly` (NEW in draft-07): marks data-instance as read-only or write-only in relation to the source of the data (database, api, etc.). +- `contentEncoding`: [RFC 2045](https://tools.ietf.org/html/rfc2045#section-6.1 ), e.g., "base64". +- `contentMediaType`: [RFC 2046](https://tools.ietf.org/html/rfc2046), e.g., "image/png". + +__Please note__: Ajv does not implement validation of the keywords `examples`, `contentEncoding` and `contentMediaType` but it reserves them. If you want to create a plugin that implements some of them, it should remove these keywords from the instance. + + +## Formats + +Ajv implements formats defined by JSON Schema specification and several other formats. It is recommended NOT to use "format" keyword implementations with untrusted data, as they use potentially unsafe regular expressions - see [ReDoS attack](#redos-attack). + +__Please note__: if you need to use "format" keyword to validate untrusted data, you MUST assess their suitability and safety for your validation scenarios. + +The following formats are implemented for string validation with "format" keyword: + +- _date_: full-date according to [RFC3339](http://tools.ietf.org/html/rfc3339#section-5.6). +- _time_: time with optional time-zone. +- _date-time_: date-time from the same source (time-zone is mandatory). `date`, `time` and `date-time` validate ranges in `full` mode and only regexp in `fast` mode (see [options](#options)). +- _uri_: full URI. +- _uri-reference_: URI reference, including full and relative URIs. +- _uri-template_: URI template according to [RFC6570](https://tools.ietf.org/html/rfc6570) +- _url_ (deprecated): [URL record](https://url.spec.whatwg.org/#concept-url). +- _email_: email address. +- _hostname_: host name according to [RFC1034](http://tools.ietf.org/html/rfc1034#section-3.5). +- _ipv4_: IP address v4. +- _ipv6_: IP address v6. +- _regex_: tests whether a string is a valid regular expression by passing it to RegExp constructor. +- _uuid_: Universally Unique IDentifier according to [RFC4122](http://tools.ietf.org/html/rfc4122). +- _json-pointer_: JSON-pointer according to [RFC6901](https://tools.ietf.org/html/rfc6901). +- _relative-json-pointer_: relative JSON-pointer according to [this draft](http://tools.ietf.org/html/draft-luff-relative-json-pointer-00). + +__Please note__: JSON Schema draft-07 also defines formats `iri`, `iri-reference`, `idn-hostname` and `idn-email` for URLs, hostnames and emails with international characters. Ajv does not implement these formats. If you create Ajv plugin that implements them please make a PR to mention this plugin here. + +There are two modes of format validation: `fast` and `full`. This mode affects formats `date`, `time`, `date-time`, `uri`, `uri-reference`, and `email`. See [Options](#options) for details. + +You can add additional formats and replace any of the formats above using [addFormat](#api-addformat) method. + +The option `unknownFormats` allows changing the default behaviour when an unknown format is encountered. In this case Ajv can either fail schema compilation (default) or ignore it (default in versions before 5.0.0). You also can allow specific format(s) that will be ignored. See [Options](#options) for details. + +You can find regular expressions used for format validation and the sources that were used in [formats.js](https://github.com/ajv-validator/ajv/blob/master/lib/compile/formats.js). + + +## Combining schemas with $ref + +You can structure your validation logic across multiple schema files and have schemas reference each other using `$ref` keyword. + +Example: + +```javascript +var schema = { + "$id": "http://example.com/schemas/schema.json", + "type": "object", + "properties": { + "foo": { "$ref": "defs.json#/definitions/int" }, + "bar": { "$ref": "defs.json#/definitions/str" } + } +}; + +var defsSchema = { + "$id": "http://example.com/schemas/defs.json", + "definitions": { + "int": { "type": "integer" }, + "str": { "type": "string" } + } +}; +``` + +Now to compile your schema you can either pass all schemas to Ajv instance: + +```javascript +var ajv = new Ajv({schemas: [schema, defsSchema]}); +var validate = ajv.getSchema('http://example.com/schemas/schema.json'); +``` + +or use `addSchema` method: + +```javascript +var ajv = new Ajv; +var validate = ajv.addSchema(defsSchema) + .compile(schema); +``` + +See [Options](#options) and [addSchema](#api) method. + +__Please note__: +- `$ref` is resolved as the uri-reference using schema $id as the base URI (see the example). +- References can be recursive (and mutually recursive) to implement the schemas for different data structures (such as linked lists, trees, graphs, etc.). +- You don't have to host your schema files at the URIs that you use as schema $id. These URIs are only used to identify the schemas, and according to JSON Schema specification validators should not expect to be able to download the schemas from these URIs. +- The actual location of the schema file in the file system is not used. +- You can pass the identifier of the schema as the second parameter of `addSchema` method or as a property name in `schemas` option. This identifier can be used instead of (or in addition to) schema $id. +- You cannot have the same $id (or the schema identifier) used for more than one schema - the exception will be thrown. +- You can implement dynamic resolution of the referenced schemas using `compileAsync` method. In this way you can store schemas in any system (files, web, database, etc.) and reference them without explicitly adding to Ajv instance. See [Asynchronous schema compilation](#asynchronous-schema-compilation). + + +## $data reference + +With `$data` option you can use values from the validated data as the values for the schema keywords. See [proposal](https://github.com/json-schema-org/json-schema-spec/issues/51) for more information about how it works. + +`$data` reference is supported in the keywords: const, enum, format, maximum/minimum, exclusiveMaximum / exclusiveMinimum, maxLength / minLength, maxItems / minItems, maxProperties / minProperties, formatMaximum / formatMinimum, formatExclusiveMaximum / formatExclusiveMinimum, multipleOf, pattern, required, uniqueItems. + +The value of "$data" should be a [JSON-pointer](https://tools.ietf.org/html/rfc6901) to the data (the root is always the top level data object, even if the $data reference is inside a referenced subschema) or a [relative JSON-pointer](http://tools.ietf.org/html/draft-luff-relative-json-pointer-00) (it is relative to the current point in data; if the $data reference is inside a referenced subschema it cannot point to the data outside of the root level for this subschema). + +Examples. + +This schema requires that the value in property `smaller` is less or equal than the value in the property larger: + +```javascript +var ajv = new Ajv({$data: true}); + +var schema = { + "properties": { + "smaller": { + "type": "number", + "maximum": { "$data": "1/larger" } + }, + "larger": { "type": "number" } + } +}; + +var validData = { + smaller: 5, + larger: 7 +}; + +ajv.validate(schema, validData); // true +``` + +This schema requires that the properties have the same format as their field names: + +```javascript +var schema = { + "additionalProperties": { + "type": "string", + "format": { "$data": "0#" } + } +}; + +var validData = { + 'date-time': '1963-06-19T08:30:06.283185Z', + email: 'joe.bloggs@example.com' +} +``` + +`$data` reference is resolved safely - it won't throw even if some property is undefined. If `$data` resolves to `undefined` the validation succeeds (with the exclusion of `const` keyword). If `$data` resolves to incorrect type (e.g. not "number" for maximum keyword) the validation fails. + + +## $merge and $patch keywords + +With the package [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) you can use the keywords `$merge` and `$patch` that allow extending JSON Schemas with patches using formats [JSON Merge Patch (RFC 7396)](https://tools.ietf.org/html/rfc7396) and [JSON Patch (RFC 6902)](https://tools.ietf.org/html/rfc6902). + +To add keywords `$merge` and `$patch` to Ajv instance use this code: + +```javascript +require('ajv-merge-patch')(ajv); +``` + +Examples. + +Using `$merge`: + +```json +{ + "$merge": { + "source": { + "type": "object", + "properties": { "p": { "type": "string" } }, + "additionalProperties": false + }, + "with": { + "properties": { "q": { "type": "number" } } + } + } +} +``` + +Using `$patch`: + +```json +{ + "$patch": { + "source": { + "type": "object", + "properties": { "p": { "type": "string" } }, + "additionalProperties": false + }, + "with": [ + { "op": "add", "path": "/properties/q", "value": { "type": "number" } } + ] + } +} +``` + +The schemas above are equivalent to this schema: + +```json +{ + "type": "object", + "properties": { + "p": { "type": "string" }, + "q": { "type": "number" } + }, + "additionalProperties": false +} +``` + +The properties `source` and `with` in the keywords `$merge` and `$patch` can use absolute or relative `$ref` to point to other schemas previously added to the Ajv instance or to the fragments of the current schema. + +See the package [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) for more information. + + +## Defining custom keywords + +The advantages of using custom keywords are: + +- allow creating validation scenarios that cannot be expressed using JSON Schema +- simplify your schemas +- help bringing a bigger part of the validation logic to your schemas +- make your schemas more expressive, less verbose and closer to your application domain +- implement custom data processors that modify your data (`modifying` option MUST be used in keyword definition) and/or create side effects while the data is being validated + +If a keyword is used only for side-effects and its validation result is pre-defined, use option `valid: true/false` in keyword definition to simplify both generated code (no error handling in case of `valid: true`) and your keyword functions (no need to return any validation result). + +The concerns you have to be aware of when extending JSON Schema standard with custom keywords are the portability and understanding of your schemas. You will have to support these custom keywords on other platforms and to properly document these keywords so that everybody can understand them in your schemas. + +You can define custom keywords with [addKeyword](#api-addkeyword) method. Keywords are defined on the `ajv` instance level - new instances will not have previously defined keywords. + +Ajv allows defining keywords with: +- validation function +- compilation function +- macro function +- inline compilation function that should return code (as string) that will be inlined in the currently compiled schema. + +Example. `range` and `exclusiveRange` keywords using compiled schema: + +```javascript +ajv.addKeyword('range', { + type: 'number', + compile: function (sch, parentSchema) { + var min = sch[0]; + var max = sch[1]; + + return parentSchema.exclusiveRange === true + ? function (data) { return data > min && data < max; } + : function (data) { return data >= min && data <= max; } + } +}); + +var schema = { "range": [2, 4], "exclusiveRange": true }; +var validate = ajv.compile(schema); +console.log(validate(2.01)); // true +console.log(validate(3.99)); // true +console.log(validate(2)); // false +console.log(validate(4)); // false +``` + +Several custom keywords (typeof, instanceof, range and propertyNames) are defined in [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package - they can be used for your schemas and as a starting point for your own custom keywords. + +See [Defining custom keywords](https://github.com/ajv-validator/ajv/blob/master/CUSTOM.md) for more details. + + +## Asynchronous schema compilation + +During asynchronous compilation remote references are loaded using supplied function. See `compileAsync` [method](#api-compileAsync) and `loadSchema` [option](#options). + +Example: + +```javascript +var ajv = new Ajv({ loadSchema: loadSchema }); + +ajv.compileAsync(schema).then(function (validate) { + var valid = validate(data); + // ... +}); + +function loadSchema(uri) { + return request.json(uri).then(function (res) { + if (res.statusCode >= 400) + throw new Error('Loading error: ' + res.statusCode); + return res.body; + }); +} +``` + +__Please note__: [Option](#options) `missingRefs` should NOT be set to `"ignore"` or `"fail"` for asynchronous compilation to work. + + +## Asynchronous validation + +Example in Node.js REPL: https://tonicdev.com/esp/ajv-asynchronous-validation + +You can define custom formats and keywords that perform validation asynchronously by accessing database or some other service. You should add `async: true` in the keyword or format definition (see [addFormat](#api-addformat), [addKeyword](#api-addkeyword) and [Defining custom keywords](#defining-custom-keywords)). + +If your schema uses asynchronous formats/keywords or refers to some schema that contains them it should have `"$async": true` keyword so that Ajv can compile it correctly. If asynchronous format/keyword or reference to asynchronous schema is used in the schema without `$async` keyword Ajv will throw an exception during schema compilation. + +__Please note__: all asynchronous subschemas that are referenced from the current or other schemas should have `"$async": true` keyword as well, otherwise the schema compilation will fail. + +Validation function for an asynchronous custom format/keyword should return a promise that resolves with `true` or `false` (or rejects with `new Ajv.ValidationError(errors)` if you want to return custom errors from the keyword function). + +Ajv compiles asynchronous schemas to [es7 async functions](http://tc39.github.io/ecmascript-asyncawait/) that can optionally be transpiled with [nodent](https://github.com/MatAtBread/nodent). Async functions are supported in Node.js 7+ and all modern browsers. You can also supply any other transpiler as a function via `processCode` option. See [Options](#options). + +The compiled validation function has `$async: true` property (if the schema is asynchronous), so you can differentiate these functions if you are using both synchronous and asynchronous schemas. + +Validation result will be a promise that resolves with validated data or rejects with an exception `Ajv.ValidationError` that contains the array of validation errors in `errors` property. + + +Example: + +```javascript +var ajv = new Ajv; +// require('ajv-async')(ajv); + +ajv.addKeyword('idExists', { + async: true, + type: 'number', + validate: checkIdExists +}); + + +function checkIdExists(schema, data) { + return knex(schema.table) + .select('id') + .where('id', data) + .then(function (rows) { + return !!rows.length; // true if record is found + }); +} + +var schema = { + "$async": true, + "properties": { + "userId": { + "type": "integer", + "idExists": { "table": "users" } + }, + "postId": { + "type": "integer", + "idExists": { "table": "posts" } + } + } +}; + +var validate = ajv.compile(schema); + +validate({ userId: 1, postId: 19 }) +.then(function (data) { + console.log('Data is valid', data); // { userId: 1, postId: 19 } +}) +.catch(function (err) { + if (!(err instanceof Ajv.ValidationError)) throw err; + // data is invalid + console.log('Validation errors:', err.errors); +}); +``` + +### Using transpilers with asynchronous validation functions. + +[ajv-async](https://github.com/ajv-validator/ajv-async) uses [nodent](https://github.com/MatAtBread/nodent) to transpile async functions. To use another transpiler you should separately install it (or load its bundle in the browser). + + +#### Using nodent + +```javascript +var ajv = new Ajv; +require('ajv-async')(ajv); +// in the browser if you want to load ajv-async bundle separately you can: +// window.ajvAsync(ajv); +var validate = ajv.compile(schema); // transpiled es7 async function +validate(data).then(successFunc).catch(errorFunc); +``` + + +#### Using other transpilers + +```javascript +var ajv = new Ajv({ processCode: transpileFunc }); +var validate = ajv.compile(schema); // transpiled es7 async function +validate(data).then(successFunc).catch(errorFunc); +``` + +See [Options](#options). + + +## Security considerations + +JSON Schema, if properly used, can replace data sanitisation. It doesn't replace other API security considerations. It also introduces additional security aspects to consider. + + +##### Security contact + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. Please do NOT report security vulnerabilities via GitHub issues. + + +##### Untrusted schemas + +Ajv treats JSON schemas as trusted as your application code. This security model is based on the most common use case, when the schemas are static and bundled together with the application. + +If your schemas are received from untrusted sources (or generated from untrusted data) there are several scenarios you need to prevent: +- compiling schemas can cause stack overflow (if they are too deep) +- compiling schemas can be slow (e.g. [#557](https://github.com/ajv-validator/ajv/issues/557)) +- validating certain data can be slow + +It is difficult to predict all the scenarios, but at the very least it may help to limit the size of untrusted schemas (e.g. limit JSON string length) and also the maximum schema object depth (that can be high for relatively small JSON strings). You also may want to mitigate slow regular expressions in `pattern` and `patternProperties` keywords. + +Regardless the measures you take, using untrusted schemas increases security risks. + + +##### Circular references in JavaScript objects + +Ajv does not support schemas and validated data that have circular references in objects. See [issue #802](https://github.com/ajv-validator/ajv/issues/802). + +An attempt to compile such schemas or validate such data would cause stack overflow (or will not complete in case of asynchronous validation). Depending on the parser you use, untrusted data can lead to circular references. + + +##### Security risks of trusted schemas + +Some keywords in JSON Schemas can lead to very slow validation for certain data. These keywords include (but may be not limited to): + +- `pattern` and `format` for large strings - in some cases using `maxLength` can help mitigate it, but certain regular expressions can lead to exponential validation time even with relatively short strings (see [ReDoS attack](#redos-attack)). +- `patternProperties` for large property names - use `propertyNames` to mitigate, but some regular expressions can have exponential evaluation time as well. +- `uniqueItems` for large non-scalar arrays - use `maxItems` to mitigate + +__Please note__: The suggestions above to prevent slow validation would only work if you do NOT use `allErrors: true` in production code (using it would continue validation after validation errors). + +You can validate your JSON schemas against [this meta-schema](https://github.com/ajv-validator/ajv/blob/master/lib/refs/json-schema-secure.json) to check that these recommendations are followed: + +```javascript +const isSchemaSecure = ajv.compile(require('ajv/lib/refs/json-schema-secure.json')); + +const schema1 = {format: 'email'}; +isSchemaSecure(schema1); // false + +const schema2 = {format: 'email', maxLength: MAX_LENGTH}; +isSchemaSecure(schema2); // true +``` + +__Please note__: following all these recommendation is not a guarantee that validation of untrusted data is safe - it can still lead to some undesirable results. + + +##### Content Security Policies (CSP) +See [Ajv and Content Security Policies (CSP)](#ajv-and-content-security-policies-csp) + + +## ReDoS attack + +Certain regular expressions can lead to the exponential evaluation time even with relatively short strings. + +Please assess the regular expressions you use in the schemas on their vulnerability to this attack - see [safe-regex](https://github.com/substack/safe-regex), for example. + +__Please note__: some formats that Ajv implements use [regular expressions](https://github.com/ajv-validator/ajv/blob/master/lib/compile/formats.js) that can be vulnerable to ReDoS attack, so if you use Ajv to validate data from untrusted sources __it is strongly recommended__ to consider the following: + +- making assessment of "format" implementations in Ajv. +- using `format: 'fast'` option that simplifies some of the regular expressions (although it does not guarantee that they are safe). +- replacing format implementations provided by Ajv with your own implementations of "format" keyword that either uses different regular expressions or another approach to format validation. Please see [addFormat](#api-addformat) method. +- disabling format validation by ignoring "format" keyword with option `format: false` + +Whatever mitigation you choose, please assume all formats provided by Ajv as potentially unsafe and make your own assessment of their suitability for your validation scenarios. + + +## Filtering data + +With [option `removeAdditional`](#options) (added by [andyscott](https://github.com/andyscott)) you can filter data during the validation. + +This option modifies original data. + +Example: + +```javascript +var ajv = new Ajv({ removeAdditional: true }); +var schema = { + "additionalProperties": false, + "properties": { + "foo": { "type": "number" }, + "bar": { + "additionalProperties": { "type": "number" }, + "properties": { + "baz": { "type": "string" } + } + } + } +} + +var data = { + "foo": 0, + "additional1": 1, // will be removed; `additionalProperties` == false + "bar": { + "baz": "abc", + "additional2": 2 // will NOT be removed; `additionalProperties` != false + }, +} + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": 0, "bar": { "baz": "abc", "additional2": 2 } +``` + +If `removeAdditional` option in the example above were `"all"` then both `additional1` and `additional2` properties would have been removed. + +If the option were `"failing"` then property `additional1` would have been removed regardless of its value and property `additional2` would have been removed only if its value were failing the schema in the inner `additionalProperties` (so in the example above it would have stayed because it passes the schema, but any non-number would have been removed). + +__Please note__: If you use `removeAdditional` option with `additionalProperties` keyword inside `anyOf`/`oneOf` keywords your validation can fail with this schema, for example: + +```json +{ + "type": "object", + "oneOf": [ + { + "properties": { + "foo": { "type": "string" } + }, + "required": [ "foo" ], + "additionalProperties": false + }, + { + "properties": { + "bar": { "type": "integer" } + }, + "required": [ "bar" ], + "additionalProperties": false + } + ] +} +``` + +The intention of the schema above is to allow objects with either the string property "foo" or the integer property "bar", but not with both and not with any other properties. + +With the option `removeAdditional: true` the validation will pass for the object `{ "foo": "abc"}` but will fail for the object `{"bar": 1}`. It happens because while the first subschema in `oneOf` is validated, the property `bar` is removed because it is an additional property according to the standard (because it is not included in `properties` keyword in the same schema). + +While this behaviour is unexpected (issues [#129](https://github.com/ajv-validator/ajv/issues/129), [#134](https://github.com/ajv-validator/ajv/issues/134)), it is correct. To have the expected behaviour (both objects are allowed and additional properties are removed) the schema has to be refactored in this way: + +```json +{ + "type": "object", + "properties": { + "foo": { "type": "string" }, + "bar": { "type": "integer" } + }, + "additionalProperties": false, + "oneOf": [ + { "required": [ "foo" ] }, + { "required": [ "bar" ] } + ] +} +``` + +The schema above is also more efficient - it will compile into a faster function. + + +## Assigning defaults + +With [option `useDefaults`](#options) Ajv will assign values from `default` keyword in the schemas of `properties` and `items` (when it is the array of schemas) to the missing properties and items. + +With the option value `"empty"` properties and items equal to `null` or `""` (empty string) will be considered missing and assigned defaults. + +This option modifies original data. + +__Please note__: the default value is inserted in the generated validation code as a literal, so the value inserted in the data will be the deep clone of the default in the schema. + + +Example 1 (`default` in `properties`): + +```javascript +var ajv = new Ajv({ useDefaults: true }); +var schema = { + "type": "object", + "properties": { + "foo": { "type": "number" }, + "bar": { "type": "string", "default": "baz" } + }, + "required": [ "foo", "bar" ] +}; + +var data = { "foo": 1 }; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": 1, "bar": "baz" } +``` + +Example 2 (`default` in `items`): + +```javascript +var schema = { + "type": "array", + "items": [ + { "type": "number" }, + { "type": "string", "default": "foo" } + ] +} + +var data = [ 1 ]; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // [ 1, "foo" ] +``` + +`default` keywords in other cases are ignored: + +- not in `properties` or `items` subschemas +- in schemas inside `anyOf`, `oneOf` and `not` (see [#42](https://github.com/ajv-validator/ajv/issues/42)) +- in `if` subschema of `switch` keyword +- in schemas generated by custom macro keywords + +The [`strictDefaults` option](#options) customizes Ajv's behavior for the defaults that Ajv ignores (`true` raises an error, and `"log"` outputs a warning). + + +## Coercing data types + +When you are validating user inputs all your data properties are usually strings. The option `coerceTypes` allows you to have your data types coerced to the types specified in your schema `type` keywords, both to pass the validation and to use the correctly typed data afterwards. + +This option modifies original data. + +__Please note__: if you pass a scalar value to the validating function its type will be coerced and it will pass the validation, but the value of the variable you pass won't be updated because scalars are passed by value. + + +Example 1: + +```javascript +var ajv = new Ajv({ coerceTypes: true }); +var schema = { + "type": "object", + "properties": { + "foo": { "type": "number" }, + "bar": { "type": "boolean" } + }, + "required": [ "foo", "bar" ] +}; + +var data = { "foo": "1", "bar": "false" }; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": 1, "bar": false } +``` + +Example 2 (array coercions): + +```javascript +var ajv = new Ajv({ coerceTypes: 'array' }); +var schema = { + "properties": { + "foo": { "type": "array", "items": { "type": "number" } }, + "bar": { "type": "boolean" } + } +}; + +var data = { "foo": "1", "bar": ["false"] }; + +var validate = ajv.compile(schema); + +console.log(validate(data)); // true +console.log(data); // { "foo": [1], "bar": false } +``` + +The coercion rules, as you can see from the example, are different from JavaScript both to validate user input as expected and to have the coercion reversible (to correctly validate cases where different types are defined in subschemas of "anyOf" and other compound keywords). + +See [Coercion rules](https://github.com/ajv-validator/ajv/blob/master/COERCION.md) for details. + + +## API + +##### new Ajv(Object options) -> Object + +Create Ajv instance. + + +##### .compile(Object schema) -> Function<Object data> + +Generate validating function and cache the compiled schema for future use. + +Validating function returns a boolean value. This function has properties `errors` and `schema`. Errors encountered during the last validation are assigned to `errors` property (it is assigned `null` if there was no errors). `schema` property contains the reference to the original schema. + +The schema passed to this method will be validated against meta-schema unless `validateSchema` option is false. If schema is invalid, an error will be thrown. See [options](#options). + + +##### .compileAsync(Object schema [, Boolean meta] [, Function callback]) -> Promise + +Asynchronous version of `compile` method that loads missing remote schemas using asynchronous function in `options.loadSchema`. This function returns a Promise that resolves to a validation function. An optional callback passed to `compileAsync` will be called with 2 parameters: error (or null) and validating function. The returned promise will reject (and the callback will be called with an error) when: + +- missing schema can't be loaded (`loadSchema` returns a Promise that rejects). +- a schema containing a missing reference is loaded, but the reference cannot be resolved. +- schema (or some loaded/referenced schema) is invalid. + +The function compiles schema and loads the first missing schema (or meta-schema) until all missing schemas are loaded. + +You can asynchronously compile meta-schema by passing `true` as the second parameter. + +See example in [Asynchronous compilation](#asynchronous-schema-compilation). + + +##### .validate(Object schema|String key|String ref, data) -> Boolean + +Validate data using passed schema (it will be compiled and cached). + +Instead of the schema you can use the key that was previously passed to `addSchema`, the schema id if it was present in the schema or any previously resolved reference. + +Validation errors will be available in the `errors` property of Ajv instance (`null` if there were no errors). + +__Please note__: every time this method is called the errors are overwritten so you need to copy them to another variable if you want to use them later. + +If the schema is asynchronous (has `$async` keyword on the top level) this method returns a Promise. See [Asynchronous validation](#asynchronous-validation). + + +##### .addSchema(Array<Object>|Object schema [, String key]) -> Ajv + +Add schema(s) to validator instance. This method does not compile schemas (but it still validates them). Because of that dependencies can be added in any order and circular dependencies are supported. It also prevents unnecessary compilation of schemas that are containers for other schemas but not used as a whole. + +Array of schemas can be passed (schemas should have ids), the second parameter will be ignored. + +Key can be passed that can be used to reference the schema and will be used as the schema id if there is no id inside the schema. If the key is not passed, the schema id will be used as the key. + + +Once the schema is added, it (and all the references inside it) can be referenced in other schemas and used to validate data. + +Although `addSchema` does not compile schemas, explicit compilation is not required - the schema will be compiled when it is used first time. + +By default the schema is validated against meta-schema before it is added, and if the schema does not pass validation the exception is thrown. This behaviour is controlled by `validateSchema` option. + +__Please note__: Ajv uses the [method chaining syntax](https://en.wikipedia.org/wiki/Method_chaining) for all methods with the prefix `add*` and `remove*`. +This allows you to do nice things like the following. + +```javascript +var validate = new Ajv().addSchema(schema).addFormat(name, regex).getSchema(uri); +``` + +##### .addMetaSchema(Array<Object>|Object schema [, String key]) -> Ajv + +Adds meta schema(s) that can be used to validate other schemas. That function should be used instead of `addSchema` because there may be instance options that would compile a meta schema incorrectly (at the moment it is `removeAdditional` option). + +There is no need to explicitly add draft-07 meta schema (http://json-schema.org/draft-07/schema) - it is added by default, unless option `meta` is set to `false`. You only need to use it if you have a changed meta-schema that you want to use to validate your schemas. See `validateSchema`. + + +##### .validateSchema(Object schema) -> Boolean + +Validates schema. This method should be used to validate schemas rather than `validate` due to the inconsistency of `uri` format in JSON Schema standard. + +By default this method is called automatically when the schema is added, so you rarely need to use it directly. + +If schema doesn't have `$schema` property, it is validated against draft 6 meta-schema (option `meta` should not be false). + +If schema has `$schema` property, then the schema with this id (that should be previously added) is used to validate passed schema. + +Errors will be available at `ajv.errors`. + + +##### .getSchema(String key) -> Function<Object data> + +Retrieve compiled schema previously added with `addSchema` by the key passed to `addSchema` or by its full reference (id). The returned validating function has `schema` property with the reference to the original schema. + + +##### .removeSchema([Object schema|String key|String ref|RegExp pattern]) -> Ajv + +Remove added/cached schema. Even if schema is referenced by other schemas it can be safely removed as dependent schemas have local references. + +Schema can be removed using: +- key passed to `addSchema` +- it's full reference (id) +- RegExp that should match schema id or key (meta-schemas won't be removed) +- actual schema object that will be stable-stringified to remove schema from cache + +If no parameter is passed all schemas but meta-schemas will be removed and the cache will be cleared. + + +##### .addFormat(String name, String|RegExp|Function|Object format) -> Ajv + +Add custom format to validate strings or numbers. It can also be used to replace pre-defined formats for Ajv instance. + +Strings are converted to RegExp. + +Function should return validation result as `true` or `false`. + +If object is passed it should have properties `validate`, `compare` and `async`: + +- _validate_: a string, RegExp or a function as described above. +- _compare_: an optional comparison function that accepts two strings and compares them according to the format meaning. This function is used with keywords `formatMaximum`/`formatMinimum` (defined in [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) package). It should return `1` if the first value is bigger than the second value, `-1` if it is smaller and `0` if it is equal. +- _async_: an optional `true` value if `validate` is an asynchronous function; in this case it should return a promise that resolves with a value `true` or `false`. +- _type_: an optional type of data that the format applies to. It can be `"string"` (default) or `"number"` (see https://github.com/ajv-validator/ajv/issues/291#issuecomment-259923858). If the type of data is different, the validation will pass. + +Custom formats can be also added via `formats` option. + + +##### .addKeyword(String keyword, Object definition) -> Ajv + +Add custom validation keyword to Ajv instance. + +Keyword should be different from all standard JSON Schema keywords and different from previously defined keywords. There is no way to redefine keywords or to remove keyword definition from the instance. + +Keyword must start with a letter, `_` or `$`, and may continue with letters, numbers, `_`, `$`, or `-`. +It is recommended to use an application-specific prefix for keywords to avoid current and future name collisions. + +Example Keywords: +- `"xyz-example"`: valid, and uses prefix for the xyz project to avoid name collisions. +- `"example"`: valid, but not recommended as it could collide with future versions of JSON Schema etc. +- `"3-example"`: invalid as numbers are not allowed to be the first character in a keyword + +Keyword definition is an object with the following properties: + +- _type_: optional string or array of strings with data type(s) that the keyword applies to. If not present, the keyword will apply to all types. +- _validate_: validating function +- _compile_: compiling function +- _macro_: macro function +- _inline_: compiling function that returns code (as string) +- _schema_: an optional `false` value used with "validate" keyword to not pass schema +- _metaSchema_: an optional meta-schema for keyword schema +- _dependencies_: an optional list of properties that must be present in the parent schema - it will be checked during schema compilation +- _modifying_: `true` MUST be passed if keyword modifies data +- _statements_: `true` can be passed in case inline keyword generates statements (as opposed to expression) +- _valid_: pass `true`/`false` to pre-define validation result, the result returned from validation function will be ignored. This option cannot be used with macro keywords. +- _$data_: an optional `true` value to support [$data reference](#data-reference) as the value of custom keyword. The reference will be resolved at validation time. If the keyword has meta-schema it would be extended to allow $data and it will be used to validate the resolved value. Supporting $data reference requires that keyword has validating function (as the only option or in addition to compile, macro or inline function). +- _async_: an optional `true` value if the validation function is asynchronous (whether it is compiled or passed in _validate_ property); in this case it should return a promise that resolves with a value `true` or `false`. This option is ignored in case of "macro" and "inline" keywords. +- _errors_: an optional boolean or string `"full"` indicating whether keyword returns errors. If this property is not set Ajv will determine if the errors were set in case of failed validation. + +_compile_, _macro_ and _inline_ are mutually exclusive, only one should be used at a time. _validate_ can be used separately or in addition to them to support $data reference. + +__Please note__: If the keyword is validating data type that is different from the type(s) in its definition, the validation function will not be called (and expanded macro will not be used), so there is no need to check for data type inside validation function or inside schema returned by macro function (unless you want to enforce a specific type and for some reason do not want to use a separate `type` keyword for that). In the same way as standard keywords work, if the keyword does not apply to the data type being validated, the validation of this keyword will succeed. + +See [Defining custom keywords](#defining-custom-keywords) for more details. + + +##### .getKeyword(String keyword) -> Object|Boolean + +Returns custom keyword definition, `true` for pre-defined keywords and `false` if the keyword is unknown. + + +##### .removeKeyword(String keyword) -> Ajv + +Removes custom or pre-defined keyword so you can redefine them. + +While this method can be used to extend pre-defined keywords, it can also be used to completely change their meaning - it may lead to unexpected results. + +__Please note__: schemas compiled before the keyword is removed will continue to work without changes. To recompile schemas use `removeSchema` method and compile them again. + + +##### .errorsText([Array<Object> errors [, Object options]]) -> String + +Returns the text with all errors in a String. + +Options can have properties `separator` (string used to separate errors, ", " by default) and `dataVar` (the variable name that dataPaths are prefixed with, "data" by default). + + +## Options + +Defaults: + +```javascript +{ + // validation and reporting options: + $data: false, + allErrors: false, + verbose: false, + $comment: false, // NEW in Ajv version 6.0 + jsonPointers: false, + uniqueItems: true, + unicode: true, + nullable: false, + format: 'fast', + formats: {}, + unknownFormats: true, + schemas: {}, + logger: undefined, + // referenced schema options: + schemaId: '$id', + missingRefs: true, + extendRefs: 'ignore', // recommended 'fail' + loadSchema: undefined, // function(uri: string): Promise {} + // options to modify validated data: + removeAdditional: false, + useDefaults: false, + coerceTypes: false, + // strict mode options + strictDefaults: false, + strictKeywords: false, + strictNumbers: false, + // asynchronous validation options: + transpile: undefined, // requires ajv-async package + // advanced options: + meta: true, + validateSchema: true, + addUsedSchema: true, + inlineRefs: true, + passContext: false, + loopRequired: Infinity, + ownProperties: false, + multipleOfPrecision: false, + errorDataPath: 'object', // deprecated + messages: true, + sourceCode: false, + processCode: undefined, // function (str: string, schema: object): string {} + cache: new Cache, + serialize: undefined +} +``` + +##### Validation and reporting options + +- _$data_: support [$data references](#data-reference). Draft 6 meta-schema that is added by default will be extended to allow them. If you want to use another meta-schema you need to use $dataMetaSchema method to add support for $data reference. See [API](#api). +- _allErrors_: check all rules collecting all errors. Default is to return after the first error. +- _verbose_: include the reference to the part of the schema (`schema` and `parentSchema`) and validated data in errors (false by default). +- _$comment_ (NEW in Ajv version 6.0): log or pass the value of `$comment` keyword to a function. Option values: + - `false` (default): ignore $comment keyword. + - `true`: log the keyword value to console. + - function: pass the keyword value, its schema path and root schema to the specified function +- _jsonPointers_: set `dataPath` property of errors using [JSON Pointers](https://tools.ietf.org/html/rfc6901) instead of JavaScript property access notation. +- _uniqueItems_: validate `uniqueItems` keyword (true by default). +- _unicode_: calculate correct length of strings with unicode pairs (true by default). Pass `false` to use `.length` of strings that is faster, but gives "incorrect" lengths of strings with unicode pairs - each unicode pair is counted as two characters. +- _nullable_: support keyword "nullable" from [Open API 3 specification](https://swagger.io/docs/specification/data-models/data-types/). +- _format_: formats validation mode. Option values: + - `"fast"` (default) - simplified and fast validation (see [Formats](#formats) for details of which formats are available and affected by this option). + - `"full"` - more restrictive and slow validation. E.g., 25:00:00 and 2015/14/33 will be invalid time and date in 'full' mode but it will be valid in 'fast' mode. + - `false` - ignore all format keywords. +- _formats_: an object with custom formats. Keys and values will be passed to `addFormat` method. +- _keywords_: an object with custom keywords. Keys and values will be passed to `addKeyword` method. +- _unknownFormats_: handling of unknown formats. Option values: + - `true` (default) - if an unknown format is encountered the exception is thrown during schema compilation. If `format` keyword value is [$data reference](#data-reference) and it is unknown the validation will fail. + - `[String]` - an array of unknown format names that will be ignored. This option can be used to allow usage of third party schemas with format(s) for which you don't have definitions, but still fail if another unknown format is used. If `format` keyword value is [$data reference](#data-reference) and it is not in this array the validation will fail. + - `"ignore"` - to log warning during schema compilation and always pass validation (the default behaviour in versions before 5.0.0). This option is not recommended, as it allows to mistype format name and it won't be validated without any error message. This behaviour is required by JSON Schema specification. +- _schemas_: an array or object of schemas that will be added to the instance. In case you pass the array the schemas must have IDs in them. When the object is passed the method `addSchema(value, key)` will be called for each schema in this object. +- _logger_: sets the logging method. Default is the global `console` object that should have methods `log`, `warn` and `error`. See [Error logging](#error-logging). Option values: + - custom logger - it should have methods `log`, `warn` and `error`. If any of these methods is missing an exception will be thrown. + - `false` - logging is disabled. + + +##### Referenced schema options + +- _schemaId_: this option defines which keywords are used as schema URI. Option value: + - `"$id"` (default) - only use `$id` keyword as schema URI (as specified in JSON Schema draft-06/07), ignore `id` keyword (if it is present a warning will be logged). + - `"id"` - only use `id` keyword as schema URI (as specified in JSON Schema draft-04), ignore `$id` keyword (if it is present a warning will be logged). + - `"auto"` - use both `$id` and `id` keywords as schema URI. If both are present (in the same schema object) and different the exception will be thrown during schema compilation. +- _missingRefs_: handling of missing referenced schemas. Option values: + - `true` (default) - if the reference cannot be resolved during compilation the exception is thrown. The thrown error has properties `missingRef` (with hash fragment) and `missingSchema` (without it). Both properties are resolved relative to the current base id (usually schema id, unless it was substituted). + - `"ignore"` - to log error during compilation and always pass validation. + - `"fail"` - to log error and successfully compile schema but fail validation if this rule is checked. +- _extendRefs_: validation of other keywords when `$ref` is present in the schema. Option values: + - `"ignore"` (default) - when `$ref` is used other keywords are ignored (as per [JSON Reference](https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03#section-3) standard). A warning will be logged during the schema compilation. + - `"fail"` (recommended) - if other validation keywords are used together with `$ref` the exception will be thrown when the schema is compiled. This option is recommended to make sure schema has no keywords that are ignored, which can be confusing. + - `true` - validate all keywords in the schemas with `$ref` (the default behaviour in versions before 5.0.0). +- _loadSchema_: asynchronous function that will be used to load remote schemas when `compileAsync` [method](#api-compileAsync) is used and some reference is missing (option `missingRefs` should NOT be 'fail' or 'ignore'). This function should accept remote schema uri as a parameter and return a Promise that resolves to a schema. See example in [Asynchronous compilation](#asynchronous-schema-compilation). + + +##### Options to modify validated data + +- _removeAdditional_: remove additional properties - see example in [Filtering data](#filtering-data). This option is not used if schema is added with `addMetaSchema` method. Option values: + - `false` (default) - not to remove additional properties + - `"all"` - all additional properties are removed, regardless of `additionalProperties` keyword in schema (and no validation is made for them). + - `true` - only additional properties with `additionalProperties` keyword equal to `false` are removed. + - `"failing"` - additional properties that fail schema validation will be removed (where `additionalProperties` keyword is `false` or schema). +- _useDefaults_: replace missing or undefined properties and items with the values from corresponding `default` keywords. Default behaviour is to ignore `default` keywords. This option is not used if schema is added with `addMetaSchema` method. See examples in [Assigning defaults](#assigning-defaults). Option values: + - `false` (default) - do not use defaults + - `true` - insert defaults by value (object literal is used). + - `"empty"` - in addition to missing or undefined, use defaults for properties and items that are equal to `null` or `""` (an empty string). + - `"shared"` (deprecated) - insert defaults by reference. If the default is an object, it will be shared by all instances of validated data. If you modify the inserted default in the validated data, it will be modified in the schema as well. +- _coerceTypes_: change data type of data to match `type` keyword. See the example in [Coercing data types](#coercing-data-types) and [coercion rules](https://github.com/ajv-validator/ajv/blob/master/COERCION.md). Option values: + - `false` (default) - no type coercion. + - `true` - coerce scalar data types. + - `"array"` - in addition to coercions between scalar types, coerce scalar data to an array with one element and vice versa (as required by the schema). + + +##### Strict mode options + +- _strictDefaults_: report ignored `default` keywords in schemas. Option values: + - `false` (default) - ignored defaults are not reported + - `true` - if an ignored default is present, throw an error + - `"log"` - if an ignored default is present, log warning +- _strictKeywords_: report unknown keywords in schemas. Option values: + - `false` (default) - unknown keywords are not reported + - `true` - if an unknown keyword is present, throw an error + - `"log"` - if an unknown keyword is present, log warning +- _strictNumbers_: validate numbers strictly, failing validation for NaN and Infinity. Option values: + - `false` (default) - NaN or Infinity will pass validation for numeric types + - `true` - NaN or Infinity will not pass validation for numeric types + +##### Asynchronous validation options + +- _transpile_: Requires [ajv-async](https://github.com/ajv-validator/ajv-async) package. It determines whether Ajv transpiles compiled asynchronous validation function. Option values: + - `undefined` (default) - transpile with [nodent](https://github.com/MatAtBread/nodent) if async functions are not supported. + - `true` - always transpile with nodent. + - `false` - do not transpile; if async functions are not supported an exception will be thrown. + + +##### Advanced options + +- _meta_: add [meta-schema](http://json-schema.org/documentation.html) so it can be used by other schemas (true by default). If an object is passed, it will be used as the default meta-schema for schemas that have no `$schema` keyword. This default meta-schema MUST have `$schema` keyword. +- _validateSchema_: validate added/compiled schemas against meta-schema (true by default). `$schema` property in the schema can be http://json-schema.org/draft-07/schema or absent (draft-07 meta-schema will be used) or can be a reference to the schema previously added with `addMetaSchema` method. Option values: + - `true` (default) - if the validation fails, throw the exception. + - `"log"` - if the validation fails, log error. + - `false` - skip schema validation. +- _addUsedSchema_: by default methods `compile` and `validate` add schemas to the instance if they have `$id` (or `id`) property that doesn't start with "#". If `$id` is present and it is not unique the exception will be thrown. Set this option to `false` to skip adding schemas to the instance and the `$id` uniqueness check when these methods are used. This option does not affect `addSchema` method. +- _inlineRefs_: Affects compilation of referenced schemas. Option values: + - `true` (default) - the referenced schemas that don't have refs in them are inlined, regardless of their size - that substantially improves performance at the cost of the bigger size of compiled schema functions. + - `false` - to not inline referenced schemas (they will be compiled as separate functions). + - integer number - to limit the maximum number of keywords of the schema that will be inlined. +- _passContext_: pass validation context to custom keyword functions. If this option is `true` and you pass some context to the compiled validation function with `validate.call(context, data)`, the `context` will be available as `this` in your custom keywords. By default `this` is Ajv instance. +- _loopRequired_: by default `required` keyword is compiled into a single expression (or a sequence of statements in `allErrors` mode). In case of a very large number of properties in this keyword it may result in a very big validation function. Pass integer to set the number of properties above which `required` keyword will be validated in a loop - smaller validation function size but also worse performance. +- _ownProperties_: by default Ajv iterates over all enumerable object properties; when this option is `true` only own enumerable object properties (i.e. found directly on the object rather than on its prototype) are iterated. Contributed by @mbroadst. +- _multipleOfPrecision_: by default `multipleOf` keyword is validated by comparing the result of division with parseInt() of that result. It works for dividers that are bigger than 1. For small dividers such as 0.01 the result of the division is usually not integer (even when it should be integer, see issue [#84](https://github.com/ajv-validator/ajv/issues/84)). If you need to use fractional dividers set this option to some positive integer N to have `multipleOf` validated using this formula: `Math.abs(Math.round(division) - division) < 1e-N` (it is slower but allows for float arithmetics deviations). +- _errorDataPath_ (deprecated): set `dataPath` to point to 'object' (default) or to 'property' when validating keywords `required`, `additionalProperties` and `dependencies`. +- _messages_: Include human-readable messages in errors. `true` by default. `false` can be passed when custom messages are used (e.g. with [ajv-i18n](https://github.com/ajv-validator/ajv-i18n)). +- _sourceCode_: add `sourceCode` property to validating function (for debugging; this code can be different from the result of toString call). +- _processCode_: an optional function to process generated code before it is passed to Function constructor. It can be used to either beautify (the validating function is generated without line-breaks) or to transpile code. Starting from version 5.0.0 this option replaced options: + - `beautify` that formatted the generated function using [js-beautify](https://github.com/beautify-web/js-beautify). If you want to beautify the generated code pass a function calling `require('js-beautify').js_beautify` as `processCode: code => js_beautify(code)`. + - `transpile` that transpiled asynchronous validation function. You can still use `transpile` option with [ajv-async](https://github.com/ajv-validator/ajv-async) package. See [Asynchronous validation](#asynchronous-validation) for more information. +- _cache_: an optional instance of cache to store compiled schemas using stable-stringified schema as a key. For example, set-associative cache [sacjs](https://github.com/epoberezkin/sacjs) can be used. If not passed then a simple hash is used which is good enough for the common use case (a limited number of statically defined schemas). Cache should have methods `put(key, value)`, `get(key)`, `del(key)` and `clear()`. +- _serialize_: an optional function to serialize schema to cache key. Pass `false` to use schema itself as a key (e.g., if WeakMap used as a cache). By default [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used. + + +## Validation errors + +In case of validation failure, Ajv assigns the array of errors to `errors` property of validation function (or to `errors` property of Ajv instance when `validate` or `validateSchema` methods were called). In case of [asynchronous validation](#asynchronous-validation), the returned promise is rejected with exception `Ajv.ValidationError` that has `errors` property. + + +### Error objects + +Each error is an object with the following properties: + +- _keyword_: validation keyword. +- _dataPath_: the path to the part of the data that was validated. By default `dataPath` uses JavaScript property access notation (e.g., `".prop[1].subProp"`). When the option `jsonPointers` is true (see [Options](#options)) `dataPath` will be set using JSON pointer standard (e.g., `"/prop/1/subProp"`). +- _schemaPath_: the path (JSON-pointer as a URI fragment) to the schema of the keyword that failed validation. +- _params_: the object with the additional information about error that can be used to create custom error messages (e.g., using [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) package). See below for parameters set by all keywords. +- _message_: the standard error message (can be excluded with option `messages` set to false). +- _schema_: the schema of the keyword (added with `verbose` option). +- _parentSchema_: the schema containing the keyword (added with `verbose` option) +- _data_: the data validated by the keyword (added with `verbose` option). + +__Please note__: `propertyNames` keyword schema validation errors have an additional property `propertyName`, `dataPath` points to the object. After schema validation for each property name, if it is invalid an additional error is added with the property `keyword` equal to `"propertyNames"`. + + +### Error parameters + +Properties of `params` object in errors depend on the keyword that failed validation. + +- `maxItems`, `minItems`, `maxLength`, `minLength`, `maxProperties`, `minProperties` - property `limit` (number, the schema of the keyword). +- `additionalItems` - property `limit` (the maximum number of allowed items in case when `items` keyword is an array of schemas and `additionalItems` is false). +- `additionalProperties` - property `additionalProperty` (the property not used in `properties` and `patternProperties` keywords). +- `dependencies` - properties: + - `property` (dependent property), + - `missingProperty` (required missing dependency - only the first one is reported currently) + - `deps` (required dependencies, comma separated list as a string), + - `depsCount` (the number of required dependencies). +- `format` - property `format` (the schema of the keyword). +- `maximum`, `minimum` - properties: + - `limit` (number, the schema of the keyword), + - `exclusive` (boolean, the schema of `exclusiveMaximum` or `exclusiveMinimum`), + - `comparison` (string, comparison operation to compare the data to the limit, with the data on the left and the limit on the right; can be "<", "<=", ">", ">=") +- `multipleOf` - property `multipleOf` (the schema of the keyword) +- `pattern` - property `pattern` (the schema of the keyword) +- `required` - property `missingProperty` (required property that is missing). +- `propertyNames` - property `propertyName` (an invalid property name). +- `patternRequired` (in ajv-keywords) - property `missingPattern` (required pattern that did not match any property). +- `type` - property `type` (required type(s), a string, can be a comma-separated list) +- `uniqueItems` - properties `i` and `j` (indices of duplicate items). +- `const` - property `allowedValue` pointing to the value (the schema of the keyword). +- `enum` - property `allowedValues` pointing to the array of values (the schema of the keyword). +- `$ref` - property `ref` with the referenced schema URI. +- `oneOf` - property `passingSchemas` (array of indices of passing schemas, null if no schema passes). +- custom keywords (in case keyword definition doesn't create errors) - property `keyword` (the keyword name). + + +### Error logging + +Using the `logger` option when initiallizing Ajv will allow you to define custom logging. Here you can build upon the exisiting logging. The use of other logging packages is supported as long as the package or its associated wrapper exposes the required methods. If any of the required methods are missing an exception will be thrown. +- **Required Methods**: `log`, `warn`, `error` + +```javascript +var otherLogger = new OtherLogger(); +var ajv = new Ajv({ + logger: { + log: console.log.bind(console), + warn: function warn() { + otherLogger.logWarn.apply(otherLogger, arguments); + }, + error: function error() { + otherLogger.logError.apply(otherLogger, arguments); + console.error.apply(console, arguments); + } + } +}); +``` + + +## Plugins + +Ajv can be extended with plugins that add custom keywords, formats or functions to process generated code. When such plugin is published as npm package it is recommended that it follows these conventions: + +- it exports a function +- this function accepts ajv instance as the first parameter and returns the same instance to allow chaining +- this function can accept an optional configuration as the second parameter + +If you have published a useful plugin please submit a PR to add it to the next section. + + +## Related packages + +- [ajv-async](https://github.com/ajv-validator/ajv-async) - plugin to configure async validation mode +- [ajv-bsontype](https://github.com/BoLaMN/ajv-bsontype) - plugin to validate mongodb's bsonType formats +- [ajv-cli](https://github.com/jessedc/ajv-cli) - command line interface +- [ajv-errors](https://github.com/ajv-validator/ajv-errors) - plugin for custom error messages +- [ajv-i18n](https://github.com/ajv-validator/ajv-i18n) - internationalised error messages +- [ajv-istanbul](https://github.com/ajv-validator/ajv-istanbul) - plugin to instrument generated validation code to measure test coverage of your schemas +- [ajv-keywords](https://github.com/ajv-validator/ajv-keywords) - plugin with custom validation keywords (select, typeof, etc.) +- [ajv-merge-patch](https://github.com/ajv-validator/ajv-merge-patch) - plugin with keywords $merge and $patch +- [ajv-pack](https://github.com/ajv-validator/ajv-pack) - produces a compact module exporting validation functions +- [ajv-formats-draft2019](https://github.com/luzlab/ajv-formats-draft2019) - format validators for draft2019 that aren't already included in ajv (ie. `idn-hostname`, `idn-email`, `iri`, `iri-reference` and `duration`). + +## Some packages using Ajv + +- [webpack](https://github.com/webpack/webpack) - a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser +- [jsonscript-js](https://github.com/JSONScript/jsonscript-js) - the interpreter for [JSONScript](http://www.jsonscript.org) - scripted processing of existing endpoints and services +- [osprey-method-handler](https://github.com/mulesoft-labs/osprey-method-handler) - Express middleware for validating requests and responses based on a RAML method object, used in [osprey](https://github.com/mulesoft/osprey) - validating API proxy generated from a RAML definition +- [har-validator](https://github.com/ahmadnassri/har-validator) - HTTP Archive (HAR) validator +- [jsoneditor](https://github.com/josdejong/jsoneditor) - a web-based tool to view, edit, format, and validate JSON http://jsoneditoronline.org +- [JSON Schema Lint](https://github.com/nickcmaynard/jsonschemalint) - a web tool to validate JSON/YAML document against a single JSON Schema http://jsonschemalint.com +- [objection](https://github.com/vincit/objection.js) - SQL-friendly ORM for Node.js +- [table](https://github.com/gajus/table) - formats data into a string table +- [ripple-lib](https://github.com/ripple/ripple-lib) - a JavaScript API for interacting with [Ripple](https://ripple.com) in Node.js and the browser +- [restbase](https://github.com/wikimedia/restbase) - distributed storage with REST API & dispatcher for backend services built to provide a low-latency & high-throughput API for Wikipedia / Wikimedia content +- [hippie-swagger](https://github.com/CacheControl/hippie-swagger) - [Hippie](https://github.com/vesln/hippie) wrapper that provides end to end API testing with swagger validation +- [react-form-controlled](https://github.com/seeden/react-form-controlled) - React controlled form components with validation +- [rabbitmq-schema](https://github.com/tjmehta/rabbitmq-schema) - a schema definition module for RabbitMQ graphs and messages +- [@query/schema](https://www.npmjs.com/package/@query/schema) - stream filtering with a URI-safe query syntax parsing to JSON Schema +- [chai-ajv-json-schema](https://github.com/peon374/chai-ajv-json-schema) - chai plugin to us JSON Schema with expect in mocha tests +- [grunt-jsonschema-ajv](https://github.com/SignpostMarv/grunt-jsonschema-ajv) - Grunt plugin for validating files against JSON Schema +- [extract-text-webpack-plugin](https://github.com/webpack-contrib/extract-text-webpack-plugin) - extract text from bundle into a file +- [electron-builder](https://github.com/electron-userland/electron-builder) - a solution to package and build a ready for distribution Electron app +- [addons-linter](https://github.com/mozilla/addons-linter) - Mozilla Add-ons Linter +- [gh-pages-generator](https://github.com/epoberezkin/gh-pages-generator) - multi-page site generator converting markdown files to GitHub pages +- [ESLint](https://github.com/eslint/eslint) - the pluggable linting utility for JavaScript and JSX + + +## Tests + +``` +npm install +git submodule update --init +npm test +``` + +## Contributing + +All validation functions are generated using doT templates in [dot](https://github.com/ajv-validator/ajv/tree/master/lib/dot) folder. Templates are precompiled so doT is not a run-time dependency. + +`npm run build` - compiles templates to [dotjs](https://github.com/ajv-validator/ajv/tree/master/lib/dotjs) folder. + +`npm run watch` - automatically compiles templates when files in dot folder change + +Please see [Contributing guidelines](https://github.com/ajv-validator/ajv/blob/master/CONTRIBUTING.md) + + +## Changes history + +See https://github.com/ajv-validator/ajv/releases + +__Please note__: [Changes in version 7.0.0-beta](https://github.com/ajv-validator/ajv/releases/tag/v7.0.0-beta.0) + +[Version 6.0.0](https://github.com/ajv-validator/ajv/releases/tag/v6.0.0). + +## Code of conduct + +Please review and follow the [Code of conduct](https://github.com/ajv-validator/ajv/blob/master/CODE_OF_CONDUCT.md). + +Please report any unacceptable behaviour to ajv.validator@gmail.com - it will be reviewed by the project team. + + +## Open-source software support + +Ajv is a part of [Tidelift subscription](https://tidelift.com/subscription/pkg/npm-ajv?utm_source=npm-ajv&utm_medium=referral&utm_campaign=readme) - it provides a centralised support to open-source software users, in addition to the support provided by software maintainers. + + +## License + +[MIT](https://github.com/ajv-validator/ajv/blob/master/LICENSE) diff --git a/node_sid/node_modules/ajv/dist/ajv.bundle.js b/node_sid/node_modules/ajv/dist/ajv.bundle.js new file mode 100644 index 0000000..e4d9d15 --- /dev/null +++ b/node_sid/node_modules/ajv/dist/ajv.bundle.js @@ -0,0 +1,7189 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Ajv = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; +// For the source: https://gist.github.com/dperini/729294 +// For test cases: https://mathiasbynens.be/demo/url-regex +// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. +// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; +var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; +var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; +var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/; +var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; +var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; + + +module.exports = formats; + +function formats(mode) { + mode = mode == 'full' ? 'full' : 'fast'; + return util.copy(formats[mode]); +} + + +formats.fast = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, + 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, + 'uri-reference': /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, + 'uri-template': URITEMPLATE, + url: URL, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, + hostname: HOSTNAME, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: UUID, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +formats.full = { + date: date, + time: time, + 'date-time': date_time, + uri: uri, + 'uri-reference': URIREF, + 'uri-template': URITEMPLATE, + url: URL, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: HOSTNAME, + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + uuid: UUID, + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +function isLeapYear(year) { + // https://tools.ietf.org/html/rfc3339#appendix-C + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} + + +function date(str) { + // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 + var matches = str.match(DATE); + if (!matches) return false; + + var year = +matches[1]; + var month = +matches[2]; + var day = +matches[3]; + + return month >= 1 && month <= 12 && day >= 1 && + day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]); +} + + +function time(str, full) { + var matches = str.match(TIME); + if (!matches) return false; + + var hour = matches[1]; + var minute = matches[2]; + var second = matches[3]; + var timeZone = matches[5]; + return ((hour <= 23 && minute <= 59 && second <= 59) || + (hour == 23 && minute == 59 && second == 60)) && + (!full || timeZone); +} + + +var DATE_TIME_SEPARATOR = /t|\s/i; +function date_time(str) { + // http://tools.ietf.org/html/rfc3339#section-5.6 + var dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); +} + + +var NOT_URI_FRAGMENT = /\/|:/; +function uri(str) { + // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." + return NOT_URI_FRAGMENT.test(str) && URI.test(str); +} + + +var Z_ANCHOR = /[^\\]\\Z/; +function regex(str) { + if (Z_ANCHOR.test(str)) return false; + try { + new RegExp(str); + return true; + } catch(e) { + return false; + } +} + +},{"./util":10}],5:[function(require,module,exports){ +'use strict'; + +var resolve = require('./resolve') + , util = require('./util') + , errorClasses = require('./error_classes') + , stableStringify = require('fast-json-stable-stringify'); + +var validateGenerator = require('../dotjs/validate'); + +/** + * Functions below are used inside compiled validations function + */ + +var ucs2length = util.ucs2length; +var equal = require('fast-deep-equal'); + +// this error is thrown by async schemas to return validation errors via exception +var ValidationError = errorClasses.Validation; + +module.exports = compile; + + +/** + * Compiles schema to validation function + * @this Ajv + * @param {Object} schema schema object + * @param {Object} root object with information about the root schema for this schema + * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution + * @param {String} baseId base ID for IDs in the schema + * @return {Function} validation function + */ +function compile(schema, root, localRefs, baseId) { + /* jshint validthis: true, evil: true */ + /* eslint no-shadow: 0 */ + var self = this + , opts = this._opts + , refVal = [ undefined ] + , refs = {} + , patterns = [] + , patternsHash = {} + , defaults = [] + , defaultsHash = {} + , customRules = []; + + root = root || { schema: schema, refVal: refVal, refs: refs }; + + var c = checkCompiling.call(this, schema, root, baseId); + var compilation = this._compilations[c.index]; + if (c.compiling) return (compilation.callValidate = callValidate); + + var formats = this._formats; + var RULES = this.RULES; + + try { + var v = localCompile(schema, root, localRefs, baseId); + compilation.validate = v; + var cv = compilation.callValidate; + if (cv) { + cv.schema = v.schema; + cv.errors = null; + cv.refs = v.refs; + cv.refVal = v.refVal; + cv.root = v.root; + cv.$async = v.$async; + if (opts.sourceCode) cv.source = v.source; + } + return v; + } finally { + endCompiling.call(this, schema, root, baseId); + } + + /* @this {*} - custom context, see passContext option */ + function callValidate() { + /* jshint validthis: true */ + var validate = compilation.validate; + var result = validate.apply(this, arguments); + callValidate.errors = validate.errors; + return result; + } + + function localCompile(_schema, _root, localRefs, baseId) { + var isRoot = !_root || (_root && _root.schema == _schema); + if (_root.schema != root.schema) + return compile.call(self, _schema, _root, localRefs, baseId); + + var $async = _schema.$async === true; + + var sourceCode = validateGenerator({ + isTop: true, + schema: _schema, + isRoot: isRoot, + baseId: baseId, + root: _root, + schemaPath: '', + errSchemaPath: '#', + errorPath: '""', + MissingRefError: errorClasses.MissingRef, + RULES: RULES, + validate: validateGenerator, + util: util, + resolve: resolve, + resolveRef: resolveRef, + usePattern: usePattern, + useDefault: useDefault, + useCustomRule: useCustomRule, + opts: opts, + formats: formats, + logger: self.logger, + self: self + }); + + sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) + + vars(defaults, defaultCode) + vars(customRules, customRuleCode) + + sourceCode; + + if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema); + // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); + var validate; + try { + var makeValidate = new Function( + 'self', + 'RULES', + 'formats', + 'root', + 'refVal', + 'defaults', + 'customRules', + 'equal', + 'ucs2length', + 'ValidationError', + sourceCode + ); + + validate = makeValidate( + self, + RULES, + formats, + root, + refVal, + defaults, + customRules, + equal, + ucs2length, + ValidationError + ); + + refVal[0] = validate; + } catch(e) { + self.logger.error('Error compiling schema, function code:', sourceCode); + throw e; + } + + validate.schema = _schema; + validate.errors = null; + validate.refs = refs; + validate.refVal = refVal; + validate.root = isRoot ? validate : _root; + if ($async) validate.$async = true; + if (opts.sourceCode === true) { + validate.source = { + code: sourceCode, + patterns: patterns, + defaults: defaults + }; + } + + return validate; + } + + function resolveRef(baseId, ref, isRoot) { + ref = resolve.url(baseId, ref); + var refIndex = refs[ref]; + var _refVal, refCode; + if (refIndex !== undefined) { + _refVal = refVal[refIndex]; + refCode = 'refVal[' + refIndex + ']'; + return resolvedRef(_refVal, refCode); + } + if (!isRoot && root.refs) { + var rootRefId = root.refs[ref]; + if (rootRefId !== undefined) { + _refVal = root.refVal[rootRefId]; + refCode = addLocalRef(ref, _refVal); + return resolvedRef(_refVal, refCode); + } + } + + refCode = addLocalRef(ref); + var v = resolve.call(self, localCompile, root, ref); + if (v === undefined) { + var localSchema = localRefs && localRefs[ref]; + if (localSchema) { + v = resolve.inlineRef(localSchema, opts.inlineRefs) + ? localSchema + : compile.call(self, localSchema, root, localRefs, baseId); + } + } + + if (v === undefined) { + removeLocalRef(ref); + } else { + replaceLocalRef(ref, v); + return resolvedRef(v, refCode); + } + } + + function addLocalRef(ref, v) { + var refId = refVal.length; + refVal[refId] = v; + refs[ref] = refId; + return 'refVal' + refId; + } + + function removeLocalRef(ref) { + delete refs[ref]; + } + + function replaceLocalRef(ref, v) { + var refId = refs[ref]; + refVal[refId] = v; + } + + function resolvedRef(refVal, code) { + return typeof refVal == 'object' || typeof refVal == 'boolean' + ? { code: code, schema: refVal, inline: true } + : { code: code, $async: refVal && !!refVal.$async }; + } + + function usePattern(regexStr) { + var index = patternsHash[regexStr]; + if (index === undefined) { + index = patternsHash[regexStr] = patterns.length; + patterns[index] = regexStr; + } + return 'pattern' + index; + } + + function useDefault(value) { + switch (typeof value) { + case 'boolean': + case 'number': + return '' + value; + case 'string': + return util.toQuotedString(value); + case 'object': + if (value === null) return 'null'; + var valueStr = stableStringify(value); + var index = defaultsHash[valueStr]; + if (index === undefined) { + index = defaultsHash[valueStr] = defaults.length; + defaults[index] = value; + } + return 'default' + index; + } + } + + function useCustomRule(rule, schema, parentSchema, it) { + if (self._opts.validateSchema !== false) { + var deps = rule.definition.dependencies; + if (deps && !deps.every(function(keyword) { + return Object.prototype.hasOwnProperty.call(parentSchema, keyword); + })) + throw new Error('parent schema must have all required keywords: ' + deps.join(',')); + + var validateSchema = rule.definition.validateSchema; + if (validateSchema) { + var valid = validateSchema(schema); + if (!valid) { + var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); + if (self._opts.validateSchema == 'log') self.logger.error(message); + else throw new Error(message); + } + } + } + + var compile = rule.definition.compile + , inline = rule.definition.inline + , macro = rule.definition.macro; + + var validate; + if (compile) { + validate = compile.call(self, schema, parentSchema, it); + } else if (macro) { + validate = macro.call(self, schema, parentSchema, it); + if (opts.validateSchema !== false) self.validateSchema(validate, true); + } else if (inline) { + validate = inline.call(self, it, rule.keyword, schema, parentSchema); + } else { + validate = rule.definition.validate; + if (!validate) return; + } + + if (validate === undefined) + throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); + + var index = customRules.length; + customRules[index] = validate; + + return { + code: 'customRule' + index, + validate: validate + }; + } +} + + +/** + * Checks if the schema is currently compiled + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean) + */ +function checkCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var index = compIndex.call(this, schema, root, baseId); + if (index >= 0) return { index: index, compiling: true }; + index = this._compilations.length; + this._compilations[index] = { + schema: schema, + root: root, + baseId: baseId + }; + return { index: index, compiling: false }; +} + + +/** + * Removes the schema from the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + */ +function endCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var i = compIndex.call(this, schema, root, baseId); + if (i >= 0) this._compilations.splice(i, 1); +} + + +/** + * Index of schema compilation in the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Integer} compilation index + */ +function compIndex(schema, root, baseId) { + /* jshint validthis: true */ + for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) { + // high surrogate, and there is a next character + value = str.charCodeAt(pos); + if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate + } + } + return length; +}; + +},{}],10:[function(require,module,exports){ +'use strict'; + + +module.exports = { + copy: copy, + checkDataType: checkDataType, + checkDataTypes: checkDataTypes, + coerceToTypes: coerceToTypes, + toHash: toHash, + getProperty: getProperty, + escapeQuotes: escapeQuotes, + equal: require('fast-deep-equal'), + ucs2length: require('./ucs2length'), + varOccurences: varOccurences, + varReplace: varReplace, + schemaHasRules: schemaHasRules, + schemaHasRulesExcept: schemaHasRulesExcept, + schemaUnknownRules: schemaUnknownRules, + toQuotedString: toQuotedString, + getPathExpr: getPathExpr, + getPath: getPath, + getData: getData, + unescapeFragment: unescapeFragment, + unescapeJsonPointer: unescapeJsonPointer, + escapeFragment: escapeFragment, + escapeJsonPointer: escapeJsonPointer +}; + + +function copy(o, to) { + to = to || {}; + for (var key in o) to[key] = o[key]; + return to; +} + + +function checkDataType(dataType, data, strictNumbers, negate) { + var EQUAL = negate ? ' !== ' : ' === ' + , AND = negate ? ' || ' : ' && ' + , OK = negate ? '!' : '' + , NOT = negate ? '' : '!'; + switch (dataType) { + case 'null': return data + EQUAL + 'null'; + case 'array': return OK + 'Array.isArray(' + data + ')'; + case 'object': return '(' + OK + data + AND + + 'typeof ' + data + EQUAL + '"object"' + AND + + NOT + 'Array.isArray(' + data + '))'; + case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND + + NOT + '(' + data + ' % 1)' + + AND + data + EQUAL + data + + (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; + case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' + + (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; + default: return 'typeof ' + data + EQUAL + '"' + dataType + '"'; + } +} + + +function checkDataTypes(dataTypes, data, strictNumbers) { + switch (dataTypes.length) { + case 1: return checkDataType(dataTypes[0], data, strictNumbers, true); + default: + var code = ''; + var types = toHash(dataTypes); + if (types.array && types.object) { + code = types.null ? '(': '(!' + data + ' || '; + code += 'typeof ' + data + ' !== "object")'; + delete types.null; + delete types.array; + delete types.object; + } + if (types.number) delete types.integer; + for (var t in types) + code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true); + + return code; + } +} + + +var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]); +function coerceToTypes(optionCoerceTypes, dataTypes) { + if (Array.isArray(dataTypes)) { + var types = []; + for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl); + return paths[lvl - up]; + } + + if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl); + data = 'data' + ((lvl - up) || ''); + if (!jsonPointer) return data; + } + + var expr = data; + var segments = jsonPointer.split('/'); + for (var i=0; i', + $notOp = $isMax ? '>' : '<', + $errorKeyword = undefined; + if (!($isData || typeof $schema == 'number' || $schema === undefined)) { + throw new Error($keyword + ' must be number'); + } + if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) { + throw new Error($exclusiveKeyword + ' must be number or boolean'); + } + if ($isDataExcl) { + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), + $exclusive = 'exclusive' + $lvl, + $exclType = 'exclType' + $lvl, + $exclIsNumber = 'exclIsNumber' + $lvl, + $opExpr = 'op' + $lvl, + $opStr = '\' + ' + $opExpr + ' + \''; + out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; + $schemaValueExcl = 'schemaExcl' + $lvl; + out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; + var $errorKeyword = $exclusiveKeyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; '; + if ($schema === undefined) { + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaValueExcl; + $isData = $isDataExcl; + } + } else { + var $exclIsNumber = typeof $schemaExcl == 'number', + $opStr = $op; + if ($exclIsNumber && $isData) { + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; + } else { + if ($exclIsNumber && $schema === undefined) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaExcl; + $notOp += '='; + } else { + if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $notOp += '='; + } else { + $exclusive = false; + $opStr += '='; + } + } + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; + } + } + $errorKeyword = $errorKeyword || $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be ' + ($opStr) + ' '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],14:[function(require,module,exports){ +'use strict'; +module.exports = function generate__limitItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxItems' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxItems') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],15:[function(require,module,exports){ +'use strict'; +module.exports = function generate__limitLength(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxLength' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + if (it.opts.unicode === false) { + out += ' ' + ($data) + '.length '; + } else { + out += ' ucs2length(' + ($data) + ') '; + } + out += ' ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be '; + if ($keyword == 'maxLength') { + out += 'longer'; + } else { + out += 'shorter'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' characters\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],16:[function(require,module,exports){ +'use strict'; +module.exports = function generate__limitProperties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxProperties' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxProperties') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' properties\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],17:[function(require,module,exports){ +'use strict'; +module.exports = function generate_allOf(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $allSchemasEmpty = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $allSchemasEmpty = false; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($breakOnError) { + if ($allSchemasEmpty) { + out += ' if (true) { '; + } else { + out += ' ' + ($closingBraces.slice(0, -1)) + ' '; + } + } + return out; +} + +},{}],18:[function(require,module,exports){ +'use strict'; +module.exports = function generate_anyOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $noEmptySchema = $schema.every(function($sch) { + return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)); + }); + if ($noEmptySchema) { + var $currentBaseId = $it.baseId; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; + $closingBraces += '}'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should match some schema in anyOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} + +},{}],19:[function(require,module,exports){ +'use strict'; +module.exports = function generate_comment(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $comment = it.util.toQuotedString($schema); + if (it.opts.$comment === true) { + out += ' console.log(' + ($comment) + ');'; + } else if (typeof it.opts.$comment == 'function') { + out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);'; + } + return out; +} + +},{}],20:[function(require,module,exports){ +'use strict'; +module.exports = function generate_const(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!$isData) { + out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to constant\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],21:[function(require,module,exports){ +'use strict'; +module.exports = function generate_contains(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId, + $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)); + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($nonEmptySchema) { + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (' + ($nextValid) + ') break; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; + } else { + out += ' if (' + ($data) + '.length == 0) {'; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should contain a valid item\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + if ($nonEmptySchema) { + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + } + if (it.opts.allErrors) { + out += ' } '; + } + return out; +} + +},{}],22:[function(require,module,exports){ +'use strict'; +module.exports = function generate_custom(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $rule = this, + $definition = 'definition' + $lvl, + $rDef = $rule.definition, + $closingBraces = ''; + var $compile, $inline, $macro, $ruleValidate, $validateCode; + if ($isData && $rDef.$data) { + $validateCode = 'keywordValidate' + $lvl; + var $validateSchema = $rDef.validateSchema; + out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;'; + } else { + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); + if (!$ruleValidate) return; + $schemaValue = 'validate.schema' + $schemaPath; + $validateCode = $ruleValidate.code; + $compile = $rDef.compile; + $inline = $rDef.inline; + $macro = $rDef.macro; + } + var $ruleErrs = $validateCode + '.errors', + $i = 'i' + $lvl, + $ruleErr = 'ruleErr' + $lvl, + $asyncKeyword = $rDef.async; + if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema'); + if (!($inline || $macro)) { + out += '' + ($ruleErrs) + ' = null;'; + } + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($isData && $rDef.$data) { + $closingBraces += '}'; + out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; + if ($validateSchema) { + $closingBraces += '}'; + out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; + } + } + if ($inline) { + if ($rDef.statements) { + out += ' ' + ($ruleValidate.validate) + ' '; + } else { + out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; '; + } + } else if ($macro) { + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + $it.schema = $ruleValidate.validate; + $it.schemaPath = ''; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($code); + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + out += ' ' + ($validateCode) + '.call( '; + if (it.opts.passContext) { + out += 'this'; + } else { + out += 'self'; + } + if ($compile || $rDef.schema === false) { + out += ' , ' + ($data) + ' '; + } else { + out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' '; + } + out += ' , (dataPath || \'\')'; + if (it.errorPath != '""') { + out += ' + ' + (it.errorPath); + } + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) '; + var def_callRuleValidate = out; + out = $$outStack.pop(); + if ($rDef.errors === false) { + out += ' ' + ($valid) + ' = '; + if ($asyncKeyword) { + out += 'await '; + } + out += '' + (def_callRuleValidate) + '; '; + } else { + if ($asyncKeyword) { + $ruleErrs = 'customErrors' + $lvl; + out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } '; + } else { + out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; '; + } + } + } + if ($rDef.modifying) { + out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; + } + out += '' + ($closingBraces); + if ($rDef.valid) { + if ($breakOnError) { + out += ' if (true) { '; + } + } else { + out += ' if ( '; + if ($rDef.valid === undefined) { + out += ' !'; + if ($macro) { + out += '' + ($nextValid); + } else { + out += '' + ($valid); + } + } else { + out += ' ' + (!$rDef.valid) + ' '; + } + out += ') { '; + $errorKeyword = $rule.keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + var def_customError = out; + out = $$outStack.pop(); + if ($inline) { + if ($rDef.errors) { + if ($rDef.errors != 'full') { + out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + ' 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') '; + } + out += ') { '; + $it.schema = $sch; + $it.schemaPath = $schemaPath + it.util.getProperty($property); + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} + +},{}],24:[function(require,module,exports){ +'use strict'; +module.exports = function generate_enum(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $i = 'i' + $lvl, + $vSchema = 'schema' + $lvl; + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ';'; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }'; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to one of the allowed values\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],25:[function(require,module,exports){ +'use strict'; +module.exports = function generate_format(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + if (it.opts.format === false) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $unknownFormats = it.opts.unknownFormats, + $allowUnknown = Array.isArray($unknownFormats); + if ($isData) { + var $format = 'format' + $lvl, + $isObject = 'isObject' + $lvl, + $formatType = 'formatType' + $lvl; + out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { '; + if (it.async) { + out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; '; + } + out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' ('; + if ($unknownFormats != 'ignore') { + out += ' (' + ($schemaValue) + ' && !' + ($format) + ' '; + if ($allowUnknown) { + out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 '; + } + out += ') || '; + } + out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? '; + if (it.async) { + out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) '; + } else { + out += ' ' + ($format) + '(' + ($data) + ') '; + } + out += ' : ' + ($format) + '.test(' + ($data) + '))))) {'; + } else { + var $format = it.formats[$schema]; + if (!$format) { + if ($unknownFormats == 'ignore') { + it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else { + throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); + } + } + var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; + var $formatType = $isObject && $format.type || 'string'; + if ($isObject) { + var $async = $format.async === true; + $format = $format.validate; + } + if ($formatType != $ruleType) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + if ($async) { + if (!it.async) throw new Error('async format in sync schema'); + var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; + out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { '; + } else { + out += ' if (! '; + var $formatRef = 'formats' + it.util.getProperty($schema); + if ($isObject) $formatRef += '.validate'; + if (typeof $format == 'function') { + out += ' ' + ($formatRef) + '(' + ($data) + ') '; + } else { + out += ' ' + ($formatRef) + '.test(' + ($data) + ') '; + } + out += ') { '; + } + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match format "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],26:[function(require,module,exports){ +'use strict'; +module.exports = function generate_if(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + var $thenSch = it.schema['then'], + $elseSch = it.schema['else'], + $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)), + $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)), + $currentBaseId = $it.baseId; + if ($thenPresent || $elsePresent) { + var $ifClause; + $it.createErrors = false; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + $it.createErrors = true; + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + if ($thenPresent) { + out += ' if (' + ($nextValid) + ') { '; + $it.schema = it.schema['then']; + $it.schemaPath = it.schemaPath + '.then'; + $it.errSchemaPath = it.errSchemaPath + '/then'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'then\'; '; + } else { + $ifClause = '\'then\''; + } + out += ' } '; + if ($elsePresent) { + out += ' else { '; + } + } else { + out += ' if (!' + ($nextValid) + ') { '; + } + if ($elsePresent) { + $it.schema = it.schema['else']; + $it.schemaPath = it.schemaPath + '.else'; + $it.errSchemaPath = it.errSchemaPath + '/else'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'else\'; '; + } else { + $ifClause = '\'else\''; + } + out += ' } '; + } + out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} + +},{}],27:[function(require,module,exports){ +'use strict'; + +//all requires must be explicit because browserify won't work with dynamic requires +module.exports = { + '$ref': require('./ref'), + allOf: require('./allOf'), + anyOf: require('./anyOf'), + '$comment': require('./comment'), + const: require('./const'), + contains: require('./contains'), + dependencies: require('./dependencies'), + 'enum': require('./enum'), + format: require('./format'), + 'if': require('./if'), + items: require('./items'), + maximum: require('./_limit'), + minimum: require('./_limit'), + maxItems: require('./_limitItems'), + minItems: require('./_limitItems'), + maxLength: require('./_limitLength'), + minLength: require('./_limitLength'), + maxProperties: require('./_limitProperties'), + minProperties: require('./_limitProperties'), + multipleOf: require('./multipleOf'), + not: require('./not'), + oneOf: require('./oneOf'), + pattern: require('./pattern'), + properties: require('./properties'), + propertyNames: require('./propertyNames'), + required: require('./required'), + uniqueItems: require('./uniqueItems'), + validate: require('./validate') +}; + +},{"./_limit":13,"./_limitItems":14,"./_limitLength":15,"./_limitProperties":16,"./allOf":17,"./anyOf":18,"./comment":19,"./const":20,"./contains":21,"./dependencies":23,"./enum":24,"./format":25,"./if":26,"./items":28,"./multipleOf":29,"./not":30,"./oneOf":31,"./pattern":32,"./properties":33,"./propertyNames":34,"./ref":35,"./required":36,"./uniqueItems":37,"./validate":38}],28:[function(require,module,exports){ +'use strict'; +module.exports = function generate_items(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId; + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if (Array.isArray($schema)) { + var $additionalItems = it.schema.additionalItems; + if ($additionalItems === false) { + out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + $closingBraces += '}'; + out += ' else { '; + } + } + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { '; + var $passData = $data + '[' + $i + ']'; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); + $it.dataPathArr[$dataNxt] = $i; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? (typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0) || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) { + $it.schema = $additionalItems; + $it.schemaPath = it.schemaPath + '.additionalItems'; + $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } else if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' }'; + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} + +},{}],29:[function(require,module,exports){ +'use strict'; +module.exports = function generate_multipleOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + out += 'var division' + ($lvl) + ';if ('; + if ($isData) { + out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || '; + } + out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', '; + if (it.opts.multipleOfPrecision) { + out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' '; + } else { + out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') '; + } + out += ' ) '; + if ($isData) { + out += ' ) '; + } + out += ' ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be multiple of '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],30:[function(require,module,exports){ +'use strict'; +module.exports = function generate_not(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.createErrors = false; + var $allErrorsOption; + if ($it.opts.allErrors) { + $allErrorsOption = $it.opts.allErrors; + $it.opts.allErrors = false; + } + out += ' ' + (it.validate($it)) + ' '; + $it.createErrors = true; + if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (' + ($nextValid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + } else { + out += ' var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if ($breakOnError) { + out += ' if (false) { '; + } + } + return out; +} + +},{}],31:[function(require,module,exports){ +'use strict'; +module.exports = function generate_oneOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $prevValid = 'prevValid' + $lvl, + $passingSchemas = 'passingSchemas' + $lvl; + out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + } else { + out += ' var ' + ($nextValid) + ' = true; '; + } + if ($i) { + out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { '; + $closingBraces += '}'; + } + out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match exactly one schema in oneOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; + if (it.opts.allErrors) { + out += ' } '; + } + return out; +} + +},{}],32:[function(require,module,exports){ +'use strict'; +module.exports = function generate_pattern(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match pattern "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} + +},{}],33:[function(require,module,exports){ +'use strict'; +module.exports = function generate_properties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl; + var $schemaKeys = Object.keys($schema || {}).filter(notProto), + $pProperties = it.schema.patternProperties || {}, + $pPropertyKeys = Object.keys($pProperties).filter(notProto), + $aProperties = it.schema.additionalProperties, + $someProperties = $schemaKeys.length || $pPropertyKeys.length, + $noAdditional = $aProperties === false, + $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, + $removeAdditional = it.opts.removeAdditional, + $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + var $required = it.schema.required; + if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { + var $requiredHash = it.util.toHash($required); + } + + function notProto(p) { + return p !== '__proto__'; + } + out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined;'; + } + if ($checkAdditional) { + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + if ($someProperties) { + out += ' var isAdditional' + ($lvl) + ' = !(false '; + if ($schemaKeys.length) { + if ($schemaKeys.length > 8) { + out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') '; + } else { + var arr1 = $schemaKeys; + if (arr1) { + var $propertyKey, i1 = -1, + l1 = arr1.length - 1; + while (i1 < l1) { + $propertyKey = arr1[i1 += 1]; + out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; + } + } + } + } + if ($pPropertyKeys.length) { + var arr2 = $pPropertyKeys; + if (arr2) { + var $pProperty, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $pProperty = arr2[$i += 1]; + out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; + } + } + } + out += ' ); if (isAdditional' + ($lvl) + ') { '; + } + if ($removeAdditional == 'all') { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + var $currentErrorPath = it.errorPath; + var $additionalProperty = '\' + ' + $key + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + } + if ($noAdditional) { + if ($removeAdditional) { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + out += ' ' + ($nextValid) + ' = false; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalProperties'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is an invalid additional property'; + } else { + out += 'should NOT have additional properties'; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + out += ' break; '; + } + } + } else if ($additionalIsSchema) { + if ($removeAdditional == 'failing') { + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + } else { + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + } + } + it.errorPath = $currentErrorPath; + } + if ($someProperties) { + out += ' } '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + var $useDefaults = it.opts.useDefaults && !it.compositeRule; + if ($schemaKeys.length) { + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + var $prop = it.util.getProperty($propertyKey), + $passData = $data + $prop, + $hasDefault = $useDefaults && $sch.default !== undefined; + $it.schema = $sch; + $it.schemaPath = $schemaPath + $prop; + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); + $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); + $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + $code = it.util.varReplace($code, $nextData, $passData); + var $useData = $passData; + } else { + var $useData = $nextData; + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; + } + if ($hasDefault) { + out += ' ' + ($code) + ' '; + } else { + if ($requiredHash && $requiredHash[$propertyKey]) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = false; '; + var $currentErrorPath = it.errorPath, + $currErrSchemaPath = $errSchemaPath, + $missingProperty = it.util.escapeQuotes($propertyKey); + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + $errSchemaPath = it.errSchemaPath + '/required'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + it.errorPath = $currentErrorPath; + out += ' } else { '; + } else { + if ($breakOnError) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = true; } else { '; + } else { + out += ' if (' + ($useData) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ' ) { '; + } + } + out += ' ' + ($code) + ' } '; + } + } + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($pPropertyKeys.length) { + var arr4 = $pPropertyKeys; + if (arr4) { + var $pProperty, i4 = -1, + l4 = arr4.length - 1; + while (i4 < l4) { + $pProperty = arr4[i4 += 1]; + var $sch = $pProperties[$pProperty]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); + $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else ' + ($nextValid) + ' = true; '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} + +},{}],34:[function(require,module,exports){ +'use strict'; +module.exports = function generate_propertyNames(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + out += 'var ' + ($errs) + ' = errors;'; + if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $i = 'i' + $lvl, + $invalidName = '\' + ' + $key + ' + \'', + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined; '; + } + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' var startErrs' + ($lvl) + ' = errors; '; + var $passData = $key; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + ' 0) || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) { + $required[$required.length] = $property; + } + } + } + } else { + var $required = $schema; + } + } + if ($isData || $required.length) { + var $currentErrorPath = it.errorPath, + $loopRequired = $isData || $required.length >= it.opts.loopRequired, + $ownProperties = it.opts.ownProperties; + if ($breakOnError) { + out += ' var missing' + ($lvl) + '; '; + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + out += ' var ' + ($valid) + ' = true; '; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += '; if (!' + ($valid) + ') break; } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } else { + out += ' if ( '; + var arr2 = $required; + if (arr2) { + var $propertyKey, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $propertyKey = arr2[$i += 1]; + if ($i) { + out += ' || '; + } + var $prop = it.util.getProperty($propertyKey), + $useData = $data + $prop; + out += ' ( ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) '; + } + } + out += ') { '; + var $propertyPath = 'missing' + $lvl, + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } + } else { + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + if ($isData) { + out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { '; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } '; + if ($isData) { + out += ' } '; + } + } else { + var arr3 = $required; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $prop = it.util.getProperty($propertyKey), + $missingProperty = it.util.escapeQuotes($propertyKey), + $useData = $data + $prop; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } '; + } + } + } + } + it.errorPath = $currentErrorPath; + } else if ($breakOnError) { + out += ' if (true) {'; + } + return out; +} + +},{}],37:[function(require,module,exports){ +'use strict'; +module.exports = function generate_uniqueItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (($schema || $isData) && it.opts.uniqueItems !== false) { + if ($isData) { + out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { '; + } + out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { '; + var $itemType = it.schema.items && it.schema.items.type, + $typeIsArray = Array.isArray($itemType); + if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) { + out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } '; + } else { + out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; '; + var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); + out += ' if (' + (it.util[$method]($itemType, 'item', it.opts.strictNumbers, true)) + ') continue; '; + if ($typeIsArray) { + out += ' if (typeof item == \'string\') item = \'"\' + item; '; + } + out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } '; + } + out += ' } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} + +},{}],38:[function(require,module,exports){ +'use strict'; +module.exports = function generate_validate(it, $keyword, $ruleType) { + var out = ''; + var $async = it.schema.$async === true, + $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), + $id = it.self._getId(it.schema); + if (it.opts.strictKeywords) { + var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); + if ($unknownKwd) { + var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; + if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); + else throw new Error($keywordsMsg); + } + } + if (it.isTop) { + out += ' var validate = '; + if ($async) { + it.async = true; + out += 'async '; + } + out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; + if ($id && (it.opts.sourceCode || it.opts.processCode)) { + out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; + } + } + if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { + var $keyword = 'false schema'; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + if (it.schema === false) { + if (it.isTop) { + $breakOnError = true; + } else { + out += ' var ' + ($valid) + ' = false; '; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'boolean schema is false\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } else { + if (it.isTop) { + if ($async) { + out += ' return data; '; + } else { + out += ' validate.errors = null; return true; '; + } + } else { + out += ' var ' + ($valid) + ' = true; '; + } + } + if (it.isTop) { + out += ' }; return validate; '; + } + return out; + } + if (it.isTop) { + var $top = it.isTop, + $lvl = it.level = 0, + $dataLvl = it.dataLevel = 0, + $data = 'data'; + it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); + it.baseId = it.baseId || it.rootId; + delete it.isTop; + it.dataPathArr = [""]; + if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored in the schema root'; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + out += ' var vErrors = null; '; + out += ' var errors = 0; '; + out += ' if (rootData === undefined) rootData = data; '; + } else { + var $lvl = it.level, + $dataLvl = it.dataLevel, + $data = 'data' + ($dataLvl || ''); + if ($id) it.baseId = it.resolve.url(it.baseId, $id); + if ($async && !it.async) throw new Error('async schema in sync schema'); + out += ' var errs_' + ($lvl) + ' = errors;'; + } + var $valid = 'valid' + $lvl, + $breakOnError = !it.opts.allErrors, + $closingBraces1 = '', + $closingBraces2 = ''; + var $errorKeyword; + var $typeSchema = it.schema.type, + $typeIsArray = Array.isArray($typeSchema); + if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { + if ($typeIsArray) { + if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null'); + } else if ($typeSchema != 'null') { + $typeSchema = [$typeSchema, 'null']; + $typeIsArray = true; + } + } + if ($typeIsArray && $typeSchema.length == 1) { + $typeSchema = $typeSchema[0]; + $typeIsArray = false; + } + if (it.schema.$ref && $refKeywords) { + if (it.opts.extendRefs == 'fail') { + throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); + } else if (it.opts.extendRefs !== true) { + $refKeywords = false; + it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); + } + } + if (it.schema.$comment && it.opts.$comment) { + out += ' ' + (it.RULES.all.$comment.code(it, '$comment')); + } + if ($typeSchema) { + if (it.opts.coerceTypes) { + var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); + } + var $rulesGroup = it.RULES.types[$typeSchema]; + if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type', + $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; + out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { '; + if ($coerceToTypes) { + var $dataType = 'dataType' + $lvl, + $coerced = 'coerced' + $lvl; + out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; '; + if (it.opts.coerceTypes == 'array') { + out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } '; + } + out += ' if (' + ($coerced) + ' !== undefined) ; '; + var arr1 = $coerceToTypes; + if (arr1) { + var $type, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $type = arr1[$i += 1]; + if ($type == 'string') { + out += ' else if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; + } else if ($type == 'number' || $type == 'integer') { + out += ' else if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; + if ($type == 'integer') { + out += ' && !(' + ($data) + ' % 1)'; + } + out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; + } else if ($type == 'boolean') { + out += ' else if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; + } else if ($type == 'null') { + out += ' else if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; + } else if (it.opts.coerceTypes == 'array' && $type == 'array') { + out += ' else if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; + } + } + } + out += ' else { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } if (' + ($coerced) + ' !== undefined) { '; + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' ' + ($data) + ' = ' + ($coerced) + '; '; + if (!$dataLvl) { + out += 'if (' + ($parentData) + ' !== undefined)'; + } + out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } + out += ' } '; + } + } + if (it.schema.$ref && !$refKeywords) { + out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; + if ($breakOnError) { + out += ' } if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } else { + var arr2 = it.RULES; + if (arr2) { + var $rulesGroup, i2 = -1, + l2 = arr2.length - 1; + while (i2 < l2) { + $rulesGroup = arr2[i2 += 1]; + if ($shouldUseGroup($rulesGroup)) { + if ($rulesGroup.type) { + out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { '; + } + if (it.opts.useDefaults) { + if ($rulesGroup.type == 'object' && it.schema.properties) { + var $schema = it.schema.properties, + $schemaKeys = Object.keys($schema); + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ($sch.default !== undefined) { + var $passData = $data + it.util.getProperty($propertyKey); + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { + var arr4 = it.schema.items; + if (arr4) { + var $sch, $i = -1, + l4 = arr4.length - 1; + while ($i < l4) { + $sch = arr4[$i += 1]; + if ($sch.default !== undefined) { + var $passData = $data + '[' + $i + ']'; + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } + } + var arr5 = $rulesGroup.rules; + if (arr5) { + var $rule, i5 = -1, + l5 = arr5.length - 1; + while (i5 < l5) { + $rule = arr5[i5 += 1]; + if ($shouldUseRule($rule)) { + var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); + if ($code) { + out += ' ' + ($code) + ' '; + if ($breakOnError) { + $closingBraces1 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces1) + ' '; + $closingBraces1 = ''; + } + if ($rulesGroup.type) { + out += ' } '; + if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { + out += ' else { '; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + } + } + if ($breakOnError) { + out += ' if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces2) + ' '; + } + if ($top) { + if ($async) { + out += ' if (errors === 0) return data; '; + out += ' else throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; '; + out += ' return errors === 0; '; + } + out += ' }; return validate;'; + } else { + out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; + } + + function $shouldUseGroup($rulesGroup) { + var rules = $rulesGroup.rules; + for (var i = 0; i < rules.length; i++) + if ($shouldUseRule(rules[i])) return true; + } + + function $shouldUseRule($rule) { + return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); + } + + function $ruleImplementsSomeKeyword($rule) { + var impl = $rule.implements; + for (var i = 0; i < impl.length; i++) + if (it.schema[impl[i]] !== undefined) return true; + } + return out; +} + +},{}],39:[function(require,module,exports){ +'use strict'; + +var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i; +var customRuleCode = require('./dotjs/custom'); +var definitionSchema = require('./definition_schema'); + +module.exports = { + add: addKeyword, + get: getKeyword, + remove: removeKeyword, + validate: validateKeyword +}; + + +/** + * Define custom keyword + * @this Ajv + * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords). + * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. + * @return {Ajv} this for method chaining + */ +function addKeyword(keyword, definition) { + /* jshint validthis: true */ + /* eslint no-shadow: 0 */ + var RULES = this.RULES; + if (RULES.keywords[keyword]) + throw new Error('Keyword ' + keyword + ' is already defined'); + + if (!IDENTIFIER.test(keyword)) + throw new Error('Keyword ' + keyword + ' is not a valid identifier'); + + if (definition) { + this.validateKeyword(definition, true); + + var dataType = definition.type; + if (Array.isArray(dataType)) { + for (var i=0; i 1) { + sets[0] = sets[0].slice(0, -1); + var xl = sets.length - 1; + for (var x = 1; x < xl; ++x) { + sets[x] = sets[x].slice(1, -1); + } + sets[xl] = sets[xl].slice(1); + return sets.join(''); + } else { + return sets[0]; + } +} +function subexp(str) { + return "(?:" + str + ")"; +} +function typeOf(o) { + return o === undefined ? "undefined" : o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase(); +} +function toUpperCase(str) { + return str.toUpperCase(); +} +function toArray(obj) { + return obj !== undefined && obj !== null ? obj instanceof Array ? obj : typeof obj.length !== "number" || obj.split || obj.setInterval || obj.call ? [obj] : Array.prototype.slice.call(obj) : []; +} +function assign(target, source) { + var obj = target; + if (source) { + for (var key in source) { + obj[key] = source[key]; + } + } + return obj; +} + +function buildExps(isIRI) { + var ALPHA$$ = "[A-Za-z]", + CR$ = "[\\x0D]", + DIGIT$$ = "[0-9]", + DQUOTE$$ = "[\\x22]", + HEXDIG$$ = merge(DIGIT$$, "[A-Fa-f]"), + //case-insensitive + LF$$ = "[\\x0A]", + SP$$ = "[\\x20]", + PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)), + //expanded + GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", + SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", + RESERVED$$ = merge(GEN_DELIMS$$, SUB_DELIMS$$), + UCSCHAR$$ = isIRI ? "[\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]" : "[]", + //subset, excludes bidi control characters + IPRIVATE$$ = isIRI ? "[\\uE000-\\uF8FF]" : "[]", + //subset + UNRESERVED$$ = merge(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]", UCSCHAR$$), + SCHEME$ = subexp(ALPHA$$ + merge(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), + USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), + DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), + DEC_OCTET_RELAXED$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("0?[1-9]" + DIGIT$$) + "|0?0?" + DIGIT$$), + //relaxed parsing rules + IPV4ADDRESS$ = subexp(DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$ + "\\." + DEC_OCTET_RELAXED$), + H16$ = subexp(HEXDIG$$ + "{1,4}"), + LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), + IPV6ADDRESS1$ = subexp(subexp(H16$ + "\\:") + "{6}" + LS32$), + // 6( h16 ":" ) ls32 + IPV6ADDRESS2$ = subexp("\\:\\:" + subexp(H16$ + "\\:") + "{5}" + LS32$), + // "::" 5( h16 ":" ) ls32 + IPV6ADDRESS3$ = subexp(subexp(H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{4}" + LS32$), + //[ h16 ] "::" 4( h16 ":" ) ls32 + IPV6ADDRESS4$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,1}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{3}" + LS32$), + //[ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 + IPV6ADDRESS5$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,2}" + H16$) + "?\\:\\:" + subexp(H16$ + "\\:") + "{2}" + LS32$), + //[ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 + IPV6ADDRESS6$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,3}" + H16$) + "?\\:\\:" + H16$ + "\\:" + LS32$), + //[ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 + IPV6ADDRESS7$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,4}" + H16$) + "?\\:\\:" + LS32$), + //[ *4( h16 ":" ) h16 ] "::" ls32 + IPV6ADDRESS8$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,5}" + H16$) + "?\\:\\:" + H16$), + //[ *5( h16 ":" ) h16 ] "::" h16 + IPV6ADDRESS9$ = subexp(subexp(subexp(H16$ + "\\:") + "{0,6}" + H16$) + "?\\:\\:"), + //[ *6( h16 ":" ) h16 ] "::" + IPV6ADDRESS$ = subexp([IPV6ADDRESS1$, IPV6ADDRESS2$, IPV6ADDRESS3$, IPV6ADDRESS4$, IPV6ADDRESS5$, IPV6ADDRESS6$, IPV6ADDRESS7$, IPV6ADDRESS8$, IPV6ADDRESS9$].join("|")), + ZONEID$ = subexp(subexp(UNRESERVED$$ + "|" + PCT_ENCODED$) + "+"), + //RFC 6874 + IPV6ADDRZ$ = subexp(IPV6ADDRESS$ + "\\%25" + ZONEID$), + //RFC 6874 + IPV6ADDRZ_RELAXED$ = subexp(IPV6ADDRESS$ + subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + ZONEID$), + //RFC 6874, with relaxed parsing rules + IPVFUTURE$ = subexp("[vV]" + HEXDIG$$ + "+\\." + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), + IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRZ_RELAXED$ + "|" + IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), + //RFC 6874 + REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$)) + "*"), + HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "(?!" + REG_NAME$ + ")" + "|" + REG_NAME$), + PORT$ = subexp(DIGIT$$ + "*"), + AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), + PCHAR$ = subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), + SEGMENT$ = subexp(PCHAR$ + "*"), + SEGMENT_NZ$ = subexp(PCHAR$ + "+"), + SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + merge(UNRESERVED$$, SUB_DELIMS$$, "[\\@]")) + "+"), + PATH_ABEMPTY$ = subexp(subexp("\\/" + SEGMENT$) + "*"), + PATH_ABSOLUTE$ = subexp("\\/" + subexp(SEGMENT_NZ$ + PATH_ABEMPTY$) + "?"), + //simplified + PATH_NOSCHEME$ = subexp(SEGMENT_NZ_NC$ + PATH_ABEMPTY$), + //simplified + PATH_ROOTLESS$ = subexp(SEGMENT_NZ$ + PATH_ABEMPTY$), + //simplified + PATH_EMPTY$ = "(?!" + PCHAR$ + ")", + PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + QUERY$ = subexp(subexp(PCHAR$ + "|" + merge("[\\/\\?]", IPRIVATE$$)) + "*"), + FRAGMENT$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), + HIER_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + RELATIVE_PART$ = subexp(subexp("\\/\\/" + AUTHORITY$ + PATH_ABEMPTY$) + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$), + RELATIVE$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE$), + ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), + GENERIC_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + RELATIVE_REF$ = "^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + ABSOLUTE_REF$ = "^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$", + SAMEDOC_REF$ = "^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$", + AUTHORITY_REF$ = "^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$"; + return { + NOT_SCHEME: new RegExp(merge("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), + NOT_USERINFO: new RegExp(merge("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_HOST: new RegExp(merge("[^\\%\\[\\]\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH: new RegExp(merge("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH_NOSCHEME: new RegExp(merge("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_QUERY: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]", IPRIVATE$$), "g"), + NOT_FRAGMENT: new RegExp(merge("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), + ESCAPE: new RegExp(merge("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"), + UNRESERVED: new RegExp(UNRESERVED$$, "g"), + OTHER_CHARS: new RegExp(merge("[^\\%]", UNRESERVED$$, RESERVED$$), "g"), + PCT_ENCODED: new RegExp(PCT_ENCODED$, "g"), + IPV4ADDRESS: new RegExp("^(" + IPV4ADDRESS$ + ")$"), + IPV6ADDRESS: new RegExp("^\\[?(" + IPV6ADDRESS$ + ")" + subexp(subexp("\\%25|\\%(?!" + HEXDIG$$ + "{2})") + "(" + ZONEID$ + ")") + "?\\]?$") //RFC 6874, with relaxed parsing rules + }; +} +var URI_PROTOCOL = buildExps(false); + +var IRI_PROTOCOL = buildExps(true); + +var slicedToArray = function () { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; +}(); + + + + + + + + + + + + + +var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } +}; + +/** Highest positive signed 32-bit float value */ + +var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 + +/** Bootstring parameters */ +var base = 36; +var tMin = 1; +var tMax = 26; +var skew = 38; +var damp = 700; +var initialBias = 72; +var initialN = 128; // 0x80 +var delimiter = '-'; // '\x2D' + +/** Regular expressions */ +var regexPunycode = /^xn--/; +var regexNonASCII = /[^\0-\x7E]/; // non-ASCII chars +var regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g; // RFC 3490 separators + +/** Error messages */ +var errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' +}; + +/** Convenience shortcuts */ +var baseMinusTMin = base - tMin; +var floor = Math.floor; +var stringFromCharCode = String.fromCharCode; + +/*--------------------------------------------------------------------------*/ + +/** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ +function error$1(type) { + throw new RangeError(errors[type]); +} + +/** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ +function map(array, fn) { + var result = []; + var length = array.length; + while (length--) { + result[length] = fn(array[length]); + } + return result; +} + +/** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ +function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + // Avoid `split(regex)` for IE8 compatibility. See #17. + string = string.replace(regexSeparators, '\x2E'); + var labels = string.split('.'); + var encoded = map(labels, fn).join('.'); + return result + encoded; +} + +/** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ +function ucs2decode(string) { + var output = []; + var counter = 0; + var length = string.length; + while (counter < length) { + var value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // It's a high surrogate, and there is a next character. + var extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { + // Low surrogate. + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // It's an unmatched surrogate; only append this code unit, in case the + // next code unit is the high surrogate of a surrogate pair. + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; +} + +/** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ +var ucs2encode = function ucs2encode(array) { + return String.fromCodePoint.apply(String, toConsumableArray(array)); +}; + +/** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ +var basicToDigit = function basicToDigit(codePoint) { + if (codePoint - 0x30 < 0x0A) { + return codePoint - 0x16; + } + if (codePoint - 0x41 < 0x1A) { + return codePoint - 0x41; + } + if (codePoint - 0x61 < 0x1A) { + return codePoint - 0x61; + } + return base; +}; + +/** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ +var digitToBasic = function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); +}; + +/** + * Bias adaptation function as per section 3.4 of RFC 3492. + * https://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ +var adapt = function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (; /* no initialization */delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); +}; + +/** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ +var decode = function decode(input) { + // Don't use UCS-2. + var output = []; + var inputLength = input.length; + var i = 0; + var n = initialN; + var bias = initialBias; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + var basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (var j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error$1('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (var index = basic > 0 ? basic + 1 : 0; index < inputLength;) /* no final expression */{ + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + var oldi = i; + for (var w = 1, k = base;; /* no condition */k += base) { + + if (index >= inputLength) { + error$1('invalid-input'); + } + + var digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error$1('overflow'); + } + + i += digit * w; + var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + + if (digit < t) { + break; + } + + var baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error$1('overflow'); + } + + w *= baseMinusT; + } + + var out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error$1('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output. + output.splice(i++, 0, n); + } + + return String.fromCodePoint.apply(String, output); +}; + +/** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ +var encode = function encode(input) { + var output = []; + + // Convert the input in UCS-2 to an array of Unicode code points. + input = ucs2decode(input); + + // Cache the length. + var inputLength = input.length; + + // Initialize the state. + var n = initialN; + var delta = 0; + var bias = initialBias; + + // Handle the basic code points. + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = input[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var _currentValue2 = _step.value; + + if (_currentValue2 < 0x80) { + output.push(stringFromCharCode(_currentValue2)); + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + var basicLength = output.length; + var handledCPCount = basicLength; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string with a delimiter unless it's empty. + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + var m = maxInt; + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + var currentValue = _step2.value; + + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow. + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + + var handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error$1('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + var _iteratorNormalCompletion3 = true; + var _didIteratorError3 = false; + var _iteratorError3 = undefined; + + try { + for (var _iterator3 = input[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { + var _currentValue = _step3.value; + + if (_currentValue < n && ++delta > maxInt) { + error$1('overflow'); + } + if (_currentValue == n) { + // Represent delta as a generalized variable-length integer. + var q = delta; + for (var k = base;; /* no condition */k += base) { + var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; + if (q < t) { + break; + } + var qMinusT = q - t; + var baseMinusT = base - t; + output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + } catch (err) { + _didIteratorError3 = true; + _iteratorError3 = err; + } finally { + try { + if (!_iteratorNormalCompletion3 && _iterator3.return) { + _iterator3.return(); + } + } finally { + if (_didIteratorError3) { + throw _iteratorError3; + } + } + } + + ++delta; + ++n; + } + return output.join(''); +}; + +/** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ +var toUnicode = function toUnicode(input) { + return mapDomain(input, function (string) { + return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string; + }); +}; + +/** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ +var toASCII = function toASCII(input) { + return mapDomain(input, function (string) { + return regexNonASCII.test(string) ? 'xn--' + encode(string) : string; + }); +}; + +/*--------------------------------------------------------------------------*/ + +/** Define the public API */ +var punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '2.1.0', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode +}; + +/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @see http://github.com/garycourt/uri-js + */ +/** + * Copyright 2011 Gary Court. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gary Court. + */ +var SCHEMES = {}; +function pctEncChar(chr) { + var c = chr.charCodeAt(0); + var e = void 0; + if (c < 16) e = "%0" + c.toString(16).toUpperCase();else if (c < 128) e = "%" + c.toString(16).toUpperCase();else if (c < 2048) e = "%" + (c >> 6 | 192).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase();else e = "%" + (c >> 12 | 224).toString(16).toUpperCase() + "%" + (c >> 6 & 63 | 128).toString(16).toUpperCase() + "%" + (c & 63 | 128).toString(16).toUpperCase(); + return e; +} +function pctDecChars(str) { + var newStr = ""; + var i = 0; + var il = str.length; + while (i < il) { + var c = parseInt(str.substr(i + 1, 2), 16); + if (c < 128) { + newStr += String.fromCharCode(c); + i += 3; + } else if (c >= 194 && c < 224) { + if (il - i >= 6) { + var c2 = parseInt(str.substr(i + 4, 2), 16); + newStr += String.fromCharCode((c & 31) << 6 | c2 & 63); + } else { + newStr += str.substr(i, 6); + } + i += 6; + } else if (c >= 224) { + if (il - i >= 9) { + var _c = parseInt(str.substr(i + 4, 2), 16); + var c3 = parseInt(str.substr(i + 7, 2), 16); + newStr += String.fromCharCode((c & 15) << 12 | (_c & 63) << 6 | c3 & 63); + } else { + newStr += str.substr(i, 9); + } + i += 9; + } else { + newStr += str.substr(i, 3); + i += 3; + } + } + return newStr; +} +function _normalizeComponentEncoding(components, protocol) { + function decodeUnreserved(str) { + var decStr = pctDecChars(str); + return !decStr.match(protocol.UNRESERVED) ? str : decStr; + } + if (components.scheme) components.scheme = String(components.scheme).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_SCHEME, ""); + if (components.userinfo !== undefined) components.userinfo = String(components.userinfo).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_USERINFO, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.host !== undefined) components.host = String(components.host).replace(protocol.PCT_ENCODED, decodeUnreserved).toLowerCase().replace(protocol.NOT_HOST, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.path !== undefined) components.path = String(components.path).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(components.scheme ? protocol.NOT_PATH : protocol.NOT_PATH_NOSCHEME, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.query !== undefined) components.query = String(components.query).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_QUERY, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + if (components.fragment !== undefined) components.fragment = String(components.fragment).replace(protocol.PCT_ENCODED, decodeUnreserved).replace(protocol.NOT_FRAGMENT, pctEncChar).replace(protocol.PCT_ENCODED, toUpperCase); + return components; +} + +function _stripLeadingZeros(str) { + return str.replace(/^0*(.*)/, "$1") || "0"; +} +function _normalizeIPv4(host, protocol) { + var matches = host.match(protocol.IPV4ADDRESS) || []; + + var _matches = slicedToArray(matches, 2), + address = _matches[1]; + + if (address) { + return address.split(".").map(_stripLeadingZeros).join("."); + } else { + return host; + } +} +function _normalizeIPv6(host, protocol) { + var matches = host.match(protocol.IPV6ADDRESS) || []; + + var _matches2 = slicedToArray(matches, 3), + address = _matches2[1], + zone = _matches2[2]; + + if (address) { + var _address$toLowerCase$ = address.toLowerCase().split('::').reverse(), + _address$toLowerCase$2 = slicedToArray(_address$toLowerCase$, 2), + last = _address$toLowerCase$2[0], + first = _address$toLowerCase$2[1]; + + var firstFields = first ? first.split(":").map(_stripLeadingZeros) : []; + var lastFields = last.split(":").map(_stripLeadingZeros); + var isLastFieldIPv4Address = protocol.IPV4ADDRESS.test(lastFields[lastFields.length - 1]); + var fieldCount = isLastFieldIPv4Address ? 7 : 8; + var lastFieldsStart = lastFields.length - fieldCount; + var fields = Array(fieldCount); + for (var x = 0; x < fieldCount; ++x) { + fields[x] = firstFields[x] || lastFields[lastFieldsStart + x] || ''; + } + if (isLastFieldIPv4Address) { + fields[fieldCount - 1] = _normalizeIPv4(fields[fieldCount - 1], protocol); + } + var allZeroFields = fields.reduce(function (acc, field, index) { + if (!field || field === "0") { + var lastLongest = acc[acc.length - 1]; + if (lastLongest && lastLongest.index + lastLongest.length === index) { + lastLongest.length++; + } else { + acc.push({ index: index, length: 1 }); + } + } + return acc; + }, []); + var longestZeroFields = allZeroFields.sort(function (a, b) { + return b.length - a.length; + })[0]; + var newHost = void 0; + if (longestZeroFields && longestZeroFields.length > 1) { + var newFirst = fields.slice(0, longestZeroFields.index); + var newLast = fields.slice(longestZeroFields.index + longestZeroFields.length); + newHost = newFirst.join(":") + "::" + newLast.join(":"); + } else { + newHost = fields.join(":"); + } + if (zone) { + newHost += "%" + zone; + } + return newHost; + } else { + return host; + } +} +var URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?(\[[^\/?#\]]+\]|[^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#((?:.|\n|\r)*))?/i; +var NO_MATCH_IS_UNDEFINED = "".match(/(){0}/)[1] === undefined; +function parse(uriString) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var components = {}; + var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; + if (options.reference === "suffix") uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; + var matches = uriString.match(URI_PARSE); + if (matches) { + if (NO_MATCH_IS_UNDEFINED) { + //store each component + components.scheme = matches[1]; + components.userinfo = matches[3]; + components.host = matches[4]; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = matches[7]; + components.fragment = matches[8]; + //fix port number + if (isNaN(components.port)) { + components.port = matches[5]; + } + } else { + //IE FIX for improper RegExp matching + //store each component + components.scheme = matches[1] || undefined; + components.userinfo = uriString.indexOf("@") !== -1 ? matches[3] : undefined; + components.host = uriString.indexOf("//") !== -1 ? matches[4] : undefined; + components.port = parseInt(matches[5], 10); + components.path = matches[6] || ""; + components.query = uriString.indexOf("?") !== -1 ? matches[7] : undefined; + components.fragment = uriString.indexOf("#") !== -1 ? matches[8] : undefined; + //fix port number + if (isNaN(components.port)) { + components.port = uriString.match(/\/\/(?:.|\n)*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined; + } + } + if (components.host) { + //normalize IP hosts + components.host = _normalizeIPv6(_normalizeIPv4(components.host, protocol), protocol); + } + //determine reference type + if (components.scheme === undefined && components.userinfo === undefined && components.host === undefined && components.port === undefined && !components.path && components.query === undefined) { + components.reference = "same-document"; + } else if (components.scheme === undefined) { + components.reference = "relative"; + } else if (components.fragment === undefined) { + components.reference = "absolute"; + } else { + components.reference = "uri"; + } + //check for reference errors + if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { + components.error = components.error || "URI is not a " + options.reference + " reference."; + } + //find scheme handler + var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //check if scheme can't handle IRIs + if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) { + //if host component is a domain name + if (components.host && (options.domainHost || schemeHandler && schemeHandler.domainHost)) { + //convert Unicode IDN -> ASCII IDN + try { + components.host = punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to ASCII via punycode: " + e; + } + } + //convert IRI -> URI + _normalizeComponentEncoding(components, URI_PROTOCOL); + } else { + //normalize encodings + _normalizeComponentEncoding(components, protocol); + } + //perform scheme specific parsing + if (schemeHandler && schemeHandler.parse) { + schemeHandler.parse(components, options); + } + } else { + components.error = components.error || "URI can not be parsed."; + } + return components; +} + +function _recomposeAuthority(components, options) { + var protocol = options.iri !== false ? IRI_PROTOCOL : URI_PROTOCOL; + var uriTokens = []; + if (components.userinfo !== undefined) { + uriTokens.push(components.userinfo); + uriTokens.push("@"); + } + if (components.host !== undefined) { + //normalize IP hosts, add brackets and escape zone separator for IPv6 + uriTokens.push(_normalizeIPv6(_normalizeIPv4(String(components.host), protocol), protocol).replace(protocol.IPV6ADDRESS, function (_, $1, $2) { + return "[" + $1 + ($2 ? "%25" + $2 : "") + "]"; + })); + } + if (typeof components.port === "number" || typeof components.port === "string") { + uriTokens.push(":"); + uriTokens.push(String(components.port)); + } + return uriTokens.length ? uriTokens.join("") : undefined; +} + +var RDS1 = /^\.\.?\//; +var RDS2 = /^\/\.(\/|$)/; +var RDS3 = /^\/\.\.(\/|$)/; +var RDS5 = /^\/?(?:.|\n)*?(?=\/|$)/; +function removeDotSegments(input) { + var output = []; + while (input.length) { + if (input.match(RDS1)) { + input = input.replace(RDS1, ""); + } else if (input.match(RDS2)) { + input = input.replace(RDS2, "/"); + } else if (input.match(RDS3)) { + input = input.replace(RDS3, "/"); + output.pop(); + } else if (input === "." || input === "..") { + input = ""; + } else { + var im = input.match(RDS5); + if (im) { + var s = im[0]; + input = input.slice(s.length); + output.push(s); + } else { + throw new Error("Unexpected dot segment condition"); + } + } + } + return output.join(""); +} + +function serialize(components) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var protocol = options.iri ? IRI_PROTOCOL : URI_PROTOCOL; + var uriTokens = []; + //find scheme handler + var schemeHandler = SCHEMES[(options.scheme || components.scheme || "").toLowerCase()]; + //perform scheme specific serialization + if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(components, options); + if (components.host) { + //if host component is an IPv6 address + if (protocol.IPV6ADDRESS.test(components.host)) {} + //TODO: normalize IPv6 address as per RFC 5952 + + //if host component is a domain name + else if (options.domainHost || schemeHandler && schemeHandler.domainHost) { + //convert IDN via punycode + try { + components.host = !options.iri ? punycode.toASCII(components.host.replace(protocol.PCT_ENCODED, pctDecChars).toLowerCase()) : punycode.toUnicode(components.host); + } catch (e) { + components.error = components.error || "Host's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + } + } + //normalize encoding + _normalizeComponentEncoding(components, protocol); + if (options.reference !== "suffix" && components.scheme) { + uriTokens.push(components.scheme); + uriTokens.push(":"); + } + var authority = _recomposeAuthority(components, options); + if (authority !== undefined) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + uriTokens.push(authority); + if (components.path && components.path.charAt(0) !== "/") { + uriTokens.push("/"); + } + } + if (components.path !== undefined) { + var s = components.path; + if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) { + s = removeDotSegments(s); + } + if (authority === undefined) { + s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//" + } + uriTokens.push(s); + } + if (components.query !== undefined) { + uriTokens.push("?"); + uriTokens.push(components.query); + } + if (components.fragment !== undefined) { + uriTokens.push("#"); + uriTokens.push(components.fragment); + } + return uriTokens.join(""); //merge tokens into a string +} + +function resolveComponents(base, relative) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var skipNormalization = arguments[3]; + + var target = {}; + if (!skipNormalization) { + base = parse(serialize(base, options), options); //normalize base components + relative = parse(serialize(relative, options), options); //normalize relative components + } + options = options || {}; + if (!options.tolerant && relative.scheme) { + target.scheme = relative.scheme; + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) { + //target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = removeDotSegments(relative.path || ""); + target.query = relative.query; + } else { + if (!relative.path) { + target.path = base.path; + if (relative.query !== undefined) { + target.query = relative.query; + } else { + target.query = base.query; + } + } else { + if (relative.path.charAt(0) === "/") { + target.path = removeDotSegments(relative.path); + } else { + if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) { + target.path = "/" + relative.path; + } else if (!base.path) { + target.path = relative.path; + } else { + target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path; + } + target.path = removeDotSegments(target.path); + } + target.query = relative.query; + } + //target.authority = base.authority; + target.userinfo = base.userinfo; + target.host = base.host; + target.port = base.port; + } + target.scheme = base.scheme; + } + target.fragment = relative.fragment; + return target; +} + +function resolve(baseURI, relativeURI, options) { + var schemelessOptions = assign({ scheme: 'null' }, options); + return serialize(resolveComponents(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true), schemelessOptions); +} + +function normalize(uri, options) { + if (typeof uri === "string") { + uri = serialize(parse(uri, options), options); + } else if (typeOf(uri) === "object") { + uri = parse(serialize(uri, options), options); + } + return uri; +} + +function equal(uriA, uriB, options) { + if (typeof uriA === "string") { + uriA = serialize(parse(uriA, options), options); + } else if (typeOf(uriA) === "object") { + uriA = serialize(uriA, options); + } + if (typeof uriB === "string") { + uriB = serialize(parse(uriB, options), options); + } else if (typeOf(uriB) === "object") { + uriB = serialize(uriB, options); + } + return uriA === uriB; +} + +function escapeComponent(str, options) { + return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.ESCAPE : IRI_PROTOCOL.ESCAPE, pctEncChar); +} + +function unescapeComponent(str, options) { + return str && str.toString().replace(!options || !options.iri ? URI_PROTOCOL.PCT_ENCODED : IRI_PROTOCOL.PCT_ENCODED, pctDecChars); +} + +var handler = { + scheme: "http", + domainHost: true, + parse: function parse(components, options) { + //report missing host + if (!components.host) { + components.error = components.error || "HTTP URIs must have a host."; + } + return components; + }, + serialize: function serialize(components, options) { + var secure = String(components.scheme).toLowerCase() === "https"; + //normalize the default port + if (components.port === (secure ? 443 : 80) || components.port === "") { + components.port = undefined; + } + //normalize the empty path + if (!components.path) { + components.path = "/"; + } + //NOTE: We do not parse query strings for HTTP URIs + //as WWW Form Url Encoded query strings are part of the HTML4+ spec, + //and not the HTTP spec. + return components; + } +}; + +var handler$1 = { + scheme: "https", + domainHost: handler.domainHost, + parse: handler.parse, + serialize: handler.serialize +}; + +function isSecure(wsComponents) { + return typeof wsComponents.secure === 'boolean' ? wsComponents.secure : String(wsComponents.scheme).toLowerCase() === "wss"; +} +//RFC 6455 +var handler$2 = { + scheme: "ws", + domainHost: true, + parse: function parse(components, options) { + var wsComponents = components; + //indicate if the secure flag is set + wsComponents.secure = isSecure(wsComponents); + //construct resouce name + wsComponents.resourceName = (wsComponents.path || '/') + (wsComponents.query ? '?' + wsComponents.query : ''); + wsComponents.path = undefined; + wsComponents.query = undefined; + return wsComponents; + }, + serialize: function serialize(wsComponents, options) { + //normalize the default port + if (wsComponents.port === (isSecure(wsComponents) ? 443 : 80) || wsComponents.port === "") { + wsComponents.port = undefined; + } + //ensure scheme matches secure flag + if (typeof wsComponents.secure === 'boolean') { + wsComponents.scheme = wsComponents.secure ? 'wss' : 'ws'; + wsComponents.secure = undefined; + } + //reconstruct path from resource name + if (wsComponents.resourceName) { + var _wsComponents$resourc = wsComponents.resourceName.split('?'), + _wsComponents$resourc2 = slicedToArray(_wsComponents$resourc, 2), + path = _wsComponents$resourc2[0], + query = _wsComponents$resourc2[1]; + + wsComponents.path = path && path !== '/' ? path : undefined; + wsComponents.query = query; + wsComponents.resourceName = undefined; + } + //forbid fragment component + wsComponents.fragment = undefined; + return wsComponents; + } +}; + +var handler$3 = { + scheme: "wss", + domainHost: handler$2.domainHost, + parse: handler$2.parse, + serialize: handler$2.serialize +}; + +var O = {}; +var isIRI = true; +//RFC 3986 +var UNRESERVED$$ = "[A-Za-z0-9\\-\\.\\_\\~" + (isIRI ? "\\xA0-\\u200D\\u2010-\\u2029\\u202F-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF" : "") + "]"; +var HEXDIG$$ = "[0-9A-Fa-f]"; //case-insensitive +var PCT_ENCODED$ = subexp(subexp("%[EFef]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%[89A-Fa-f]" + HEXDIG$$ + "%" + HEXDIG$$ + HEXDIG$$) + "|" + subexp("%" + HEXDIG$$ + HEXDIG$$)); //expanded +//RFC 5322, except these symbols as per RFC 6068: @ : / ? # [ ] & ; = +//const ATEXT$$ = "[A-Za-z0-9\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QTEXT$$ = "[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]"; //(%d1-8 / %d11-12 / %d14-31 / %d127) +//const QTEXT$$ = merge("[\\x21\\x23-\\x5B\\x5D-\\x7E]", OBS_QTEXT$$); //%d33 / %d35-91 / %d93-126 / obs-qtext +//const VCHAR$$ = "[\\x21-\\x7E]"; +//const WSP$$ = "[\\x20\\x09]"; +//const OBS_QP$ = subexp("\\\\" + merge("[\\x00\\x0D\\x0A]", OBS_QTEXT$$)); //%d0 / CR / LF / obs-qtext +//const FWS$ = subexp(subexp(WSP$$ + "*" + "\\x0D\\x0A") + "?" + WSP$$ + "+"); +//const QUOTED_PAIR$ = subexp(subexp("\\\\" + subexp(VCHAR$$ + "|" + WSP$$)) + "|" + OBS_QP$); +//const QUOTED_STRING$ = subexp('\\"' + subexp(FWS$ + "?" + QCONTENT$) + "*" + FWS$ + "?" + '\\"'); +var ATEXT$$ = "[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]"; +var QTEXT$$ = "[\\!\\$\\%\\'\\(\\)\\*\\+\\,\\-\\.0-9\\<\\>A-Z\\x5E-\\x7E]"; +var VCHAR$$ = merge(QTEXT$$, "[\\\"\\\\]"); +var SOME_DELIMS$$ = "[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"; +var UNRESERVED = new RegExp(UNRESERVED$$, "g"); +var PCT_ENCODED = new RegExp(PCT_ENCODED$, "g"); +var NOT_LOCAL_PART = new RegExp(merge("[^]", ATEXT$$, "[\\.]", '[\\"]', VCHAR$$), "g"); +var NOT_HFNAME = new RegExp(merge("[^]", UNRESERVED$$, SOME_DELIMS$$), "g"); +var NOT_HFVALUE = NOT_HFNAME; +function decodeUnreserved(str) { + var decStr = pctDecChars(str); + return !decStr.match(UNRESERVED) ? str : decStr; +} +var handler$4 = { + scheme: "mailto", + parse: function parse$$1(components, options) { + var mailtoComponents = components; + var to = mailtoComponents.to = mailtoComponents.path ? mailtoComponents.path.split(",") : []; + mailtoComponents.path = undefined; + if (mailtoComponents.query) { + var unknownHeaders = false; + var headers = {}; + var hfields = mailtoComponents.query.split("&"); + for (var x = 0, xl = hfields.length; x < xl; ++x) { + var hfield = hfields[x].split("="); + switch (hfield[0]) { + case "to": + var toAddrs = hfield[1].split(","); + for (var _x = 0, _xl = toAddrs.length; _x < _xl; ++_x) { + to.push(toAddrs[_x]); + } + break; + case "subject": + mailtoComponents.subject = unescapeComponent(hfield[1], options); + break; + case "body": + mailtoComponents.body = unescapeComponent(hfield[1], options); + break; + default: + unknownHeaders = true; + headers[unescapeComponent(hfield[0], options)] = unescapeComponent(hfield[1], options); + break; + } + } + if (unknownHeaders) mailtoComponents.headers = headers; + } + mailtoComponents.query = undefined; + for (var _x2 = 0, _xl2 = to.length; _x2 < _xl2; ++_x2) { + var addr = to[_x2].split("@"); + addr[0] = unescapeComponent(addr[0]); + if (!options.unicodeSupport) { + //convert Unicode IDN -> ASCII IDN + try { + addr[1] = punycode.toASCII(unescapeComponent(addr[1], options).toLowerCase()); + } catch (e) { + mailtoComponents.error = mailtoComponents.error || "Email address's domain name can not be converted to ASCII via punycode: " + e; + } + } else { + addr[1] = unescapeComponent(addr[1], options).toLowerCase(); + } + to[_x2] = addr.join("@"); + } + return mailtoComponents; + }, + serialize: function serialize$$1(mailtoComponents, options) { + var components = mailtoComponents; + var to = toArray(mailtoComponents.to); + if (to) { + for (var x = 0, xl = to.length; x < xl; ++x) { + var toAddr = String(to[x]); + var atIdx = toAddr.lastIndexOf("@"); + var localPart = toAddr.slice(0, atIdx).replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_LOCAL_PART, pctEncChar); + var domain = toAddr.slice(atIdx + 1); + //convert IDN via punycode + try { + domain = !options.iri ? punycode.toASCII(unescapeComponent(domain, options).toLowerCase()) : punycode.toUnicode(domain); + } catch (e) { + components.error = components.error || "Email address's domain name can not be converted to " + (!options.iri ? "ASCII" : "Unicode") + " via punycode: " + e; + } + to[x] = localPart + "@" + domain; + } + components.path = to.join(","); + } + var headers = mailtoComponents.headers = mailtoComponents.headers || {}; + if (mailtoComponents.subject) headers["subject"] = mailtoComponents.subject; + if (mailtoComponents.body) headers["body"] = mailtoComponents.body; + var fields = []; + for (var name in headers) { + if (headers[name] !== O[name]) { + fields.push(name.replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFNAME, pctEncChar) + "=" + headers[name].replace(PCT_ENCODED, decodeUnreserved).replace(PCT_ENCODED, toUpperCase).replace(NOT_HFVALUE, pctEncChar)); + } + } + if (fields.length) { + components.query = fields.join("&"); + } + return components; + } +}; + +var URN_PARSE = /^([^\:]+)\:(.*)/; +//RFC 2141 +var handler$5 = { + scheme: "urn", + parse: function parse$$1(components, options) { + var matches = components.path && components.path.match(URN_PARSE); + var urnComponents = components; + if (matches) { + var scheme = options.scheme || urnComponents.scheme || "urn"; + var nid = matches[1].toLowerCase(); + var nss = matches[2]; + var urnScheme = scheme + ":" + (options.nid || nid); + var schemeHandler = SCHEMES[urnScheme]; + urnComponents.nid = nid; + urnComponents.nss = nss; + urnComponents.path = undefined; + if (schemeHandler) { + urnComponents = schemeHandler.parse(urnComponents, options); + } + } else { + urnComponents.error = urnComponents.error || "URN can not be parsed."; + } + return urnComponents; + }, + serialize: function serialize$$1(urnComponents, options) { + var scheme = options.scheme || urnComponents.scheme || "urn"; + var nid = urnComponents.nid; + var urnScheme = scheme + ":" + (options.nid || nid); + var schemeHandler = SCHEMES[urnScheme]; + if (schemeHandler) { + urnComponents = schemeHandler.serialize(urnComponents, options); + } + var uriComponents = urnComponents; + var nss = urnComponents.nss; + uriComponents.path = (nid || options.nid) + ":" + nss; + return uriComponents; + } +}; + +var UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; +//RFC 4122 +var handler$6 = { + scheme: "urn:uuid", + parse: function parse(urnComponents, options) { + var uuidComponents = urnComponents; + uuidComponents.uuid = uuidComponents.nss; + uuidComponents.nss = undefined; + if (!options.tolerant && (!uuidComponents.uuid || !uuidComponents.uuid.match(UUID))) { + uuidComponents.error = uuidComponents.error || "UUID is not valid."; + } + return uuidComponents; + }, + serialize: function serialize(uuidComponents, options) { + var urnComponents = uuidComponents; + //normalize UUID + urnComponents.nss = (uuidComponents.uuid || "").toLowerCase(); + return urnComponents; + } +}; + +SCHEMES[handler.scheme] = handler; +SCHEMES[handler$1.scheme] = handler$1; +SCHEMES[handler$2.scheme] = handler$2; +SCHEMES[handler$3.scheme] = handler$3; +SCHEMES[handler$4.scheme] = handler$4; +SCHEMES[handler$5.scheme] = handler$5; +SCHEMES[handler$6.scheme] = handler$6; + +exports.SCHEMES = SCHEMES; +exports.pctEncChar = pctEncChar; +exports.pctDecChars = pctDecChars; +exports.parse = parse; +exports.removeDotSegments = removeDotSegments; +exports.serialize = serialize; +exports.resolveComponents = resolveComponents; +exports.resolve = resolve; +exports.normalize = normalize; +exports.equal = equal; +exports.escapeComponent = escapeComponent; +exports.unescapeComponent = unescapeComponent; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); + + +},{}],"ajv":[function(require,module,exports){ +'use strict'; + +var compileSchema = require('./compile') + , resolve = require('./compile/resolve') + , Cache = require('./cache') + , SchemaObject = require('./compile/schema_obj') + , stableStringify = require('fast-json-stable-stringify') + , formats = require('./compile/formats') + , rules = require('./compile/rules') + , $dataMetaSchema = require('./data') + , util = require('./compile/util'); + +module.exports = Ajv; + +Ajv.prototype.validate = validate; +Ajv.prototype.compile = compile; +Ajv.prototype.addSchema = addSchema; +Ajv.prototype.addMetaSchema = addMetaSchema; +Ajv.prototype.validateSchema = validateSchema; +Ajv.prototype.getSchema = getSchema; +Ajv.prototype.removeSchema = removeSchema; +Ajv.prototype.addFormat = addFormat; +Ajv.prototype.errorsText = errorsText; + +Ajv.prototype._addSchema = _addSchema; +Ajv.prototype._compile = _compile; + +Ajv.prototype.compileAsync = require('./compile/async'); +var customKeyword = require('./keyword'); +Ajv.prototype.addKeyword = customKeyword.add; +Ajv.prototype.getKeyword = customKeyword.get; +Ajv.prototype.removeKeyword = customKeyword.remove; +Ajv.prototype.validateKeyword = customKeyword.validate; + +var errorClasses = require('./compile/error_classes'); +Ajv.ValidationError = errorClasses.Validation; +Ajv.MissingRefError = errorClasses.MissingRef; +Ajv.$dataMetaSchema = $dataMetaSchema; + +var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema'; + +var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ]; +var META_SUPPORT_DATA = ['/properties']; + +/** + * Creates validator instance. + * Usage: `Ajv(opts)` + * @param {Object} opts optional options + * @return {Object} ajv instance + */ +function Ajv(opts) { + if (!(this instanceof Ajv)) return new Ajv(opts); + opts = this._opts = util.copy(opts) || {}; + setLogger(this); + this._schemas = {}; + this._refs = {}; + this._fragments = {}; + this._formats = formats(opts.format); + + this._cache = opts.cache || new Cache; + this._loadingSchemas = {}; + this._compilations = []; + this.RULES = rules(); + this._getId = chooseGetId(opts); + + opts.loopRequired = opts.loopRequired || Infinity; + if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true; + if (opts.serialize === undefined) opts.serialize = stableStringify; + this._metaOpts = getMetaSchemaOptions(this); + + if (opts.formats) addInitialFormats(this); + if (opts.keywords) addInitialKeywords(this); + addDefaultMetaSchema(this); + if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta); + if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}}); + addInitialSchemas(this); +} + + + +/** + * Validate data using schema + * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize. + * @this Ajv + * @param {String|Object} schemaKeyRef key, ref or schema object + * @param {Any} data to be validated + * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). + */ +function validate(schemaKeyRef, data) { + var v; + if (typeof schemaKeyRef == 'string') { + v = this.getSchema(schemaKeyRef); + if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); + } else { + var schemaObj = this._addSchema(schemaKeyRef); + v = schemaObj.validate || this._compile(schemaObj); + } + + var valid = v(data); + if (v.$async !== true) this.errors = v.errors; + return valid; +} + + +/** + * Create validating function for passed schema. + * @this Ajv + * @param {Object} schema schema object + * @param {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords. + * @return {Function} validating function + */ +function compile(schema, _meta) { + var schemaObj = this._addSchema(schema, undefined, _meta); + return schemaObj.validate || this._compile(schemaObj); +} + + +/** + * Adds schema to the instance. + * @this Ajv + * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. + * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. + * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead. + * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead. + * @return {Ajv} this for method chaining + */ +function addSchema(schema, key, _skipValidation, _meta) { + if (Array.isArray(schema)){ + for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. + * @param {Object} options optional options with properties `separator` and `dataVar`. + * @return {String} human readable string with all errors descriptions + */ +function errorsText(errors, options) { + errors = errors || this.errors; + if (!errors) return 'No errors'; + options = options || {}; + var separator = options.separator === undefined ? ', ' : options.separator; + var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; + + var text = ''; + for (var i=0; i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,u=/^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i,h=/^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,d=/^(?:\/(?:[^~/]|~0|~1)*)*$/,p=/^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,f=/^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;function m(e){return a.copy(m[e="full"==e?"full":"fast"])}function v(e){var r=e.match(o);if(!r)return!1;var t,a=+r[2],s=+r[3];return 1<=a&&a<=12&&1<=s&&s<=(2!=a||((t=+r[1])%4!=0||t%100==0&&t%400!=0)?i[a]:29)}function y(e,r){var t=e.match(n);if(!t)return!1;var a=t[1],s=t[2],o=t[3];return(a<=23&&s<=59&&o<=59||23==a&&59==s&&60==o)&&(!r||t[5])}(r.exports=m).fast={date:/^\d\d\d\d-[0-1]\d-[0-3]\d$/,time:/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i,"date-time":/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i,uri:/^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,"uri-reference":/^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f},m.full={date:v,time:y,"date-time":function(e){var r=e.split(g);return 2==r.length&&v(r[0])&&y(r[1],!0)},uri:function(e){return P.test(e)&&l.test(e)},"uri-reference":/^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,"uri-template":c,url:u,email:/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,hostname:s,ipv4:/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/,ipv6:/^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i,regex:w,uuid:h,"json-pointer":d,"json-pointer-uri-fragment":p,"relative-json-pointer":f};var g=/t|\s/i;var P=/\/|:/;var E=/[^\\]\\Z/;function w(e){if(E.test(e))return!1;try{return new RegExp(e),!0}catch(e){return!1}}},{"./util":10}],5:[function(e,r,t){"use strict";var R=e("./resolve"),$=e("./util"),j=e("./error_classes"),D=e("fast-json-stable-stringify"),O=e("../dotjs/validate"),I=$.ucs2length,A=e("fast-deep-equal"),k=j.Validation;function C(e,c,u,r){var d=this,p=this._opts,h=[void 0],f={},l=[],t={},m=[],a={},v=[],s=function(e,r,t){var a=L.call(this,e,r,t);return 0<=a?{index:a,compiling:!0}:{index:a=this._compilations.length,compiling:!(this._compilations[a]={schema:e,root:r,baseId:t})}}.call(this,e,c=c||{schema:e,refVal:h,refs:f},r),o=this._compilations[s.index];if(s.compiling)return o.callValidate=P;var y=this._formats,g=this.RULES;try{var i=E(e,c,u,r);o.validate=i;var n=o.callValidate;return n&&(n.schema=i.schema,n.errors=null,n.refs=i.refs,n.refVal=i.refVal,n.root=i.root,n.$async=i.$async,p.sourceCode&&(n.source=i.source)),i}finally{(function(e,r,t){var a=L.call(this,e,r,t);0<=a&&this._compilations.splice(a,1)}).call(this,e,c,r)}function P(){var e=o.validate,r=e.apply(this,arguments);return P.errors=e.errors,r}function E(e,r,t,a){var s=!r||r&&r.schema==e;if(r.schema!=c.schema)return C.call(d,e,r,t,a);var o=!0===e.$async,i=O({isTop:!0,schema:e,isRoot:s,baseId:a,root:r,schemaPath:"",errSchemaPath:"#",errorPath:'""',MissingRefError:j.MissingRef,RULES:g,validate:O,util:$,resolve:R,resolveRef:w,usePattern:_,useDefault:F,useCustomRule:x,opts:p,formats:y,logger:d.logger,self:d}),i=Q(h,z)+Q(l,N)+Q(m,q)+Q(v,T)+i;p.processCode&&(i=p.processCode(i,e));try{var n=new Function("self","RULES","formats","root","refVal","defaults","customRules","equal","ucs2length","ValidationError",i)(d,g,y,c,h,m,v,A,I,k);h[0]=n}catch(e){throw d.logger.error("Error compiling schema, function code:",i),e}return n.schema=e,n.errors=null,n.refs=f,n.refVal=h,n.root=s?n:r,o&&(n.$async=!0),!0===p.sourceCode&&(n.source={code:i,patterns:l,defaults:m}),n}function w(e,r,t){r=R.url(e,r);var a,s,o=f[r];if(void 0!==o)return S(a=h[o],s="refVal["+o+"]");if(!t&&c.refs){var i=c.refs[r];if(void 0!==i)return S(a=c.refVal[i],s=b(r,a))}s=b(r);var n,l=R.call(d,E,c,r);if(void 0!==l||(n=u&&u[r])&&(l=R.inlineRef(n,p.inlineRefs)?n:C.call(d,n,c,u,e)),void 0!==l)return S(h[f[r]]=l,s);delete f[r]}function b(e,r){var t=h.length;return h[t]=r,"refVal"+(f[e]=t)}function S(e,r){return"object"==typeof e||"boolean"==typeof e?{code:r,schema:e,inline:!0}:{code:r,$async:e&&!!e.$async}}function _(e){var r=t[e];return void 0===r&&(r=t[e]=l.length,l[r]=e),"pattern"+r}function F(e){switch(typeof e){case"boolean":case"number":return""+e;case"string":return $.toQuotedString(e);case"object":if(null===e)return"null";var r=D(e),t=a[r];return void 0===t&&(t=a[r]=m.length,m[t]=e),"default"+t}}function x(e,r,t,a){if(!1!==d._opts.validateSchema){var s=e.definition.dependencies;if(s&&!s.every(function(e){return Object.prototype.hasOwnProperty.call(t,e)}))throw new Error("parent schema must have all required keywords: "+s.join(","));var o=e.definition.validateSchema;if(o)if(!o(r)){var i="keyword schema is invalid: "+d.errorsText(o.errors);if("log"!=d._opts.validateSchema)throw new Error(i);d.logger.error(i)}}var n,l=e.definition.compile,c=e.definition.inline,u=e.definition.macro;if(l)n=l.call(d,r,t,a);else if(u)n=u.call(d,r,t,a),!1!==p.validateSchema&&d.validateSchema(n,!0);else if(c)n=c.call(d,a,e.keyword,r,t);else if(!(n=e.definition.validate))return;if(void 0===n)throw new Error('custom keyword "'+e.keyword+'"failed to compile');var h=v.length;return{code:"customRule"+h,validate:v[h]=n}}}function L(e,r,t){for(var a=0;a",_=P?">":"<",F=void 0;if(!y&&"number"!=typeof d&&void 0!==d)throw new Error(r+" must be number");if(!b&&void 0!==w&&"number"!=typeof w&&"boolean"!=typeof w)throw new Error(E+" must be number or boolean");b?(o="exclIsNumber"+u,i="' + "+(n="op"+u)+" + '",c+=" var schemaExcl"+u+" = "+(t=e.util.getData(w.$data,h,e.dataPathArr))+"; ",F=E,(l=l||[]).push(c+=" var "+(a="exclusive"+u)+"; var "+(s="exclType"+u)+" = typeof "+(t="schemaExcl"+u)+"; if ("+s+" != 'boolean' && "+s+" != 'undefined' && "+s+" != 'number') { "),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_exclusiveLimit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: {} ",!1!==e.opts.messages&&(c+=" , message: '"+E+" should be boolean' "),e.opts.verbose&&(c+=" , schema: validate.schema"+p+" , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ",x=c,c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } else if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+s+" == 'number' ? ( ("+a+" = "+g+" === undefined || "+t+" "+S+"= "+g+") ? "+v+" "+_+"= "+t+" : "+v+" "+_+" "+g+" ) : ( ("+a+" = "+t+" === true) ? "+v+" "+_+"= "+g+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { var op"+u+" = "+a+" ? '"+S+"' : '"+S+"='; ",void 0===d&&(f=e.errSchemaPath+"/"+(F=E),g=t,y=b)):(i=S,(o="number"==typeof w)&&y?(n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" ( "+g+" === undefined || "+w+" "+S+"= "+g+" ? "+v+" "+_+"= "+w+" : "+v+" "+_+" "+g+" ) || "+v+" !== "+v+") { "):(o&&void 0===d?(a=!0,f=e.errSchemaPath+"/"+(F=E),g=w,_+="="):(o&&(g=Math[P?"min":"max"](w,d)),w===(!o||g)?(a=!0,f=e.errSchemaPath+"/"+(F=E),_+="="):(a=!1,i+="=")),n="'"+i+"'",c+=" if ( ",y&&(c+=" ("+g+" !== undefined && typeof "+g+" != 'number') || "),c+=" "+v+" "+_+" "+g+" || "+v+" !== "+v+") { ")),F=F||r,(l=l||[]).push(c),c="",!1!==e.createErrors?(c+=" { keyword: '"+(F||"_limit")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(f)+" , params: { comparison: "+n+", limit: "+g+", exclusive: "+a+" } ",!1!==e.opts.messages&&(c+=" , message: 'should be "+i+" ",c+=y?"' + "+g:g+"'"),e.opts.verbose&&(c+=" , schema: ",c+=y?"validate.schema"+p:""+d,c+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+v+" "),c+=" } "):c+=" {} ";var x=c;return c=l.pop(),c+=!e.compositeRule&&m?e.async?" throw new ValidationError(["+x+"]); ":" validate.errors = ["+x+"]; return false; ":" var err = "+x+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",c+=" } ",m&&(c+=" else { "),c}},{}],14:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" "+c+".length "+("maxItems"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitItems")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxItems"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" items' "),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],15:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || "),t+=!1===e.opts.unicode?" "+c+".length ":" ucs2length("+c+") ";var d=r,p=p||[];p.push(t+=" "+("maxLength"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitLength")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT be ",t+="maxLength"==r?"longer":"shorter",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" characters' "),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],16:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u=e.opts.$data&&o&&o.$data,h=u?(t+=" var schema"+a+" = "+e.util.getData(o.$data,s,e.dataPathArr)+"; ","schema"+a):o;if(!u&&"number"!=typeof o)throw new Error(r+" must be number");t+="if ( ",u&&(t+=" ("+h+" !== undefined && typeof "+h+" != 'number') || ");var d=r,p=p||[];p.push(t+=" Object.keys("+c+").length "+("maxProperties"==r?">":"<")+" "+h+") { "),t="",!1!==e.createErrors?(t+=" { keyword: '"+(d||"_limitProperties")+"' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { limit: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should NOT have ",t+="maxProperties"==r?"more":"fewer",t+=" than ",t+=u?"' + "+h+" + '":""+o,t+=" properties' "),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var f=t,t=p.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+f+"]); ":" validate.errors = ["+f+"]; return false; ":" var err = "+f+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],17:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.schema[r],s=e.schemaPath+e.util.getProperty(r),o=e.errSchemaPath+"/"+r,i=!e.opts.allErrors,n=e.util.copy(e),l="";n.level++;var c="valid"+n.level,u=n.baseId,h=!0,d=a;if(d)for(var p,f=-1,m=d.length-1;f "+_+") { ",x=c+"["+_+"]",d.schema=$,d.schemaPath=i+"["+_+"]",d.errSchemaPath=n+"/"+_,d.errorPath=e.util.getPathExpr(e.errorPath,_,e.opts.jsonPointers,!0),d.dataPathArr[v]=_,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",t+=" } ",l&&(t+=" if ("+f+") { ",p+="}"))}"object"==typeof b&&(e.opts.strictKeywords?"object"==typeof b&&0 "+o.length+") { for (var "+m+" = "+o.length+"; "+m+" < "+c+".length; "+m+"++) { ",d.errorPath=e.util.getPathExpr(e.errorPath,m,e.opts.jsonPointers,!0),x=c+"["+m+"]",d.dataPathArr[v]=m,R=e.validate(d),d.baseId=g,e.util.varOccurences(R,y)<2?t+=" "+e.util.varReplace(R,y,x)+" ":t+=" var "+y+" = "+x+"; "+R+" ",l&&(t+=" if (!"+f+") break; "),t+=" } } ",l&&(t+=" if ("+f+") { ",p+="}"))}else{(e.opts.strictKeywords?"object"==typeof o&&0 1e-"+e.opts.multipleOfPrecision+" ":" division"+a+" !== parseInt(division"+a+") ",t+=" ) ",u&&(t+=" ) ");var d=d||[];d.push(t+=" ) { "),t="",!1!==e.createErrors?(t+=" { keyword: 'multipleOf' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(n)+" , params: { multipleOf: "+h+" } ",!1!==e.opts.messages&&(t+=" , message: 'should be multiple of ",t+=u?"' + "+h:h+"'"),e.opts.verbose&&(t+=" , schema: ",t+=u?"validate.schema"+i:""+o,t+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+c+" "),t+=" } "):t+=" {} ";var p=t,t=d.pop();return t+=!e.compositeRule&&l?e.async?" throw new ValidationError(["+p+"]); ":" validate.errors = ["+p+"]; return false; ":" var err = "+p+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",t+="} ",l&&(t+=" else { "),t}},{}],30:[function(e,r,t){"use strict";r.exports=function(e,r){var t=" ",a=e.level,s=e.dataLevel,o=e.schema[r],i=e.schemaPath+e.util.getProperty(r),n=e.errSchemaPath+"/"+r,l=!e.opts.allErrors,c="data"+(s||""),u="errs__"+a,h=e.util.copy(e);h.level++;var d,p,f,m,v="valid"+h.level;return(e.opts.strictKeywords?"object"==typeof o&&0 1) { ",t=e.schema.items&&e.schema.items.type,a=Array.isArray(t),!t||"object"==t||"array"==t||a&&(0<=t.indexOf("object")||0<=t.indexOf("array"))?i+=" outer: for (;i--;) { for (j = i; j--;) { if (equal("+p+"[i], "+p+"[j])) { "+f+" = false; break outer; } } } ":(i+=" var itemIndices = {}, item; for (;i--;) { var item = "+p+"[i]; ",i+=" if ("+e.util["checkDataType"+(a?"s":"")](t,"item",e.opts.strictNumbers,!0)+") continue; ",a&&(i+=" if (typeof item == 'string') item = '\"' + item; "),i+=" if (typeof itemIndices[item] == 'number') { "+f+" = false; j = itemIndices[item]; break; } itemIndices[item] = i; } "),i+=" } ",m&&(i+=" } "),(s=s||[]).push(i+=" if (!"+f+") { "),i="",!1!==e.createErrors?(i+=" { keyword: 'uniqueItems' , dataPath: (dataPath || '') + "+e.errorPath+" , schemaPath: "+e.util.toQuotedString(h)+" , params: { i: i, j: j } ",!1!==e.opts.messages&&(i+=" , message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)' "),e.opts.verbose&&(i+=" , schema: ",i+=m?"validate.schema"+u:""+c,i+=" , parentSchema: validate.schema"+e.schemaPath+" , data: "+p+" "),i+=" } "):i+=" {} ",o=i,i=s.pop(),i+=!e.compositeRule&&d?e.async?" throw new ValidationError(["+o+"]); ":" validate.errors = ["+o+"]; return false; ":" var err = "+o+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ",i+=" } ",d&&(i+=" else { ")):d&&(i+=" if (true) { "),i}},{}],38:[function(e,r,t){"use strict";r.exports=function(a,e){var r="",t=!0===a.schema.$async,s=a.util.schemaHasRulesExcept(a.schema,a.RULES.all,"$ref"),o=a.self._getId(a.schema);if(a.opts.strictKeywords){var i=a.util.schemaUnknownRules(a.schema,a.RULES.keywords);if(i){var n="unknown keyword: "+i;if("log"!==a.opts.strictKeywords)throw new Error(n);a.logger.warn(n)}}if(a.isTop&&(r+=" var validate = ",t&&(a.async=!0,r+="async "),r+="function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; ",o&&(a.opts.sourceCode||a.opts.processCode)&&(r+=" /*# sourceURL="+o+" */ ")),"boolean"==typeof a.schema||!s&&!a.schema.$ref){var l=a.level,c=a.dataLevel,u=a.schema[e="false schema"],h=a.schemaPath+a.util.getProperty(e),d=a.errSchemaPath+"/"+e,p=!a.opts.allErrors,f="data"+(c||""),m="valid"+l;return!1===a.schema?(a.isTop?p=!0:r+=" var "+m+" = false; ",(U=U||[]).push(r),r="",!1!==a.createErrors?(r+=" { keyword: 'false schema' , dataPath: (dataPath || '') + "+a.errorPath+" , schemaPath: "+a.util.toQuotedString(d)+" , params: {} ",!1!==a.opts.messages&&(r+=" , message: 'boolean schema is false' "),a.opts.verbose&&(r+=" , schema: false , parentSchema: validate.schema"+a.schemaPath+" , data: "+f+" "),r+=" } "):r+=" {} ",D=r,r=U.pop(),r+=!a.compositeRule&&p?a.async?" throw new ValidationError(["+D+"]); ":" validate.errors = ["+D+"]; return false; ":" var err = "+D+"; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; "):r+=a.isTop?t?" return data; ":" validate.errors = null; return true; ":" var "+m+" = true; ",a.isTop&&(r+=" }; return validate; "),r}if(a.isTop){var v=a.isTop,l=a.level=0,c=a.dataLevel=0,f="data";if(a.rootId=a.resolve.fullPath(a.self._getId(a.root.schema)),a.baseId=a.baseId||a.rootId,delete a.isTop,a.dataPathArr=[""],void 0!==a.schema.default&&a.opts.useDefaults&&a.opts.strictDefaults){var y="default is ignored in the schema root";if("log"!==a.opts.strictDefaults)throw new Error(y);a.logger.warn(y)}r+=" var vErrors = null; ",r+=" var errors = 0; ",r+=" if (rootData === undefined) rootData = data; "}else{l=a.level,f="data"+((c=a.dataLevel)||"");if(o&&(a.baseId=a.resolve.url(a.baseId,o)),t&&!a.async)throw new Error("async schema in sync schema");r+=" var errs_"+l+" = errors;"}var g,m="valid"+l,p=!a.opts.allErrors,P="",E="",w=a.schema.type,b=Array.isArray(w);if(w&&a.opts.nullable&&!0===a.schema.nullable&&(b?-1==w.indexOf("null")&&(w=w.concat("null")):"null"!=w&&(w=[w,"null"],b=!0)),b&&1==w.length&&(w=w[0],b=!1),a.schema.$ref&&s){if("fail"==a.opts.extendRefs)throw new Error('$ref: validation keywords used in schema at path "'+a.errSchemaPath+'" (see option extendRefs)');!0!==a.opts.extendRefs&&(s=!1,a.logger.warn('$ref: keywords ignored in schema at path "'+a.errSchemaPath+'"'))}if(a.schema.$comment&&a.opts.$comment&&(r+=" "+a.RULES.all.$comment.code(a,"$comment")),w){a.opts.coerceTypes&&(g=a.util.coerceToTypes(a.opts.coerceTypes,w));var S=a.RULES.types[w];if(g||b||!0===S||S&&!Z(S)){h=a.schemaPath+".type",d=a.errSchemaPath+"/type",h=a.schemaPath+".type",d=a.errSchemaPath+"/type";if(r+=" if ("+a.util[b?"checkDataTypes":"checkDataType"](w,f,a.opts.strictNumbers,!0)+") { ",g){var _="dataType"+l,F="coerced"+l;r+=" var "+_+" = typeof "+f+"; var "+F+" = undefined; ","array"==a.opts.coerceTypes&&(r+=" if ("+_+" == 'object' && Array.isArray("+f+") && "+f+".length == 1) { "+f+" = "+f+"[0]; "+_+" = typeof "+f+"; if ("+a.util.checkDataType(a.schema.type,f,a.opts.strictNumbers)+") "+F+" = "+f+"; } "),r+=" if ("+F+" !== undefined) ; ";var x=g;if(x)for(var R,$=-1,j=x.length-1;$= 0x80 (not a basic code point)","invalid-input":"Invalid input"},k=Math.floor,C=String.fromCharCode;function L(e){throw new RangeError(i[e])}function n(e,r){var t=e.split("@"),a="";return 1>1,e+=k(e/r);455k((A-a)/h))&&L("overflow"),a+=p*h;var f=d<=o?1:o+26<=d?26:d-o;if(pk(A/m)&&L("overflow"),h*=m}var v=r.length+1,o=z(a-u,v,0==u);k(a/v)>A-s&&L("overflow"),s+=k(a/v),a%=v,r.splice(a++,0,s)}return String.fromCodePoint.apply(String,r)}function c(e){var r=[],t=(e=N(e)).length,a=128,s=0,o=72,i=!0,n=!1,l=void 0;try{for(var c,u=e[Symbol.iterator]();!(i=(c=u.next()).done);i=!0){var h=c.value;h<128&&r.push(C(h))}}catch(e){n=!0,l=e}finally{try{!i&&u.return&&u.return()}finally{if(n)throw l}}var d=r.length,p=d;for(d&&r.push("-");pk((A-s)/w)&&L("overflow"),s+=(f-a)*w,a=f;var b=!0,S=!1,_=void 0;try{for(var F,x=e[Symbol.iterator]();!(b=(F=x.next()).done);b=!0){var R=F.value;if(RA&&L("overflow"),R==a){for(var $=s,j=36;;j+=36){var D=j<=o?1:o+26<=j?26:j-o;if($>6|192).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase():"%"+(r>>12|224).toString(16).toUpperCase()+"%"+(r>>6&63|128).toString(16).toUpperCase()+"%"+(63&r|128).toString(16).toUpperCase()}function p(e){for(var r="",t=0,a=e.length;tA-Z\\x5E-\\x7E]",'[\\"\\\\]')),Y=new RegExp(K,"g"),W=new RegExp("(?:(?:%[EFef][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[89A-Fa-f][0-9A-Fa-f]%[0-9A-Fa-f][0-9A-Fa-f])|(?:%[0-9A-Fa-f][0-9A-Fa-f]))","g"),X=new RegExp(J("[^]","[A-Za-z0-9\\!\\$\\%\\'\\*\\+\\-\\^\\_\\`\\{\\|\\}\\~]","[\\.]",'[\\"]',G),"g"),ee=new RegExp(J("[^]",K,"[\\!\\$\\'\\(\\)\\*\\+\\,\\;\\:\\@]"),"g"),re=ee;function te(e){var r=p(e);return r.match(Y)?r:e}var ae={scheme:"mailto",parse:function(e,r){var t=e,a=t.to=t.path?t.path.split(","):[];if(t.path=void 0,t.query){for(var s=!1,o={},i=t.query.split("&"),n=0,l=i.length;n); + + message: string; + errors: Array; + ajv: true; + validation: true; + } + + class MissingRefError extends Error { + constructor(baseId: string, ref: string, message?: string); + static message: (baseId: string, ref: string) => string; + + message: string; + missingRef: string; + missingSchema: string; + } +} + +declare namespace ajv { + type ValidationError = AjvErrors.ValidationError; + + type MissingRefError = AjvErrors.MissingRefError; + + interface Ajv { + /** + * Validate data using schema + * Schema will be compiled and cached (using serialized JSON as key, [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize by default). + * @param {string|object|Boolean} schemaKeyRef key, ref or schema object + * @param {Any} data to be validated + * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). + */ + validate(schemaKeyRef: object | string | boolean, data: any): boolean | PromiseLike; + /** + * Create validating function for passed schema. + * @param {object|Boolean} schema schema object + * @return {Function} validating function + */ + compile(schema: object | boolean): ValidateFunction; + /** + * Creates validating function for passed schema with asynchronous loading of missing schemas. + * `loadSchema` option should be a function that accepts schema uri and node-style callback. + * @this Ajv + * @param {object|Boolean} schema schema object + * @param {Boolean} meta optional true to compile meta-schema; this parameter can be skipped + * @param {Function} callback optional node-style callback, it is always called with 2 parameters: error (or null) and validating function. + * @return {PromiseLike} validating function + */ + compileAsync(schema: object | boolean, meta?: Boolean, callback?: (err: Error, validate: ValidateFunction) => any): PromiseLike; + /** + * Adds schema to the instance. + * @param {object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. + * @param {string} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. + * @return {Ajv} this for method chaining + */ + addSchema(schema: Array | object, key?: string): Ajv; + /** + * Add schema that will be used to validate other schemas + * options in META_IGNORE_OPTIONS are alway set to false + * @param {object} schema schema object + * @param {string} key optional schema key + * @return {Ajv} this for method chaining + */ + addMetaSchema(schema: object, key?: string): Ajv; + /** + * Validate schema + * @param {object|Boolean} schema schema to validate + * @return {Boolean} true if schema is valid + */ + validateSchema(schema: object | boolean): boolean; + /** + * Get compiled schema from the instance by `key` or `ref`. + * @param {string} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id). + * @return {Function} schema validating function (with property `schema`). Returns undefined if keyRef can't be resolved to an existing schema. + */ + getSchema(keyRef: string): ValidateFunction | undefined; + /** + * Remove cached schema(s). + * If no parameter is passed all schemas but meta-schemas are removed. + * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed. + * Even if schema is referenced by other schemas it still can be removed as other schemas have local references. + * @param {string|object|RegExp|Boolean} schemaKeyRef key, ref, pattern to match key/ref or schema object + * @return {Ajv} this for method chaining + */ + removeSchema(schemaKeyRef?: object | string | RegExp | boolean): Ajv; + /** + * Add custom format + * @param {string} name format name + * @param {string|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid) + * @return {Ajv} this for method chaining + */ + addFormat(name: string, format: FormatValidator | FormatDefinition): Ajv; + /** + * Define custom keyword + * @this Ajv + * @param {string} keyword custom keyword, should be a valid identifier, should be different from all standard, custom and macro keywords. + * @param {object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. + * @return {Ajv} this for method chaining + */ + addKeyword(keyword: string, definition: KeywordDefinition): Ajv; + /** + * Get keyword definition + * @this Ajv + * @param {string} keyword pre-defined or custom keyword. + * @return {object|Boolean} custom keyword definition, `true` if it is a predefined keyword, `false` otherwise. + */ + getKeyword(keyword: string): object | boolean; + /** + * Remove keyword + * @this Ajv + * @param {string} keyword pre-defined or custom keyword. + * @return {Ajv} this for method chaining + */ + removeKeyword(keyword: string): Ajv; + /** + * Validate keyword + * @this Ajv + * @param {object} definition keyword definition object + * @param {boolean} throwError true to throw exception if definition is invalid + * @return {boolean} validation result + */ + validateKeyword(definition: KeywordDefinition, throwError: boolean): boolean; + /** + * Convert array of error message objects to string + * @param {Array} errors optional array of validation errors, if not passed errors from the instance are used. + * @param {object} options optional options with properties `separator` and `dataVar`. + * @return {string} human readable string with all errors descriptions + */ + errorsText(errors?: Array | null, options?: ErrorsTextOptions): string; + errors?: Array | null; + _opts: Options; + } + + interface CustomLogger { + log(...args: any[]): any; + warn(...args: any[]): any; + error(...args: any[]): any; + } + + interface ValidateFunction { + ( + data: any, + dataPath?: string, + parentData?: object | Array, + parentDataProperty?: string | number, + rootData?: object | Array + ): boolean | PromiseLike; + schema?: object | boolean; + errors?: null | Array; + refs?: object; + refVal?: Array; + root?: ValidateFunction | object; + $async?: true; + source?: object; + } + + interface Options { + $data?: boolean; + allErrors?: boolean; + verbose?: boolean; + jsonPointers?: boolean; + uniqueItems?: boolean; + unicode?: boolean; + format?: false | string; + formats?: object; + keywords?: object; + unknownFormats?: true | string[] | 'ignore'; + schemas?: Array | object; + schemaId?: '$id' | 'id' | 'auto'; + missingRefs?: true | 'ignore' | 'fail'; + extendRefs?: true | 'ignore' | 'fail'; + loadSchema?: (uri: string, cb?: (err: Error, schema: object) => void) => PromiseLike; + removeAdditional?: boolean | 'all' | 'failing'; + useDefaults?: boolean | 'empty' | 'shared'; + coerceTypes?: boolean | 'array'; + strictDefaults?: boolean | 'log'; + strictKeywords?: boolean | 'log'; + strictNumbers?: boolean; + async?: boolean | string; + transpile?: string | ((code: string) => string); + meta?: boolean | object; + validateSchema?: boolean | 'log'; + addUsedSchema?: boolean; + inlineRefs?: boolean | number; + passContext?: boolean; + loopRequired?: number; + ownProperties?: boolean; + multipleOfPrecision?: boolean | number; + errorDataPath?: string, + messages?: boolean; + sourceCode?: boolean; + processCode?: (code: string, schema: object) => string; + cache?: object; + logger?: CustomLogger | false; + nullable?: boolean; + serialize?: ((schema: object | boolean) => any) | false; + } + + type FormatValidator = string | RegExp | ((data: string) => boolean | PromiseLike); + type NumberFormatValidator = ((data: number) => boolean | PromiseLike); + + interface NumberFormatDefinition { + type: "number", + validate: NumberFormatValidator; + compare?: (data1: number, data2: number) => number; + async?: boolean; + } + + interface StringFormatDefinition { + type?: "string", + validate: FormatValidator; + compare?: (data1: string, data2: string) => number; + async?: boolean; + } + + type FormatDefinition = NumberFormatDefinition | StringFormatDefinition; + + interface KeywordDefinition { + type?: string | Array; + async?: boolean; + $data?: boolean; + errors?: boolean | string; + metaSchema?: object; + // schema: false makes validate not to expect schema (ValidateFunction) + schema?: boolean; + statements?: boolean; + dependencies?: Array; + modifying?: boolean; + valid?: boolean; + // one and only one of the following properties should be present + validate?: SchemaValidateFunction | ValidateFunction; + compile?: (schema: any, parentSchema: object, it: CompilationContext) => ValidateFunction; + macro?: (schema: any, parentSchema: object, it: CompilationContext) => object | boolean; + inline?: (it: CompilationContext, keyword: string, schema: any, parentSchema: object) => string; + } + + interface CompilationContext { + level: number; + dataLevel: number; + dataPathArr: string[]; + schema: any; + schemaPath: string; + baseId: string; + async: boolean; + opts: Options; + formats: { + [index: string]: FormatDefinition | undefined; + }; + keywords: { + [index: string]: KeywordDefinition | undefined; + }; + compositeRule: boolean; + validate: (schema: object) => boolean; + util: { + copy(obj: any, target?: any): any; + toHash(source: string[]): { [index: string]: true | undefined }; + equal(obj: any, target: any): boolean; + getProperty(str: string): string; + schemaHasRules(schema: object, rules: any): string; + escapeQuotes(str: string): string; + toQuotedString(str: string): string; + getData(jsonPointer: string, dataLevel: number, paths: string[]): string; + escapeJsonPointer(str: string): string; + unescapeJsonPointer(str: string): string; + escapeFragment(str: string): string; + unescapeFragment(str: string): string; + }; + self: Ajv; + } + + interface SchemaValidateFunction { + ( + schema: any, + data: any, + parentSchema?: object, + dataPath?: string, + parentData?: object | Array, + parentDataProperty?: string | number, + rootData?: object | Array + ): boolean | PromiseLike; + errors?: Array; + } + + interface ErrorsTextOptions { + separator?: string; + dataVar?: string; + } + + interface ErrorObject { + keyword: string; + dataPath: string; + schemaPath: string; + params: ErrorParameters; + // Added to validation errors of propertyNames keyword schema + propertyName?: string; + // Excluded if messages set to false. + message?: string; + // These are added with the `verbose` option. + schema?: any; + parentSchema?: object; + data?: any; + } + + type ErrorParameters = RefParams | LimitParams | AdditionalPropertiesParams | + DependenciesParams | FormatParams | ComparisonParams | + MultipleOfParams | PatternParams | RequiredParams | + TypeParams | UniqueItemsParams | CustomParams | + PatternRequiredParams | PropertyNamesParams | + IfParams | SwitchParams | NoParams | EnumParams; + + interface RefParams { + ref: string; + } + + interface LimitParams { + limit: number; + } + + interface AdditionalPropertiesParams { + additionalProperty: string; + } + + interface DependenciesParams { + property: string; + missingProperty: string; + depsCount: number; + deps: string; + } + + interface FormatParams { + format: string + } + + interface ComparisonParams { + comparison: string; + limit: number | string; + exclusive: boolean; + } + + interface MultipleOfParams { + multipleOf: number; + } + + interface PatternParams { + pattern: string; + } + + interface RequiredParams { + missingProperty: string; + } + + interface TypeParams { + type: string; + } + + interface UniqueItemsParams { + i: number; + j: number; + } + + interface CustomParams { + keyword: string; + } + + interface PatternRequiredParams { + missingPattern: string; + } + + interface PropertyNamesParams { + propertyName: string; + } + + interface IfParams { + failingKeyword: string; + } + + interface SwitchParams { + caseIndex: number; + } + + interface NoParams { } + + interface EnumParams { + allowedValues: Array; + } +} + +export = ajv; diff --git a/node_sid/node_modules/ajv/lib/ajv.js b/node_sid/node_modules/ajv/lib/ajv.js new file mode 100644 index 0000000..06a45b6 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/ajv.js @@ -0,0 +1,506 @@ +'use strict'; + +var compileSchema = require('./compile') + , resolve = require('./compile/resolve') + , Cache = require('./cache') + , SchemaObject = require('./compile/schema_obj') + , stableStringify = require('fast-json-stable-stringify') + , formats = require('./compile/formats') + , rules = require('./compile/rules') + , $dataMetaSchema = require('./data') + , util = require('./compile/util'); + +module.exports = Ajv; + +Ajv.prototype.validate = validate; +Ajv.prototype.compile = compile; +Ajv.prototype.addSchema = addSchema; +Ajv.prototype.addMetaSchema = addMetaSchema; +Ajv.prototype.validateSchema = validateSchema; +Ajv.prototype.getSchema = getSchema; +Ajv.prototype.removeSchema = removeSchema; +Ajv.prototype.addFormat = addFormat; +Ajv.prototype.errorsText = errorsText; + +Ajv.prototype._addSchema = _addSchema; +Ajv.prototype._compile = _compile; + +Ajv.prototype.compileAsync = require('./compile/async'); +var customKeyword = require('./keyword'); +Ajv.prototype.addKeyword = customKeyword.add; +Ajv.prototype.getKeyword = customKeyword.get; +Ajv.prototype.removeKeyword = customKeyword.remove; +Ajv.prototype.validateKeyword = customKeyword.validate; + +var errorClasses = require('./compile/error_classes'); +Ajv.ValidationError = errorClasses.Validation; +Ajv.MissingRefError = errorClasses.MissingRef; +Ajv.$dataMetaSchema = $dataMetaSchema; + +var META_SCHEMA_ID = 'http://json-schema.org/draft-07/schema'; + +var META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes', 'strictDefaults' ]; +var META_SUPPORT_DATA = ['/properties']; + +/** + * Creates validator instance. + * Usage: `Ajv(opts)` + * @param {Object} opts optional options + * @return {Object} ajv instance + */ +function Ajv(opts) { + if (!(this instanceof Ajv)) return new Ajv(opts); + opts = this._opts = util.copy(opts) || {}; + setLogger(this); + this._schemas = {}; + this._refs = {}; + this._fragments = {}; + this._formats = formats(opts.format); + + this._cache = opts.cache || new Cache; + this._loadingSchemas = {}; + this._compilations = []; + this.RULES = rules(); + this._getId = chooseGetId(opts); + + opts.loopRequired = opts.loopRequired || Infinity; + if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true; + if (opts.serialize === undefined) opts.serialize = stableStringify; + this._metaOpts = getMetaSchemaOptions(this); + + if (opts.formats) addInitialFormats(this); + if (opts.keywords) addInitialKeywords(this); + addDefaultMetaSchema(this); + if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta); + if (opts.nullable) this.addKeyword('nullable', {metaSchema: {type: 'boolean'}}); + addInitialSchemas(this); +} + + + +/** + * Validate data using schema + * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize. + * @this Ajv + * @param {String|Object} schemaKeyRef key, ref or schema object + * @param {Any} data to be validated + * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`). + */ +function validate(schemaKeyRef, data) { + var v; + if (typeof schemaKeyRef == 'string') { + v = this.getSchema(schemaKeyRef); + if (!v) throw new Error('no schema with key or ref "' + schemaKeyRef + '"'); + } else { + var schemaObj = this._addSchema(schemaKeyRef); + v = schemaObj.validate || this._compile(schemaObj); + } + + var valid = v(data); + if (v.$async !== true) this.errors = v.errors; + return valid; +} + + +/** + * Create validating function for passed schema. + * @this Ajv + * @param {Object} schema schema object + * @param {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords. + * @return {Function} validating function + */ +function compile(schema, _meta) { + var schemaObj = this._addSchema(schema, undefined, _meta); + return schemaObj.validate || this._compile(schemaObj); +} + + +/** + * Adds schema to the instance. + * @this Ajv + * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored. + * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`. + * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead. + * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead. + * @return {Ajv} this for method chaining + */ +function addSchema(schema, key, _skipValidation, _meta) { + if (Array.isArray(schema)){ + for (var i=0; i} errors optional array of validation errors, if not passed errors from the instance are used. + * @param {Object} options optional options with properties `separator` and `dataVar`. + * @return {String} human readable string with all errors descriptions + */ +function errorsText(errors, options) { + errors = errors || this.errors; + if (!errors) return 'No errors'; + options = options || {}; + var separator = options.separator === undefined ? ', ' : options.separator; + var dataVar = options.dataVar === undefined ? 'data' : options.dataVar; + + var text = ''; + for (var i=0; i%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i; +// For the source: https://gist.github.com/dperini/729294 +// For test cases: https://mathiasbynens.be/demo/url-regex +// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983. +// var URL = /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)(?:\.(?:[a-z\u{00a1}-\u{ffff}0-9]+-)*[a-z\u{00a1}-\u{ffff}0-9]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu; +var URL = /^(?:(?:http[s\u017F]?|ftp):\/\/)(?:(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+(?::(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?@)?(?:(?!10(?:\.[0-9]{1,3}){3})(?!127(?:\.[0-9]{1,3}){3})(?!169\.254(?:\.[0-9]{1,3}){2})(?!192\.168(?:\.[0-9]{1,3}){2})(?!172\.(?:1[6-9]|2[0-9]|3[01])(?:\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)(?:\.(?:(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+-)*(?:[0-9a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])+)*(?:\.(?:(?:[a-z\xA1-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\/(?:[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uD7FF\uE000-\uFEFE\uFF00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*)?$/i; +var UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i; +var JSON_POINTER = /^(?:\/(?:[^~/]|~0|~1)*)*$/; +var JSON_POINTER_URI_FRAGMENT = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i; +var RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/; + + +module.exports = formats; + +function formats(mode) { + mode = mode == 'full' ? 'full' : 'fast'; + return util.copy(formats[mode]); +} + + +formats.fast = { + // date: http://tools.ietf.org/html/rfc3339#section-5.6 + date: /^\d\d\d\d-[0-1]\d-[0-3]\d$/, + // date-time: http://tools.ietf.org/html/rfc3339#section-5.6 + time: /^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, + 'date-time': /^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, + // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js + uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i, + 'uri-reference': /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i, + 'uri-template': URITEMPLATE, + url: URL, + // email (sources from jsen validator): + // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363 + // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation') + email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i, + hostname: HOSTNAME, + // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + // uuid: http://tools.ietf.org/html/rfc4122 + uuid: UUID, + // JSON-pointer: https://tools.ietf.org/html/rfc6901 + // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00 + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +formats.full = { + date: date, + time: time, + 'date-time': date_time, + uri: uri, + 'uri-reference': URIREF, + 'uri-template': URITEMPLATE, + url: URL, + email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i, + hostname: HOSTNAME, + ipv4: /^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/, + ipv6: /^\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*$/i, + regex: regex, + uuid: UUID, + 'json-pointer': JSON_POINTER, + 'json-pointer-uri-fragment': JSON_POINTER_URI_FRAGMENT, + 'relative-json-pointer': RELATIVE_JSON_POINTER +}; + + +function isLeapYear(year) { + // https://tools.ietf.org/html/rfc3339#appendix-C + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} + + +function date(str) { + // full-date from http://tools.ietf.org/html/rfc3339#section-5.6 + var matches = str.match(DATE); + if (!matches) return false; + + var year = +matches[1]; + var month = +matches[2]; + var day = +matches[3]; + + return month >= 1 && month <= 12 && day >= 1 && + day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month]); +} + + +function time(str, full) { + var matches = str.match(TIME); + if (!matches) return false; + + var hour = matches[1]; + var minute = matches[2]; + var second = matches[3]; + var timeZone = matches[5]; + return ((hour <= 23 && minute <= 59 && second <= 59) || + (hour == 23 && minute == 59 && second == 60)) && + (!full || timeZone); +} + + +var DATE_TIME_SEPARATOR = /t|\s/i; +function date_time(str) { + // http://tools.ietf.org/html/rfc3339#section-5.6 + var dateTime = str.split(DATE_TIME_SEPARATOR); + return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true); +} + + +var NOT_URI_FRAGMENT = /\/|:/; +function uri(str) { + // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required "." + return NOT_URI_FRAGMENT.test(str) && URI.test(str); +} + + +var Z_ANCHOR = /[^\\]\\Z/; +function regex(str) { + if (Z_ANCHOR.test(str)) return false; + try { + new RegExp(str); + return true; + } catch(e) { + return false; + } +} diff --git a/node_sid/node_modules/ajv/lib/compile/index.js b/node_sid/node_modules/ajv/lib/compile/index.js new file mode 100644 index 0000000..97518c4 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/compile/index.js @@ -0,0 +1,387 @@ +'use strict'; + +var resolve = require('./resolve') + , util = require('./util') + , errorClasses = require('./error_classes') + , stableStringify = require('fast-json-stable-stringify'); + +var validateGenerator = require('../dotjs/validate'); + +/** + * Functions below are used inside compiled validations function + */ + +var ucs2length = util.ucs2length; +var equal = require('fast-deep-equal'); + +// this error is thrown by async schemas to return validation errors via exception +var ValidationError = errorClasses.Validation; + +module.exports = compile; + + +/** + * Compiles schema to validation function + * @this Ajv + * @param {Object} schema schema object + * @param {Object} root object with information about the root schema for this schema + * @param {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution + * @param {String} baseId base ID for IDs in the schema + * @return {Function} validation function + */ +function compile(schema, root, localRefs, baseId) { + /* jshint validthis: true, evil: true */ + /* eslint no-shadow: 0 */ + var self = this + , opts = this._opts + , refVal = [ undefined ] + , refs = {} + , patterns = [] + , patternsHash = {} + , defaults = [] + , defaultsHash = {} + , customRules = []; + + root = root || { schema: schema, refVal: refVal, refs: refs }; + + var c = checkCompiling.call(this, schema, root, baseId); + var compilation = this._compilations[c.index]; + if (c.compiling) return (compilation.callValidate = callValidate); + + var formats = this._formats; + var RULES = this.RULES; + + try { + var v = localCompile(schema, root, localRefs, baseId); + compilation.validate = v; + var cv = compilation.callValidate; + if (cv) { + cv.schema = v.schema; + cv.errors = null; + cv.refs = v.refs; + cv.refVal = v.refVal; + cv.root = v.root; + cv.$async = v.$async; + if (opts.sourceCode) cv.source = v.source; + } + return v; + } finally { + endCompiling.call(this, schema, root, baseId); + } + + /* @this {*} - custom context, see passContext option */ + function callValidate() { + /* jshint validthis: true */ + var validate = compilation.validate; + var result = validate.apply(this, arguments); + callValidate.errors = validate.errors; + return result; + } + + function localCompile(_schema, _root, localRefs, baseId) { + var isRoot = !_root || (_root && _root.schema == _schema); + if (_root.schema != root.schema) + return compile.call(self, _schema, _root, localRefs, baseId); + + var $async = _schema.$async === true; + + var sourceCode = validateGenerator({ + isTop: true, + schema: _schema, + isRoot: isRoot, + baseId: baseId, + root: _root, + schemaPath: '', + errSchemaPath: '#', + errorPath: '""', + MissingRefError: errorClasses.MissingRef, + RULES: RULES, + validate: validateGenerator, + util: util, + resolve: resolve, + resolveRef: resolveRef, + usePattern: usePattern, + useDefault: useDefault, + useCustomRule: useCustomRule, + opts: opts, + formats: formats, + logger: self.logger, + self: self + }); + + sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode) + + vars(defaults, defaultCode) + vars(customRules, customRuleCode) + + sourceCode; + + if (opts.processCode) sourceCode = opts.processCode(sourceCode, _schema); + // console.log('\n\n\n *** \n', JSON.stringify(sourceCode)); + var validate; + try { + var makeValidate = new Function( + 'self', + 'RULES', + 'formats', + 'root', + 'refVal', + 'defaults', + 'customRules', + 'equal', + 'ucs2length', + 'ValidationError', + sourceCode + ); + + validate = makeValidate( + self, + RULES, + formats, + root, + refVal, + defaults, + customRules, + equal, + ucs2length, + ValidationError + ); + + refVal[0] = validate; + } catch(e) { + self.logger.error('Error compiling schema, function code:', sourceCode); + throw e; + } + + validate.schema = _schema; + validate.errors = null; + validate.refs = refs; + validate.refVal = refVal; + validate.root = isRoot ? validate : _root; + if ($async) validate.$async = true; + if (opts.sourceCode === true) { + validate.source = { + code: sourceCode, + patterns: patterns, + defaults: defaults + }; + } + + return validate; + } + + function resolveRef(baseId, ref, isRoot) { + ref = resolve.url(baseId, ref); + var refIndex = refs[ref]; + var _refVal, refCode; + if (refIndex !== undefined) { + _refVal = refVal[refIndex]; + refCode = 'refVal[' + refIndex + ']'; + return resolvedRef(_refVal, refCode); + } + if (!isRoot && root.refs) { + var rootRefId = root.refs[ref]; + if (rootRefId !== undefined) { + _refVal = root.refVal[rootRefId]; + refCode = addLocalRef(ref, _refVal); + return resolvedRef(_refVal, refCode); + } + } + + refCode = addLocalRef(ref); + var v = resolve.call(self, localCompile, root, ref); + if (v === undefined) { + var localSchema = localRefs && localRefs[ref]; + if (localSchema) { + v = resolve.inlineRef(localSchema, opts.inlineRefs) + ? localSchema + : compile.call(self, localSchema, root, localRefs, baseId); + } + } + + if (v === undefined) { + removeLocalRef(ref); + } else { + replaceLocalRef(ref, v); + return resolvedRef(v, refCode); + } + } + + function addLocalRef(ref, v) { + var refId = refVal.length; + refVal[refId] = v; + refs[ref] = refId; + return 'refVal' + refId; + } + + function removeLocalRef(ref) { + delete refs[ref]; + } + + function replaceLocalRef(ref, v) { + var refId = refs[ref]; + refVal[refId] = v; + } + + function resolvedRef(refVal, code) { + return typeof refVal == 'object' || typeof refVal == 'boolean' + ? { code: code, schema: refVal, inline: true } + : { code: code, $async: refVal && !!refVal.$async }; + } + + function usePattern(regexStr) { + var index = patternsHash[regexStr]; + if (index === undefined) { + index = patternsHash[regexStr] = patterns.length; + patterns[index] = regexStr; + } + return 'pattern' + index; + } + + function useDefault(value) { + switch (typeof value) { + case 'boolean': + case 'number': + return '' + value; + case 'string': + return util.toQuotedString(value); + case 'object': + if (value === null) return 'null'; + var valueStr = stableStringify(value); + var index = defaultsHash[valueStr]; + if (index === undefined) { + index = defaultsHash[valueStr] = defaults.length; + defaults[index] = value; + } + return 'default' + index; + } + } + + function useCustomRule(rule, schema, parentSchema, it) { + if (self._opts.validateSchema !== false) { + var deps = rule.definition.dependencies; + if (deps && !deps.every(function(keyword) { + return Object.prototype.hasOwnProperty.call(parentSchema, keyword); + })) + throw new Error('parent schema must have all required keywords: ' + deps.join(',')); + + var validateSchema = rule.definition.validateSchema; + if (validateSchema) { + var valid = validateSchema(schema); + if (!valid) { + var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors); + if (self._opts.validateSchema == 'log') self.logger.error(message); + else throw new Error(message); + } + } + } + + var compile = rule.definition.compile + , inline = rule.definition.inline + , macro = rule.definition.macro; + + var validate; + if (compile) { + validate = compile.call(self, schema, parentSchema, it); + } else if (macro) { + validate = macro.call(self, schema, parentSchema, it); + if (opts.validateSchema !== false) self.validateSchema(validate, true); + } else if (inline) { + validate = inline.call(self, it, rule.keyword, schema, parentSchema); + } else { + validate = rule.definition.validate; + if (!validate) return; + } + + if (validate === undefined) + throw new Error('custom keyword "' + rule.keyword + '"failed to compile'); + + var index = customRules.length; + customRules[index] = validate; + + return { + code: 'customRule' + index, + validate: validate + }; + } +} + + +/** + * Checks if the schema is currently compiled + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Object} object with properties "index" (compilation index) and "compiling" (boolean) + */ +function checkCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var index = compIndex.call(this, schema, root, baseId); + if (index >= 0) return { index: index, compiling: true }; + index = this._compilations.length; + this._compilations[index] = { + schema: schema, + root: root, + baseId: baseId + }; + return { index: index, compiling: false }; +} + + +/** + * Removes the schema from the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + */ +function endCompiling(schema, root, baseId) { + /* jshint validthis: true */ + var i = compIndex.call(this, schema, root, baseId); + if (i >= 0) this._compilations.splice(i, 1); +} + + +/** + * Index of schema compilation in the currently compiled list + * @this Ajv + * @param {Object} schema schema to compile + * @param {Object} root root object + * @param {String} baseId base schema ID + * @return {Integer} compilation index + */ +function compIndex(schema, root, baseId) { + /* jshint validthis: true */ + for (var i=0; i= 0xD800 && value <= 0xDBFF && pos < len) { + // high surrogate, and there is a next character + value = str.charCodeAt(pos); + if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate + } + } + return length; +}; diff --git a/node_sid/node_modules/ajv/lib/compile/util.js b/node_sid/node_modules/ajv/lib/compile/util.js new file mode 100644 index 0000000..ef07b8c --- /dev/null +++ b/node_sid/node_modules/ajv/lib/compile/util.js @@ -0,0 +1,239 @@ +'use strict'; + + +module.exports = { + copy: copy, + checkDataType: checkDataType, + checkDataTypes: checkDataTypes, + coerceToTypes: coerceToTypes, + toHash: toHash, + getProperty: getProperty, + escapeQuotes: escapeQuotes, + equal: require('fast-deep-equal'), + ucs2length: require('./ucs2length'), + varOccurences: varOccurences, + varReplace: varReplace, + schemaHasRules: schemaHasRules, + schemaHasRulesExcept: schemaHasRulesExcept, + schemaUnknownRules: schemaUnknownRules, + toQuotedString: toQuotedString, + getPathExpr: getPathExpr, + getPath: getPath, + getData: getData, + unescapeFragment: unescapeFragment, + unescapeJsonPointer: unescapeJsonPointer, + escapeFragment: escapeFragment, + escapeJsonPointer: escapeJsonPointer +}; + + +function copy(o, to) { + to = to || {}; + for (var key in o) to[key] = o[key]; + return to; +} + + +function checkDataType(dataType, data, strictNumbers, negate) { + var EQUAL = negate ? ' !== ' : ' === ' + , AND = negate ? ' || ' : ' && ' + , OK = negate ? '!' : '' + , NOT = negate ? '' : '!'; + switch (dataType) { + case 'null': return data + EQUAL + 'null'; + case 'array': return OK + 'Array.isArray(' + data + ')'; + case 'object': return '(' + OK + data + AND + + 'typeof ' + data + EQUAL + '"object"' + AND + + NOT + 'Array.isArray(' + data + '))'; + case 'integer': return '(typeof ' + data + EQUAL + '"number"' + AND + + NOT + '(' + data + ' % 1)' + + AND + data + EQUAL + data + + (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; + case 'number': return '(typeof ' + data + EQUAL + '"' + dataType + '"' + + (strictNumbers ? (AND + OK + 'isFinite(' + data + ')') : '') + ')'; + default: return 'typeof ' + data + EQUAL + '"' + dataType + '"'; + } +} + + +function checkDataTypes(dataTypes, data, strictNumbers) { + switch (dataTypes.length) { + case 1: return checkDataType(dataTypes[0], data, strictNumbers, true); + default: + var code = ''; + var types = toHash(dataTypes); + if (types.array && types.object) { + code = types.null ? '(': '(!' + data + ' || '; + code += 'typeof ' + data + ' !== "object")'; + delete types.null; + delete types.array; + delete types.object; + } + if (types.number) delete types.integer; + for (var t in types) + code += (code ? ' && ' : '' ) + checkDataType(t, data, strictNumbers, true); + + return code; + } +} + + +var COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]); +function coerceToTypes(optionCoerceTypes, dataTypes) { + if (Array.isArray(dataTypes)) { + var types = []; + for (var i=0; i= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl); + return paths[lvl - up]; + } + + if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl); + data = 'data' + ((lvl - up) || ''); + if (!jsonPointer) return data; + } + + var expr = data; + var segments = jsonPointer.split('/'); + for (var i=0; i' + , $notOp = $isMax ? '>' : '<' + , $errorKeyword = undefined; + + if (!($isData || typeof $schema == 'number' || $schema === undefined)) { + throw new Error($keyword + ' must be number'); + } + if (!($isDataExcl || $schemaExcl === undefined + || typeof $schemaExcl == 'number' + || typeof $schemaExcl == 'boolean')) { + throw new Error($exclusiveKeyword + ' must be number or boolean'); + } +}} + +{{? $isDataExcl }} + {{ + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr) + , $exclusive = 'exclusive' + $lvl + , $exclType = 'exclType' + $lvl + , $exclIsNumber = 'exclIsNumber' + $lvl + , $opExpr = 'op' + $lvl + , $opStr = '\' + ' + $opExpr + ' + \''; + }} + var schemaExcl{{=$lvl}} = {{=$schemaValueExcl}}; + {{ $schemaValueExcl = 'schemaExcl' + $lvl; }} + + var {{=$exclusive}}; + var {{=$exclType}} = typeof {{=$schemaValueExcl}}; + if ({{=$exclType}} != 'boolean' && {{=$exclType}} != 'undefined' && {{=$exclType}} != 'number') { + {{ var $errorKeyword = $exclusiveKeyword; }} + {{# def.error:'_exclusiveLimit' }} + } else if ({{# def.$dataNotType:'number' }} + {{=$exclType}} == 'number' + ? ( + ({{=$exclusive}} = {{=$schemaValue}} === undefined || {{=$schemaValueExcl}} {{=$op}}= {{=$schemaValue}}) + ? {{=$data}} {{=$notOp}}= {{=$schemaValueExcl}} + : {{=$data}} {{=$notOp}} {{=$schemaValue}} + ) + : ( + ({{=$exclusive}} = {{=$schemaValueExcl}} === true) + ? {{=$data}} {{=$notOp}}= {{=$schemaValue}} + : {{=$data}} {{=$notOp}} {{=$schemaValue}} + ) + || {{=$data}} !== {{=$data}}) { + var op{{=$lvl}} = {{=$exclusive}} ? '{{=$op}}' : '{{=$op}}='; + {{ + if ($schema === undefined) { + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaValueExcl; + $isData = $isDataExcl; + } + }} +{{??}} + {{ + var $exclIsNumber = typeof $schemaExcl == 'number' + , $opStr = $op; /*used in error*/ + }} + + {{? $exclIsNumber && $isData }} + {{ var $opExpr = '\'' + $opStr + '\''; /*used in error*/ }} + if ({{# def.$dataNotType:'number' }} + ( {{=$schemaValue}} === undefined + || {{=$schemaExcl}} {{=$op}}= {{=$schemaValue}} + ? {{=$data}} {{=$notOp}}= {{=$schemaExcl}} + : {{=$data}} {{=$notOp}} {{=$schemaValue}} ) + || {{=$data}} !== {{=$data}}) { + {{??}} + {{ + if ($exclIsNumber && $schema === undefined) { + {{# def.setExclusiveLimit }} + $schemaValue = $schemaExcl; + $notOp += '='; + } else { + if ($exclIsNumber) + $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); + + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { + {{# def.setExclusiveLimit }} + $notOp += '='; + } else { + $exclusive = false; + $opStr += '='; + } + } + + var $opExpr = '\'' + $opStr + '\''; /*used in error*/ + }} + + if ({{# def.$dataNotType:'number' }} + {{=$data}} {{=$notOp}} {{=$schemaValue}} + || {{=$data}} !== {{=$data}}) { + {{?}} +{{?}} + {{ $errorKeyword = $errorKeyword || $keyword; }} + {{# def.error:'_limit' }} + } {{? $breakOnError }} else { {{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/_limitItems.jst b/node_sid/node_modules/ajv/lib/dot/_limitItems.jst new file mode 100644 index 0000000..741329e --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/_limitItems.jst @@ -0,0 +1,12 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{# def.numberKeyword }} + +{{ var $op = $keyword == 'maxItems' ? '>' : '<'; }} +if ({{# def.$dataNotType:'number' }} {{=$data}}.length {{=$op}} {{=$schemaValue}}) { + {{ var $errorKeyword = $keyword; }} + {{# def.error:'_limitItems' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/_limitLength.jst b/node_sid/node_modules/ajv/lib/dot/_limitLength.jst new file mode 100644 index 0000000..285c66b --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/_limitLength.jst @@ -0,0 +1,12 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{# def.numberKeyword }} + +{{ var $op = $keyword == 'maxLength' ? '>' : '<'; }} +if ({{# def.$dataNotType:'number' }} {{# def.strLength }} {{=$op}} {{=$schemaValue}}) { + {{ var $errorKeyword = $keyword; }} + {{# def.error:'_limitLength' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/_limitProperties.jst b/node_sid/node_modules/ajv/lib/dot/_limitProperties.jst new file mode 100644 index 0000000..c4c2155 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/_limitProperties.jst @@ -0,0 +1,12 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{# def.numberKeyword }} + +{{ var $op = $keyword == 'maxProperties' ? '>' : '<'; }} +if ({{# def.$dataNotType:'number' }} Object.keys({{=$data}}).length {{=$op}} {{=$schemaValue}}) { + {{ var $errorKeyword = $keyword; }} + {{# def.error:'_limitProperties' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/allOf.jst b/node_sid/node_modules/ajv/lib/dot/allOf.jst new file mode 100644 index 0000000..0e782fe --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/allOf.jst @@ -0,0 +1,32 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{ + var $currentBaseId = $it.baseId + , $allSchemasEmpty = true; +}} + +{{~ $schema:$sch:$i }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{ + $allSchemasEmpty = false; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + }} + + {{# def.insertSubschemaCode }} + + {{# def.ifResultValid }} + {{?}} +{{~}} + +{{? $breakOnError }} + {{? $allSchemasEmpty }} + if (true) { + {{??}} + {{= $closingBraces.slice(0,-1) }} + {{?}} +{{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/anyOf.jst b/node_sid/node_modules/ajv/lib/dot/anyOf.jst new file mode 100644 index 0000000..ea909ee --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/anyOf.jst @@ -0,0 +1,46 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{ + var $noEmptySchema = $schema.every(function($sch) { + return {{# def.nonEmptySchema:$sch }}; + }); +}} +{{? $noEmptySchema }} + {{ var $currentBaseId = $it.baseId; }} + var {{=$errs}} = errors; + var {{=$valid}} = false; + + {{# def.setCompositeRule }} + + {{~ $schema:$sch:$i }} + {{ + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + }} + + {{# def.insertSubschemaCode }} + + {{=$valid}} = {{=$valid}} || {{=$nextValid}}; + + if (!{{=$valid}}) { + {{ $closingBraces += '}'; }} + {{~}} + + {{# def.resetCompositeRule }} + + {{= $closingBraces }} + + if (!{{=$valid}}) { + {{# def.extraError:'anyOf' }} + } else { + {{# def.resetErrors }} + {{? it.opts.allErrors }} } {{?}} +{{??}} + {{? $breakOnError }} + if (true) { + {{?}} +{{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/coerce.def b/node_sid/node_modules/ajv/lib/dot/coerce.def new file mode 100644 index 0000000..c947ed6 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/coerce.def @@ -0,0 +1,51 @@ +{{## def.coerceType: + {{ + var $dataType = 'dataType' + $lvl + , $coerced = 'coerced' + $lvl; + }} + var {{=$dataType}} = typeof {{=$data}}; + var {{=$coerced}} = undefined; + + {{? it.opts.coerceTypes == 'array' }} + if ({{=$dataType}} == 'object' && Array.isArray({{=$data}}) && {{=$data}}.length == 1) { + {{=$data}} = {{=$data}}[0]; + {{=$dataType}} = typeof {{=$data}}; + if ({{=it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)}}) {{=$coerced}} = {{=$data}}; + } + {{?}} + + if ({{=$coerced}} !== undefined) ; + {{~ $coerceToTypes:$type:$i }} + {{? $type == 'string' }} + else if ({{=$dataType}} == 'number' || {{=$dataType}} == 'boolean') + {{=$coerced}} = '' + {{=$data}}; + else if ({{=$data}} === null) {{=$coerced}} = ''; + {{?? $type == 'number' || $type == 'integer' }} + else if ({{=$dataType}} == 'boolean' || {{=$data}} === null + || ({{=$dataType}} == 'string' && {{=$data}} && {{=$data}} == +{{=$data}} + {{? $type == 'integer' }} && !({{=$data}} % 1){{?}})) + {{=$coerced}} = +{{=$data}}; + {{?? $type == 'boolean' }} + else if ({{=$data}} === 'false' || {{=$data}} === 0 || {{=$data}} === null) + {{=$coerced}} = false; + else if ({{=$data}} === 'true' || {{=$data}} === 1) + {{=$coerced}} = true; + {{?? $type == 'null' }} + else if ({{=$data}} === '' || {{=$data}} === 0 || {{=$data}} === false) + {{=$coerced}} = null; + {{?? it.opts.coerceTypes == 'array' && $type == 'array' }} + else if ({{=$dataType}} == 'string' || {{=$dataType}} == 'number' || {{=$dataType}} == 'boolean' || {{=$data}} == null) + {{=$coerced}} = [{{=$data}}]; + {{?}} + {{~}} + else { + {{# def.error:'type' }} + } + + if ({{=$coerced}} !== undefined) { + {{# def.setParentData }} + {{=$data}} = {{=$coerced}}; + {{? !$dataLvl }}if ({{=$parentData}} !== undefined){{?}} + {{=$parentData}}[{{=$parentDataProperty}}] = {{=$coerced}}; + } +#}} diff --git a/node_sid/node_modules/ajv/lib/dot/comment.jst b/node_sid/node_modules/ajv/lib/dot/comment.jst new file mode 100644 index 0000000..f959150 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/comment.jst @@ -0,0 +1,9 @@ +{{# def.definitions }} +{{# def.setupKeyword }} + +{{ var $comment = it.util.toQuotedString($schema); }} +{{? it.opts.$comment === true }} + console.log({{=$comment}}); +{{?? typeof it.opts.$comment == 'function' }} + self._opts.$comment({{=$comment}}, {{=it.util.toQuotedString($errSchemaPath)}}, validate.root.schema); +{{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/const.jst b/node_sid/node_modules/ajv/lib/dot/const.jst new file mode 100644 index 0000000..2aa2298 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/const.jst @@ -0,0 +1,11 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{? !$isData }} + var schema{{=$lvl}} = validate.schema{{=$schemaPath}}; +{{?}} +var {{=$valid}} = equal({{=$data}}, schema{{=$lvl}}); +{{# def.checkError:'const' }} +{{? $breakOnError }} else { {{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/contains.jst b/node_sid/node_modules/ajv/lib/dot/contains.jst new file mode 100644 index 0000000..4dc9967 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/contains.jst @@ -0,0 +1,55 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{ + var $idx = 'i' + $lvl + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $currentBaseId = it.baseId + , $nonEmptySchema = {{# def.nonEmptySchema:$schema }}; +}} + +var {{=$errs}} = errors; +var {{=$valid}}; + +{{? $nonEmptySchema }} + {{# def.setCompositeRule }} + + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + + var {{=$nextValid}} = false; + + for (var {{=$idx}} = 0; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) { + {{ + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + + if ({{=$nextValid}}) break; + } + + {{# def.resetCompositeRule }} + {{= $closingBraces }} + + if (!{{=$nextValid}}) { +{{??}} + if ({{=$data}}.length == 0) { +{{?}} + + {{# def.error:'contains' }} + } else { + {{? $nonEmptySchema }} + {{# def.resetErrors }} + {{?}} + {{? it.opts.allErrors }} } {{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/custom.jst b/node_sid/node_modules/ajv/lib/dot/custom.jst new file mode 100644 index 0000000..d30588f --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/custom.jst @@ -0,0 +1,191 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ + var $rule = this + , $definition = 'definition' + $lvl + , $rDef = $rule.definition + , $closingBraces = ''; + var $validate = $rDef.validate; + var $compile, $inline, $macro, $ruleValidate, $validateCode; +}} + +{{? $isData && $rDef.$data }} + {{ + $validateCode = 'keywordValidate' + $lvl; + var $validateSchema = $rDef.validateSchema; + }} + var {{=$definition}} = RULES.custom['{{=$keyword}}'].definition; + var {{=$validateCode}} = {{=$definition}}.validate; +{{??}} + {{ + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); + if (!$ruleValidate) return; + $schemaValue = 'validate.schema' + $schemaPath; + $validateCode = $ruleValidate.code; + $compile = $rDef.compile; + $inline = $rDef.inline; + $macro = $rDef.macro; + }} +{{?}} + +{{ + var $ruleErrs = $validateCode + '.errors' + , $i = 'i' + $lvl + , $ruleErr = 'ruleErr' + $lvl + , $asyncKeyword = $rDef.async; + + if ($asyncKeyword && !it.async) + throw new Error('async keyword in sync schema'); +}} + + +{{? !($inline || $macro) }}{{=$ruleErrs}} = null;{{?}} +var {{=$errs}} = errors; +var {{=$valid}}; + +{{## def.callRuleValidate: + {{=$validateCode}}.call( + {{? it.opts.passContext }}this{{??}}self{{?}} + {{? $compile || $rDef.schema === false }} + , {{=$data}} + {{??}} + , {{=$schemaValue}} + , {{=$data}} + , validate.schema{{=it.schemaPath}} + {{?}} + , {{# def.dataPath }} + {{# def.passParentData }} + , rootData + ) +#}} + +{{## def.extendErrors:_inline: + for (var {{=$i}}={{=$errs}}; {{=$i}} 0) + || _schema === false + : it.util.schemaHasRules(_schema, it.RULES.all)) +#}} + + +{{## def.strLength: + {{? it.opts.unicode === false }} + {{=$data}}.length + {{??}} + ucs2length({{=$data}}) + {{?}} +#}} + + +{{## def.willOptimize: + it.util.varOccurences($code, $nextData) < 2 +#}} + + +{{## def.generateSubschemaCode: + {{ + var $code = it.validate($it); + $it.baseId = $currentBaseId; + }} +#}} + + +{{## def.insertSubschemaCode: + {{= it.validate($it) }} + {{ $it.baseId = $currentBaseId; }} +#}} + + +{{## def._optimizeValidate: + it.util.varReplace($code, $nextData, $passData) +#}} + + +{{## def.optimizeValidate: + {{? {{# def.willOptimize}} }} + {{= {{# def._optimizeValidate }} }} + {{??}} + var {{=$nextData}} = {{=$passData}}; + {{= $code }} + {{?}} +#}} + + +{{## def.$data: + {{ + var $isData = it.opts.$data && $schema && $schema.$data + , $schemaValue; + }} + {{? $isData }} + var schema{{=$lvl}} = {{= it.util.getData($schema.$data, $dataLvl, it.dataPathArr) }}; + {{ $schemaValue = 'schema' + $lvl; }} + {{??}} + {{ $schemaValue = $schema; }} + {{?}} +#}} + + +{{## def.$dataNotType:_type: + {{?$isData}} ({{=$schemaValue}} !== undefined && typeof {{=$schemaValue}} != _type) || {{?}} +#}} + + +{{## def.check$dataIsArray: + if (schema{{=$lvl}} === undefined) {{=$valid}} = true; + else if (!Array.isArray(schema{{=$lvl}})) {{=$valid}} = false; + else { +#}} + + +{{## def.numberKeyword: + {{? !($isData || typeof $schema == 'number') }} + {{ throw new Error($keyword + ' must be number'); }} + {{?}} +#}} + + +{{## def.beginDefOut: + {{ + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + }} +#}} + + +{{## def.storeDefOut:_variable: + {{ + var _variable = out; + out = $$outStack.pop(); + }} +#}} + + +{{## def.dataPath:(dataPath || ''){{? it.errorPath != '""'}} + {{= it.errorPath }}{{?}}#}} + +{{## def.setParentData: + {{ + var $parentData = $dataLvl ? 'data' + (($dataLvl-1)||'') : 'parentData' + , $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + }} +#}} + +{{## def.passParentData: + {{# def.setParentData }} + , {{= $parentData }} + , {{= $parentDataProperty }} +#}} + + +{{## def.iterateProperties: + {{? $ownProperties }} + {{=$dataProperties}} = {{=$dataProperties}} || Object.keys({{=$data}}); + for (var {{=$idx}}=0; {{=$idx}}<{{=$dataProperties}}.length; {{=$idx}}++) { + var {{=$key}} = {{=$dataProperties}}[{{=$idx}}]; + {{??}} + for (var {{=$key}} in {{=$data}}) { + {{?}} +#}} + + +{{## def.noPropertyInData: + {{=$useData}} === undefined + {{? $ownProperties }} + || !{{# def.isOwnProperty }} + {{?}} +#}} + + +{{## def.isOwnProperty: + Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($propertyKey)}}') +#}} diff --git a/node_sid/node_modules/ajv/lib/dot/dependencies.jst b/node_sid/node_modules/ajv/lib/dot/dependencies.jst new file mode 100644 index 0000000..e4bddde --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/dependencies.jst @@ -0,0 +1,79 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.missing }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.propertyInData: + {{=$data}}{{= it.util.getProperty($property) }} !== undefined + {{? $ownProperties }} + && Object.prototype.hasOwnProperty.call({{=$data}}, '{{=it.util.escapeQuotes($property)}}') + {{?}} +#}} + + +{{ + var $schemaDeps = {} + , $propertyDeps = {} + , $ownProperties = it.opts.ownProperties; + + for ($property in $schema) { + if ($property == '__proto__') continue; + var $sch = $schema[$property]; + var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps; + $deps[$property] = $sch; + } +}} + +var {{=$errs}} = errors; + +{{ var $currentErrorPath = it.errorPath; }} + +var missing{{=$lvl}}; +{{ for (var $property in $propertyDeps) { }} + {{ $deps = $propertyDeps[$property]; }} + {{? $deps.length }} + if ({{# def.propertyInData }} + {{? $breakOnError }} + && ({{# def.checkMissingProperty:$deps }})) { + {{# def.errorMissingProperty:'dependencies' }} + {{??}} + ) { + {{~ $deps:$propertyKey }} + {{# def.allErrorsMissingProperty:'dependencies' }} + {{~}} + {{?}} + } {{# def.elseIfValid }} + {{?}} +{{ } }} + +{{ + it.errorPath = $currentErrorPath; + var $currentBaseId = $it.baseId; +}} + + +{{ for (var $property in $schemaDeps) { }} + {{ var $sch = $schemaDeps[$property]; }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{=$nextValid}} = true; + + if ({{# def.propertyInData }}) { + {{ + $it.schema = $sch; + $it.schemaPath = $schemaPath + it.util.getProperty($property); + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); + }} + + {{# def.insertSubschemaCode }} + } + + {{# def.ifResultValid }} + {{?}} +{{ } }} + +{{? $breakOnError }} + {{= $closingBraces }} + if ({{=$errs}} == errors) { +{{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/enum.jst b/node_sid/node_modules/ajv/lib/dot/enum.jst new file mode 100644 index 0000000..357c2e8 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/enum.jst @@ -0,0 +1,30 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ + var $i = 'i' + $lvl + , $vSchema = 'schema' + $lvl; +}} + +{{? !$isData }} + var {{=$vSchema}} = validate.schema{{=$schemaPath}}; +{{?}} +var {{=$valid}}; + +{{?$isData}}{{# def.check$dataIsArray }}{{?}} + +{{=$valid}} = false; + +for (var {{=$i}}=0; {{=$i}}<{{=$vSchema}}.length; {{=$i}}++) + if (equal({{=$data}}, {{=$vSchema}}[{{=$i}}])) { + {{=$valid}} = true; + break; + } + +{{? $isData }} } {{?}} + +{{# def.checkError:'enum' }} + +{{? $breakOnError }} else { {{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/errors.def b/node_sid/node_modules/ajv/lib/dot/errors.def new file mode 100644 index 0000000..5c5752c --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/errors.def @@ -0,0 +1,194 @@ +{{# def.definitions }} + +{{## def._error:_rule: + {{ 'istanbul ignore else'; }} + {{? it.createErrors !== false }} + { + keyword: '{{= $errorKeyword || _rule }}' + , dataPath: (dataPath || '') + {{= it.errorPath }} + , schemaPath: {{=it.util.toQuotedString($errSchemaPath)}} + , params: {{# def._errorParams[_rule] }} + {{? it.opts.messages !== false }} + , message: {{# def._errorMessages[_rule] }} + {{?}} + {{? it.opts.verbose }} + , schema: {{# def._errorSchemas[_rule] }} + , parentSchema: validate.schema{{=it.schemaPath}} + , data: {{=$data}} + {{?}} + } + {{??}} + {} + {{?}} +#}} + + +{{## def._addError:_rule: + if (vErrors === null) vErrors = [err]; + else vErrors.push(err); + errors++; +#}} + + +{{## def.addError:_rule: + var err = {{# def._error:_rule }}; + {{# def._addError:_rule }} +#}} + + +{{## def.error:_rule: + {{# def.beginDefOut}} + {{# def._error:_rule }} + {{# def.storeDefOut:__err }} + + {{? !it.compositeRule && $breakOnError }} + {{ 'istanbul ignore if'; }} + {{? it.async }} + throw new ValidationError([{{=__err}}]); + {{??}} + validate.errors = [{{=__err}}]; + return false; + {{?}} + {{??}} + var err = {{=__err}}; + {{# def._addError:_rule }} + {{?}} +#}} + + +{{## def.extraError:_rule: + {{# def.addError:_rule}} + {{? !it.compositeRule && $breakOnError }} + {{ 'istanbul ignore if'; }} + {{? it.async }} + throw new ValidationError(vErrors); + {{??}} + validate.errors = vErrors; + return false; + {{?}} + {{?}} +#}} + + +{{## def.checkError:_rule: + if (!{{=$valid}}) { + {{# def.error:_rule }} + } +#}} + + +{{## def.resetErrors: + errors = {{=$errs}}; + if (vErrors !== null) { + if ({{=$errs}}) vErrors.length = {{=$errs}}; + else vErrors = null; + } +#}} + + +{{## def.concatSchema:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=$schema}}{{?}}#}} +{{## def.appendSchema:{{?$isData}}' + {{=$schemaValue}}{{??}}{{=$schemaValue}}'{{?}}#}} +{{## def.concatSchemaEQ:{{?$isData}}' + {{=$schemaValue}} + '{{??}}{{=it.util.escapeQuotes($schema)}}{{?}}#}} + +{{## def._errorMessages = { + 'false schema': "'boolean schema is false'", + $ref: "'can\\\'t resolve reference {{=it.util.escapeQuotes($schema)}}'", + additionalItems: "'should NOT have more than {{=$schema.length}} items'", + additionalProperties: "'{{? it.opts._errorDataPathProperty }}is an invalid additional property{{??}}should NOT have additional properties{{?}}'", + anyOf: "'should match some schema in anyOf'", + const: "'should be equal to constant'", + contains: "'should contain a valid item'", + dependencies: "'should have {{? $deps.length == 1 }}property {{= it.util.escapeQuotes($deps[0]) }}{{??}}properties {{= it.util.escapeQuotes($deps.join(\", \")) }}{{?}} when property {{= it.util.escapeQuotes($property) }} is present'", + 'enum': "'should be equal to one of the allowed values'", + format: "'should match format \"{{#def.concatSchemaEQ}}\"'", + 'if': "'should match \"' + {{=$ifClause}} + '\" schema'", + _limit: "'should be {{=$opStr}} {{#def.appendSchema}}", + _exclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'", + _limitItems: "'should NOT have {{?$keyword=='maxItems'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} items'", + _limitLength: "'should NOT be {{?$keyword=='maxLength'}}longer{{??}}shorter{{?}} than {{#def.concatSchema}} characters'", + _limitProperties:"'should NOT have {{?$keyword=='maxProperties'}}more{{??}}fewer{{?}} than {{#def.concatSchema}} properties'", + multipleOf: "'should be multiple of {{#def.appendSchema}}", + not: "'should NOT be valid'", + oneOf: "'should match exactly one schema in oneOf'", + pattern: "'should match pattern \"{{#def.concatSchemaEQ}}\"'", + propertyNames: "'property name \\'{{=$invalidName}}\\' is invalid'", + required: "'{{? it.opts._errorDataPathProperty }}is a required property{{??}}should have required property \\'{{=$missingProperty}}\\'{{?}}'", + type: "'should be {{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}'", + uniqueItems: "'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)'", + custom: "'should pass \"{{=$rule.keyword}}\" keyword validation'", + patternRequired: "'should have property matching pattern \\'{{=$missingPattern}}\\''", + switch: "'should pass \"switch\" keyword validation'", + _formatLimit: "'should be {{=$opStr}} \"{{#def.concatSchemaEQ}}\"'", + _formatExclusiveLimit: "'{{=$exclusiveKeyword}} should be boolean'" +} #}} + + +{{## def.schemaRefOrVal: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=$schema}}{{?}} #}} +{{## def.schemaRefOrQS: {{?$isData}}validate.schema{{=$schemaPath}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}} + +{{## def._errorSchemas = { + 'false schema': "false", + $ref: "{{=it.util.toQuotedString($schema)}}", + additionalItems: "false", + additionalProperties: "false", + anyOf: "validate.schema{{=$schemaPath}}", + const: "validate.schema{{=$schemaPath}}", + contains: "validate.schema{{=$schemaPath}}", + dependencies: "validate.schema{{=$schemaPath}}", + 'enum': "validate.schema{{=$schemaPath}}", + format: "{{#def.schemaRefOrQS}}", + 'if': "validate.schema{{=$schemaPath}}", + _limit: "{{#def.schemaRefOrVal}}", + _exclusiveLimit: "validate.schema{{=$schemaPath}}", + _limitItems: "{{#def.schemaRefOrVal}}", + _limitLength: "{{#def.schemaRefOrVal}}", + _limitProperties:"{{#def.schemaRefOrVal}}", + multipleOf: "{{#def.schemaRefOrVal}}", + not: "validate.schema{{=$schemaPath}}", + oneOf: "validate.schema{{=$schemaPath}}", + pattern: "{{#def.schemaRefOrQS}}", + propertyNames: "validate.schema{{=$schemaPath}}", + required: "validate.schema{{=$schemaPath}}", + type: "validate.schema{{=$schemaPath}}", + uniqueItems: "{{#def.schemaRefOrVal}}", + custom: "validate.schema{{=$schemaPath}}", + patternRequired: "validate.schema{{=$schemaPath}}", + switch: "validate.schema{{=$schemaPath}}", + _formatLimit: "{{#def.schemaRefOrQS}}", + _formatExclusiveLimit: "validate.schema{{=$schemaPath}}" +} #}} + + +{{## def.schemaValueQS: {{?$isData}}{{=$schemaValue}}{{??}}{{=it.util.toQuotedString($schema)}}{{?}} #}} + +{{## def._errorParams = { + 'false schema': "{}", + $ref: "{ ref: '{{=it.util.escapeQuotes($schema)}}' }", + additionalItems: "{ limit: {{=$schema.length}} }", + additionalProperties: "{ additionalProperty: '{{=$additionalProperty}}' }", + anyOf: "{}", + const: "{ allowedValue: schema{{=$lvl}} }", + contains: "{}", + dependencies: "{ property: '{{= it.util.escapeQuotes($property) }}', missingProperty: '{{=$missingProperty}}', depsCount: {{=$deps.length}}, deps: '{{= it.util.escapeQuotes($deps.length==1 ? $deps[0] : $deps.join(\", \")) }}' }", + 'enum': "{ allowedValues: schema{{=$lvl}} }", + format: "{ format: {{#def.schemaValueQS}} }", + 'if': "{ failingKeyword: {{=$ifClause}} }", + _limit: "{ comparison: {{=$opExpr}}, limit: {{=$schemaValue}}, exclusive: {{=$exclusive}} }", + _exclusiveLimit: "{}", + _limitItems: "{ limit: {{=$schemaValue}} }", + _limitLength: "{ limit: {{=$schemaValue}} }", + _limitProperties:"{ limit: {{=$schemaValue}} }", + multipleOf: "{ multipleOf: {{=$schemaValue}} }", + not: "{}", + oneOf: "{ passingSchemas: {{=$passingSchemas}} }", + pattern: "{ pattern: {{#def.schemaValueQS}} }", + propertyNames: "{ propertyName: '{{=$invalidName}}' }", + required: "{ missingProperty: '{{=$missingProperty}}' }", + type: "{ type: '{{? $typeIsArray }}{{= $typeSchema.join(\",\") }}{{??}}{{=$typeSchema}}{{?}}' }", + uniqueItems: "{ i: i, j: j }", + custom: "{ keyword: '{{=$rule.keyword}}' }", + patternRequired: "{ missingPattern: '{{=$missingPattern}}' }", + switch: "{ caseIndex: {{=$caseIndex}} }", + _formatLimit: "{ comparison: {{=$opExpr}}, limit: {{#def.schemaValueQS}}, exclusive: {{=$exclusive}} }", + _formatExclusiveLimit: "{}" +} #}} diff --git a/node_sid/node_modules/ajv/lib/dot/format.jst b/node_sid/node_modules/ajv/lib/dot/format.jst new file mode 100644 index 0000000..37f14da --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/format.jst @@ -0,0 +1,106 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} + +{{## def.skipFormat: + {{? $breakOnError }} if (true) { {{?}} + {{ return out; }} +#}} + +{{? it.opts.format === false }}{{# def.skipFormat }}{{?}} + + +{{# def.$data }} + + +{{## def.$dataCheckFormat: + {{# def.$dataNotType:'string' }} + ({{? $unknownFormats != 'ignore' }} + ({{=$schemaValue}} && !{{=$format}} + {{? $allowUnknown }} + && self._opts.unknownFormats.indexOf({{=$schemaValue}}) == -1 + {{?}}) || + {{?}} + ({{=$format}} && {{=$formatType}} == '{{=$ruleType}}' + && !(typeof {{=$format}} == 'function' + ? {{? it.async}} + (async{{=$lvl}} ? await {{=$format}}({{=$data}}) : {{=$format}}({{=$data}})) + {{??}} + {{=$format}}({{=$data}}) + {{?}} + : {{=$format}}.test({{=$data}})))) +#}} + +{{## def.checkFormat: + {{ + var $formatRef = 'formats' + it.util.getProperty($schema); + if ($isObject) $formatRef += '.validate'; + }} + {{? typeof $format == 'function' }} + {{=$formatRef}}({{=$data}}) + {{??}} + {{=$formatRef}}.test({{=$data}}) + {{?}} +#}} + + +{{ + var $unknownFormats = it.opts.unknownFormats + , $allowUnknown = Array.isArray($unknownFormats); +}} + +{{? $isData }} + {{ + var $format = 'format' + $lvl + , $isObject = 'isObject' + $lvl + , $formatType = 'formatType' + $lvl; + }} + var {{=$format}} = formats[{{=$schemaValue}}]; + var {{=$isObject}} = typeof {{=$format}} == 'object' + && !({{=$format}} instanceof RegExp) + && {{=$format}}.validate; + var {{=$formatType}} = {{=$isObject}} && {{=$format}}.type || 'string'; + if ({{=$isObject}}) { + {{? it.async}} + var async{{=$lvl}} = {{=$format}}.async; + {{?}} + {{=$format}} = {{=$format}}.validate; + } + if ({{# def.$dataCheckFormat }}) { +{{??}} + {{ var $format = it.formats[$schema]; }} + {{? !$format }} + {{? $unknownFormats == 'ignore' }} + {{ it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); }} + {{# def.skipFormat }} + {{?? $allowUnknown && $unknownFormats.indexOf($schema) >= 0 }} + {{# def.skipFormat }} + {{??}} + {{ throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); }} + {{?}} + {{?}} + {{ + var $isObject = typeof $format == 'object' + && !($format instanceof RegExp) + && $format.validate; + var $formatType = $isObject && $format.type || 'string'; + if ($isObject) { + var $async = $format.async === true; + $format = $format.validate; + } + }} + {{? $formatType != $ruleType }} + {{# def.skipFormat }} + {{?}} + {{? $async }} + {{ + if (!it.async) throw new Error('async format in sync schema'); + var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; + }} + if (!(await {{=$formatRef}}({{=$data}}))) { + {{??}} + if (!{{# def.checkFormat }}) { + {{?}} +{{?}} + {{# def.error:'format' }} + } {{? $breakOnError }} else { {{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/if.jst b/node_sid/node_modules/ajv/lib/dot/if.jst new file mode 100644 index 0000000..adb5036 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/if.jst @@ -0,0 +1,73 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.validateIfClause:_clause: + {{ + $it.schema = it.schema['_clause']; + $it.schemaPath = it.schemaPath + '._clause'; + $it.errSchemaPath = it.errSchemaPath + '/_clause'; + }} + {{# def.insertSubschemaCode }} + {{=$valid}} = {{=$nextValid}}; + {{? $thenPresent && $elsePresent }} + {{ $ifClause = 'ifClause' + $lvl; }} + var {{=$ifClause}} = '_clause'; + {{??}} + {{ $ifClause = '\'_clause\''; }} + {{?}} +#}} + +{{ + var $thenSch = it.schema['then'] + , $elseSch = it.schema['else'] + , $thenPresent = $thenSch !== undefined && {{# def.nonEmptySchema:$thenSch }} + , $elsePresent = $elseSch !== undefined && {{# def.nonEmptySchema:$elseSch }} + , $currentBaseId = $it.baseId; +}} + +{{? $thenPresent || $elsePresent }} + {{ + var $ifClause; + $it.createErrors = false; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + var {{=$errs}} = errors; + var {{=$valid}} = true; + + {{# def.setCompositeRule }} + {{# def.insertSubschemaCode }} + {{ $it.createErrors = true; }} + {{# def.resetErrors }} + {{# def.resetCompositeRule }} + + {{? $thenPresent }} + if ({{=$nextValid}}) { + {{# def.validateIfClause:then }} + } + {{? $elsePresent }} + else { + {{?}} + {{??}} + if (!{{=$nextValid}}) { + {{?}} + + {{? $elsePresent }} + {{# def.validateIfClause:else }} + } + {{?}} + + if (!{{=$valid}}) { + {{# def.extraError:'if' }} + } + {{? $breakOnError }} else { {{?}} +{{??}} + {{? $breakOnError }} + if (true) { + {{?}} +{{?}} + diff --git a/node_sid/node_modules/ajv/lib/dot/items.jst b/node_sid/node_modules/ajv/lib/dot/items.jst new file mode 100644 index 0000000..acc932a --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/items.jst @@ -0,0 +1,98 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.validateItems:startFrom: + for (var {{=$idx}} = {{=startFrom}}; {{=$idx}} < {{=$data}}.length; {{=$idx}}++) { + {{ + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + + {{? $breakOnError }} + if (!{{=$nextValid}}) break; + {{?}} + } +#}} + +{{ + var $idx = 'i' + $lvl + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $currentBaseId = it.baseId; +}} + +var {{=$errs}} = errors; +var {{=$valid}}; + +{{? Array.isArray($schema) }} + {{ /* 'items' is an array of schemas */}} + {{ var $additionalItems = it.schema.additionalItems; }} + {{? $additionalItems === false }} + {{=$valid}} = {{=$data}}.length <= {{= $schema.length }}; + {{ + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalItems'; + }} + {{# def.checkError:'additionalItems' }} + {{ $errSchemaPath = $currErrSchemaPath; }} + {{# def.elseIfValid}} + {{?}} + + {{~ $schema:$sch:$i }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{=$nextValid}} = true; + + if ({{=$data}}.length > {{=$i}}) { + {{ + var $passData = $data + '[' + $i + ']'; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); + $it.dataPathArr[$dataNxt] = $i; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + } + + {{# def.ifResultValid }} + {{?}} + {{~}} + + {{? typeof $additionalItems == 'object' && {{# def.nonEmptySchema:$additionalItems }} }} + {{ + $it.schema = $additionalItems; + $it.schemaPath = it.schemaPath + '.additionalItems'; + $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; + }} + {{=$nextValid}} = true; + + if ({{=$data}}.length > {{= $schema.length }}) { + {{# def.validateItems: $schema.length }} + } + + {{# def.ifResultValid }} + {{?}} + +{{?? {{# def.nonEmptySchema:$schema }} }} + {{ /* 'items' is a single schema */}} + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + {{# def.validateItems: 0 }} +{{?}} + +{{? $breakOnError }} + {{= $closingBraces }} + if ({{=$errs}} == errors) { +{{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/missing.def b/node_sid/node_modules/ajv/lib/dot/missing.def new file mode 100644 index 0000000..a73b9f9 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/missing.def @@ -0,0 +1,39 @@ +{{## def.checkMissingProperty:_properties: + {{~ _properties:$propertyKey:$i }} + {{?$i}} || {{?}} + {{ + var $prop = it.util.getProperty($propertyKey) + , $useData = $data + $prop; + }} + ( ({{# def.noPropertyInData }}) && (missing{{=$lvl}} = {{= it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop) }}) ) + {{~}} +#}} + + +{{## def.errorMissingProperty:_error: + {{ + var $propertyPath = 'missing' + $lvl + , $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.opts.jsonPointers + ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) + : $currentErrorPath + ' + ' + $propertyPath; + } + }} + {{# def.error:_error }} +#}} + + +{{## def.allErrorsMissingProperty:_error: + {{ + var $prop = it.util.getProperty($propertyKey) + , $missingProperty = it.util.escapeQuotes($propertyKey) + , $useData = $data + $prop; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + }} + if ({{# def.noPropertyInData }}) { + {{# def.addError:_error }} + } +#}} diff --git a/node_sid/node_modules/ajv/lib/dot/multipleOf.jst b/node_sid/node_modules/ajv/lib/dot/multipleOf.jst new file mode 100644 index 0000000..6d88a45 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/multipleOf.jst @@ -0,0 +1,22 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{# def.numberKeyword }} + +var division{{=$lvl}}; +if ({{?$isData}} + {{=$schemaValue}} !== undefined && ( + typeof {{=$schemaValue}} != 'number' || + {{?}} + (division{{=$lvl}} = {{=$data}} / {{=$schemaValue}}, + {{? it.opts.multipleOfPrecision }} + Math.abs(Math.round(division{{=$lvl}}) - division{{=$lvl}}) > 1e-{{=it.opts.multipleOfPrecision}} + {{??}} + division{{=$lvl}} !== parseInt(division{{=$lvl}}) + {{?}} + ) + {{?$isData}} ) {{?}} ) { + {{# def.error:'multipleOf' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/not.jst b/node_sid/node_modules/ajv/lib/dot/not.jst new file mode 100644 index 0000000..e03185a --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/not.jst @@ -0,0 +1,43 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{? {{# def.nonEmptySchema:$schema }} }} + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + + var {{=$errs}} = errors; + + {{# def.setCompositeRule }} + + {{ + $it.createErrors = false; + var $allErrorsOption; + if ($it.opts.allErrors) { + $allErrorsOption = $it.opts.allErrors; + $it.opts.allErrors = false; + } + }} + {{= it.validate($it) }} + {{ + $it.createErrors = true; + if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; + }} + + {{# def.resetCompositeRule }} + + if ({{=$nextValid}}) { + {{# def.error:'not' }} + } else { + {{# def.resetErrors }} + {{? it.opts.allErrors }} } {{?}} +{{??}} + {{# def.addError:'not' }} + {{? $breakOnError}} + if (false) { + {{?}} +{{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/oneOf.jst b/node_sid/node_modules/ajv/lib/dot/oneOf.jst new file mode 100644 index 0000000..bcce2c6 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/oneOf.jst @@ -0,0 +1,54 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +{{ + var $currentBaseId = $it.baseId + , $prevValid = 'prevValid' + $lvl + , $passingSchemas = 'passingSchemas' + $lvl; +}} + +var {{=$errs}} = errors + , {{=$prevValid}} = false + , {{=$valid}} = false + , {{=$passingSchemas}} = null; + +{{# def.setCompositeRule }} + +{{~ $schema:$sch:$i }} + {{? {{# def.nonEmptySchema:$sch }} }} + {{ + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + }} + + {{# def.insertSubschemaCode }} + {{??}} + var {{=$nextValid}} = true; + {{?}} + + {{? $i }} + if ({{=$nextValid}} && {{=$prevValid}}) { + {{=$valid}} = false; + {{=$passingSchemas}} = [{{=$passingSchemas}}, {{=$i}}]; + } else { + {{ $closingBraces += '}'; }} + {{?}} + + if ({{=$nextValid}}) { + {{=$valid}} = {{=$prevValid}} = true; + {{=$passingSchemas}} = {{=$i}}; + } +{{~}} + +{{# def.resetCompositeRule }} + +{{= $closingBraces }} + +if (!{{=$valid}}) { + {{# def.extraError:'oneOf' }} +} else { + {{# def.resetErrors }} +{{? it.opts.allErrors }} } {{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/pattern.jst b/node_sid/node_modules/ajv/lib/dot/pattern.jst new file mode 100644 index 0000000..3a37ef6 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/pattern.jst @@ -0,0 +1,14 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + +{{ + var $regexp = $isData + ? '(new RegExp(' + $schemaValue + '))' + : it.usePattern($schema); +}} + +if ({{# def.$dataNotType:'string' }} !{{=$regexp}}.test({{=$data}}) ) { + {{# def.error:'pattern' }} +} {{? $breakOnError }} else { {{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/properties.jst b/node_sid/node_modules/ajv/lib/dot/properties.jst new file mode 100644 index 0000000..5cebb9b --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/properties.jst @@ -0,0 +1,245 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + + +{{## def.validateAdditional: + {{ /* additionalProperties is schema */ + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty + ? it.errorPath + : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} +#}} + + +{{ + var $key = 'key' + $lvl + , $idx = 'idx' + $lvl + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $dataProperties = 'dataProperties' + $lvl; + + var $schemaKeys = Object.keys($schema || {}).filter(notProto) + , $pProperties = it.schema.patternProperties || {} + , $pPropertyKeys = Object.keys($pProperties).filter(notProto) + , $aProperties = it.schema.additionalProperties + , $someProperties = $schemaKeys.length || $pPropertyKeys.length + , $noAdditional = $aProperties === false + , $additionalIsSchema = typeof $aProperties == 'object' + && Object.keys($aProperties).length + , $removeAdditional = it.opts.removeAdditional + , $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional + , $ownProperties = it.opts.ownProperties + , $currentBaseId = it.baseId; + + var $required = it.schema.required; + if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { + var $requiredHash = it.util.toHash($required); + } + + function notProto(p) { return p !== '__proto__'; } +}} + + +var {{=$errs}} = errors; +var {{=$nextValid}} = true; +{{? $ownProperties }} + var {{=$dataProperties}} = undefined; +{{?}} + +{{? $checkAdditional }} + {{# def.iterateProperties }} + {{? $someProperties }} + var isAdditional{{=$lvl}} = !(false + {{? $schemaKeys.length }} + {{? $schemaKeys.length > 8 }} + || validate.schema{{=$schemaPath}}.hasOwnProperty({{=$key}}) + {{??}} + {{~ $schemaKeys:$propertyKey }} + || {{=$key}} == {{= it.util.toQuotedString($propertyKey) }} + {{~}} + {{?}} + {{?}} + {{? $pPropertyKeys.length }} + {{~ $pPropertyKeys:$pProperty:$i }} + || {{= it.usePattern($pProperty) }}.test({{=$key}}) + {{~}} + {{?}} + ); + + if (isAdditional{{=$lvl}}) { + {{?}} + {{? $removeAdditional == 'all' }} + delete {{=$data}}[{{=$key}}]; + {{??}} + {{ + var $currentErrorPath = it.errorPath; + var $additionalProperty = '\' + ' + $key + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + } + }} + {{? $noAdditional }} + {{? $removeAdditional }} + delete {{=$data}}[{{=$key}}]; + {{??}} + {{=$nextValid}} = false; + {{ + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalProperties'; + }} + {{# def.error:'additionalProperties' }} + {{ $errSchemaPath = $currErrSchemaPath; }} + {{? $breakOnError }} break; {{?}} + {{?}} + {{?? $additionalIsSchema }} + {{? $removeAdditional == 'failing' }} + var {{=$errs}} = errors; + {{# def.setCompositeRule }} + + {{# def.validateAdditional }} + + if (!{{=$nextValid}}) { + errors = {{=$errs}}; + if (validate.errors !== null) { + if (errors) validate.errors.length = errors; + else validate.errors = null; + } + delete {{=$data}}[{{=$key}}]; + } + + {{# def.resetCompositeRule }} + {{??}} + {{# def.validateAdditional }} + {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} + {{?}} + {{?}} + {{ it.errorPath = $currentErrorPath; }} + {{?}} + {{? $someProperties }} + } + {{?}} + } + + {{# def.ifResultValid }} +{{?}} + +{{ var $useDefaults = it.opts.useDefaults && !it.compositeRule; }} + +{{? $schemaKeys.length }} + {{~ $schemaKeys:$propertyKey }} + {{ var $sch = $schema[$propertyKey]; }} + + {{? {{# def.nonEmptySchema:$sch}} }} + {{ + var $prop = it.util.getProperty($propertyKey) + , $passData = $data + $prop + , $hasDefault = $useDefaults && $sch.default !== undefined; + $it.schema = $sch; + $it.schemaPath = $schemaPath + $prop; + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); + $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); + $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); + }} + + {{# def.generateSubschemaCode }} + + {{? {{# def.willOptimize }} }} + {{ + $code = {{# def._optimizeValidate }}; + var $useData = $passData; + }} + {{??}} + {{ var $useData = $nextData; }} + var {{=$nextData}} = {{=$passData}}; + {{?}} + + {{? $hasDefault }} + {{= $code }} + {{??}} + {{? $requiredHash && $requiredHash[$propertyKey] }} + if ({{# def.noPropertyInData }}) { + {{=$nextValid}} = false; + {{ + var $currentErrorPath = it.errorPath + , $currErrSchemaPath = $errSchemaPath + , $missingProperty = it.util.escapeQuotes($propertyKey); + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + $errSchemaPath = it.errSchemaPath + '/required'; + }} + {{# def.error:'required' }} + {{ $errSchemaPath = $currErrSchemaPath; }} + {{ it.errorPath = $currentErrorPath; }} + } else { + {{??}} + {{? $breakOnError }} + if ({{# def.noPropertyInData }}) { + {{=$nextValid}} = true; + } else { + {{??}} + if ({{=$useData}} !== undefined + {{? $ownProperties }} + && {{# def.isOwnProperty }} + {{?}} + ) { + {{?}} + {{?}} + + {{= $code }} + } + {{?}} {{ /* $hasDefault */ }} + {{?}} {{ /* def.nonEmptySchema */ }} + + {{# def.ifResultValid }} + {{~}} +{{?}} + +{{? $pPropertyKeys.length }} + {{~ $pPropertyKeys:$pProperty }} + {{ var $sch = $pProperties[$pProperty]; }} + + {{? {{# def.nonEmptySchema:$sch}} }} + {{ + $it.schema = $sch; + $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); + $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + + it.util.escapeFragment($pProperty); + }} + + {{# def.iterateProperties }} + if ({{= it.usePattern($pProperty) }}.test({{=$key}})) { + {{ + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + }} + + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + + {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} + } + {{? $breakOnError }} else {{=$nextValid}} = true; {{?}} + } + + {{# def.ifResultValid }} + {{?}} {{ /* def.nonEmptySchema */ }} + {{~}} +{{?}} + + +{{? $breakOnError }} + {{= $closingBraces }} + if ({{=$errs}} == errors) { +{{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/propertyNames.jst b/node_sid/node_modules/ajv/lib/dot/propertyNames.jst new file mode 100644 index 0000000..d456cca --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/propertyNames.jst @@ -0,0 +1,52 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.setupNextLevel }} + +var {{=$errs}} = errors; + +{{? {{# def.nonEmptySchema:$schema }} }} + {{ + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + }} + + {{ + var $key = 'key' + $lvl + , $idx = 'idx' + $lvl + , $i = 'i' + $lvl + , $invalidName = '\' + ' + $key + ' + \'' + , $dataNxt = $it.dataLevel = it.dataLevel + 1 + , $nextData = 'data' + $dataNxt + , $dataProperties = 'dataProperties' + $lvl + , $ownProperties = it.opts.ownProperties + , $currentBaseId = it.baseId; + }} + + {{? $ownProperties }} + var {{=$dataProperties}} = undefined; + {{?}} + {{# def.iterateProperties }} + var startErrs{{=$lvl}} = errors; + + {{ var $passData = $key; }} + {{# def.setCompositeRule }} + {{# def.generateSubschemaCode }} + {{# def.optimizeValidate }} + {{# def.resetCompositeRule }} + + if (!{{=$nextValid}}) { + for (var {{=$i}}=startErrs{{=$lvl}}; {{=$i}}= it.opts.loopRequired + , $ownProperties = it.opts.ownProperties; + }} + + {{? $breakOnError }} + var missing{{=$lvl}}; + {{? $loopRequired }} + {{# def.setupLoop }} + var {{=$valid}} = true; + + {{?$isData}}{{# def.check$dataIsArray }}{{?}} + + for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { + {{=$valid}} = {{=$data}}[{{=$vSchema}}[{{=$i}}]] !== undefined + {{? $ownProperties }} + && {{# def.isRequiredOwnProperty }} + {{?}}; + if (!{{=$valid}}) break; + } + + {{? $isData }} } {{?}} + + {{# def.checkError:'required' }} + else { + {{??}} + if ({{# def.checkMissingProperty:$required }}) { + {{# def.errorMissingProperty:'required' }} + } else { + {{?}} + {{??}} + {{? $loopRequired }} + {{# def.setupLoop }} + {{? $isData }} + if ({{=$vSchema}} && !Array.isArray({{=$vSchema}})) { + {{# def.addError:'required' }} + } else if ({{=$vSchema}} !== undefined) { + {{?}} + + for (var {{=$i}} = 0; {{=$i}} < {{=$vSchema}}.length; {{=$i}}++) { + if ({{=$data}}[{{=$vSchema}}[{{=$i}}]] === undefined + {{? $ownProperties }} + || !{{# def.isRequiredOwnProperty }} + {{?}}) { + {{# def.addError:'required' }} + } + } + + {{? $isData }} } {{?}} + {{??}} + {{~ $required:$propertyKey }} + {{# def.allErrorsMissingProperty:'required' }} + {{~}} + {{?}} + {{?}} + + {{ it.errorPath = $currentErrorPath; }} + +{{?? $breakOnError }} + if (true) { +{{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/uniqueItems.jst b/node_sid/node_modules/ajv/lib/dot/uniqueItems.jst new file mode 100644 index 0000000..e69b830 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/uniqueItems.jst @@ -0,0 +1,62 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.setupKeyword }} +{{# def.$data }} + + +{{? ($schema || $isData) && it.opts.uniqueItems !== false }} + {{? $isData }} + var {{=$valid}}; + if ({{=$schemaValue}} === false || {{=$schemaValue}} === undefined) + {{=$valid}} = true; + else if (typeof {{=$schemaValue}} != 'boolean') + {{=$valid}} = false; + else { + {{?}} + + var i = {{=$data}}.length + , {{=$valid}} = true + , j; + if (i > 1) { + {{ + var $itemType = it.schema.items && it.schema.items.type + , $typeIsArray = Array.isArray($itemType); + }} + {{? !$itemType || $itemType == 'object' || $itemType == 'array' || + ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0)) }} + outer: + for (;i--;) { + for (j = i; j--;) { + if (equal({{=$data}}[i], {{=$data}}[j])) { + {{=$valid}} = false; + break outer; + } + } + } + {{??}} + var itemIndices = {}, item; + for (;i--;) { + var item = {{=$data}}[i]; + {{ var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); }} + if ({{= it.util[$method]($itemType, 'item', it.opts.strictNumbers, true) }}) continue; + {{? $typeIsArray}} + if (typeof item == 'string') item = '"' + item; + {{?}} + if (typeof itemIndices[item] == 'number') { + {{=$valid}} = false; + j = itemIndices[item]; + break; + } + itemIndices[item] = i; + } + {{?}} + } + + {{? $isData }} } {{?}} + + if (!{{=$valid}}) { + {{# def.error:'uniqueItems' }} + } {{? $breakOnError }} else { {{?}} +{{??}} + {{? $breakOnError }} if (true) { {{?}} +{{?}} diff --git a/node_sid/node_modules/ajv/lib/dot/validate.jst b/node_sid/node_modules/ajv/lib/dot/validate.jst new file mode 100644 index 0000000..32087e7 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dot/validate.jst @@ -0,0 +1,276 @@ +{{# def.definitions }} +{{# def.errors }} +{{# def.defaults }} +{{# def.coerce }} + +{{ /** + * schema compilation (render) time: + * it = { schema, RULES, _validate, opts } + * it.validate - this template function, + * it is used recursively to generate code for subschemas + * + * runtime: + * "validate" is a variable name to which this function will be assigned + * validateRef etc. are defined in the parent scope in index.js + */ }} + +{{ + var $async = it.schema.$async === true + , $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref') + , $id = it.self._getId(it.schema); +}} + +{{ + if (it.opts.strictKeywords) { + var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); + if ($unknownKwd) { + var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; + if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); + else throw new Error($keywordsMsg); + } + } +}} + +{{? it.isTop }} + var validate = {{?$async}}{{it.async = true;}}async {{?}}function(data, dataPath, parentData, parentDataProperty, rootData) { + 'use strict'; + {{? $id && (it.opts.sourceCode || it.opts.processCode) }} + {{= '/\*# sourceURL=' + $id + ' */' }} + {{?}} +{{?}} + +{{? typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref) }} + {{ var $keyword = 'false schema'; }} + {{# def.setupKeyword }} + {{? it.schema === false}} + {{? it.isTop}} + {{ $breakOnError = true; }} + {{??}} + var {{=$valid}} = false; + {{?}} + {{# def.error:'false schema' }} + {{??}} + {{? it.isTop}} + {{? $async }} + return data; + {{??}} + validate.errors = null; + return true; + {{?}} + {{??}} + var {{=$valid}} = true; + {{?}} + {{?}} + + {{? it.isTop}} + }; + return validate; + {{?}} + + {{ return out; }} +{{?}} + + +{{? it.isTop }} + {{ + var $top = it.isTop + , $lvl = it.level = 0 + , $dataLvl = it.dataLevel = 0 + , $data = 'data'; + it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); + it.baseId = it.baseId || it.rootId; + delete it.isTop; + + it.dataPathArr = [""]; + + if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored in the schema root'; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + }} + + var vErrors = null; {{ /* don't edit, used in replace */ }} + var errors = 0; {{ /* don't edit, used in replace */ }} + if (rootData === undefined) rootData = data; {{ /* don't edit, used in replace */ }} +{{??}} + {{ + var $lvl = it.level + , $dataLvl = it.dataLevel + , $data = 'data' + ($dataLvl || ''); + + if ($id) it.baseId = it.resolve.url(it.baseId, $id); + + if ($async && !it.async) throw new Error('async schema in sync schema'); + }} + + var errs_{{=$lvl}} = errors; +{{?}} + +{{ + var $valid = 'valid' + $lvl + , $breakOnError = !it.opts.allErrors + , $closingBraces1 = '' + , $closingBraces2 = ''; + + var $errorKeyword; + var $typeSchema = it.schema.type + , $typeIsArray = Array.isArray($typeSchema); + + if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { + if ($typeIsArray) { + if ($typeSchema.indexOf('null') == -1) + $typeSchema = $typeSchema.concat('null'); + } else if ($typeSchema != 'null') { + $typeSchema = [$typeSchema, 'null']; + $typeIsArray = true; + } + } + + if ($typeIsArray && $typeSchema.length == 1) { + $typeSchema = $typeSchema[0]; + $typeIsArray = false; + } +}} + +{{## def.checkType: + {{ + var $schemaPath = it.schemaPath + '.type' + , $errSchemaPath = it.errSchemaPath + '/type' + , $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; + }} + + if ({{= it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true) }}) { +#}} + +{{? it.schema.$ref && $refKeywords }} + {{? it.opts.extendRefs == 'fail' }} + {{ throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); }} + {{?? it.opts.extendRefs !== true }} + {{ + $refKeywords = false; + it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); + }} + {{?}} +{{?}} + +{{? it.schema.$comment && it.opts.$comment }} + {{= it.RULES.all.$comment.code(it, '$comment') }} +{{?}} + +{{? $typeSchema }} + {{? it.opts.coerceTypes }} + {{ var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); }} + {{?}} + + {{ var $rulesGroup = it.RULES.types[$typeSchema]; }} + {{? $coerceToTypes || $typeIsArray || $rulesGroup === true || + ($rulesGroup && !$shouldUseGroup($rulesGroup)) }} + {{ + var $schemaPath = it.schemaPath + '.type' + , $errSchemaPath = it.errSchemaPath + '/type'; + }} + {{# def.checkType }} + {{? $coerceToTypes }} + {{# def.coerceType }} + {{??}} + {{# def.error:'type' }} + {{?}} + } + {{?}} +{{?}} + + +{{? it.schema.$ref && !$refKeywords }} + {{= it.RULES.all.$ref.code(it, '$ref') }} + {{? $breakOnError }} + } + if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) { + {{ $closingBraces2 += '}'; }} + {{?}} +{{??}} + {{~ it.RULES:$rulesGroup }} + {{? $shouldUseGroup($rulesGroup) }} + {{? $rulesGroup.type }} + if ({{= it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers) }}) { + {{?}} + {{? it.opts.useDefaults }} + {{? $rulesGroup.type == 'object' && it.schema.properties }} + {{# def.defaultProperties }} + {{?? $rulesGroup.type == 'array' && Array.isArray(it.schema.items) }} + {{# def.defaultItems }} + {{?}} + {{?}} + {{~ $rulesGroup.rules:$rule }} + {{? $shouldUseRule($rule) }} + {{ var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); }} + {{? $code }} + {{= $code }} + {{? $breakOnError }} + {{ $closingBraces1 += '}'; }} + {{?}} + {{?}} + {{?}} + {{~}} + {{? $breakOnError }} + {{= $closingBraces1 }} + {{ $closingBraces1 = ''; }} + {{?}} + {{? $rulesGroup.type }} + } + {{? $typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes }} + else { + {{ + var $schemaPath = it.schemaPath + '.type' + , $errSchemaPath = it.errSchemaPath + '/type'; + }} + {{# def.error:'type' }} + } + {{?}} + {{?}} + + {{? $breakOnError }} + if (errors === {{?$top}}0{{??}}errs_{{=$lvl}}{{?}}) { + {{ $closingBraces2 += '}'; }} + {{?}} + {{?}} + {{~}} +{{?}} + +{{? $breakOnError }} {{= $closingBraces2 }} {{?}} + +{{? $top }} + {{? $async }} + if (errors === 0) return data; {{ /* don't edit, used in replace */ }} + else throw new ValidationError(vErrors); {{ /* don't edit, used in replace */ }} + {{??}} + validate.errors = vErrors; {{ /* don't edit, used in replace */ }} + return errors === 0; {{ /* don't edit, used in replace */ }} + {{?}} + }; + + return validate; +{{??}} + var {{=$valid}} = errors === errs_{{=$lvl}}; +{{?}} + +{{ + function $shouldUseGroup($rulesGroup) { + var rules = $rulesGroup.rules; + for (var i=0; i < rules.length; i++) + if ($shouldUseRule(rules[i])) + return true; + } + + function $shouldUseRule($rule) { + return it.schema[$rule.keyword] !== undefined || + ($rule.implements && $ruleImplementsSomeKeyword($rule)); + } + + function $ruleImplementsSomeKeyword($rule) { + var impl = $rule.implements; + for (var i=0; i < impl.length; i++) + if (it.schema[impl[i]] !== undefined) + return true; + } +}} diff --git a/node_sid/node_modules/ajv/lib/dotjs/README.md b/node_sid/node_modules/ajv/lib/dotjs/README.md new file mode 100644 index 0000000..4d99484 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/README.md @@ -0,0 +1,3 @@ +These files are compiled dot templates from dot folder. + +Do NOT edit them directly, edit the templates and run `npm run build` from main ajv folder. diff --git a/node_sid/node_modules/ajv/lib/dotjs/_limit.js b/node_sid/node_modules/ajv/lib/dotjs/_limit.js new file mode 100644 index 0000000..05a1979 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/_limit.js @@ -0,0 +1,163 @@ +'use strict'; +module.exports = function generate__limit(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $isMax = $keyword == 'maximum', + $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum', + $schemaExcl = it.schema[$exclusiveKeyword], + $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data, + $op = $isMax ? '<' : '>', + $notOp = $isMax ? '>' : '<', + $errorKeyword = undefined; + if (!($isData || typeof $schema == 'number' || $schema === undefined)) { + throw new Error($keyword + ' must be number'); + } + if (!($isDataExcl || $schemaExcl === undefined || typeof $schemaExcl == 'number' || typeof $schemaExcl == 'boolean')) { + throw new Error($exclusiveKeyword + ' must be number or boolean'); + } + if ($isDataExcl) { + var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr), + $exclusive = 'exclusive' + $lvl, + $exclType = 'exclType' + $lvl, + $exclIsNumber = 'exclIsNumber' + $lvl, + $opExpr = 'op' + $lvl, + $opStr = '\' + ' + $opExpr + ' + \''; + out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; '; + $schemaValueExcl = 'schemaExcl' + $lvl; + out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \'boolean\' && ' + ($exclType) + ' != \'undefined\' && ' + ($exclType) + ' != \'number\') { '; + var $errorKeyword = $exclusiveKeyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_exclusiveLimit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'' + ($exclusiveKeyword) + ' should be boolean\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($exclType) + ' == \'number\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \'' + ($op) + '\' : \'' + ($op) + '=\'; '; + if ($schema === undefined) { + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaValueExcl; + $isData = $isDataExcl; + } + } else { + var $exclIsNumber = typeof $schemaExcl == 'number', + $opStr = $op; + if ($exclIsNumber && $isData) { + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { '; + } else { + if ($exclIsNumber && $schema === undefined) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $schemaValue = $schemaExcl; + $notOp += '='; + } else { + if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema); + if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) { + $exclusive = true; + $errorKeyword = $exclusiveKeyword; + $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword; + $notOp += '='; + } else { + $exclusive = false; + $opStr += '='; + } + } + var $opExpr = '\'' + $opStr + '\''; + out += ' if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { '; + } + } + $errorKeyword = $errorKeyword || $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limit') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be ' + ($opStr) + ' '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/_limitItems.js b/node_sid/node_modules/ajv/lib/dotjs/_limitItems.js new file mode 100644 index 0000000..e092a55 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/_limitItems.js @@ -0,0 +1,80 @@ +'use strict'; +module.exports = function generate__limitItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxItems' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxItems') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/_limitLength.js b/node_sid/node_modules/ajv/lib/dotjs/_limitLength.js new file mode 100644 index 0000000..ecbd3fe --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/_limitLength.js @@ -0,0 +1,85 @@ +'use strict'; +module.exports = function generate__limitLength(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxLength' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + if (it.opts.unicode === false) { + out += ' ' + ($data) + '.length '; + } else { + out += ' ucs2length(' + ($data) + ') '; + } + out += ' ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitLength') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be '; + if ($keyword == 'maxLength') { + out += 'longer'; + } else { + out += 'shorter'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' characters\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/_limitProperties.js b/node_sid/node_modules/ajv/lib/dotjs/_limitProperties.js new file mode 100644 index 0000000..d232755 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/_limitProperties.js @@ -0,0 +1,80 @@ +'use strict'; +module.exports = function generate__limitProperties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + var $op = $keyword == 'maxProperties' ? '>' : '<'; + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'number\') || '; + } + out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { '; + var $errorKeyword = $keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || '_limitProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have '; + if ($keyword == 'maxProperties') { + out += 'more'; + } else { + out += 'fewer'; + } + out += ' than '; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + ($schema); + } + out += ' properties\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/allOf.js b/node_sid/node_modules/ajv/lib/dotjs/allOf.js new file mode 100644 index 0000000..fb8c2e4 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/allOf.js @@ -0,0 +1,42 @@ +'use strict'; +module.exports = function generate_allOf(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $allSchemasEmpty = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $allSchemasEmpty = false; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($breakOnError) { + if ($allSchemasEmpty) { + out += ' if (true) { '; + } else { + out += ' ' + ($closingBraces.slice(0, -1)) + ' '; + } + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/anyOf.js b/node_sid/node_modules/ajv/lib/dotjs/anyOf.js new file mode 100644 index 0000000..0600a9d --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/anyOf.js @@ -0,0 +1,73 @@ +'use strict'; +module.exports = function generate_anyOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $noEmptySchema = $schema.every(function($sch) { + return (it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all)); + }); + if ($noEmptySchema) { + var $currentBaseId = $it.baseId; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { '; + $closingBraces += '}'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('anyOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should match some schema in anyOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/comment.js b/node_sid/node_modules/ajv/lib/dotjs/comment.js new file mode 100644 index 0000000..dd66bb8 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/comment.js @@ -0,0 +1,14 @@ +'use strict'; +module.exports = function generate_comment(it, $keyword, $ruleType) { + var out = ' '; + var $schema = it.schema[$keyword]; + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $comment = it.util.toQuotedString($schema); + if (it.opts.$comment === true) { + out += ' console.log(' + ($comment) + ');'; + } else if (typeof it.opts.$comment == 'function') { + out += ' self._opts.$comment(' + ($comment) + ', ' + (it.util.toQuotedString($errSchemaPath)) + ', validate.root.schema);'; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/const.js b/node_sid/node_modules/ajv/lib/dotjs/const.js new file mode 100644 index 0000000..15b7c61 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/const.js @@ -0,0 +1,56 @@ +'use strict'; +module.exports = function generate_const(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!$isData) { + out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('const') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValue: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to constant\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/contains.js b/node_sid/node_modules/ajv/lib/dotjs/contains.js new file mode 100644 index 0000000..7d76300 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/contains.js @@ -0,0 +1,81 @@ +'use strict'; +module.exports = function generate_contains(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId, + $nonEmptySchema = (it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all)); + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($nonEmptySchema) { + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (' + ($nextValid) + ') break; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {'; + } else { + out += ' if (' + ($data) + '.length == 0) {'; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('contains') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should contain a valid item\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + if ($nonEmptySchema) { + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + } + if (it.opts.allErrors) { + out += ' } '; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/custom.js b/node_sid/node_modules/ajv/lib/dotjs/custom.js new file mode 100644 index 0000000..f3e641e --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/custom.js @@ -0,0 +1,228 @@ +'use strict'; +module.exports = function generate_custom(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $rule = this, + $definition = 'definition' + $lvl, + $rDef = $rule.definition, + $closingBraces = ''; + var $compile, $inline, $macro, $ruleValidate, $validateCode; + if ($isData && $rDef.$data) { + $validateCode = 'keywordValidate' + $lvl; + var $validateSchema = $rDef.validateSchema; + out += ' var ' + ($definition) + ' = RULES.custom[\'' + ($keyword) + '\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;'; + } else { + $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it); + if (!$ruleValidate) return; + $schemaValue = 'validate.schema' + $schemaPath; + $validateCode = $ruleValidate.code; + $compile = $rDef.compile; + $inline = $rDef.inline; + $macro = $rDef.macro; + } + var $ruleErrs = $validateCode + '.errors', + $i = 'i' + $lvl, + $ruleErr = 'ruleErr' + $lvl, + $asyncKeyword = $rDef.async; + if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema'); + if (!($inline || $macro)) { + out += '' + ($ruleErrs) + ' = null;'; + } + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if ($isData && $rDef.$data) { + $closingBraces += '}'; + out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { '; + if ($validateSchema) { + $closingBraces += '}'; + out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { '; + } + } + if ($inline) { + if ($rDef.statements) { + out += ' ' + ($ruleValidate.validate) + ' '; + } else { + out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; '; + } + } else if ($macro) { + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + $it.schema = $ruleValidate.validate; + $it.schemaPath = ''; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' ' + ($code); + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + out += ' ' + ($validateCode) + '.call( '; + if (it.opts.passContext) { + out += 'this'; + } else { + out += 'self'; + } + if ($compile || $rDef.schema === false) { + out += ' , ' + ($data) + ' '; + } else { + out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' '; + } + out += ' , (dataPath || \'\')'; + if (it.errorPath != '""') { + out += ' + ' + (it.errorPath); + } + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData ) '; + var def_callRuleValidate = out; + out = $$outStack.pop(); + if ($rDef.errors === false) { + out += ' ' + ($valid) + ' = '; + if ($asyncKeyword) { + out += 'await '; + } + out += '' + (def_callRuleValidate) + '; '; + } else { + if ($asyncKeyword) { + $ruleErrs = 'customErrors' + $lvl; + out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = await ' + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } '; + } else { + out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; '; + } + } + } + if ($rDef.modifying) { + out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];'; + } + out += '' + ($closingBraces); + if ($rDef.valid) { + if ($breakOnError) { + out += ' if (true) { '; + } + } else { + out += ' if ( '; + if ($rDef.valid === undefined) { + out += ' !'; + if ($macro) { + out += '' + ($nextValid); + } else { + out += '' + ($valid); + } + } else { + out += ' ' + (!$rDef.valid) + ' '; + } + out += ') { '; + $errorKeyword = $rule.keyword; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'custom') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \'' + ($rule.keyword) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should pass "' + ($rule.keyword) + '" keyword validation\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + var def_customError = out; + out = $$outStack.pop(); + if ($inline) { + if ($rDef.errors) { + if ($rDef.errors != 'full') { + out += ' for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + ' 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($property)) + '\') '; + } + out += ') { '; + $it.schema = $sch; + $it.schemaPath = $schemaPath + it.util.getProperty($property); + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property); + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/enum.js b/node_sid/node_modules/ajv/lib/dotjs/enum.js new file mode 100644 index 0000000..90580b9 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/enum.js @@ -0,0 +1,66 @@ +'use strict'; +module.exports = function generate_enum(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $i = 'i' + $lvl, + $vSchema = 'schema' + $lvl; + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';'; + } + out += 'var ' + ($valid) + ';'; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }'; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('enum') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be equal to one of the allowed values\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' }'; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/format.js b/node_sid/node_modules/ajv/lib/dotjs/format.js new file mode 100644 index 0000000..cd9a569 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/format.js @@ -0,0 +1,150 @@ +'use strict'; +module.exports = function generate_format(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + if (it.opts.format === false) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $unknownFormats = it.opts.unknownFormats, + $allowUnknown = Array.isArray($unknownFormats); + if ($isData) { + var $format = 'format' + $lvl, + $isObject = 'isObject' + $lvl, + $formatType = 'formatType' + $lvl; + out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \'object\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \'string\'; if (' + ($isObject) + ') { '; + if (it.async) { + out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; '; + } + out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' ('; + if ($unknownFormats != 'ignore') { + out += ' (' + ($schemaValue) + ' && !' + ($format) + ' '; + if ($allowUnknown) { + out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 '; + } + out += ') || '; + } + out += ' (' + ($format) + ' && ' + ($formatType) + ' == \'' + ($ruleType) + '\' && !(typeof ' + ($format) + ' == \'function\' ? '; + if (it.async) { + out += ' (async' + ($lvl) + ' ? await ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) '; + } else { + out += ' ' + ($format) + '(' + ($data) + ') '; + } + out += ' : ' + ($format) + '.test(' + ($data) + '))))) {'; + } else { + var $format = it.formats[$schema]; + if (!$format) { + if ($unknownFormats == 'ignore') { + it.logger.warn('unknown format "' + $schema + '" ignored in schema at path "' + it.errSchemaPath + '"'); + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } else { + throw new Error('unknown format "' + $schema + '" is used in schema at path "' + it.errSchemaPath + '"'); + } + } + var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate; + var $formatType = $isObject && $format.type || 'string'; + if ($isObject) { + var $async = $format.async === true; + $format = $format.validate; + } + if ($formatType != $ruleType) { + if ($breakOnError) { + out += ' if (true) { '; + } + return out; + } + if ($async) { + if (!it.async) throw new Error('async format in sync schema'); + var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate'; + out += ' if (!(await ' + ($formatRef) + '(' + ($data) + '))) { '; + } else { + out += ' if (! '; + var $formatRef = 'formats' + it.util.getProperty($schema); + if ($isObject) $formatRef += '.validate'; + if (typeof $format == 'function') { + out += ' ' + ($formatRef) + '(' + ($data) + ') '; + } else { + out += ' ' + ($formatRef) + '.test(' + ($data) + ') '; + } + out += ') { '; + } + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('format') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match format "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/if.js b/node_sid/node_modules/ajv/lib/dotjs/if.js new file mode 100644 index 0000000..94d27ad --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/if.js @@ -0,0 +1,103 @@ +'use strict'; +module.exports = function generate_if(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + var $thenSch = it.schema['then'], + $elseSch = it.schema['else'], + $thenPresent = $thenSch !== undefined && (it.opts.strictKeywords ? (typeof $thenSch == 'object' && Object.keys($thenSch).length > 0) || $thenSch === false : it.util.schemaHasRules($thenSch, it.RULES.all)), + $elsePresent = $elseSch !== undefined && (it.opts.strictKeywords ? (typeof $elseSch == 'object' && Object.keys($elseSch).length > 0) || $elseSch === false : it.util.schemaHasRules($elseSch, it.RULES.all)), + $currentBaseId = $it.baseId; + if ($thenPresent || $elsePresent) { + var $ifClause; + $it.createErrors = false; + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = true; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + $it.createErrors = true; + out += ' errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + if ($thenPresent) { + out += ' if (' + ($nextValid) + ') { '; + $it.schema = it.schema['then']; + $it.schemaPath = it.schemaPath + '.then'; + $it.errSchemaPath = it.errSchemaPath + '/then'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'then\'; '; + } else { + $ifClause = '\'then\''; + } + out += ' } '; + if ($elsePresent) { + out += ' else { '; + } + } else { + out += ' if (!' + ($nextValid) + ') { '; + } + if ($elsePresent) { + $it.schema = it.schema['else']; + $it.schemaPath = it.schemaPath + '.else'; + $it.errSchemaPath = it.errSchemaPath + '/else'; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + out += ' ' + ($valid) + ' = ' + ($nextValid) + '; '; + if ($thenPresent && $elsePresent) { + $ifClause = 'ifClause' + $lvl; + out += ' var ' + ($ifClause) + ' = \'else\'; '; + } else { + $ifClause = '\'else\''; + } + out += ' } '; + } + out += ' if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('if') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { failingKeyword: ' + ($ifClause) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match "\' + ' + ($ifClause) + ' + \'" schema\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/index.js b/node_sid/node_modules/ajv/lib/dotjs/index.js new file mode 100644 index 0000000..2fb1b00 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/index.js @@ -0,0 +1,33 @@ +'use strict'; + +//all requires must be explicit because browserify won't work with dynamic requires +module.exports = { + '$ref': require('./ref'), + allOf: require('./allOf'), + anyOf: require('./anyOf'), + '$comment': require('./comment'), + const: require('./const'), + contains: require('./contains'), + dependencies: require('./dependencies'), + 'enum': require('./enum'), + format: require('./format'), + 'if': require('./if'), + items: require('./items'), + maximum: require('./_limit'), + minimum: require('./_limit'), + maxItems: require('./_limitItems'), + minItems: require('./_limitItems'), + maxLength: require('./_limitLength'), + minLength: require('./_limitLength'), + maxProperties: require('./_limitProperties'), + minProperties: require('./_limitProperties'), + multipleOf: require('./multipleOf'), + not: require('./not'), + oneOf: require('./oneOf'), + pattern: require('./pattern'), + properties: require('./properties'), + propertyNames: require('./propertyNames'), + required: require('./required'), + uniqueItems: require('./uniqueItems'), + validate: require('./validate') +}; diff --git a/node_sid/node_modules/ajv/lib/dotjs/items.js b/node_sid/node_modules/ajv/lib/dotjs/items.js new file mode 100644 index 0000000..bee5d67 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/items.js @@ -0,0 +1,140 @@ +'use strict'; +module.exports = function generate_items(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $idx = 'i' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $currentBaseId = it.baseId; + out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';'; + if (Array.isArray($schema)) { + var $additionalItems = it.schema.additionalItems; + if ($additionalItems === false) { + out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have more than ' + ($schema.length) + ' items\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + $closingBraces += '}'; + out += ' else { '; + } + } + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { '; + var $passData = $data + '[' + $i + ']'; + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true); + $it.dataPathArr[$dataNxt] = $i; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if (typeof $additionalItems == 'object' && (it.opts.strictKeywords ? (typeof $additionalItems == 'object' && Object.keys($additionalItems).length > 0) || $additionalItems === false : it.util.schemaHasRules($additionalItems, it.RULES.all))) { + $it.schema = $additionalItems; + $it.schemaPath = it.schemaPath + '.additionalItems'; + $it.errSchemaPath = it.errSchemaPath + '/additionalItems'; + out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') { for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } else if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true); + var $passData = $data + '[' + $idx + ']'; + $it.dataPathArr[$dataNxt] = $idx; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' }'; + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/multipleOf.js b/node_sid/node_modules/ajv/lib/dotjs/multipleOf.js new file mode 100644 index 0000000..9d6401b --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/multipleOf.js @@ -0,0 +1,80 @@ +'use strict'; +module.exports = function generate_multipleOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (!($isData || typeof $schema == 'number')) { + throw new Error($keyword + ' must be number'); + } + out += 'var division' + ($lvl) + ';if ('; + if ($isData) { + out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \'number\' || '; + } + out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', '; + if (it.opts.multipleOfPrecision) { + out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' '; + } else { + out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') '; + } + out += ' ) '; + if ($isData) { + out += ' ) '; + } + out += ' ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('multipleOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be multiple of '; + if ($isData) { + out += '\' + ' + ($schemaValue); + } else { + out += '' + ($schemaValue) + '\''; + } + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/not.js b/node_sid/node_modules/ajv/lib/dotjs/not.js new file mode 100644 index 0000000..f50c937 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/not.js @@ -0,0 +1,84 @@ +'use strict'; +module.exports = function generate_not(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + $it.level++; + var $nextValid = 'valid' + $it.level; + if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.createErrors = false; + var $allErrorsOption; + if ($it.opts.allErrors) { + $allErrorsOption = $it.opts.allErrors; + $it.opts.allErrors = false; + } + out += ' ' + (it.validate($it)) + ' '; + $it.createErrors = true; + if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption; + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (' + ($nextValid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } '; + if (it.opts.allErrors) { + out += ' } '; + } + } else { + out += ' var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('not') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT be valid\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if ($breakOnError) { + out += ' if (false) { '; + } + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/oneOf.js b/node_sid/node_modules/ajv/lib/dotjs/oneOf.js new file mode 100644 index 0000000..dfe2fd5 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/oneOf.js @@ -0,0 +1,73 @@ +'use strict'; +module.exports = function generate_oneOf(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $currentBaseId = $it.baseId, + $prevValid = 'prevValid' + $lvl, + $passingSchemas = 'passingSchemas' + $lvl; + out += 'var ' + ($errs) + ' = errors , ' + ($prevValid) + ' = false , ' + ($valid) + ' = false , ' + ($passingSchemas) + ' = null; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var arr1 = $schema; + if (arr1) { + var $sch, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $sch = arr1[$i += 1]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = $schemaPath + '[' + $i + ']'; + $it.errSchemaPath = $errSchemaPath + '/' + $i; + out += ' ' + (it.validate($it)) + ' '; + $it.baseId = $currentBaseId; + } else { + out += ' var ' + ($nextValid) + ' = true; '; + } + if ($i) { + out += ' if (' + ($nextValid) + ' && ' + ($prevValid) + ') { ' + ($valid) + ' = false; ' + ($passingSchemas) + ' = [' + ($passingSchemas) + ', ' + ($i) + ']; } else { '; + $closingBraces += '}'; + } + out += ' if (' + ($nextValid) + ') { ' + ($valid) + ' = ' + ($prevValid) + ' = true; ' + ($passingSchemas) + ' = ' + ($i) + '; }'; + } + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += '' + ($closingBraces) + 'if (!' + ($valid) + ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('oneOf') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { passingSchemas: ' + ($passingSchemas) + ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match exactly one schema in oneOf\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; return false; '; + } + } + out += '} else { errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }'; + if (it.opts.allErrors) { + out += ' } '; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/pattern.js b/node_sid/node_modules/ajv/lib/dotjs/pattern.js new file mode 100644 index 0000000..1d74d6b --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/pattern.js @@ -0,0 +1,75 @@ +'use strict'; +module.exports = function generate_pattern(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema); + out += 'if ( '; + if ($isData) { + out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \'string\') || '; + } + out += ' !' + ($regexp) + '.test(' + ($data) + ') ) { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('pattern') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern: '; + if ($isData) { + out += '' + ($schemaValue); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should match pattern "'; + if ($isData) { + out += '\' + ' + ($schemaValue) + ' + \''; + } else { + out += '' + (it.util.escapeQuotes($schema)); + } + out += '"\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + (it.util.toQuotedString($schema)); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += '} '; + if ($breakOnError) { + out += ' else { '; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/properties.js b/node_sid/node_modules/ajv/lib/dotjs/properties.js new file mode 100644 index 0000000..bc5ee55 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/properties.js @@ -0,0 +1,335 @@ +'use strict'; +module.exports = function generate_properties(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl; + var $schemaKeys = Object.keys($schema || {}).filter(notProto), + $pProperties = it.schema.patternProperties || {}, + $pPropertyKeys = Object.keys($pProperties).filter(notProto), + $aProperties = it.schema.additionalProperties, + $someProperties = $schemaKeys.length || $pPropertyKeys.length, + $noAdditional = $aProperties === false, + $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length, + $removeAdditional = it.opts.removeAdditional, + $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + var $required = it.schema.required; + if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { + var $requiredHash = it.util.toHash($required); + } + + function notProto(p) { + return p !== '__proto__'; + } + out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;'; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined;'; + } + if ($checkAdditional) { + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + if ($someProperties) { + out += ' var isAdditional' + ($lvl) + ' = !(false '; + if ($schemaKeys.length) { + if ($schemaKeys.length > 8) { + out += ' || validate.schema' + ($schemaPath) + '.hasOwnProperty(' + ($key) + ') '; + } else { + var arr1 = $schemaKeys; + if (arr1) { + var $propertyKey, i1 = -1, + l1 = arr1.length - 1; + while (i1 < l1) { + $propertyKey = arr1[i1 += 1]; + out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' '; + } + } + } + } + if ($pPropertyKeys.length) { + var arr2 = $pPropertyKeys; + if (arr2) { + var $pProperty, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $pProperty = arr2[$i += 1]; + out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') '; + } + } + } + out += ' ); if (isAdditional' + ($lvl) + ') { '; + } + if ($removeAdditional == 'all') { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + var $currentErrorPath = it.errorPath; + var $additionalProperty = '\' + ' + $key + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + } + if ($noAdditional) { + if ($removeAdditional) { + out += ' delete ' + ($data) + '[' + ($key) + ']; '; + } else { + out += ' ' + ($nextValid) + ' = false; '; + var $currErrSchemaPath = $errSchemaPath; + $errSchemaPath = it.errSchemaPath + '/additionalProperties'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('additionalProperties') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \'' + ($additionalProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is an invalid additional property'; + } else { + out += 'should NOT have additional properties'; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + if ($breakOnError) { + out += ' break; '; + } + } + } else if ($additionalIsSchema) { + if ($removeAdditional == 'failing') { + out += ' var ' + ($errs) + ' = errors; '; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; } '; + it.compositeRule = $it.compositeRule = $wasComposite; + } else { + $it.schema = $aProperties; + $it.schemaPath = it.schemaPath + '.additionalProperties'; + $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; + $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + } + } + it.errorPath = $currentErrorPath; + } + if ($someProperties) { + out += ' } '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + var $useDefaults = it.opts.useDefaults && !it.compositeRule; + if ($schemaKeys.length) { + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + var $prop = it.util.getProperty($propertyKey), + $passData = $data + $prop, + $hasDefault = $useDefaults && $sch.default !== undefined; + $it.schema = $sch; + $it.schemaPath = $schemaPath + $prop; + $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); + $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); + $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + $code = it.util.varReplace($code, $nextData, $passData); + var $useData = $passData; + } else { + var $useData = $nextData; + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; '; + } + if ($hasDefault) { + out += ' ' + ($code) + ' '; + } else { + if ($requiredHash && $requiredHash[$propertyKey]) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = false; '; + var $currentErrorPath = it.errorPath, + $currErrSchemaPath = $errSchemaPath, + $missingProperty = it.util.escapeQuotes($propertyKey); + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + $errSchemaPath = it.errSchemaPath + '/required'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + $errSchemaPath = $currErrSchemaPath; + it.errorPath = $currentErrorPath; + out += ' } else { '; + } else { + if ($breakOnError) { + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { ' + ($nextValid) + ' = true; } else { '; + } else { + out += ' if (' + ($useData) + ' !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ' ) { '; + } + } + out += ' ' + ($code) + ' } '; + } + } + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + if ($pPropertyKeys.length) { + var arr4 = $pPropertyKeys; + if (arr4) { + var $pProperty, i4 = -1, + l4 = arr4.length - 1; + while (i4 < l4) { + $pProperty = arr4[i4 += 1]; + var $sch = $pProperties[$pProperty]; + if ((it.opts.strictKeywords ? (typeof $sch == 'object' && Object.keys($sch).length > 0) || $sch === false : it.util.schemaHasRules($sch, it.RULES.all))) { + $it.schema = $sch; + $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); + $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty); + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { '; + $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); + var $passData = $data + '[' + $key + ']'; + $it.dataPathArr[$dataNxt] = $key; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + if ($breakOnError) { + out += ' if (!' + ($nextValid) + ') break; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else ' + ($nextValid) + ' = true; '; + } + out += ' } '; + if ($breakOnError) { + out += ' if (' + ($nextValid) + ') { '; + $closingBraces += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {'; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/propertyNames.js b/node_sid/node_modules/ajv/lib/dotjs/propertyNames.js new file mode 100644 index 0000000..2a54a08 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/propertyNames.js @@ -0,0 +1,81 @@ +'use strict'; +module.exports = function generate_propertyNames(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $errs = 'errs__' + $lvl; + var $it = it.util.copy(it); + var $closingBraces = ''; + $it.level++; + var $nextValid = 'valid' + $it.level; + out += 'var ' + ($errs) + ' = errors;'; + if ((it.opts.strictKeywords ? (typeof $schema == 'object' && Object.keys($schema).length > 0) || $schema === false : it.util.schemaHasRules($schema, it.RULES.all))) { + $it.schema = $schema; + $it.schemaPath = $schemaPath; + $it.errSchemaPath = $errSchemaPath; + var $key = 'key' + $lvl, + $idx = 'idx' + $lvl, + $i = 'i' + $lvl, + $invalidName = '\' + ' + $key + ' + \'', + $dataNxt = $it.dataLevel = it.dataLevel + 1, + $nextData = 'data' + $dataNxt, + $dataProperties = 'dataProperties' + $lvl, + $ownProperties = it.opts.ownProperties, + $currentBaseId = it.baseId; + if ($ownProperties) { + out += ' var ' + ($dataProperties) + ' = undefined; '; + } + if ($ownProperties) { + out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; '; + } else { + out += ' for (var ' + ($key) + ' in ' + ($data) + ') { '; + } + out += ' var startErrs' + ($lvl) + ' = errors; '; + var $passData = $key; + var $wasComposite = it.compositeRule; + it.compositeRule = $it.compositeRule = true; + var $code = it.validate($it); + $it.baseId = $currentBaseId; + if (it.util.varOccurences($code, $nextData) < 2) { + out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' '; + } else { + out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' '; + } + it.compositeRule = $it.compositeRule = $wasComposite; + out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + ' 0) || $propertySch === false : it.util.schemaHasRules($propertySch, it.RULES.all)))) { + $required[$required.length] = $property; + } + } + } + } else { + var $required = $schema; + } + } + if ($isData || $required.length) { + var $currentErrorPath = it.errorPath, + $loopRequired = $isData || $required.length >= it.opts.loopRequired, + $ownProperties = it.opts.ownProperties; + if ($breakOnError) { + out += ' var missing' + ($lvl) + '; '; + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + out += ' var ' + ($valid) + ' = true; '; + if ($isData) { + out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {'; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined '; + if ($ownProperties) { + out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += '; if (!' + ($valid) + ') break; } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } else { + out += ' if ( '; + var arr2 = $required; + if (arr2) { + var $propertyKey, $i = -1, + l2 = arr2.length - 1; + while ($i < l2) { + $propertyKey = arr2[$i += 1]; + if ($i) { + out += ' || '; + } + var $prop = it.util.getProperty($propertyKey), + $useData = $data + $prop; + out += ' ( ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) '; + } + } + out += ') { '; + var $propertyPath = 'missing' + $lvl, + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } else { '; + } + } else { + if ($loopRequired) { + if (!$isData) { + out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; '; + } + var $i = 'i' + $lvl, + $propertyPath = 'schema' + $lvl + '[' + $i + ']', + $missingProperty = '\' + ' + $propertyPath + ' + \''; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers); + } + if ($isData) { + out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { '; + } + out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } '; + if ($isData) { + out += ' } '; + } + } else { + var arr3 = $required; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $prop = it.util.getProperty($propertyKey), + $missingProperty = it.util.escapeQuotes($propertyKey), + $useData = $data + $prop; + if (it.opts._errorDataPathProperty) { + it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); + } + out += ' if ( ' + ($useData) + ' === undefined '; + if ($ownProperties) { + out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \'' + (it.util.escapeQuotes($propertyKey)) + '\') '; + } + out += ') { var err = '; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('required') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \'' + ($missingProperty) + '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \''; + if (it.opts._errorDataPathProperty) { + out += 'is a required property'; + } else { + out += 'should have required property \\\'' + ($missingProperty) + '\\\''; + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + out += '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } '; + } + } + } + } + it.errorPath = $currentErrorPath; + } else if ($breakOnError) { + out += ' if (true) {'; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/uniqueItems.js b/node_sid/node_modules/ajv/lib/dotjs/uniqueItems.js new file mode 100644 index 0000000..0736a0e --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/uniqueItems.js @@ -0,0 +1,86 @@ +'use strict'; +module.exports = function generate_uniqueItems(it, $keyword, $ruleType) { + var out = ' '; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + var $isData = it.opts.$data && $schema && $schema.$data, + $schemaValue; + if ($isData) { + out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; '; + $schemaValue = 'schema' + $lvl; + } else { + $schemaValue = $schema; + } + if (($schema || $isData) && it.opts.uniqueItems !== false) { + if ($isData) { + out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \'boolean\') ' + ($valid) + ' = false; else { '; + } + out += ' var i = ' + ($data) + '.length , ' + ($valid) + ' = true , j; if (i > 1) { '; + var $itemType = it.schema.items && it.schema.items.type, + $typeIsArray = Array.isArray($itemType); + if (!$itemType || $itemType == 'object' || $itemType == 'array' || ($typeIsArray && ($itemType.indexOf('object') >= 0 || $itemType.indexOf('array') >= 0))) { + out += ' outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } '; + } else { + out += ' var itemIndices = {}, item; for (;i--;) { var item = ' + ($data) + '[i]; '; + var $method = 'checkDataType' + ($typeIsArray ? 's' : ''); + out += ' if (' + (it.util[$method]($itemType, 'item', it.opts.strictNumbers, true)) + ') continue; '; + if ($typeIsArray) { + out += ' if (typeof item == \'string\') item = \'"\' + item; '; + } + out += ' if (typeof itemIndices[item] == \'number\') { ' + ($valid) + ' = false; j = itemIndices[item]; break; } itemIndices[item] = i; } '; + } + out += ' } '; + if ($isData) { + out += ' } '; + } + out += ' if (!' + ($valid) + ') { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ('uniqueItems') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } '; + if (it.opts.messages !== false) { + out += ' , message: \'should NOT have duplicate items (items ## \' + j + \' and \' + i + \' are identical)\' '; + } + if (it.opts.verbose) { + out += ' , schema: '; + if ($isData) { + out += 'validate.schema' + ($schemaPath); + } else { + out += '' + ($schema); + } + out += ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + if ($breakOnError) { + out += ' else { '; + } + } else { + if ($breakOnError) { + out += ' if (true) { '; + } + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/dotjs/validate.js b/node_sid/node_modules/ajv/lib/dotjs/validate.js new file mode 100644 index 0000000..f295824 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/dotjs/validate.js @@ -0,0 +1,482 @@ +'use strict'; +module.exports = function generate_validate(it, $keyword, $ruleType) { + var out = ''; + var $async = it.schema.$async === true, + $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'), + $id = it.self._getId(it.schema); + if (it.opts.strictKeywords) { + var $unknownKwd = it.util.schemaUnknownRules(it.schema, it.RULES.keywords); + if ($unknownKwd) { + var $keywordsMsg = 'unknown keyword: ' + $unknownKwd; + if (it.opts.strictKeywords === 'log') it.logger.warn($keywordsMsg); + else throw new Error($keywordsMsg); + } + } + if (it.isTop) { + out += ' var validate = '; + if ($async) { + it.async = true; + out += 'async '; + } + out += 'function(data, dataPath, parentData, parentDataProperty, rootData) { \'use strict\'; '; + if ($id && (it.opts.sourceCode || it.opts.processCode)) { + out += ' ' + ('/\*# sourceURL=' + $id + ' */') + ' '; + } + } + if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) { + var $keyword = 'false schema'; + var $lvl = it.level; + var $dataLvl = it.dataLevel; + var $schema = it.schema[$keyword]; + var $schemaPath = it.schemaPath + it.util.getProperty($keyword); + var $errSchemaPath = it.errSchemaPath + '/' + $keyword; + var $breakOnError = !it.opts.allErrors; + var $errorKeyword; + var $data = 'data' + ($dataLvl || ''); + var $valid = 'valid' + $lvl; + if (it.schema === false) { + if (it.isTop) { + $breakOnError = true; + } else { + out += ' var ' + ($valid) + ' = false; '; + } + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'false schema') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} '; + if (it.opts.messages !== false) { + out += ' , message: \'boolean schema is false\' '; + } + if (it.opts.verbose) { + out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } else { + if (it.isTop) { + if ($async) { + out += ' return data; '; + } else { + out += ' validate.errors = null; return true; '; + } + } else { + out += ' var ' + ($valid) + ' = true; '; + } + } + if (it.isTop) { + out += ' }; return validate; '; + } + return out; + } + if (it.isTop) { + var $top = it.isTop, + $lvl = it.level = 0, + $dataLvl = it.dataLevel = 0, + $data = 'data'; + it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema)); + it.baseId = it.baseId || it.rootId; + delete it.isTop; + it.dataPathArr = [""]; + if (it.schema.default !== undefined && it.opts.useDefaults && it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored in the schema root'; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + out += ' var vErrors = null; '; + out += ' var errors = 0; '; + out += ' if (rootData === undefined) rootData = data; '; + } else { + var $lvl = it.level, + $dataLvl = it.dataLevel, + $data = 'data' + ($dataLvl || ''); + if ($id) it.baseId = it.resolve.url(it.baseId, $id); + if ($async && !it.async) throw new Error('async schema in sync schema'); + out += ' var errs_' + ($lvl) + ' = errors;'; + } + var $valid = 'valid' + $lvl, + $breakOnError = !it.opts.allErrors, + $closingBraces1 = '', + $closingBraces2 = ''; + var $errorKeyword; + var $typeSchema = it.schema.type, + $typeIsArray = Array.isArray($typeSchema); + if ($typeSchema && it.opts.nullable && it.schema.nullable === true) { + if ($typeIsArray) { + if ($typeSchema.indexOf('null') == -1) $typeSchema = $typeSchema.concat('null'); + } else if ($typeSchema != 'null') { + $typeSchema = [$typeSchema, 'null']; + $typeIsArray = true; + } + } + if ($typeIsArray && $typeSchema.length == 1) { + $typeSchema = $typeSchema[0]; + $typeIsArray = false; + } + if (it.schema.$ref && $refKeywords) { + if (it.opts.extendRefs == 'fail') { + throw new Error('$ref: validation keywords used in schema at path "' + it.errSchemaPath + '" (see option extendRefs)'); + } else if (it.opts.extendRefs !== true) { + $refKeywords = false; + it.logger.warn('$ref: keywords ignored in schema at path "' + it.errSchemaPath + '"'); + } + } + if (it.schema.$comment && it.opts.$comment) { + out += ' ' + (it.RULES.all.$comment.code(it, '$comment')); + } + if ($typeSchema) { + if (it.opts.coerceTypes) { + var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema); + } + var $rulesGroup = it.RULES.types[$typeSchema]; + if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) { + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type', + $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType'; + out += ' if (' + (it.util[$method]($typeSchema, $data, it.opts.strictNumbers, true)) + ') { '; + if ($coerceToTypes) { + var $dataType = 'dataType' + $lvl, + $coerced = 'coerced' + $lvl; + out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; var ' + ($coerced) + ' = undefined; '; + if (it.opts.coerceTypes == 'array') { + out += ' if (' + ($dataType) + ' == \'object\' && Array.isArray(' + ($data) + ') && ' + ($data) + '.length == 1) { ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + '; if (' + (it.util.checkDataType(it.schema.type, $data, it.opts.strictNumbers)) + ') ' + ($coerced) + ' = ' + ($data) + '; } '; + } + out += ' if (' + ($coerced) + ' !== undefined) ; '; + var arr1 = $coerceToTypes; + if (arr1) { + var $type, $i = -1, + l1 = arr1.length - 1; + while ($i < l1) { + $type = arr1[$i += 1]; + if ($type == 'string') { + out += ' else if (' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\') ' + ($coerced) + ' = \'\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \'\'; '; + } else if ($type == 'number' || $type == 'integer') { + out += ' else if (' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \'string\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' '; + if ($type == 'integer') { + out += ' && !(' + ($data) + ' % 1)'; + } + out += ')) ' + ($coerced) + ' = +' + ($data) + '; '; + } else if ($type == 'boolean') { + out += ' else if (' + ($data) + ' === \'false\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \'true\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; '; + } else if ($type == 'null') { + out += ' else if (' + ($data) + ' === \'\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; '; + } else if (it.opts.coerceTypes == 'array' && $type == 'array') { + out += ' else if (' + ($dataType) + ' == \'string\' || ' + ($dataType) + ' == \'number\' || ' + ($dataType) + ' == \'boolean\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; '; + } + } + } + out += ' else { '; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } if (' + ($coerced) + ' !== undefined) { '; + var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData', + $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty'; + out += ' ' + ($data) + ' = ' + ($coerced) + '; '; + if (!$dataLvl) { + out += 'if (' + ($parentData) + ' !== undefined)'; + } + out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } '; + } else { + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + } + out += ' } '; + } + } + if (it.schema.$ref && !$refKeywords) { + out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' '; + if ($breakOnError) { + out += ' } if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } else { + var arr2 = it.RULES; + if (arr2) { + var $rulesGroup, i2 = -1, + l2 = arr2.length - 1; + while (i2 < l2) { + $rulesGroup = arr2[i2 += 1]; + if ($shouldUseGroup($rulesGroup)) { + if ($rulesGroup.type) { + out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data, it.opts.strictNumbers)) + ') { '; + } + if (it.opts.useDefaults) { + if ($rulesGroup.type == 'object' && it.schema.properties) { + var $schema = it.schema.properties, + $schemaKeys = Object.keys($schema); + var arr3 = $schemaKeys; + if (arr3) { + var $propertyKey, i3 = -1, + l3 = arr3.length - 1; + while (i3 < l3) { + $propertyKey = arr3[i3 += 1]; + var $sch = $schema[$propertyKey]; + if ($sch.default !== undefined) { + var $passData = $data + it.util.getProperty($propertyKey); + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) { + var arr4 = it.schema.items; + if (arr4) { + var $sch, $i = -1, + l4 = arr4.length - 1; + while ($i < l4) { + $sch = arr4[$i += 1]; + if ($sch.default !== undefined) { + var $passData = $data + '[' + $i + ']'; + if (it.compositeRule) { + if (it.opts.strictDefaults) { + var $defaultMsg = 'default is ignored for: ' + $passData; + if (it.opts.strictDefaults === 'log') it.logger.warn($defaultMsg); + else throw new Error($defaultMsg); + } + } else { + out += ' if (' + ($passData) + ' === undefined '; + if (it.opts.useDefaults == 'empty') { + out += ' || ' + ($passData) + ' === null || ' + ($passData) + ' === \'\' '; + } + out += ' ) ' + ($passData) + ' = '; + if (it.opts.useDefaults == 'shared') { + out += ' ' + (it.useDefault($sch.default)) + ' '; + } else { + out += ' ' + (JSON.stringify($sch.default)) + ' '; + } + out += '; '; + } + } + } + } + } + } + var arr5 = $rulesGroup.rules; + if (arr5) { + var $rule, i5 = -1, + l5 = arr5.length - 1; + while (i5 < l5) { + $rule = arr5[i5 += 1]; + if ($shouldUseRule($rule)) { + var $code = $rule.code(it, $rule.keyword, $rulesGroup.type); + if ($code) { + out += ' ' + ($code) + ' '; + if ($breakOnError) { + $closingBraces1 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces1) + ' '; + $closingBraces1 = ''; + } + if ($rulesGroup.type) { + out += ' } '; + if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) { + out += ' else { '; + var $schemaPath = it.schemaPath + '.type', + $errSchemaPath = it.errSchemaPath + '/type'; + var $$outStack = $$outStack || []; + $$outStack.push(out); + out = ''; /* istanbul ignore else */ + if (it.createErrors !== false) { + out += ' { keyword: \'' + ($errorKeyword || 'type') + '\' , dataPath: (dataPath || \'\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \''; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' } '; + if (it.opts.messages !== false) { + out += ' , message: \'should be '; + if ($typeIsArray) { + out += '' + ($typeSchema.join(",")); + } else { + out += '' + ($typeSchema); + } + out += '\' '; + } + if (it.opts.verbose) { + out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' '; + } + out += ' } '; + } else { + out += ' {} '; + } + var __err = out; + out = $$outStack.pop(); + if (!it.compositeRule && $breakOnError) { + /* istanbul ignore if */ + if (it.async) { + out += ' throw new ValidationError([' + (__err) + ']); '; + } else { + out += ' validate.errors = [' + (__err) + ']; return false; '; + } + } else { + out += ' var err = ' + (__err) + '; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; '; + } + out += ' } '; + } + } + if ($breakOnError) { + out += ' if (errors === '; + if ($top) { + out += '0'; + } else { + out += 'errs_' + ($lvl); + } + out += ') { '; + $closingBraces2 += '}'; + } + } + } + } + } + if ($breakOnError) { + out += ' ' + ($closingBraces2) + ' '; + } + if ($top) { + if ($async) { + out += ' if (errors === 0) return data; '; + out += ' else throw new ValidationError(vErrors); '; + } else { + out += ' validate.errors = vErrors; '; + out += ' return errors === 0; '; + } + out += ' }; return validate;'; + } else { + out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';'; + } + + function $shouldUseGroup($rulesGroup) { + var rules = $rulesGroup.rules; + for (var i = 0; i < rules.length; i++) + if ($shouldUseRule(rules[i])) return true; + } + + function $shouldUseRule($rule) { + return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule)); + } + + function $ruleImplementsSomeKeyword($rule) { + var impl = $rule.implements; + for (var i = 0; i < impl.length; i++) + if (it.schema[impl[i]] !== undefined) return true; + } + return out; +} diff --git a/node_sid/node_modules/ajv/lib/keyword.js b/node_sid/node_modules/ajv/lib/keyword.js new file mode 100644 index 0000000..06da9a2 --- /dev/null +++ b/node_sid/node_modules/ajv/lib/keyword.js @@ -0,0 +1,146 @@ +'use strict'; + +var IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i; +var customRuleCode = require('./dotjs/custom'); +var definitionSchema = require('./definition_schema'); + +module.exports = { + add: addKeyword, + get: getKeyword, + remove: removeKeyword, + validate: validateKeyword +}; + + +/** + * Define custom keyword + * @this Ajv + * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords). + * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`. + * @return {Ajv} this for method chaining + */ +function addKeyword(keyword, definition) { + /* jshint validthis: true */ + /* eslint no-shadow: 0 */ + var RULES = this.RULES; + if (RULES.keywords[keyword]) + throw new Error('Keyword ' + keyword + ' is already defined'); + + if (!IDENTIFIER.test(keyword)) + throw new Error('Keyword ' + keyword + ' is not a valid identifier'); + + if (definition) { + this.validateKeyword(definition, true); + + var dataType = definition.type; + if (Array.isArray(dataType)) { + for (var i=0; i ../ajv-dist/bower.json + cd ../ajv-dist + + if [[ `git status --porcelain` ]]; then + echo "Changes detected. Updating master branch..." + git add -A + git commit -m "updated by travis build #$TRAVIS_BUILD_NUMBER" + git push --quiet origin master > /dev/null 2>&1 + fi + + echo "Publishing tag..." + + git tag $TRAVIS_TAG + git push --tags > /dev/null 2>&1 + + echo "Done" +fi diff --git a/node_sid/node_modules/ajv/scripts/travis-gh-pages b/node_sid/node_modules/ajv/scripts/travis-gh-pages new file mode 100644 index 0000000..b3d4f3d --- /dev/null +++ b/node_sid/node_modules/ajv/scripts/travis-gh-pages @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +set -e + +if [[ "$TRAVIS_BRANCH" == "master" && "$TRAVIS_PULL_REQUEST" == "false" && $TRAVIS_JOB_NUMBER =~ ".3" ]]; then + git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qE '\.md$|^LICENSE$|travis-gh-pages$' && { + rm -rf ../gh-pages + git clone -b gh-pages --single-branch https://${GITHUB_TOKEN}@github.com/ajv-validator/ajv.git ../gh-pages + mkdir -p ../gh-pages/_source + cp *.md ../gh-pages/_source + cp LICENSE ../gh-pages/_source + currentDir=$(pwd) + cd ../gh-pages + $currentDir/node_modules/.bin/gh-pages-generator + # remove logo from README + sed -i -E "s/]+ajv_logo[^>]+>//" index.md + git config user.email "$GIT_USER_EMAIL" + git config user.name "$GIT_USER_NAME" + git add . + git commit -am "updated by travis build #$TRAVIS_BUILD_NUMBER" + git push --quiet origin gh-pages > /dev/null 2>&1 + } +fi diff --git a/node_sid/node_modules/asn1/Jenkinsfile b/node_sid/node_modules/asn1/Jenkinsfile new file mode 100644 index 0000000..d1b4593 --- /dev/null +++ b/node_sid/node_modules/asn1/Jenkinsfile @@ -0,0 +1,65 @@ +@Library('jenkins-joylib@v1.0.8') _ + +pipeline { + + agent none + + options { + buildDiscarder(logRotator(numToKeepStr: '45')) + timestamps() + } + + stages { + stage('top') { + parallel { + stage('v4-zone') { + agent { + label joyCommonLabels(image_ver: '15.4.1') + } + tools { + nodejs 'sdcnode-v4-zone' + } + stages { + stage('check') { + steps{ + sh('make check') + } + } + stage('test') { + steps{ + sh('make test') + } + } + } + } + + stage('v6-zone64') { + agent { + label joyCommonLabels(image_ver: '18.4.0') + } + tools { + nodejs 'sdcnode-v6-zone64' + } + stages { + stage('check') { + steps{ + sh('make check') + } + } + stage('test') { + steps{ + sh('make test') + } + } + } + } + } + } + } + + post { + always { + joySlackNotifications() + } + } +} diff --git a/node_sid/node_modules/asn1/LICENSE b/node_sid/node_modules/asn1/LICENSE new file mode 100644 index 0000000..9b5dcdb --- /dev/null +++ b/node_sid/node_modules/asn1/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011 Mark Cavage, All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE diff --git a/node_sid/node_modules/asn1/README.md b/node_sid/node_modules/asn1/README.md new file mode 100644 index 0000000..2208210 --- /dev/null +++ b/node_sid/node_modules/asn1/README.md @@ -0,0 +1,50 @@ +node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS. +Currently BER encoding is supported; at some point I'll likely have to do DER. + +## Usage + +Mostly, if you're *actually* needing to read and write ASN.1, you probably don't +need this readme to explain what and why. If you have no idea what ASN.1 is, +see this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc + +The source is pretty much self-explanatory, and has read/write methods for the +common types out there. + +### Decoding + +The following reads an ASN.1 sequence with a boolean. + + var Ber = require('asn1').Ber; + + var reader = new Ber.Reader(Buffer.from([0x30, 0x03, 0x01, 0x01, 0xff])); + + reader.readSequence(); + console.log('Sequence len: ' + reader.length); + if (reader.peek() === Ber.Boolean) + console.log(reader.readBoolean()); + +### Encoding + +The following generates the same payload as above. + + var Ber = require('asn1').Ber; + + var writer = new Ber.Writer(); + + writer.startSequence(); + writer.writeBoolean(true); + writer.endSequence(); + + console.log(writer.buffer); + +## Installation + + npm install asn1 + +## License + +MIT. + +## Bugs + +See . diff --git a/node_sid/node_modules/asn1/lib/ber/errors.js b/node_sid/node_modules/asn1/lib/ber/errors.js new file mode 100644 index 0000000..4557b8a --- /dev/null +++ b/node_sid/node_modules/asn1/lib/ber/errors.js @@ -0,0 +1,13 @@ +// Copyright 2011 Mark Cavage All rights reserved. + + +module.exports = { + + newInvalidAsn1Error: function (msg) { + var e = new Error(); + e.name = 'InvalidAsn1Error'; + e.message = msg || ''; + return e; + } + +}; diff --git a/node_sid/node_modules/asn1/lib/ber/index.js b/node_sid/node_modules/asn1/lib/ber/index.js new file mode 100644 index 0000000..387d132 --- /dev/null +++ b/node_sid/node_modules/asn1/lib/ber/index.js @@ -0,0 +1,27 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +var errors = require('./errors'); +var types = require('./types'); + +var Reader = require('./reader'); +var Writer = require('./writer'); + + +// --- Exports + +module.exports = { + + Reader: Reader, + + Writer: Writer + +}; + +for (var t in types) { + if (types.hasOwnProperty(t)) + module.exports[t] = types[t]; +} +for (var e in errors) { + if (errors.hasOwnProperty(e)) + module.exports[e] = errors[e]; +} diff --git a/node_sid/node_modules/asn1/lib/ber/reader.js b/node_sid/node_modules/asn1/lib/ber/reader.js new file mode 100644 index 0000000..8a7e4ca --- /dev/null +++ b/node_sid/node_modules/asn1/lib/ber/reader.js @@ -0,0 +1,262 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +var assert = require('assert'); +var Buffer = require('safer-buffer').Buffer; + +var ASN1 = require('./types'); +var errors = require('./errors'); + + +// --- Globals + +var newInvalidAsn1Error = errors.newInvalidAsn1Error; + + + +// --- API + +function Reader(data) { + if (!data || !Buffer.isBuffer(data)) + throw new TypeError('data must be a node Buffer'); + + this._buf = data; + this._size = data.length; + + // These hold the "current" state + this._len = 0; + this._offset = 0; +} + +Object.defineProperty(Reader.prototype, 'length', { + enumerable: true, + get: function () { return (this._len); } +}); + +Object.defineProperty(Reader.prototype, 'offset', { + enumerable: true, + get: function () { return (this._offset); } +}); + +Object.defineProperty(Reader.prototype, 'remain', { + get: function () { return (this._size - this._offset); } +}); + +Object.defineProperty(Reader.prototype, 'buffer', { + get: function () { return (this._buf.slice(this._offset)); } +}); + + +/** + * Reads a single byte and advances offset; you can pass in `true` to make this + * a "peek" operation (i.e., get the byte, but don't advance the offset). + * + * @param {Boolean} peek true means don't move offset. + * @return {Number} the next byte, null if not enough data. + */ +Reader.prototype.readByte = function (peek) { + if (this._size - this._offset < 1) + return null; + + var b = this._buf[this._offset] & 0xff; + + if (!peek) + this._offset += 1; + + return b; +}; + + +Reader.prototype.peek = function () { + return this.readByte(true); +}; + + +/** + * Reads a (potentially) variable length off the BER buffer. This call is + * not really meant to be called directly, as callers have to manipulate + * the internal buffer afterwards. + * + * As a result of this call, you can call `Reader.length`, until the + * next thing called that does a readLength. + * + * @return {Number} the amount of offset to advance the buffer. + * @throws {InvalidAsn1Error} on bad ASN.1 + */ +Reader.prototype.readLength = function (offset) { + if (offset === undefined) + offset = this._offset; + + if (offset >= this._size) + return null; + + var lenB = this._buf[offset++] & 0xff; + if (lenB === null) + return null; + + if ((lenB & 0x80) === 0x80) { + lenB &= 0x7f; + + if (lenB === 0) + throw newInvalidAsn1Error('Indefinite length not supported'); + + if (lenB > 4) + throw newInvalidAsn1Error('encoding too long'); + + if (this._size - offset < lenB) + return null; + + this._len = 0; + for (var i = 0; i < lenB; i++) + this._len = (this._len << 8) + (this._buf[offset++] & 0xff); + + } else { + // Wasn't a variable length + this._len = lenB; + } + + return offset; +}; + + +/** + * Parses the next sequence in this BER buffer. + * + * To get the length of the sequence, call `Reader.length`. + * + * @return {Number} the sequence's tag. + */ +Reader.prototype.readSequence = function (tag) { + var seq = this.peek(); + if (seq === null) + return null; + if (tag !== undefined && tag !== seq) + throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + + ': got 0x' + seq.toString(16)); + + var o = this.readLength(this._offset + 1); // stored in `length` + if (o === null) + return null; + + this._offset = o; + return seq; +}; + + +Reader.prototype.readInt = function () { + return this._readTag(ASN1.Integer); +}; + + +Reader.prototype.readBoolean = function () { + return (this._readTag(ASN1.Boolean) === 0 ? false : true); +}; + + +Reader.prototype.readEnumeration = function () { + return this._readTag(ASN1.Enumeration); +}; + + +Reader.prototype.readString = function (tag, retbuf) { + if (!tag) + tag = ASN1.OctetString; + + var b = this.peek(); + if (b === null) + return null; + + if (b !== tag) + throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + + ': got 0x' + b.toString(16)); + + var o = this.readLength(this._offset + 1); // stored in `length` + + if (o === null) + return null; + + if (this.length > this._size - o) + return null; + + this._offset = o; + + if (this.length === 0) + return retbuf ? Buffer.alloc(0) : ''; + + var str = this._buf.slice(this._offset, this._offset + this.length); + this._offset += this.length; + + return retbuf ? str : str.toString('utf8'); +}; + +Reader.prototype.readOID = function (tag) { + if (!tag) + tag = ASN1.OID; + + var b = this.readString(tag, true); + if (b === null) + return null; + + var values = []; + var value = 0; + + for (var i = 0; i < b.length; i++) { + var byte = b[i] & 0xff; + + value <<= 7; + value += byte & 0x7f; + if ((byte & 0x80) === 0) { + values.push(value); + value = 0; + } + } + + value = values.shift(); + values.unshift(value % 40); + values.unshift((value / 40) >> 0); + + return values.join('.'); +}; + + +Reader.prototype._readTag = function (tag) { + assert.ok(tag !== undefined); + + var b = this.peek(); + + if (b === null) + return null; + + if (b !== tag) + throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) + + ': got 0x' + b.toString(16)); + + var o = this.readLength(this._offset + 1); // stored in `length` + if (o === null) + return null; + + if (this.length > 4) + throw newInvalidAsn1Error('Integer too long: ' + this.length); + + if (this.length > this._size - o) + return null; + this._offset = o; + + var fb = this._buf[this._offset]; + var value = 0; + + for (var i = 0; i < this.length; i++) { + value <<= 8; + value |= (this._buf[this._offset++] & 0xff); + } + + if ((fb & 0x80) === 0x80 && i !== 4) + value -= (1 << (i * 8)); + + return value >> 0; +}; + + + +// --- Exported API + +module.exports = Reader; diff --git a/node_sid/node_modules/asn1/lib/ber/types.js b/node_sid/node_modules/asn1/lib/ber/types.js new file mode 100644 index 0000000..8aea000 --- /dev/null +++ b/node_sid/node_modules/asn1/lib/ber/types.js @@ -0,0 +1,36 @@ +// Copyright 2011 Mark Cavage All rights reserved. + + +module.exports = { + EOC: 0, + Boolean: 1, + Integer: 2, + BitString: 3, + OctetString: 4, + Null: 5, + OID: 6, + ObjectDescriptor: 7, + External: 8, + Real: 9, // float + Enumeration: 10, + PDV: 11, + Utf8String: 12, + RelativeOID: 13, + Sequence: 16, + Set: 17, + NumericString: 18, + PrintableString: 19, + T61String: 20, + VideotexString: 21, + IA5String: 22, + UTCTime: 23, + GeneralizedTime: 24, + GraphicString: 25, + VisibleString: 26, + GeneralString: 28, + UniversalString: 29, + CharacterString: 30, + BMPString: 31, + Constructor: 32, + Context: 128 +}; diff --git a/node_sid/node_modules/asn1/lib/ber/writer.js b/node_sid/node_modules/asn1/lib/ber/writer.js new file mode 100644 index 0000000..3515acf --- /dev/null +++ b/node_sid/node_modules/asn1/lib/ber/writer.js @@ -0,0 +1,317 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +var assert = require('assert'); +var Buffer = require('safer-buffer').Buffer; +var ASN1 = require('./types'); +var errors = require('./errors'); + + +// --- Globals + +var newInvalidAsn1Error = errors.newInvalidAsn1Error; + +var DEFAULT_OPTS = { + size: 1024, + growthFactor: 8 +}; + + +// --- Helpers + +function merge(from, to) { + assert.ok(from); + assert.equal(typeof (from), 'object'); + assert.ok(to); + assert.equal(typeof (to), 'object'); + + var keys = Object.getOwnPropertyNames(from); + keys.forEach(function (key) { + if (to[key]) + return; + + var value = Object.getOwnPropertyDescriptor(from, key); + Object.defineProperty(to, key, value); + }); + + return to; +} + + + +// --- API + +function Writer(options) { + options = merge(DEFAULT_OPTS, options || {}); + + this._buf = Buffer.alloc(options.size || 1024); + this._size = this._buf.length; + this._offset = 0; + this._options = options; + + // A list of offsets in the buffer where we need to insert + // sequence tag/len pairs. + this._seq = []; +} + +Object.defineProperty(Writer.prototype, 'buffer', { + get: function () { + if (this._seq.length) + throw newInvalidAsn1Error(this._seq.length + ' unended sequence(s)'); + + return (this._buf.slice(0, this._offset)); + } +}); + +Writer.prototype.writeByte = function (b) { + if (typeof (b) !== 'number') + throw new TypeError('argument must be a Number'); + + this._ensure(1); + this._buf[this._offset++] = b; +}; + + +Writer.prototype.writeInt = function (i, tag) { + if (typeof (i) !== 'number') + throw new TypeError('argument must be a Number'); + if (typeof (tag) !== 'number') + tag = ASN1.Integer; + + var sz = 4; + + while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) && + (sz > 1)) { + sz--; + i <<= 8; + } + + if (sz > 4) + throw newInvalidAsn1Error('BER ints cannot be > 0xffffffff'); + + this._ensure(2 + sz); + this._buf[this._offset++] = tag; + this._buf[this._offset++] = sz; + + while (sz-- > 0) { + this._buf[this._offset++] = ((i & 0xff000000) >>> 24); + i <<= 8; + } + +}; + + +Writer.prototype.writeNull = function () { + this.writeByte(ASN1.Null); + this.writeByte(0x00); +}; + + +Writer.prototype.writeEnumeration = function (i, tag) { + if (typeof (i) !== 'number') + throw new TypeError('argument must be a Number'); + if (typeof (tag) !== 'number') + tag = ASN1.Enumeration; + + return this.writeInt(i, tag); +}; + + +Writer.prototype.writeBoolean = function (b, tag) { + if (typeof (b) !== 'boolean') + throw new TypeError('argument must be a Boolean'); + if (typeof (tag) !== 'number') + tag = ASN1.Boolean; + + this._ensure(3); + this._buf[this._offset++] = tag; + this._buf[this._offset++] = 0x01; + this._buf[this._offset++] = b ? 0xff : 0x00; +}; + + +Writer.prototype.writeString = function (s, tag) { + if (typeof (s) !== 'string') + throw new TypeError('argument must be a string (was: ' + typeof (s) + ')'); + if (typeof (tag) !== 'number') + tag = ASN1.OctetString; + + var len = Buffer.byteLength(s); + this.writeByte(tag); + this.writeLength(len); + if (len) { + this._ensure(len); + this._buf.write(s, this._offset); + this._offset += len; + } +}; + + +Writer.prototype.writeBuffer = function (buf, tag) { + if (typeof (tag) !== 'number') + throw new TypeError('tag must be a number'); + if (!Buffer.isBuffer(buf)) + throw new TypeError('argument must be a buffer'); + + this.writeByte(tag); + this.writeLength(buf.length); + this._ensure(buf.length); + buf.copy(this._buf, this._offset, 0, buf.length); + this._offset += buf.length; +}; + + +Writer.prototype.writeStringArray = function (strings) { + if ((!strings instanceof Array)) + throw new TypeError('argument must be an Array[String]'); + + var self = this; + strings.forEach(function (s) { + self.writeString(s); + }); +}; + +// This is really to solve DER cases, but whatever for now +Writer.prototype.writeOID = function (s, tag) { + if (typeof (s) !== 'string') + throw new TypeError('argument must be a string'); + if (typeof (tag) !== 'number') + tag = ASN1.OID; + + if (!/^([0-9]+\.){3,}[0-9]+$/.test(s)) + throw new Error('argument is not a valid OID string'); + + function encodeOctet(bytes, octet) { + if (octet < 128) { + bytes.push(octet); + } else if (octet < 16384) { + bytes.push((octet >>> 7) | 0x80); + bytes.push(octet & 0x7F); + } else if (octet < 2097152) { + bytes.push((octet >>> 14) | 0x80); + bytes.push(((octet >>> 7) | 0x80) & 0xFF); + bytes.push(octet & 0x7F); + } else if (octet < 268435456) { + bytes.push((octet >>> 21) | 0x80); + bytes.push(((octet >>> 14) | 0x80) & 0xFF); + bytes.push(((octet >>> 7) | 0x80) & 0xFF); + bytes.push(octet & 0x7F); + } else { + bytes.push(((octet >>> 28) | 0x80) & 0xFF); + bytes.push(((octet >>> 21) | 0x80) & 0xFF); + bytes.push(((octet >>> 14) | 0x80) & 0xFF); + bytes.push(((octet >>> 7) | 0x80) & 0xFF); + bytes.push(octet & 0x7F); + } + } + + var tmp = s.split('.'); + var bytes = []; + bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10)); + tmp.slice(2).forEach(function (b) { + encodeOctet(bytes, parseInt(b, 10)); + }); + + var self = this; + this._ensure(2 + bytes.length); + this.writeByte(tag); + this.writeLength(bytes.length); + bytes.forEach(function (b) { + self.writeByte(b); + }); +}; + + +Writer.prototype.writeLength = function (len) { + if (typeof (len) !== 'number') + throw new TypeError('argument must be a Number'); + + this._ensure(4); + + if (len <= 0x7f) { + this._buf[this._offset++] = len; + } else if (len <= 0xff) { + this._buf[this._offset++] = 0x81; + this._buf[this._offset++] = len; + } else if (len <= 0xffff) { + this._buf[this._offset++] = 0x82; + this._buf[this._offset++] = len >> 8; + this._buf[this._offset++] = len; + } else if (len <= 0xffffff) { + this._buf[this._offset++] = 0x83; + this._buf[this._offset++] = len >> 16; + this._buf[this._offset++] = len >> 8; + this._buf[this._offset++] = len; + } else { + throw newInvalidAsn1Error('Length too long (> 4 bytes)'); + } +}; + +Writer.prototype.startSequence = function (tag) { + if (typeof (tag) !== 'number') + tag = ASN1.Sequence | ASN1.Constructor; + + this.writeByte(tag); + this._seq.push(this._offset); + this._ensure(3); + this._offset += 3; +}; + + +Writer.prototype.endSequence = function () { + var seq = this._seq.pop(); + var start = seq + 3; + var len = this._offset - start; + + if (len <= 0x7f) { + this._shift(start, len, -2); + this._buf[seq] = len; + } else if (len <= 0xff) { + this._shift(start, len, -1); + this._buf[seq] = 0x81; + this._buf[seq + 1] = len; + } else if (len <= 0xffff) { + this._buf[seq] = 0x82; + this._buf[seq + 1] = len >> 8; + this._buf[seq + 2] = len; + } else if (len <= 0xffffff) { + this._shift(start, len, 1); + this._buf[seq] = 0x83; + this._buf[seq + 1] = len >> 16; + this._buf[seq + 2] = len >> 8; + this._buf[seq + 3] = len; + } else { + throw newInvalidAsn1Error('Sequence too long'); + } +}; + + +Writer.prototype._shift = function (start, len, shift) { + assert.ok(start !== undefined); + assert.ok(len !== undefined); + assert.ok(shift); + + this._buf.copy(this._buf, start + shift, start, start + len); + this._offset += shift; +}; + +Writer.prototype._ensure = function (len) { + assert.ok(len); + + if (this._size - this._offset < len) { + var sz = this._size * this._options.growthFactor; + if (sz - this._offset < len) + sz += len; + + var buf = Buffer.alloc(sz); + + this._buf.copy(buf, 0, 0, this._offset); + this._buf = buf; + this._size = sz; + } +}; + + + +// --- Exported API + +module.exports = Writer; diff --git a/node_sid/node_modules/asn1/lib/index.js b/node_sid/node_modules/asn1/lib/index.js new file mode 100644 index 0000000..ede3ab2 --- /dev/null +++ b/node_sid/node_modules/asn1/lib/index.js @@ -0,0 +1,20 @@ +// Copyright 2011 Mark Cavage All rights reserved. + +// If you have no idea what ASN.1 or BER is, see this: +// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc + +var Ber = require('./ber/index'); + + + +// --- Exported API + +module.exports = { + + Ber: Ber, + + BerReader: Ber.Reader, + + BerWriter: Ber.Writer + +}; diff --git a/node_sid/node_modules/asn1/package.json b/node_sid/node_modules/asn1/package.json new file mode 100644 index 0000000..e31cce5 --- /dev/null +++ b/node_sid/node_modules/asn1/package.json @@ -0,0 +1,31 @@ +{ + "author": "Joyent (joyent.com)", + "contributors": [ + "Mark Cavage ", + "David Gwynne ", + "Yunong Xiao ", + "Alex Wilson " + ], + "name": "asn1", + "description": "Contains parsers and serializers for ASN.1 (currently BER only)", + "version": "0.2.6", + "repository": { + "type": "git", + "url": "https://github.com/joyent/node-asn1.git" + }, + "main": "lib/index.js", + "dependencies": { + "safer-buffer": "~2.1.0" + }, + "devDependencies": { + "istanbul": "^0.3.6", + "faucet": "0.0.1", + "tape": "^3.5.0", + "eslint": "2.13.1", + "eslint-plugin-joyent": "~1.3.0" + }, + "scripts": { + "test": "./node_modules/.bin/tape ./test/ber/*.test.js" + }, + "license": "MIT" +} diff --git a/node_sid/node_modules/assert-plus/AUTHORS b/node_sid/node_modules/assert-plus/AUTHORS new file mode 100644 index 0000000..1923524 --- /dev/null +++ b/node_sid/node_modules/assert-plus/AUTHORS @@ -0,0 +1,6 @@ +Dave Eddy +Fred Kuo +Lars-Magnus Skog +Mark Cavage +Patrick Mooney +Rob Gulewich diff --git a/node_sid/node_modules/assert-plus/CHANGES.md b/node_sid/node_modules/assert-plus/CHANGES.md new file mode 100644 index 0000000..57d92bf --- /dev/null +++ b/node_sid/node_modules/assert-plus/CHANGES.md @@ -0,0 +1,14 @@ +# assert-plus Changelog + +## 1.0.0 + +- *BREAKING* assert.number (and derivatives) now accept Infinity as valid input +- Add assert.finite check. Previous assert.number callers should use this if + they expect Infinity inputs to throw. + +## 0.2.0 + +- Fix `assert.object(null)` so it throws +- Fix optional/arrayOf exports for non-type-of asserts +- Add optiona/arrayOf exports for Stream/Date/Regex/uuid +- Add basic unit test coverage diff --git a/node_sid/node_modules/assert-plus/README.md b/node_sid/node_modules/assert-plus/README.md new file mode 100644 index 0000000..ec200d1 --- /dev/null +++ b/node_sid/node_modules/assert-plus/README.md @@ -0,0 +1,162 @@ +# assert-plus + +This library is a super small wrapper over node's assert module that has two +things: (1) the ability to disable assertions with the environment variable +NODE\_NDEBUG, and (2) some API wrappers for argument testing. Like +`assert.string(myArg, 'myArg')`. As a simple example, most of my code looks +like this: + +```javascript + var assert = require('assert-plus'); + + function fooAccount(options, callback) { + assert.object(options, 'options'); + assert.number(options.id, 'options.id'); + assert.bool(options.isManager, 'options.isManager'); + assert.string(options.name, 'options.name'); + assert.arrayOfString(options.email, 'options.email'); + assert.func(callback, 'callback'); + + // Do stuff + callback(null, {}); + } +``` + +# API + +All methods that *aren't* part of node's core assert API are simply assumed to +take an argument, and then a string 'name' that's not a message; `AssertionError` +will be thrown if the assertion fails with a message like: + + AssertionError: foo (string) is required + at test (/home/mark/work/foo/foo.js:3:9) + at Object. (/home/mark/work/foo/foo.js:15:1) + at Module._compile (module.js:446:26) + at Object..js (module.js:464:10) + at Module.load (module.js:353:31) + at Function._load (module.js:311:12) + at Array.0 (module.js:484:10) + at EventEmitter._tickCallback (node.js:190:38) + +from: + +```javascript + function test(foo) { + assert.string(foo, 'foo'); + } +``` + +There you go. You can check that arrays are of a homogeneous type with `Arrayof$Type`: + +```javascript + function test(foo) { + assert.arrayOfString(foo, 'foo'); + } +``` + +You can assert IFF an argument is not `undefined` (i.e., an optional arg): + +```javascript + assert.optionalString(foo, 'foo'); +``` + +Lastly, you can opt-out of assertion checking altogether by setting the +environment variable `NODE_NDEBUG=1`. This is pseudo-useful if you have +lots of assertions, and don't want to pay `typeof ()` taxes to v8 in +production. Be advised: The standard functions re-exported from `assert` are +also disabled in assert-plus if NDEBUG is specified. Using them directly from +the `assert` module avoids this behavior. + +The complete list of APIs is: + +* assert.array +* assert.bool +* assert.buffer +* assert.func +* assert.number +* assert.finite +* assert.object +* assert.string +* assert.stream +* assert.date +* assert.regexp +* assert.uuid +* assert.arrayOfArray +* assert.arrayOfBool +* assert.arrayOfBuffer +* assert.arrayOfFunc +* assert.arrayOfNumber +* assert.arrayOfFinite +* assert.arrayOfObject +* assert.arrayOfString +* assert.arrayOfStream +* assert.arrayOfDate +* assert.arrayOfRegexp +* assert.arrayOfUuid +* assert.optionalArray +* assert.optionalBool +* assert.optionalBuffer +* assert.optionalFunc +* assert.optionalNumber +* assert.optionalFinite +* assert.optionalObject +* assert.optionalString +* assert.optionalStream +* assert.optionalDate +* assert.optionalRegexp +* assert.optionalUuid +* assert.optionalArrayOfArray +* assert.optionalArrayOfBool +* assert.optionalArrayOfBuffer +* assert.optionalArrayOfFunc +* assert.optionalArrayOfNumber +* assert.optionalArrayOfFinite +* assert.optionalArrayOfObject +* assert.optionalArrayOfString +* assert.optionalArrayOfStream +* assert.optionalArrayOfDate +* assert.optionalArrayOfRegexp +* assert.optionalArrayOfUuid +* assert.AssertionError +* assert.fail +* assert.ok +* assert.equal +* assert.notEqual +* assert.deepEqual +* assert.notDeepEqual +* assert.strictEqual +* assert.notStrictEqual +* assert.throws +* assert.doesNotThrow +* assert.ifError + +# Installation + + npm install assert-plus + +## License + +The MIT License (MIT) +Copyright (c) 2012 Mark Cavage + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +## Bugs + +See . diff --git a/node_sid/node_modules/assert-plus/assert.js b/node_sid/node_modules/assert-plus/assert.js new file mode 100644 index 0000000..26f944e --- /dev/null +++ b/node_sid/node_modules/assert-plus/assert.js @@ -0,0 +1,211 @@ +// Copyright (c) 2012, Mark Cavage. All rights reserved. +// Copyright 2015 Joyent, Inc. + +var assert = require('assert'); +var Stream = require('stream').Stream; +var util = require('util'); + + +///--- Globals + +/* JSSTYLED */ +var UUID_REGEXP = /^[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}$/; + + +///--- Internal + +function _capitalize(str) { + return (str.charAt(0).toUpperCase() + str.slice(1)); +} + +function _toss(name, expected, oper, arg, actual) { + throw new assert.AssertionError({ + message: util.format('%s (%s) is required', name, expected), + actual: (actual === undefined) ? typeof (arg) : actual(arg), + expected: expected, + operator: oper || '===', + stackStartFunction: _toss.caller + }); +} + +function _getClass(arg) { + return (Object.prototype.toString.call(arg).slice(8, -1)); +} + +function noop() { + // Why even bother with asserts? +} + + +///--- Exports + +var types = { + bool: { + check: function (arg) { return typeof (arg) === 'boolean'; } + }, + func: { + check: function (arg) { return typeof (arg) === 'function'; } + }, + string: { + check: function (arg) { return typeof (arg) === 'string'; } + }, + object: { + check: function (arg) { + return typeof (arg) === 'object' && arg !== null; + } + }, + number: { + check: function (arg) { + return typeof (arg) === 'number' && !isNaN(arg); + } + }, + finite: { + check: function (arg) { + return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg); + } + }, + buffer: { + check: function (arg) { return Buffer.isBuffer(arg); }, + operator: 'Buffer.isBuffer' + }, + array: { + check: function (arg) { return Array.isArray(arg); }, + operator: 'Array.isArray' + }, + stream: { + check: function (arg) { return arg instanceof Stream; }, + operator: 'instanceof', + actual: _getClass + }, + date: { + check: function (arg) { return arg instanceof Date; }, + operator: 'instanceof', + actual: _getClass + }, + regexp: { + check: function (arg) { return arg instanceof RegExp; }, + operator: 'instanceof', + actual: _getClass + }, + uuid: { + check: function (arg) { + return typeof (arg) === 'string' && UUID_REGEXP.test(arg); + }, + operator: 'isUUID' + } +}; + +function _setExports(ndebug) { + var keys = Object.keys(types); + var out; + + /* re-export standard assert */ + if (process.env.NODE_NDEBUG) { + out = noop; + } else { + out = function (arg, msg) { + if (!arg) { + _toss(msg, 'true', arg); + } + }; + } + + /* standard checks */ + keys.forEach(function (k) { + if (ndebug) { + out[k] = noop; + return; + } + var type = types[k]; + out[k] = function (arg, msg) { + if (!type.check(arg)) { + _toss(msg, k, type.operator, arg, type.actual); + } + }; + }); + + /* optional checks */ + keys.forEach(function (k) { + var name = 'optional' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + out[name] = function (arg, msg) { + if (arg === undefined || arg === null) { + return; + } + if (!type.check(arg)) { + _toss(msg, k, type.operator, arg, type.actual); + } + }; + }); + + /* arrayOf checks */ + keys.forEach(function (k) { + var name = 'arrayOf' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + var expected = '[' + k + ']'; + out[name] = function (arg, msg) { + if (!Array.isArray(arg)) { + _toss(msg, expected, type.operator, arg, type.actual); + } + var i; + for (i = 0; i < arg.length; i++) { + if (!type.check(arg[i])) { + _toss(msg, expected, type.operator, arg, type.actual); + } + } + }; + }); + + /* optionalArrayOf checks */ + keys.forEach(function (k) { + var name = 'optionalArrayOf' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + var expected = '[' + k + ']'; + out[name] = function (arg, msg) { + if (arg === undefined || arg === null) { + return; + } + if (!Array.isArray(arg)) { + _toss(msg, expected, type.operator, arg, type.actual); + } + var i; + for (i = 0; i < arg.length; i++) { + if (!type.check(arg[i])) { + _toss(msg, expected, type.operator, arg, type.actual); + } + } + }; + }); + + /* re-export built-in assertions */ + Object.keys(assert).forEach(function (k) { + if (k === 'AssertionError') { + out[k] = assert[k]; + return; + } + if (ndebug) { + out[k] = noop; + return; + } + out[k] = assert[k]; + }); + + /* export ourselves (for unit tests _only_) */ + out._setExports = _setExports; + + return out; +} + +module.exports = _setExports(process.env.NODE_NDEBUG); diff --git a/node_sid/node_modules/assert-plus/package.json b/node_sid/node_modules/assert-plus/package.json new file mode 100644 index 0000000..40d6a5c --- /dev/null +++ b/node_sid/node_modules/assert-plus/package.json @@ -0,0 +1,23 @@ +{ + "author": "Mark Cavage ", + "name": "assert-plus", + "description": "Extra assertions on top of node's assert module", + "version": "1.0.0", + "license": "MIT", + "main": "./assert.js", + "devDependencies": { + "tape": "4.2.2", + "faucet": "0.0.1" + }, + "optionalDependencies": {}, + "scripts": { + "test": "./node_modules/.bin/tape tests/*.js | ./node_modules/.bin/faucet" + }, + "repository": { + "type": "git", + "url": "https://github.com/mcavage/node-assert-plus.git" + }, + "engines": { + "node": ">=0.8" + } +} diff --git a/node_sid/node_modules/asynckit/LICENSE b/node_sid/node_modules/asynckit/LICENSE new file mode 100644 index 0000000..c9eca5d --- /dev/null +++ b/node_sid/node_modules/asynckit/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Alex Indigo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_sid/node_modules/asynckit/README.md b/node_sid/node_modules/asynckit/README.md new file mode 100644 index 0000000..ddcc7e6 --- /dev/null +++ b/node_sid/node_modules/asynckit/README.md @@ -0,0 +1,233 @@ +# asynckit [![NPM Module](https://img.shields.io/npm/v/asynckit.svg?style=flat)](https://www.npmjs.com/package/asynckit) + +Minimal async jobs utility library, with streams support. + +[![PhantomJS Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=browser&style=flat)](https://travis-ci.org/alexindigo/asynckit) +[![Linux Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=linux:0.12-6.x&style=flat)](https://travis-ci.org/alexindigo/asynckit) +[![Windows Build](https://img.shields.io/appveyor/ci/alexindigo/asynckit/v0.4.0.svg?label=windows:0.12-6.x&style=flat)](https://ci.appveyor.com/project/alexindigo/asynckit) + +[![Coverage Status](https://img.shields.io/coveralls/alexindigo/asynckit/v0.4.0.svg?label=code+coverage&style=flat)](https://coveralls.io/github/alexindigo/asynckit?branch=master) +[![Dependency Status](https://img.shields.io/david/alexindigo/asynckit/v0.4.0.svg?style=flat)](https://david-dm.org/alexindigo/asynckit) +[![bitHound Overall Score](https://www.bithound.io/github/alexindigo/asynckit/badges/score.svg)](https://www.bithound.io/github/alexindigo/asynckit) + + + +AsyncKit provides harness for `parallel` and `serial` iterators over list of items represented by arrays or objects. +Optionally it accepts abort function (should be synchronously return by iterator for each item), and terminates left over jobs upon an error event. For specific iteration order built-in (`ascending` and `descending`) and custom sort helpers also supported, via `asynckit.serialOrdered` method. + +It ensures async operations to keep behavior more stable and prevent `Maximum call stack size exceeded` errors, from sync iterators. + +| compression | size | +| :----------------- | -------: | +| asynckit.js | 12.34 kB | +| asynckit.min.js | 4.11 kB | +| asynckit.min.js.gz | 1.47 kB | + + +## Install + +```sh +$ npm install --save asynckit +``` + +## Examples + +### Parallel Jobs + +Runs iterator over provided array in parallel. Stores output in the `result` array, +on the matching positions. In unlikely event of an error from one of the jobs, +will terminate rest of the active jobs (if abort function is provided) +and return error along with salvaged data to the main callback function. + +#### Input Array + +```javascript +var parallel = require('asynckit').parallel + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ] + , target = [] + ; + +parallel(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// async job accepts one element from the array +// and a callback function +function asyncJob(item, cb) +{ + // different delays (in ms) per item + var delay = item * 25; + + // pretend different jobs take different time to finish + // and not in consequential order + var timeoutId = setTimeout(function() { + target.push(item); + cb(null, item * 2); + }, delay); + + // allow to cancel "leftover" jobs upon error + // return function, invoking of which will abort this job + return clearTimeout.bind(null, timeoutId); +} +``` + +More examples could be found in [test/test-parallel-array.js](test/test-parallel-array.js). + +#### Input Object + +Also it supports named jobs, listed via object. + +```javascript +var parallel = require('asynckit/parallel') + , assert = require('assert') + ; + +var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 } + , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 } + , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ] + , expectedKeys = [ 'first', 'one', 'two', 'four', 'eight', 'sixteen', 'thirtyTwo', 'sixtyFour' ] + , target = [] + , keys = [] + ; + +parallel(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); + assert.deepEqual(keys, expectedKeys); +}); + +// supports full value, key, callback (shortcut) interface +function asyncJob(item, key, cb) +{ + // different delays (in ms) per item + var delay = item * 25; + + // pretend different jobs take different time to finish + // and not in consequential order + var timeoutId = setTimeout(function() { + keys.push(key); + target.push(item); + cb(null, item * 2); + }, delay); + + // allow to cancel "leftover" jobs upon error + // return function, invoking of which will abort this job + return clearTimeout.bind(null, timeoutId); +} +``` + +More examples could be found in [test/test-parallel-object.js](test/test-parallel-object.js). + +### Serial Jobs + +Runs iterator over provided array sequentially. Stores output in the `result` array, +on the matching positions. In unlikely event of an error from one of the jobs, +will not proceed to the rest of the items in the list +and return error along with salvaged data to the main callback function. + +#### Input Array + +```javascript +var serial = require('asynckit/serial') + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ] + , target = [] + ; + +serial(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// extended interface (item, key, callback) +// also supported for arrays +function asyncJob(item, key, cb) +{ + target.push(key); + + // it will be automatically made async + // even it iterator "returns" in the same event loop + cb(null, item * 2); +} +``` + +More examples could be found in [test/test-serial-array.js](test/test-serial-array.js). + +#### Input Object + +Also it supports named jobs, listed via object. + +```javascript +var serial = require('asynckit').serial + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ] + , target = [] + ; + +var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 } + , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 } + , expectedTarget = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , target = [] + ; + + +serial(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// shortcut interface (item, callback) +// works for object as well as for the arrays +function asyncJob(item, cb) +{ + target.push(item); + + // it will be automatically made async + // even it iterator "returns" in the same event loop + cb(null, item * 2); +} +``` + +More examples could be found in [test/test-serial-object.js](test/test-serial-object.js). + +_Note: Since _object_ is an _unordered_ collection of properties, +it may produce unexpected results with sequential iterations. +Whenever order of the jobs' execution is important please use `serialOrdered` method._ + +### Ordered Serial Iterations + +TBD + +For example [compare-property](compare-property) package. + +### Streaming interface + +TBD + +## Want to Know More? + +More examples can be found in [test folder](test/). + +Or open an [issue](https://github.com/alexindigo/asynckit/issues) with questions and/or suggestions. + +## License + +AsyncKit is licensed under the MIT license. diff --git a/node_sid/node_modules/asynckit/bench.js b/node_sid/node_modules/asynckit/bench.js new file mode 100644 index 0000000..c612f1a --- /dev/null +++ b/node_sid/node_modules/asynckit/bench.js @@ -0,0 +1,76 @@ +/* eslint no-console: "off" */ + +var asynckit = require('./') + , async = require('async') + , assert = require('assert') + , expected = 0 + ; + +var Benchmark = require('benchmark'); +var suite = new Benchmark.Suite; + +var source = []; +for (var z = 1; z < 100; z++) +{ + source.push(z); + expected += z; +} + +suite +// add tests + +.add('async.map', function(deferred) +{ + var total = 0; + + async.map(source, + function(i, cb) + { + setImmediate(function() + { + total += i; + cb(null, total); + }); + }, + function(err, result) + { + assert.ifError(err); + assert.equal(result[result.length - 1], expected); + deferred.resolve(); + }); +}, {'defer': true}) + + +.add('asynckit.parallel', function(deferred) +{ + var total = 0; + + asynckit.parallel(source, + function(i, cb) + { + setImmediate(function() + { + total += i; + cb(null, total); + }); + }, + function(err, result) + { + assert.ifError(err); + assert.equal(result[result.length - 1], expected); + deferred.resolve(); + }); +}, {'defer': true}) + + +// add listeners +.on('cycle', function(ev) +{ + console.log(String(ev.target)); +}) +.on('complete', function() +{ + console.log('Fastest is ' + this.filter('fastest').map('name')); +}) +// run async +.run({ 'async': true }); diff --git a/node_sid/node_modules/asynckit/index.js b/node_sid/node_modules/asynckit/index.js new file mode 100644 index 0000000..455f945 --- /dev/null +++ b/node_sid/node_modules/asynckit/index.js @@ -0,0 +1,6 @@ +module.exports = +{ + parallel : require('./parallel.js'), + serial : require('./serial.js'), + serialOrdered : require('./serialOrdered.js') +}; diff --git a/node_sid/node_modules/asynckit/lib/abort.js b/node_sid/node_modules/asynckit/lib/abort.js new file mode 100644 index 0000000..114367e --- /dev/null +++ b/node_sid/node_modules/asynckit/lib/abort.js @@ -0,0 +1,29 @@ +// API +module.exports = abort; + +/** + * Aborts leftover active jobs + * + * @param {object} state - current state object + */ +function abort(state) +{ + Object.keys(state.jobs).forEach(clean.bind(state)); + + // reset leftover jobs + state.jobs = {}; +} + +/** + * Cleans up leftover job by invoking abort function for the provided job id + * + * @this state + * @param {string|number} key - job id to abort + */ +function clean(key) +{ + if (typeof this.jobs[key] == 'function') + { + this.jobs[key](); + } +} diff --git a/node_sid/node_modules/asynckit/lib/async.js b/node_sid/node_modules/asynckit/lib/async.js new file mode 100644 index 0000000..7f1288a --- /dev/null +++ b/node_sid/node_modules/asynckit/lib/async.js @@ -0,0 +1,34 @@ +var defer = require('./defer.js'); + +// API +module.exports = async; + +/** + * Runs provided callback asynchronously + * even if callback itself is not + * + * @param {function} callback - callback to invoke + * @returns {function} - augmented callback + */ +function async(callback) +{ + var isAsync = false; + + // check if async happened + defer(function() { isAsync = true; }); + + return function async_callback(err, result) + { + if (isAsync) + { + callback(err, result); + } + else + { + defer(function nextTick_callback() + { + callback(err, result); + }); + } + }; +} diff --git a/node_sid/node_modules/asynckit/lib/defer.js b/node_sid/node_modules/asynckit/lib/defer.js new file mode 100644 index 0000000..b67110c --- /dev/null +++ b/node_sid/node_modules/asynckit/lib/defer.js @@ -0,0 +1,26 @@ +module.exports = defer; + +/** + * Runs provided function on next iteration of the event loop + * + * @param {function} fn - function to run + */ +function defer(fn) +{ + var nextTick = typeof setImmediate == 'function' + ? setImmediate + : ( + typeof process == 'object' && typeof process.nextTick == 'function' + ? process.nextTick + : null + ); + + if (nextTick) + { + nextTick(fn); + } + else + { + setTimeout(fn, 0); + } +} diff --git a/node_sid/node_modules/asynckit/lib/iterate.js b/node_sid/node_modules/asynckit/lib/iterate.js new file mode 100644 index 0000000..5d2839a --- /dev/null +++ b/node_sid/node_modules/asynckit/lib/iterate.js @@ -0,0 +1,75 @@ +var async = require('./async.js') + , abort = require('./abort.js') + ; + +// API +module.exports = iterate; + +/** + * Iterates over each job object + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {object} state - current job status + * @param {function} callback - invoked when all elements processed + */ +function iterate(list, iterator, state, callback) +{ + // store current index + var key = state['keyedList'] ? state['keyedList'][state.index] : state.index; + + state.jobs[key] = runJob(iterator, key, list[key], function(error, output) + { + // don't repeat yourself + // skip secondary callbacks + if (!(key in state.jobs)) + { + return; + } + + // clean up jobs + delete state.jobs[key]; + + if (error) + { + // don't process rest of the results + // stop still active jobs + // and reset the list + abort(state); + } + else + { + state.results[key] = output; + } + + // return salvaged results + callback(error, state.results); + }); +} + +/** + * Runs iterator over provided job element + * + * @param {function} iterator - iterator to invoke + * @param {string|number} key - key/index of the element in the list of jobs + * @param {mixed} item - job description + * @param {function} callback - invoked after iterator is done with the job + * @returns {function|mixed} - job abort function or something else + */ +function runJob(iterator, key, item, callback) +{ + var aborter; + + // allow shortcut if iterator expects only two arguments + if (iterator.length == 2) + { + aborter = iterator(item, async(callback)); + } + // otherwise go with full three arguments + else + { + aborter = iterator(item, key, async(callback)); + } + + return aborter; +} diff --git a/node_sid/node_modules/asynckit/lib/readable_asynckit.js b/node_sid/node_modules/asynckit/lib/readable_asynckit.js new file mode 100644 index 0000000..78ad240 --- /dev/null +++ b/node_sid/node_modules/asynckit/lib/readable_asynckit.js @@ -0,0 +1,91 @@ +var streamify = require('./streamify.js') + , defer = require('./defer.js') + ; + +// API +module.exports = ReadableAsyncKit; + +/** + * Base constructor for all streams + * used to hold properties/methods + */ +function ReadableAsyncKit() +{ + ReadableAsyncKit.super_.apply(this, arguments); + + // list of active jobs + this.jobs = {}; + + // add stream methods + this.destroy = destroy; + this._start = _start; + this._read = _read; +} + +/** + * Destroys readable stream, + * by aborting outstanding jobs + * + * @returns {void} + */ +function destroy() +{ + if (this.destroyed) + { + return; + } + + this.destroyed = true; + + if (typeof this.terminator == 'function') + { + this.terminator(); + } +} + +/** + * Starts provided jobs in async manner + * + * @private + */ +function _start() +{ + // first argument – runner function + var runner = arguments[0] + // take away first argument + , args = Array.prototype.slice.call(arguments, 1) + // second argument - input data + , input = args[0] + // last argument - result callback + , endCb = streamify.callback.call(this, args[args.length - 1]) + ; + + args[args.length - 1] = endCb; + // third argument - iterator + args[1] = streamify.iterator.call(this, args[1]); + + // allow time for proper setup + defer(function() + { + if (!this.destroyed) + { + this.terminator = runner.apply(null, args); + } + else + { + endCb(null, Array.isArray(input) ? [] : {}); + } + }.bind(this)); +} + + +/** + * Implement _read to comply with Readable streams + * Doesn't really make sense for flowing object mode + * + * @private + */ +function _read() +{ + +} diff --git a/node_sid/node_modules/asynckit/lib/readable_parallel.js b/node_sid/node_modules/asynckit/lib/readable_parallel.js new file mode 100644 index 0000000..5d2929f --- /dev/null +++ b/node_sid/node_modules/asynckit/lib/readable_parallel.js @@ -0,0 +1,25 @@ +var parallel = require('../parallel.js'); + +// API +module.exports = ReadableParallel; + +/** + * Streaming wrapper to `asynckit.parallel` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableParallel(list, iterator, callback) +{ + if (!(this instanceof ReadableParallel)) + { + return new ReadableParallel(list, iterator, callback); + } + + // turn on object mode + ReadableParallel.super_.call(this, {objectMode: true}); + + this._start(parallel, list, iterator, callback); +} diff --git a/node_sid/node_modules/asynckit/lib/readable_serial.js b/node_sid/node_modules/asynckit/lib/readable_serial.js new file mode 100644 index 0000000..7822698 --- /dev/null +++ b/node_sid/node_modules/asynckit/lib/readable_serial.js @@ -0,0 +1,25 @@ +var serial = require('../serial.js'); + +// API +module.exports = ReadableSerial; + +/** + * Streaming wrapper to `asynckit.serial` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableSerial(list, iterator, callback) +{ + if (!(this instanceof ReadableSerial)) + { + return new ReadableSerial(list, iterator, callback); + } + + // turn on object mode + ReadableSerial.super_.call(this, {objectMode: true}); + + this._start(serial, list, iterator, callback); +} diff --git a/node_sid/node_modules/asynckit/lib/readable_serial_ordered.js b/node_sid/node_modules/asynckit/lib/readable_serial_ordered.js new file mode 100644 index 0000000..3de89c4 --- /dev/null +++ b/node_sid/node_modules/asynckit/lib/readable_serial_ordered.js @@ -0,0 +1,29 @@ +var serialOrdered = require('../serialOrdered.js'); + +// API +module.exports = ReadableSerialOrdered; +// expose sort helpers +module.exports.ascending = serialOrdered.ascending; +module.exports.descending = serialOrdered.descending; + +/** + * Streaming wrapper to `asynckit.serialOrdered` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} sortMethod - custom sort function + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableSerialOrdered(list, iterator, sortMethod, callback) +{ + if (!(this instanceof ReadableSerialOrdered)) + { + return new ReadableSerialOrdered(list, iterator, sortMethod, callback); + } + + // turn on object mode + ReadableSerialOrdered.super_.call(this, {objectMode: true}); + + this._start(serialOrdered, list, iterator, sortMethod, callback); +} diff --git a/node_sid/node_modules/asynckit/lib/state.js b/node_sid/node_modules/asynckit/lib/state.js new file mode 100644 index 0000000..cbea7ad --- /dev/null +++ b/node_sid/node_modules/asynckit/lib/state.js @@ -0,0 +1,37 @@ +// API +module.exports = state; + +/** + * Creates initial state object + * for iteration over list + * + * @param {array|object} list - list to iterate over + * @param {function|null} sortMethod - function to use for keys sort, + * or `null` to keep them as is + * @returns {object} - initial state object + */ +function state(list, sortMethod) +{ + var isNamedList = !Array.isArray(list) + , initState = + { + index : 0, + keyedList: isNamedList || sortMethod ? Object.keys(list) : null, + jobs : {}, + results : isNamedList ? {} : [], + size : isNamedList ? Object.keys(list).length : list.length + } + ; + + if (sortMethod) + { + // sort array keys based on it's values + // sort object's keys just on own merit + initState.keyedList.sort(isNamedList ? sortMethod : function(a, b) + { + return sortMethod(list[a], list[b]); + }); + } + + return initState; +} diff --git a/node_sid/node_modules/asynckit/lib/streamify.js b/node_sid/node_modules/asynckit/lib/streamify.js new file mode 100644 index 0000000..f56a1c9 --- /dev/null +++ b/node_sid/node_modules/asynckit/lib/streamify.js @@ -0,0 +1,141 @@ +var async = require('./async.js'); + +// API +module.exports = { + iterator: wrapIterator, + callback: wrapCallback +}; + +/** + * Wraps iterators with long signature + * + * @this ReadableAsyncKit# + * @param {function} iterator - function to wrap + * @returns {function} - wrapped function + */ +function wrapIterator(iterator) +{ + var stream = this; + + return function(item, key, cb) + { + var aborter + , wrappedCb = async(wrapIteratorCallback.call(stream, cb, key)) + ; + + stream.jobs[key] = wrappedCb; + + // it's either shortcut (item, cb) + if (iterator.length == 2) + { + aborter = iterator(item, wrappedCb); + } + // or long format (item, key, cb) + else + { + aborter = iterator(item, key, wrappedCb); + } + + return aborter; + }; +} + +/** + * Wraps provided callback function + * allowing to execute snitch function before + * real callback + * + * @this ReadableAsyncKit# + * @param {function} callback - function to wrap + * @returns {function} - wrapped function + */ +function wrapCallback(callback) +{ + var stream = this; + + var wrapped = function(error, result) + { + return finisher.call(stream, error, result, callback); + }; + + return wrapped; +} + +/** + * Wraps provided iterator callback function + * makes sure snitch only called once, + * but passes secondary calls to the original callback + * + * @this ReadableAsyncKit# + * @param {function} callback - callback to wrap + * @param {number|string} key - iteration key + * @returns {function} wrapped callback + */ +function wrapIteratorCallback(callback, key) +{ + var stream = this; + + return function(error, output) + { + // don't repeat yourself + if (!(key in stream.jobs)) + { + callback(error, output); + return; + } + + // clean up jobs + delete stream.jobs[key]; + + return streamer.call(stream, error, {key: key, value: output}, callback); + }; +} + +/** + * Stream wrapper for iterator callback + * + * @this ReadableAsyncKit# + * @param {mixed} error - error response + * @param {mixed} output - iterator output + * @param {function} callback - callback that expects iterator results + */ +function streamer(error, output, callback) +{ + if (error && !this.error) + { + this.error = error; + this.pause(); + this.emit('error', error); + // send back value only, as expected + callback(error, output && output.value); + return; + } + + // stream stuff + this.push(output); + + // back to original track + // send back value only, as expected + callback(error, output && output.value); +} + +/** + * Stream wrapper for finishing callback + * + * @this ReadableAsyncKit# + * @param {mixed} error - error response + * @param {mixed} output - iterator output + * @param {function} callback - callback that expects final results + */ +function finisher(error, output, callback) +{ + // signal end of the stream + // only for successfully finished streams + if (!error) + { + this.push(null); + } + + // back to original track + callback(error, output); +} diff --git a/node_sid/node_modules/asynckit/lib/terminator.js b/node_sid/node_modules/asynckit/lib/terminator.js new file mode 100644 index 0000000..d6eb992 --- /dev/null +++ b/node_sid/node_modules/asynckit/lib/terminator.js @@ -0,0 +1,29 @@ +var abort = require('./abort.js') + , async = require('./async.js') + ; + +// API +module.exports = terminator; + +/** + * Terminates jobs in the attached state context + * + * @this AsyncKitState# + * @param {function} callback - final callback to invoke after termination + */ +function terminator(callback) +{ + if (!Object.keys(this.jobs).length) + { + return; + } + + // fast forward iteration index + this.index = this.size; + + // abort jobs + abort(this); + + // send back results we have so far + async(callback)(null, this.results); +} diff --git a/node_sid/node_modules/asynckit/package.json b/node_sid/node_modules/asynckit/package.json new file mode 100644 index 0000000..51147d6 --- /dev/null +++ b/node_sid/node_modules/asynckit/package.json @@ -0,0 +1,63 @@ +{ + "name": "asynckit", + "version": "0.4.0", + "description": "Minimal async jobs utility library, with streams support", + "main": "index.js", + "scripts": { + "clean": "rimraf coverage", + "lint": "eslint *.js lib/*.js test/*.js", + "test": "istanbul cover --reporter=json tape -- 'test/test-*.js' | tap-spec", + "win-test": "tape test/test-*.js", + "browser": "browserify -t browserify-istanbul test/lib/browserify_adjustment.js test/test-*.js | obake --coverage | tap-spec", + "report": "istanbul report", + "size": "browserify index.js | size-table asynckit", + "debug": "tape test/test-*.js" + }, + "pre-commit": [ + "clean", + "lint", + "test", + "browser", + "report", + "size" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/alexindigo/asynckit.git" + }, + "keywords": [ + "async", + "jobs", + "parallel", + "serial", + "iterator", + "array", + "object", + "stream", + "destroy", + "terminate", + "abort" + ], + "author": "Alex Indigo ", + "license": "MIT", + "bugs": { + "url": "https://github.com/alexindigo/asynckit/issues" + }, + "homepage": "https://github.com/alexindigo/asynckit#readme", + "devDependencies": { + "browserify": "^13.0.0", + "browserify-istanbul": "^2.0.0", + "coveralls": "^2.11.9", + "eslint": "^2.9.0", + "istanbul": "^0.4.3", + "obake": "^0.1.2", + "phantomjs-prebuilt": "^2.1.7", + "pre-commit": "^1.1.3", + "reamde": "^1.1.0", + "rimraf": "^2.5.2", + "size-table": "^0.2.0", + "tap-spec": "^4.1.1", + "tape": "^4.5.1" + }, + "dependencies": {} +} diff --git a/node_sid/node_modules/asynckit/parallel.js b/node_sid/node_modules/asynckit/parallel.js new file mode 100644 index 0000000..3c50344 --- /dev/null +++ b/node_sid/node_modules/asynckit/parallel.js @@ -0,0 +1,43 @@ +var iterate = require('./lib/iterate.js') + , initState = require('./lib/state.js') + , terminator = require('./lib/terminator.js') + ; + +// Public API +module.exports = parallel; + +/** + * Runs iterator over provided array elements in parallel + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function parallel(list, iterator, callback) +{ + var state = initState(list); + + while (state.index < (state['keyedList'] || list).length) + { + iterate(list, iterator, state, function(error, result) + { + if (error) + { + callback(error, result); + return; + } + + // looks like it's the last one + if (Object.keys(state.jobs).length === 0) + { + callback(null, state.results); + return; + } + }); + + state.index++; + } + + return terminator.bind(state, callback); +} diff --git a/node_sid/node_modules/asynckit/serial.js b/node_sid/node_modules/asynckit/serial.js new file mode 100644 index 0000000..6cd949a --- /dev/null +++ b/node_sid/node_modules/asynckit/serial.js @@ -0,0 +1,17 @@ +var serialOrdered = require('./serialOrdered.js'); + +// Public API +module.exports = serial; + +/** + * Runs iterator over provided array elements in series + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function serial(list, iterator, callback) +{ + return serialOrdered(list, iterator, null, callback); +} diff --git a/node_sid/node_modules/asynckit/serialOrdered.js b/node_sid/node_modules/asynckit/serialOrdered.js new file mode 100644 index 0000000..607eafe --- /dev/null +++ b/node_sid/node_modules/asynckit/serialOrdered.js @@ -0,0 +1,75 @@ +var iterate = require('./lib/iterate.js') + , initState = require('./lib/state.js') + , terminator = require('./lib/terminator.js') + ; + +// Public API +module.exports = serialOrdered; +// sorting helpers +module.exports.ascending = ascending; +module.exports.descending = descending; + +/** + * Runs iterator over provided sorted array elements in series + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} sortMethod - custom sort function + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function serialOrdered(list, iterator, sortMethod, callback) +{ + var state = initState(list, sortMethod); + + iterate(list, iterator, state, function iteratorHandler(error, result) + { + if (error) + { + callback(error, result); + return; + } + + state.index++; + + // are we there yet? + if (state.index < (state['keyedList'] || list).length) + { + iterate(list, iterator, state, iteratorHandler); + return; + } + + // done here + callback(null, state.results); + }); + + return terminator.bind(state, callback); +} + +/* + * -- Sort methods + */ + +/** + * sort helper to sort array elements in ascending order + * + * @param {mixed} a - an item to compare + * @param {mixed} b - an item to compare + * @returns {number} - comparison result + */ +function ascending(a, b) +{ + return a < b ? -1 : a > b ? 1 : 0; +} + +/** + * sort helper to sort array elements in descending order + * + * @param {mixed} a - an item to compare + * @param {mixed} b - an item to compare + * @returns {number} - comparison result + */ +function descending(a, b) +{ + return -1 * ascending(a, b); +} diff --git a/node_sid/node_modules/asynckit/stream.js b/node_sid/node_modules/asynckit/stream.js new file mode 100644 index 0000000..d43465f --- /dev/null +++ b/node_sid/node_modules/asynckit/stream.js @@ -0,0 +1,21 @@ +var inherits = require('util').inherits + , Readable = require('stream').Readable + , ReadableAsyncKit = require('./lib/readable_asynckit.js') + , ReadableParallel = require('./lib/readable_parallel.js') + , ReadableSerial = require('./lib/readable_serial.js') + , ReadableSerialOrdered = require('./lib/readable_serial_ordered.js') + ; + +// API +module.exports = +{ + parallel : ReadableParallel, + serial : ReadableSerial, + serialOrdered : ReadableSerialOrdered, +}; + +inherits(ReadableAsyncKit, Readable); + +inherits(ReadableParallel, ReadableAsyncKit); +inherits(ReadableSerial, ReadableAsyncKit); +inherits(ReadableSerialOrdered, ReadableAsyncKit); diff --git a/node_sid/node_modules/aws-sign2/LICENSE b/node_sid/node_modules/aws-sign2/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/node_sid/node_modules/aws-sign2/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_sid/node_modules/aws-sign2/README.md b/node_sid/node_modules/aws-sign2/README.md new file mode 100644 index 0000000..763564e --- /dev/null +++ b/node_sid/node_modules/aws-sign2/README.md @@ -0,0 +1,4 @@ +aws-sign +======== + +AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module. diff --git a/node_sid/node_modules/aws-sign2/index.js b/node_sid/node_modules/aws-sign2/index.js new file mode 100644 index 0000000..fb35f6d --- /dev/null +++ b/node_sid/node_modules/aws-sign2/index.js @@ -0,0 +1,212 @@ + +/*! + * Copyright 2010 LearnBoost + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Module dependencies. + */ + +var crypto = require('crypto') + , parse = require('url').parse + ; + +/** + * Valid keys. + */ + +var keys = + [ 'acl' + , 'location' + , 'logging' + , 'notification' + , 'partNumber' + , 'policy' + , 'requestPayment' + , 'torrent' + , 'uploadId' + , 'uploads' + , 'versionId' + , 'versioning' + , 'versions' + , 'website' + ] + +/** + * Return an "Authorization" header value with the given `options` + * in the form of "AWS :" + * + * @param {Object} options + * @return {String} + * @api private + */ + +function authorization (options) { + return 'AWS ' + options.key + ':' + sign(options) +} + +module.exports = authorization +module.exports.authorization = authorization + +/** + * Simple HMAC-SHA1 Wrapper + * + * @param {Object} options + * @return {String} + * @api private + */ + +function hmacSha1 (options) { + return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64') +} + +module.exports.hmacSha1 = hmacSha1 + +/** + * Create a base64 sha1 HMAC for `options`. + * + * @param {Object} options + * @return {String} + * @api private + */ + +function sign (options) { + options.message = stringToSign(options) + return hmacSha1(options) +} +module.exports.sign = sign + +/** + * Create a base64 sha1 HMAC for `options`. + * + * Specifically to be used with S3 presigned URLs + * + * @param {Object} options + * @return {String} + * @api private + */ + +function signQuery (options) { + options.message = queryStringToSign(options) + return hmacSha1(options) +} +module.exports.signQuery= signQuery + +/** + * Return a string for sign() with the given `options`. + * + * Spec: + * + * \n + * \n + * \n + * \n + * [headers\n] + * + * + * @param {Object} options + * @return {String} + * @api private + */ + +function stringToSign (options) { + var headers = options.amazonHeaders || '' + if (headers) headers += '\n' + var r = + [ options.verb + , options.md5 + , options.contentType + , options.date ? options.date.toUTCString() : '' + , headers + options.resource + ] + return r.join('\n') +} +module.exports.stringToSign = stringToSign + +/** + * Return a string for sign() with the given `options`, but is meant exclusively + * for S3 presigned URLs + * + * Spec: + * + * \n + * + * + * @param {Object} options + * @return {String} + * @api private + */ + +function queryStringToSign (options){ + return 'GET\n\n\n' + options.date + '\n' + options.resource +} +module.exports.queryStringToSign = queryStringToSign + +/** + * Perform the following: + * + * - ignore non-amazon headers + * - lowercase fields + * - sort lexicographically + * - trim whitespace between ":" + * - join with newline + * + * @param {Object} headers + * @return {String} + * @api private + */ + +function canonicalizeHeaders (headers) { + var buf = [] + , fields = Object.keys(headers) + ; + for (var i = 0, len = fields.length; i < len; ++i) { + var field = fields[i] + , val = headers[field] + , field = field.toLowerCase() + ; + if (0 !== field.indexOf('x-amz')) continue + buf.push(field + ':' + val) + } + return buf.sort().join('\n') +} +module.exports.canonicalizeHeaders = canonicalizeHeaders + +/** + * Perform the following: + * + * - ignore non sub-resources + * - sort lexicographically + * + * @param {String} resource + * @return {String} + * @api private + */ + +function canonicalizeResource (resource) { + var url = parse(resource, true) + , path = url.pathname + , buf = [] + ; + + Object.keys(url.query).forEach(function(key){ + if (!~keys.indexOf(key)) return + var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]) + buf.push(key + val) + }) + + return path + (buf.length ? '?' + buf.sort().join('&') : '') +} +module.exports.canonicalizeResource = canonicalizeResource diff --git a/node_sid/node_modules/aws-sign2/package.json b/node_sid/node_modules/aws-sign2/package.json new file mode 100644 index 0000000..4c3d57e --- /dev/null +++ b/node_sid/node_modules/aws-sign2/package.json @@ -0,0 +1,17 @@ +{ + "author": "Mikeal Rogers (http://www.futurealoof.com)", + "name": "aws-sign2", + "description": "AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.", + "version": "0.7.0", + "repository": { + "url": "https://github.com/mikeal/aws-sign" + }, + "license": "Apache-2.0", + "main": "index.js", + "dependencies": {}, + "devDependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + } +} diff --git a/node_sid/node_modules/aws4/.github/FUNDING.yml b/node_sid/node_modules/aws4/.github/FUNDING.yml new file mode 100644 index 0000000..b7fdd97 --- /dev/null +++ b/node_sid/node_modules/aws4/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: mhart diff --git a/node_sid/node_modules/aws4/.travis.yml b/node_sid/node_modules/aws4/.travis.yml new file mode 100644 index 0000000..178bf31 --- /dev/null +++ b/node_sid/node_modules/aws4/.travis.yml @@ -0,0 +1,9 @@ +language: node_js +node_js: + - "0.10" + - "0.12" + - "4" + - "6" + - "8" + - "10" + - "12" diff --git a/node_sid/node_modules/aws4/LICENSE b/node_sid/node_modules/aws4/LICENSE new file mode 100644 index 0000000..4f321e5 --- /dev/null +++ b/node_sid/node_modules/aws4/LICENSE @@ -0,0 +1,19 @@ +Copyright 2013 Michael Hart (michael.hart.au@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_sid/node_modules/aws4/README.md b/node_sid/node_modules/aws4/README.md new file mode 100644 index 0000000..7202e45 --- /dev/null +++ b/node_sid/node_modules/aws4/README.md @@ -0,0 +1,183 @@ +aws4 +---- + +[![Build Status](https://api.travis-ci.org/mhart/aws4.png?branch=master)](https://travis-ci.org/github/mhart/aws4) + +A small utility to sign vanilla Node.js http(s) request options using Amazon's +[AWS Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html). + +If you want to sign and send AWS requests in a modern browser, or an environment like [Cloudflare Workers](https://developers.cloudflare.com/workers/), then check out [aws4fetch](https://github.com/mhart/aws4fetch) – otherwise you can also bundle this library for use [in older browsers](./browser). + +The only AWS service that *doesn't* support v4 as of 2020-05-22 is +[SimpleDB](https://docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/SDB_API.html) +(it only supports [AWS Signature Version 2](https://github.com/mhart/aws2)). + +It also provides defaults for a number of core AWS headers and +request parameters, making it very easy to query AWS services, or +build out a fully-featured AWS library. + +Example +------- + +```javascript +var https = require('https') +var aws4 = require('aws4') + +// to illustrate usage, we'll create a utility function to request and pipe to stdout +function request(opts) { https.request(opts, function(res) { res.pipe(process.stdout) }).end(opts.body || '') } + +// aws4 will sign an options object as you'd pass to http.request, with an AWS service and region +var opts = { host: 'my-bucket.s3.us-west-1.amazonaws.com', path: '/my-object', service: 's3', region: 'us-west-1' } + +// aws4.sign() will sign and modify these options, ready to pass to http.request +aws4.sign(opts, { accessKeyId: '', secretAccessKey: '' }) + +// or it can get credentials from process.env.AWS_ACCESS_KEY_ID, etc +aws4.sign(opts) + +// for most AWS services, aws4 can figure out the service and region if you pass a host +opts = { host: 'my-bucket.s3.us-west-1.amazonaws.com', path: '/my-object' } + +// usually it will add/modify request headers, but you can also sign the query: +opts = { host: 'my-bucket.s3.amazonaws.com', path: '/?X-Amz-Expires=12345', signQuery: true } + +// and for services with simple hosts, aws4 can infer the host from service and region: +opts = { service: 'sqs', region: 'us-east-1', path: '/?Action=ListQueues' } + +// and if you're using us-east-1, it's the default: +opts = { service: 'sqs', path: '/?Action=ListQueues' } + +aws4.sign(opts) +console.log(opts) +/* +{ + host: 'sqs.us-east-1.amazonaws.com', + path: '/?Action=ListQueues', + headers: { + Host: 'sqs.us-east-1.amazonaws.com', + 'X-Amz-Date': '20121226T061030Z', + Authorization: 'AWS4-HMAC-SHA256 Credential=ABCDEF/20121226/us-east-1/sqs/aws4_request, ...' + } +} +*/ + +// we can now use this to query AWS +request(opts) +/* + + +... +*/ + +// aws4 can infer the HTTP method if a body is passed in +// method will be POST and Content-Type: 'application/x-www-form-urlencoded; charset=utf-8' +request(aws4.sign({ service: 'iam', body: 'Action=ListGroups&Version=2010-05-08' })) +/* + +... +*/ + +// you can specify any custom option or header as per usual +request(aws4.sign({ + service: 'dynamodb', + region: 'ap-southeast-2', + method: 'POST', + path: '/', + headers: { + 'Content-Type': 'application/x-amz-json-1.0', + 'X-Amz-Target': 'DynamoDB_20120810.ListTables' + }, + body: '{}' +})) +/* +{"TableNames":[]} +... +*/ + +// The raw RequestSigner can be used to generate CodeCommit Git passwords +var signer = new aws4.RequestSigner({ + service: 'codecommit', + host: 'git-codecommit.us-east-1.amazonaws.com', + method: 'GIT', + path: '/v1/repos/MyAwesomeRepo', +}) +var password = signer.getDateTime() + 'Z' + signer.signature() + +// see example.js for examples with other services +``` + +API +--- + +### aws4.sign(requestOptions, [credentials]) + +Calculates and populates any necessary AWS headers and/or request +options on `requestOptions`. Returns `requestOptions` as a convenience for chaining. + +`requestOptions` is an object holding the same options that the Node.js +[http.request](https://nodejs.org/docs/latest/api/http.html#http_http_request_options_callback) +function takes. + +The following properties of `requestOptions` are used in the signing or +populated if they don't already exist: + +- `hostname` or `host` (will try to be determined from `service` and `region` if not given) +- `method` (will use `'GET'` if not given or `'POST'` if there is a `body`) +- `path` (will use `'/'` if not given) +- `body` (will use `''` if not given) +- `service` (will try to be calculated from `hostname` or `host` if not given) +- `region` (will try to be calculated from `hostname` or `host` or use `'us-east-1'` if not given) +- `signQuery` (to sign the query instead of adding an `Authorization` header, defaults to false) +- `headers['Host']` (will use `hostname` or `host` or be calculated if not given) +- `headers['Content-Type']` (will use `'application/x-www-form-urlencoded; charset=utf-8'` + if not given and there is a `body`) +- `headers['Date']` (used to calculate the signature date if given, otherwise `new Date` is used) + +Your AWS credentials (which can be found in your +[AWS console](https://portal.aws.amazon.com/gp/aws/securityCredentials)) +can be specified in one of two ways: + +- As the second argument, like this: + +```javascript +aws4.sign(requestOptions, { + secretAccessKey: "", + accessKeyId: "", + sessionToken: "" +}) +``` + +- From `process.env`, such as this: + +``` +export AWS_ACCESS_KEY_ID="" +export AWS_SECRET_ACCESS_KEY="" +export AWS_SESSION_TOKEN="" +``` + +(will also use `AWS_ACCESS_KEY` and `AWS_SECRET_KEY` if available) + +The `sessionToken` property and `AWS_SESSION_TOKEN` environment variable are optional for signing +with [IAM STS temporary credentials](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html). + +Installation +------------ + +With [npm](https://www.npmjs.com/) do: + +``` +npm install aws4 +``` + +Can also be used [in the browser](./browser). + +Thanks +------ + +Thanks to [@jed](https://github.com/jed) for his +[dynamo-client](https://github.com/jed/dynamo-client) lib where I first +committed and subsequently extracted this code. + +Also thanks to the +[official Node.js AWS SDK](https://github.com/aws/aws-sdk-js) for giving +me a start on implementing the v4 signature. diff --git a/node_sid/node_modules/aws4/aws4.js b/node_sid/node_modules/aws4/aws4.js new file mode 100644 index 0000000..b99b319 --- /dev/null +++ b/node_sid/node_modules/aws4/aws4.js @@ -0,0 +1,373 @@ +var aws4 = exports, + url = require('url'), + querystring = require('querystring'), + crypto = require('crypto'), + lru = require('./lru'), + credentialsCache = lru(1000) + +// http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html + +function hmac(key, string, encoding) { + return crypto.createHmac('sha256', key).update(string, 'utf8').digest(encoding) +} + +function hash(string, encoding) { + return crypto.createHash('sha256').update(string, 'utf8').digest(encoding) +} + +// This function assumes the string has already been percent encoded +function encodeRfc3986(urlEncodedString) { + return urlEncodedString.replace(/[!'()*]/g, function(c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) +} + +function encodeRfc3986Full(str) { + return encodeRfc3986(encodeURIComponent(str)) +} + +// A bit of a combination of: +// https://github.com/aws/aws-sdk-java-v2/blob/dc695de6ab49ad03934e1b02e7263abbd2354be0/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/AbstractAws4Signer.java#L59 +// https://github.com/aws/aws-sdk-js/blob/18cb7e5b463b46239f9fdd4a65e2ff8c81831e8f/lib/signers/v4.js#L191-L199 +// https://github.com/mhart/aws4fetch/blob/b3aed16b6f17384cf36ea33bcba3c1e9f3bdfefd/src/main.js#L25-L34 +var HEADERS_TO_IGNORE = { + 'authorization': true, + 'connection': true, + 'x-amzn-trace-id': true, + 'user-agent': true, + 'expect': true, + 'presigned-expires': true, + 'range': true, +} + +// request: { path | body, [host], [method], [headers], [service], [region] } +// credentials: { accessKeyId, secretAccessKey, [sessionToken] } +function RequestSigner(request, credentials) { + + if (typeof request === 'string') request = url.parse(request) + + var headers = request.headers = (request.headers || {}), + hostParts = (!this.service || !this.region) && this.matchHost(request.hostname || request.host || headers.Host || headers.host) + + this.request = request + this.credentials = credentials || this.defaultCredentials() + + this.service = request.service || hostParts[0] || '' + this.region = request.region || hostParts[1] || 'us-east-1' + + // SES uses a different domain from the service name + if (this.service === 'email') this.service = 'ses' + + if (!request.method && request.body) + request.method = 'POST' + + if (!headers.Host && !headers.host) { + headers.Host = request.hostname || request.host || this.createHost() + + // If a port is specified explicitly, use it as is + if (request.port) + headers.Host += ':' + request.port + } + if (!request.hostname && !request.host) + request.hostname = headers.Host || headers.host + + this.isCodeCommitGit = this.service === 'codecommit' && request.method === 'GIT' +} + +RequestSigner.prototype.matchHost = function(host) { + var match = (host || '').match(/([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com(\.cn)?$/) + var hostParts = (match || []).slice(1, 3) + + // ES's hostParts are sometimes the other way round, if the value that is expected + // to be region equals ‘es’ switch them back + // e.g. search-cluster-name-aaaa00aaaa0aaa0aaaaaaa0aaa.us-east-1.es.amazonaws.com + if (hostParts[1] === 'es') + hostParts = hostParts.reverse() + + if (hostParts[1] == 's3') { + hostParts[0] = 's3' + hostParts[1] = 'us-east-1' + } else { + for (var i = 0; i < 2; i++) { + if (/^s3-/.test(hostParts[i])) { + hostParts[1] = hostParts[i].slice(3) + hostParts[0] = 's3' + break + } + } + } + + return hostParts +} + +// http://docs.aws.amazon.com/general/latest/gr/rande.html +RequestSigner.prototype.isSingleRegion = function() { + // Special case for S3 and SimpleDB in us-east-1 + if (['s3', 'sdb'].indexOf(this.service) >= 0 && this.region === 'us-east-1') return true + + return ['cloudfront', 'ls', 'route53', 'iam', 'importexport', 'sts'] + .indexOf(this.service) >= 0 +} + +RequestSigner.prototype.createHost = function() { + var region = this.isSingleRegion() ? '' : '.' + this.region, + subdomain = this.service === 'ses' ? 'email' : this.service + return subdomain + region + '.amazonaws.com' +} + +RequestSigner.prototype.prepareRequest = function() { + this.parsePath() + + var request = this.request, headers = request.headers, query + + if (request.signQuery) { + + this.parsedPath.query = query = this.parsedPath.query || {} + + if (this.credentials.sessionToken) + query['X-Amz-Security-Token'] = this.credentials.sessionToken + + if (this.service === 's3' && !query['X-Amz-Expires']) + query['X-Amz-Expires'] = 86400 + + if (query['X-Amz-Date']) + this.datetime = query['X-Amz-Date'] + else + query['X-Amz-Date'] = this.getDateTime() + + query['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256' + query['X-Amz-Credential'] = this.credentials.accessKeyId + '/' + this.credentialString() + query['X-Amz-SignedHeaders'] = this.signedHeaders() + + } else { + + if (!request.doNotModifyHeaders && !this.isCodeCommitGit) { + if (request.body && !headers['Content-Type'] && !headers['content-type']) + headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8' + + if (request.body && !headers['Content-Length'] && !headers['content-length']) + headers['Content-Length'] = Buffer.byteLength(request.body) + + if (this.credentials.sessionToken && !headers['X-Amz-Security-Token'] && !headers['x-amz-security-token']) + headers['X-Amz-Security-Token'] = this.credentials.sessionToken + + if (this.service === 's3' && !headers['X-Amz-Content-Sha256'] && !headers['x-amz-content-sha256']) + headers['X-Amz-Content-Sha256'] = hash(this.request.body || '', 'hex') + + if (headers['X-Amz-Date'] || headers['x-amz-date']) + this.datetime = headers['X-Amz-Date'] || headers['x-amz-date'] + else + headers['X-Amz-Date'] = this.getDateTime() + } + + delete headers.Authorization + delete headers.authorization + } +} + +RequestSigner.prototype.sign = function() { + if (!this.parsedPath) this.prepareRequest() + + if (this.request.signQuery) { + this.parsedPath.query['X-Amz-Signature'] = this.signature() + } else { + this.request.headers.Authorization = this.authHeader() + } + + this.request.path = this.formatPath() + + return this.request +} + +RequestSigner.prototype.getDateTime = function() { + if (!this.datetime) { + var headers = this.request.headers, + date = new Date(headers.Date || headers.date || new Date) + + this.datetime = date.toISOString().replace(/[:\-]|\.\d{3}/g, '') + + // Remove the trailing 'Z' on the timestamp string for CodeCommit git access + if (this.isCodeCommitGit) this.datetime = this.datetime.slice(0, -1) + } + return this.datetime +} + +RequestSigner.prototype.getDate = function() { + return this.getDateTime().substr(0, 8) +} + +RequestSigner.prototype.authHeader = function() { + return [ + 'AWS4-HMAC-SHA256 Credential=' + this.credentials.accessKeyId + '/' + this.credentialString(), + 'SignedHeaders=' + this.signedHeaders(), + 'Signature=' + this.signature(), + ].join(', ') +} + +RequestSigner.prototype.signature = function() { + var date = this.getDate(), + cacheKey = [this.credentials.secretAccessKey, date, this.region, this.service].join(), + kDate, kRegion, kService, kCredentials = credentialsCache.get(cacheKey) + if (!kCredentials) { + kDate = hmac('AWS4' + this.credentials.secretAccessKey, date) + kRegion = hmac(kDate, this.region) + kService = hmac(kRegion, this.service) + kCredentials = hmac(kService, 'aws4_request') + credentialsCache.set(cacheKey, kCredentials) + } + return hmac(kCredentials, this.stringToSign(), 'hex') +} + +RequestSigner.prototype.stringToSign = function() { + return [ + 'AWS4-HMAC-SHA256', + this.getDateTime(), + this.credentialString(), + hash(this.canonicalString(), 'hex'), + ].join('\n') +} + +RequestSigner.prototype.canonicalString = function() { + if (!this.parsedPath) this.prepareRequest() + + var pathStr = this.parsedPath.path, + query = this.parsedPath.query, + headers = this.request.headers, + queryStr = '', + normalizePath = this.service !== 's3', + decodePath = this.service === 's3' || this.request.doNotEncodePath, + decodeSlashesInPath = this.service === 's3', + firstValOnly = this.service === 's3', + bodyHash + + if (this.service === 's3' && this.request.signQuery) { + bodyHash = 'UNSIGNED-PAYLOAD' + } else if (this.isCodeCommitGit) { + bodyHash = '' + } else { + bodyHash = headers['X-Amz-Content-Sha256'] || headers['x-amz-content-sha256'] || + hash(this.request.body || '', 'hex') + } + + if (query) { + var reducedQuery = Object.keys(query).reduce(function(obj, key) { + if (!key) return obj + obj[encodeRfc3986Full(key)] = !Array.isArray(query[key]) ? query[key] : + (firstValOnly ? query[key][0] : query[key]) + return obj + }, {}) + var encodedQueryPieces = [] + Object.keys(reducedQuery).sort().forEach(function(key) { + if (!Array.isArray(reducedQuery[key])) { + encodedQueryPieces.push(key + '=' + encodeRfc3986Full(reducedQuery[key])) + } else { + reducedQuery[key].map(encodeRfc3986Full).sort() + .forEach(function(val) { encodedQueryPieces.push(key + '=' + val) }) + } + }) + queryStr = encodedQueryPieces.join('&') + } + if (pathStr !== '/') { + if (normalizePath) pathStr = pathStr.replace(/\/{2,}/g, '/') + pathStr = pathStr.split('/').reduce(function(path, piece) { + if (normalizePath && piece === '..') { + path.pop() + } else if (!normalizePath || piece !== '.') { + if (decodePath) piece = decodeURIComponent(piece.replace(/\+/g, ' ')) + path.push(encodeRfc3986Full(piece)) + } + return path + }, []).join('/') + if (pathStr[0] !== '/') pathStr = '/' + pathStr + if (decodeSlashesInPath) pathStr = pathStr.replace(/%2F/g, '/') + } + + return [ + this.request.method || 'GET', + pathStr, + queryStr, + this.canonicalHeaders() + '\n', + this.signedHeaders(), + bodyHash, + ].join('\n') +} + +RequestSigner.prototype.canonicalHeaders = function() { + var headers = this.request.headers + function trimAll(header) { + return header.toString().trim().replace(/\s+/g, ' ') + } + return Object.keys(headers) + .filter(function(key) { return HEADERS_TO_IGNORE[key.toLowerCase()] == null }) + .sort(function(a, b) { return a.toLowerCase() < b.toLowerCase() ? -1 : 1 }) + .map(function(key) { return key.toLowerCase() + ':' + trimAll(headers[key]) }) + .join('\n') +} + +RequestSigner.prototype.signedHeaders = function() { + return Object.keys(this.request.headers) + .map(function(key) { return key.toLowerCase() }) + .filter(function(key) { return HEADERS_TO_IGNORE[key] == null }) + .sort() + .join(';') +} + +RequestSigner.prototype.credentialString = function() { + return [ + this.getDate(), + this.region, + this.service, + 'aws4_request', + ].join('/') +} + +RequestSigner.prototype.defaultCredentials = function() { + var env = process.env + return { + accessKeyId: env.AWS_ACCESS_KEY_ID || env.AWS_ACCESS_KEY, + secretAccessKey: env.AWS_SECRET_ACCESS_KEY || env.AWS_SECRET_KEY, + sessionToken: env.AWS_SESSION_TOKEN, + } +} + +RequestSigner.prototype.parsePath = function() { + var path = this.request.path || '/' + + // S3 doesn't always encode characters > 127 correctly and + // all services don't encode characters > 255 correctly + // So if there are non-reserved chars (and it's not already all % encoded), just encode them all + if (/[^0-9A-Za-z;,/?:@&=+$\-_.!~*'()#%]/.test(path)) { + path = encodeURI(decodeURI(path)) + } + + var queryIx = path.indexOf('?'), + query = null + + if (queryIx >= 0) { + query = querystring.parse(path.slice(queryIx + 1)) + path = path.slice(0, queryIx) + } + + this.parsedPath = { + path: path, + query: query, + } +} + +RequestSigner.prototype.formatPath = function() { + var path = this.parsedPath.path, + query = this.parsedPath.query + + if (!query) return path + + // Services don't support empty query string keys + if (query[''] != null) delete query[''] + + return path + '?' + encodeRfc3986(querystring.stringify(query)) +} + +aws4.RequestSigner = RequestSigner + +aws4.sign = function(request, credentials) { + return new RequestSigner(request, credentials).sign() +} diff --git a/node_sid/node_modules/aws4/lru.js b/node_sid/node_modules/aws4/lru.js new file mode 100644 index 0000000..333f66a --- /dev/null +++ b/node_sid/node_modules/aws4/lru.js @@ -0,0 +1,96 @@ +module.exports = function(size) { + return new LruCache(size) +} + +function LruCache(size) { + this.capacity = size | 0 + this.map = Object.create(null) + this.list = new DoublyLinkedList() +} + +LruCache.prototype.get = function(key) { + var node = this.map[key] + if (node == null) return undefined + this.used(node) + return node.val +} + +LruCache.prototype.set = function(key, val) { + var node = this.map[key] + if (node != null) { + node.val = val + } else { + if (!this.capacity) this.prune() + if (!this.capacity) return false + node = new DoublyLinkedNode(key, val) + this.map[key] = node + this.capacity-- + } + this.used(node) + return true +} + +LruCache.prototype.used = function(node) { + this.list.moveToFront(node) +} + +LruCache.prototype.prune = function() { + var node = this.list.pop() + if (node != null) { + delete this.map[node.key] + this.capacity++ + } +} + + +function DoublyLinkedList() { + this.firstNode = null + this.lastNode = null +} + +DoublyLinkedList.prototype.moveToFront = function(node) { + if (this.firstNode == node) return + + this.remove(node) + + if (this.firstNode == null) { + this.firstNode = node + this.lastNode = node + node.prev = null + node.next = null + } else { + node.prev = null + node.next = this.firstNode + node.next.prev = node + this.firstNode = node + } +} + +DoublyLinkedList.prototype.pop = function() { + var lastNode = this.lastNode + if (lastNode != null) { + this.remove(lastNode) + } + return lastNode +} + +DoublyLinkedList.prototype.remove = function(node) { + if (this.firstNode == node) { + this.firstNode = node.next + } else if (node.prev != null) { + node.prev.next = node.next + } + if (this.lastNode == node) { + this.lastNode = node.prev + } else if (node.next != null) { + node.next.prev = node.prev + } +} + + +function DoublyLinkedNode(key, val) { + this.key = key + this.val = val + this.prev = null + this.next = null +} diff --git a/node_sid/node_modules/aws4/package.json b/node_sid/node_modules/aws4/package.json new file mode 100644 index 0000000..424598d --- /dev/null +++ b/node_sid/node_modules/aws4/package.json @@ -0,0 +1,17 @@ +{ + "name": "aws4", + "version": "1.11.0", + "description": "Signs and prepares requests using AWS Signature Version 4", + "author": "Michael Hart (https://github.com/mhart)", + "license": "MIT", + "repository": "github:mhart/aws4", + "main": "aws4.js", + "scripts": { + "test": "mocha ./test/fast.js -R list", + "integration": "node ./test/slow.js" + }, + "devDependencies": { + "mocha": "^2.5.3", + "should": "^8.4.0" + } +} diff --git a/node_sid/node_modules/bcrypt-pbkdf/CONTRIBUTING.md b/node_sid/node_modules/bcrypt-pbkdf/CONTRIBUTING.md new file mode 100644 index 0000000..401d34e --- /dev/null +++ b/node_sid/node_modules/bcrypt-pbkdf/CONTRIBUTING.md @@ -0,0 +1,13 @@ +# Contributing + +This repository uses [cr.joyent.us](https://cr.joyent.us) (Gerrit) for new +changes. Anyone can submit changes. To get started, see the [cr.joyent.us user +guide](https://github.com/joyent/joyent-gerrit/blob/master/docs/user/README.md). +This repo does not use GitHub pull requests. + +See the [Joyent Engineering +Guidelines](https://github.com/joyent/eng/blob/master/docs/index.md) for general +best practices expected in this repository. + +If you're changing something non-trivial or user-facing, you may want to submit +an issue first. diff --git a/node_sid/node_modules/bcrypt-pbkdf/LICENSE b/node_sid/node_modules/bcrypt-pbkdf/LICENSE new file mode 100644 index 0000000..fc58d2a --- /dev/null +++ b/node_sid/node_modules/bcrypt-pbkdf/LICENSE @@ -0,0 +1,66 @@ +The Blowfish portions are under the following license: + +Blowfish block cipher for OpenBSD +Copyright 1997 Niels Provos +All rights reserved. + +Implementation advice by David Mazieres . + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +The bcrypt_pbkdf portions are under the following license: + +Copyright (c) 2013 Ted Unangst + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + + +Performance improvements (Javascript-specific): + +Copyright 2016, Joyent Inc +Author: Alex Wilson + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_sid/node_modules/bcrypt-pbkdf/README.md b/node_sid/node_modules/bcrypt-pbkdf/README.md new file mode 100644 index 0000000..7551f33 --- /dev/null +++ b/node_sid/node_modules/bcrypt-pbkdf/README.md @@ -0,0 +1,45 @@ +Port of the OpenBSD `bcrypt_pbkdf` function to pure Javascript. `npm`-ified +version of [Devi Mandiri's port](https://github.com/devi/tmp/blob/master/js/bcrypt_pbkdf.js), +with some minor performance improvements. The code is copied verbatim (and +un-styled) from Devi's work. + +This product includes software developed by Niels Provos. + +## API + +### `bcrypt_pbkdf.pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds)` + +Derive a cryptographic key of arbitrary length from a given password and salt, +using the OpenBSD `bcrypt_pbkdf` function. This is a combination of Blowfish and +SHA-512. + +See [this article](http://www.tedunangst.com/flak/post/bcrypt-pbkdf) for +further information. + +Parameters: + + * `pass`, a Uint8Array of length `passlen` + * `passlen`, an integer Number + * `salt`, a Uint8Array of length `saltlen` + * `saltlen`, an integer Number + * `key`, a Uint8Array of length `keylen`, will be filled with output + * `keylen`, an integer Number + * `rounds`, an integer Number, number of rounds of the PBKDF to run + +### `bcrypt_pbkdf.hash(sha2pass, sha2salt, out)` + +Calculate a Blowfish hash, given SHA2-512 output of a password and salt. Used as +part of the inner round function in the PBKDF. + +Parameters: + + * `sha2pass`, a Uint8Array of length 64 + * `sha2salt`, a Uint8Array of length 64 + * `out`, a Uint8Array of length 32, will be filled with output + +## License + +This source form is a 1:1 port from the OpenBSD `blowfish.c` and `bcrypt_pbkdf.c`. +As a result, it retains the original copyright and license. The two files are +under slightly different (but compatible) licenses, and are here combined in +one file. For each of the full license texts see `LICENSE`. diff --git a/node_sid/node_modules/bcrypt-pbkdf/index.js b/node_sid/node_modules/bcrypt-pbkdf/index.js new file mode 100644 index 0000000..b1b5ad4 --- /dev/null +++ b/node_sid/node_modules/bcrypt-pbkdf/index.js @@ -0,0 +1,556 @@ +'use strict'; + +var crypto_hash_sha512 = require('tweetnacl').lowlevel.crypto_hash; + +/* + * This file is a 1:1 port from the OpenBSD blowfish.c and bcrypt_pbkdf.c. As a + * result, it retains the original copyright and license. The two files are + * under slightly different (but compatible) licenses, and are here combined in + * one file. + * + * Credit for the actual porting work goes to: + * Devi Mandiri + */ + +/* + * The Blowfish portions are under the following license: + * + * Blowfish block cipher for OpenBSD + * Copyright 1997 Niels Provos + * All rights reserved. + * + * Implementation advice by David Mazieres . + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * The bcrypt_pbkdf portions are under the following license: + * + * Copyright (c) 2013 Ted Unangst + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Performance improvements (Javascript-specific): + * + * Copyright 2016, Joyent Inc + * Author: Alex Wilson + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +// Ported from OpenBSD bcrypt_pbkdf.c v1.9 + +var BLF_J = 0; + +var Blowfish = function() { + this.S = [ + new Uint32Array([ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a]), + new Uint32Array([ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7]), + new Uint32Array([ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0]), + new Uint32Array([ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]) + ]; + this.P = new Uint32Array([ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b]); +}; + +function F(S, x8, i) { + return (((S[0][x8[i+3]] + + S[1][x8[i+2]]) ^ + S[2][x8[i+1]]) + + S[3][x8[i]]); +}; + +Blowfish.prototype.encipher = function(x, x8) { + if (x8 === undefined) { + x8 = new Uint8Array(x.buffer); + if (x.byteOffset !== 0) + x8 = x8.subarray(x.byteOffset); + } + x[0] ^= this.P[0]; + for (var i = 1; i < 16; i += 2) { + x[1] ^= F(this.S, x8, 0) ^ this.P[i]; + x[0] ^= F(this.S, x8, 4) ^ this.P[i+1]; + } + var t = x[0]; + x[0] = x[1] ^ this.P[17]; + x[1] = t; +}; + +Blowfish.prototype.decipher = function(x) { + var x8 = new Uint8Array(x.buffer); + if (x.byteOffset !== 0) + x8 = x8.subarray(x.byteOffset); + x[0] ^= this.P[17]; + for (var i = 16; i > 0; i -= 2) { + x[1] ^= F(this.S, x8, 0) ^ this.P[i]; + x[0] ^= F(this.S, x8, 4) ^ this.P[i-1]; + } + var t = x[0]; + x[0] = x[1] ^ this.P[0]; + x[1] = t; +}; + +function stream2word(data, databytes){ + var i, temp = 0; + for (i = 0; i < 4; i++, BLF_J++) { + if (BLF_J >= databytes) BLF_J = 0; + temp = (temp << 8) | data[BLF_J]; + } + return temp; +}; + +Blowfish.prototype.expand0state = function(key, keybytes) { + var d = new Uint32Array(2), i, k; + var d8 = new Uint8Array(d.buffer); + + for (i = 0, BLF_J = 0; i < 18; i++) { + this.P[i] ^= stream2word(key, keybytes); + } + BLF_J = 0; + + for (i = 0; i < 18; i += 2) { + this.encipher(d, d8); + this.P[i] = d[0]; + this.P[i+1] = d[1]; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + this.encipher(d, d8); + this.S[i][k] = d[0]; + this.S[i][k+1] = d[1]; + } + } +}; + +Blowfish.prototype.expandstate = function(data, databytes, key, keybytes) { + var d = new Uint32Array(2), i, k; + + for (i = 0, BLF_J = 0; i < 18; i++) { + this.P[i] ^= stream2word(key, keybytes); + } + + for (i = 0, BLF_J = 0; i < 18; i += 2) { + d[0] ^= stream2word(data, databytes); + d[1] ^= stream2word(data, databytes); + this.encipher(d); + this.P[i] = d[0]; + this.P[i+1] = d[1]; + } + + for (i = 0; i < 4; i++) { + for (k = 0; k < 256; k += 2) { + d[0] ^= stream2word(data, databytes); + d[1] ^= stream2word(data, databytes); + this.encipher(d); + this.S[i][k] = d[0]; + this.S[i][k+1] = d[1]; + } + } + BLF_J = 0; +}; + +Blowfish.prototype.enc = function(data, blocks) { + for (var i = 0; i < blocks; i++) { + this.encipher(data.subarray(i*2)); + } +}; + +Blowfish.prototype.dec = function(data, blocks) { + for (var i = 0; i < blocks; i++) { + this.decipher(data.subarray(i*2)); + } +}; + +var BCRYPT_BLOCKS = 8, + BCRYPT_HASHSIZE = 32; + +function bcrypt_hash(sha2pass, sha2salt, out) { + var state = new Blowfish(), + cdata = new Uint32Array(BCRYPT_BLOCKS), i, + ciphertext = new Uint8Array([79,120,121,99,104,114,111,109,97,116,105, + 99,66,108,111,119,102,105,115,104,83,119,97,116,68,121,110,97,109, + 105,116,101]); //"OxychromaticBlowfishSwatDynamite" + + state.expandstate(sha2salt, 64, sha2pass, 64); + for (i = 0; i < 64; i++) { + state.expand0state(sha2salt, 64); + state.expand0state(sha2pass, 64); + } + + for (i = 0; i < BCRYPT_BLOCKS; i++) + cdata[i] = stream2word(ciphertext, ciphertext.byteLength); + for (i = 0; i < 64; i++) + state.enc(cdata, cdata.byteLength / 8); + + for (i = 0; i < BCRYPT_BLOCKS; i++) { + out[4*i+3] = cdata[i] >>> 24; + out[4*i+2] = cdata[i] >>> 16; + out[4*i+1] = cdata[i] >>> 8; + out[4*i+0] = cdata[i]; + } +}; + +function bcrypt_pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds) { + var sha2pass = new Uint8Array(64), + sha2salt = new Uint8Array(64), + out = new Uint8Array(BCRYPT_HASHSIZE), + tmpout = new Uint8Array(BCRYPT_HASHSIZE), + countsalt = new Uint8Array(saltlen+4), + i, j, amt, stride, dest, count, + origkeylen = keylen; + + if (rounds < 1) + return -1; + if (passlen === 0 || saltlen === 0 || keylen === 0 || + keylen > (out.byteLength * out.byteLength) || saltlen > (1<<20)) + return -1; + + stride = Math.floor((keylen + out.byteLength - 1) / out.byteLength); + amt = Math.floor((keylen + stride - 1) / stride); + + for (i = 0; i < saltlen; i++) + countsalt[i] = salt[i]; + + crypto_hash_sha512(sha2pass, pass, passlen); + + for (count = 1; keylen > 0; count++) { + countsalt[saltlen+0] = count >>> 24; + countsalt[saltlen+1] = count >>> 16; + countsalt[saltlen+2] = count >>> 8; + countsalt[saltlen+3] = count; + + crypto_hash_sha512(sha2salt, countsalt, saltlen + 4); + bcrypt_hash(sha2pass, sha2salt, tmpout); + for (i = out.byteLength; i--;) + out[i] = tmpout[i]; + + for (i = 1; i < rounds; i++) { + crypto_hash_sha512(sha2salt, tmpout, tmpout.byteLength); + bcrypt_hash(sha2pass, sha2salt, tmpout); + for (j = 0; j < out.byteLength; j++) + out[j] ^= tmpout[j]; + } + + amt = Math.min(amt, keylen); + for (i = 0; i < amt; i++) { + dest = i * stride + (count - 1); + if (dest >= origkeylen) + break; + key[dest] = out[i]; + } + keylen -= i; + } + + return 0; +}; + +module.exports = { + BLOCKS: BCRYPT_BLOCKS, + HASHSIZE: BCRYPT_HASHSIZE, + hash: bcrypt_hash, + pbkdf: bcrypt_pbkdf +}; diff --git a/node_sid/node_modules/bcrypt-pbkdf/package.json b/node_sid/node_modules/bcrypt-pbkdf/package.json new file mode 100644 index 0000000..e93a969 --- /dev/null +++ b/node_sid/node_modules/bcrypt-pbkdf/package.json @@ -0,0 +1,15 @@ +{ + "name": "bcrypt-pbkdf", + "version": "1.0.2", + "description": "Port of the OpenBSD bcrypt_pbkdf function to pure JS", + "repository": { + "type": "git", + "url": "git://github.com/joyent/node-bcrypt-pbkdf.git" + }, + "main": "index.js", + "dependencies": { + "tweetnacl": "^0.14.3" + }, + "devDependencies": {}, + "license": "BSD-3-Clause" +} diff --git a/node_sid/node_modules/caseless/LICENSE b/node_sid/node_modules/caseless/LICENSE new file mode 100644 index 0000000..61789f4 --- /dev/null +++ b/node_sid/node_modules/caseless/LICENSE @@ -0,0 +1,28 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +1. Definitions. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +You must give any other recipients of the Work or Derivative Works a copy of this License; and +You must cause any modified files to carry prominent notices stating that You changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_sid/node_modules/caseless/README.md b/node_sid/node_modules/caseless/README.md new file mode 100644 index 0000000..e5077a2 --- /dev/null +++ b/node_sid/node_modules/caseless/README.md @@ -0,0 +1,45 @@ +## Caseless -- wrap an object to set and get property with caseless semantics but also preserve caseing. + +This library is incredibly useful when working with HTTP headers. It allows you to get/set/check for headers in a caseless manner while also preserving the caseing of headers the first time they are set. + +## Usage + +```javascript +var headers = {} + , c = caseless(headers) + ; +c.set('a-Header', 'asdf') +c.get('a-header') === 'asdf' +``` + +## has(key) + +Has takes a name and if it finds a matching header will return that header name with the preserved caseing it was set with. + +```javascript +c.has('a-header') === 'a-Header' +``` + +## set(key, value[, clobber=true]) + +Set is fairly straight forward except that if the header exists and clobber is disabled it will add `','+value` to the existing header. + +```javascript +c.set('a-Header', 'fdas') +c.set('a-HEADER', 'more', false) +c.get('a-header') === 'fdsa,more' +``` + +## swap(key) + +Swaps the casing of a header with the new one that is passed in. + +```javascript +var headers = {} + , c = caseless(headers) + ; +c.set('a-Header', 'fdas') +c.swap('a-HEADER') +c.has('a-header') === 'a-HEADER' +headers === {'a-HEADER': 'fdas'} +``` diff --git a/node_sid/node_modules/caseless/index.js b/node_sid/node_modules/caseless/index.js new file mode 100644 index 0000000..b194734 --- /dev/null +++ b/node_sid/node_modules/caseless/index.js @@ -0,0 +1,67 @@ +function Caseless (dict) { + this.dict = dict || {} +} +Caseless.prototype.set = function (name, value, clobber) { + if (typeof name === 'object') { + for (var i in name) { + this.set(i, name[i], value) + } + } else { + if (typeof clobber === 'undefined') clobber = true + var has = this.has(name) + + if (!clobber && has) this.dict[has] = this.dict[has] + ',' + value + else this.dict[has || name] = value + return has + } +} +Caseless.prototype.has = function (name) { + var keys = Object.keys(this.dict) + , name = name.toLowerCase() + ; + for (var i=0;i", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/mikeal/caseless/issues" + }, + "devDependencies": { + "tape": "^2.10.2" + } +} diff --git a/node_sid/node_modules/caseless/test.js b/node_sid/node_modules/caseless/test.js new file mode 100644 index 0000000..f55196c --- /dev/null +++ b/node_sid/node_modules/caseless/test.js @@ -0,0 +1,67 @@ +var tape = require('tape') + , caseless = require('./') + ; + +tape('set get has', function (t) { + var headers = {} + , c = caseless(headers) + ; + t.plan(17) + c.set('a-Header', 'asdf') + t.equal(c.get('a-header'), 'asdf') + t.equal(c.has('a-header'), 'a-Header') + t.ok(!c.has('nothing')) + // old bug where we used the wrong regex + t.ok(!c.has('a-hea')) + c.set('a-header', 'fdsa') + t.equal(c.get('a-header'), 'fdsa') + t.equal(c.get('a-Header'), 'fdsa') + c.set('a-HEADER', 'more', false) + t.equal(c.get('a-header'), 'fdsa,more') + + t.deepEqual(headers, {'a-Header': 'fdsa,more'}) + c.swap('a-HEADER') + t.deepEqual(headers, {'a-HEADER': 'fdsa,more'}) + + c.set('deleteme', 'foobar') + t.ok(c.has('deleteme')) + t.ok(c.del('deleteme')) + t.notOk(c.has('deleteme')) + t.notOk(c.has('idonotexist')) + t.ok(c.del('idonotexist')) + + c.set('tva', 'test1') + c.set('tva-header', 'test2') + t.equal(c.has('tva'), 'tva') + t.notOk(c.has('header')) + + t.equal(c.get('tva'), 'test1') + +}) + +tape('swap', function (t) { + var headers = {} + , c = caseless(headers) + ; + t.plan(4) + // No Header to Swap. + t.throws(function () { + c.swap('content-type') + }) + // Set Header. + c.set('content-type', 'application/json') + // Swap Header With Itself. + c.swap('content-type') + // Does Not Delete Itself. + t.ok(c.has('content-type')) + // Swap Header With a Different Header. + c.swap('Content-Type') + // Still Has Header. + t.ok(c.has('Content-Type')) + // Delete Header. + c.del('Content-Type') + // No Header to Swap. + t.throws(function () { + c.swap('content-type') + }) +}) diff --git a/node_sid/node_modules/combined-stream/License b/node_sid/node_modules/combined-stream/License new file mode 100644 index 0000000..4804b7a --- /dev/null +++ b/node_sid/node_modules/combined-stream/License @@ -0,0 +1,19 @@ +Copyright (c) 2011 Debuggable Limited + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_sid/node_modules/combined-stream/Readme.md b/node_sid/node_modules/combined-stream/Readme.md new file mode 100644 index 0000000..9e367b5 --- /dev/null +++ b/node_sid/node_modules/combined-stream/Readme.md @@ -0,0 +1,138 @@ +# combined-stream + +A stream that emits multiple other streams one after another. + +**NB** Currently `combined-stream` works with streams version 1 only. There is ongoing effort to switch this library to streams version 2. Any help is welcome. :) Meanwhile you can explore other libraries that provide streams2 support with more or less compatibility with `combined-stream`. + +- [combined-stream2](https://www.npmjs.com/package/combined-stream2): A drop-in streams2-compatible replacement for the combined-stream module. + +- [multistream](https://www.npmjs.com/package/multistream): A stream that emits multiple other streams one after another. + +## Installation + +``` bash +npm install combined-stream +``` + +## Usage + +Here is a simple example that shows how you can use combined-stream to combine +two files into one: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create(); +combinedStream.append(fs.createReadStream('file1.txt')); +combinedStream.append(fs.createReadStream('file2.txt')); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +While the example above works great, it will pause all source streams until +they are needed. If you don't want that to happen, you can set `pauseStreams` +to `false`: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create({pauseStreams: false}); +combinedStream.append(fs.createReadStream('file1.txt')); +combinedStream.append(fs.createReadStream('file2.txt')); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +However, what if you don't have all the source streams yet, or you don't want +to allocate the resources (file descriptors, memory, etc.) for them right away? +Well, in that case you can simply provide a callback that supplies the stream +by calling a `next()` function: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create(); +combinedStream.append(function(next) { + next(fs.createReadStream('file1.txt')); +}); +combinedStream.append(function(next) { + next(fs.createReadStream('file2.txt')); +}); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +## API + +### CombinedStream.create([options]) + +Returns a new combined stream object. Available options are: + +* `maxDataSize` +* `pauseStreams` + +The effect of those options is described below. + +### combinedStream.pauseStreams = `true` + +Whether to apply back pressure to the underlaying streams. If set to `false`, +the underlaying streams will never be paused. If set to `true`, the +underlaying streams will be paused right after being appended, as well as when +`delayedStream.pipe()` wants to throttle. + +### combinedStream.maxDataSize = `2 * 1024 * 1024` + +The maximum amount of bytes (or characters) to buffer for all source streams. +If this value is exceeded, `combinedStream` emits an `'error'` event. + +### combinedStream.dataSize = `0` + +The amount of bytes (or characters) currently buffered by `combinedStream`. + +### combinedStream.append(stream) + +Appends the given `stream` to the combinedStream object. If `pauseStreams` is +set to `true, this stream will also be paused right away. + +`streams` can also be a function that takes one parameter called `next`. `next` +is a function that must be invoked in order to provide the `next` stream, see +example above. + +Regardless of how the `stream` is appended, combined-stream always attaches an +`'error'` listener to it, so you don't have to do that manually. + +Special case: `stream` can also be a String or Buffer. + +### combinedStream.write(data) + +You should not call this, `combinedStream` takes care of piping the appended +streams into itself for you. + +### combinedStream.resume() + +Causes `combinedStream` to start drain the streams it manages. The function is +idempotent, and also emits a `'resume'` event each time which usually goes to +the stream that is currently being drained. + +### combinedStream.pause(); + +If `combinedStream.pauseStreams` is set to `false`, this does nothing. +Otherwise a `'pause'` event is emitted, this goes to the stream that is +currently being drained, so you can use it to apply back pressure. + +### combinedStream.end(); + +Sets `combinedStream.writable` to false, emits an `'end'` event, and removes +all streams from the queue. + +### combinedStream.destroy(); + +Same as `combinedStream.end()`, except it emits a `'close'` event instead of +`'end'`. + +## License + +combined-stream is licensed under the MIT license. diff --git a/node_sid/node_modules/combined-stream/lib/combined_stream.js b/node_sid/node_modules/combined-stream/lib/combined_stream.js new file mode 100644 index 0000000..125f097 --- /dev/null +++ b/node_sid/node_modules/combined-stream/lib/combined_stream.js @@ -0,0 +1,208 @@ +var util = require('util'); +var Stream = require('stream').Stream; +var DelayedStream = require('delayed-stream'); + +module.exports = CombinedStream; +function CombinedStream() { + this.writable = false; + this.readable = true; + this.dataSize = 0; + this.maxDataSize = 2 * 1024 * 1024; + this.pauseStreams = true; + + this._released = false; + this._streams = []; + this._currentStream = null; + this._insideLoop = false; + this._pendingNext = false; +} +util.inherits(CombinedStream, Stream); + +CombinedStream.create = function(options) { + var combinedStream = new this(); + + options = options || {}; + for (var option in options) { + combinedStream[option] = options[option]; + } + + return combinedStream; +}; + +CombinedStream.isStreamLike = function(stream) { + return (typeof stream !== 'function') + && (typeof stream !== 'string') + && (typeof stream !== 'boolean') + && (typeof stream !== 'number') + && (!Buffer.isBuffer(stream)); +}; + +CombinedStream.prototype.append = function(stream) { + var isStreamLike = CombinedStream.isStreamLike(stream); + + if (isStreamLike) { + if (!(stream instanceof DelayedStream)) { + var newStream = DelayedStream.create(stream, { + maxDataSize: Infinity, + pauseStream: this.pauseStreams, + }); + stream.on('data', this._checkDataSize.bind(this)); + stream = newStream; + } + + this._handleErrors(stream); + + if (this.pauseStreams) { + stream.pause(); + } + } + + this._streams.push(stream); + return this; +}; + +CombinedStream.prototype.pipe = function(dest, options) { + Stream.prototype.pipe.call(this, dest, options); + this.resume(); + return dest; +}; + +CombinedStream.prototype._getNext = function() { + this._currentStream = null; + + if (this._insideLoop) { + this._pendingNext = true; + return; // defer call + } + + this._insideLoop = true; + try { + do { + this._pendingNext = false; + this._realGetNext(); + } while (this._pendingNext); + } finally { + this._insideLoop = false; + } +}; + +CombinedStream.prototype._realGetNext = function() { + var stream = this._streams.shift(); + + + if (typeof stream == 'undefined') { + this.end(); + return; + } + + if (typeof stream !== 'function') { + this._pipeNext(stream); + return; + } + + var getStream = stream; + getStream(function(stream) { + var isStreamLike = CombinedStream.isStreamLike(stream); + if (isStreamLike) { + stream.on('data', this._checkDataSize.bind(this)); + this._handleErrors(stream); + } + + this._pipeNext(stream); + }.bind(this)); +}; + +CombinedStream.prototype._pipeNext = function(stream) { + this._currentStream = stream; + + var isStreamLike = CombinedStream.isStreamLike(stream); + if (isStreamLike) { + stream.on('end', this._getNext.bind(this)); + stream.pipe(this, {end: false}); + return; + } + + var value = stream; + this.write(value); + this._getNext(); +}; + +CombinedStream.prototype._handleErrors = function(stream) { + var self = this; + stream.on('error', function(err) { + self._emitError(err); + }); +}; + +CombinedStream.prototype.write = function(data) { + this.emit('data', data); +}; + +CombinedStream.prototype.pause = function() { + if (!this.pauseStreams) { + return; + } + + if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause(); + this.emit('pause'); +}; + +CombinedStream.prototype.resume = function() { + if (!this._released) { + this._released = true; + this.writable = true; + this._getNext(); + } + + if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume(); + this.emit('resume'); +}; + +CombinedStream.prototype.end = function() { + this._reset(); + this.emit('end'); +}; + +CombinedStream.prototype.destroy = function() { + this._reset(); + this.emit('close'); +}; + +CombinedStream.prototype._reset = function() { + this.writable = false; + this._streams = []; + this._currentStream = null; +}; + +CombinedStream.prototype._checkDataSize = function() { + this._updateDataSize(); + if (this.dataSize <= this.maxDataSize) { + return; + } + + var message = + 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'; + this._emitError(new Error(message)); +}; + +CombinedStream.prototype._updateDataSize = function() { + this.dataSize = 0; + + var self = this; + this._streams.forEach(function(stream) { + if (!stream.dataSize) { + return; + } + + self.dataSize += stream.dataSize; + }); + + if (this._currentStream && this._currentStream.dataSize) { + this.dataSize += this._currentStream.dataSize; + } +}; + +CombinedStream.prototype._emitError = function(err) { + this._reset(); + this.emit('error', err); +}; diff --git a/node_sid/node_modules/combined-stream/package.json b/node_sid/node_modules/combined-stream/package.json new file mode 100644 index 0000000..6982b6d --- /dev/null +++ b/node_sid/node_modules/combined-stream/package.json @@ -0,0 +1,25 @@ +{ + "author": "Felix Geisendörfer (http://debuggable.com/)", + "name": "combined-stream", + "description": "A stream that emits multiple other streams one after another.", + "version": "1.0.8", + "homepage": "https://github.com/felixge/node-combined-stream", + "repository": { + "type": "git", + "url": "git://github.com/felixge/node-combined-stream.git" + }, + "main": "./lib/combined_stream", + "scripts": { + "test": "node test/run.js" + }, + "engines": { + "node": ">= 0.8" + }, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "devDependencies": { + "far": "~0.0.7" + }, + "license": "MIT" +} diff --git a/node_sid/node_modules/combined-stream/yarn.lock b/node_sid/node_modules/combined-stream/yarn.lock new file mode 100644 index 0000000..7edf418 --- /dev/null +++ b/node_sid/node_modules/combined-stream/yarn.lock @@ -0,0 +1,17 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +far@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/far/-/far-0.0.7.tgz#01c1fd362bcd26ce9cf161af3938aa34619f79a7" + dependencies: + oop "0.0.3" + +oop@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/oop/-/oop-0.0.3.tgz#70fa405a5650891a194fdc82ca68dad6dabf4401" diff --git a/node_sid/node_modules/core-util-is/LICENSE b/node_sid/node_modules/core-util-is/LICENSE new file mode 100644 index 0000000..d8d7f94 --- /dev/null +++ b/node_sid/node_modules/core-util-is/LICENSE @@ -0,0 +1,19 @@ +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/node_sid/node_modules/core-util-is/README.md b/node_sid/node_modules/core-util-is/README.md new file mode 100644 index 0000000..5a76b41 --- /dev/null +++ b/node_sid/node_modules/core-util-is/README.md @@ -0,0 +1,3 @@ +# core-util-is + +The `util.is*` functions introduced in Node v0.12. diff --git a/node_sid/node_modules/core-util-is/float.patch b/node_sid/node_modules/core-util-is/float.patch new file mode 100644 index 0000000..a06d5c0 --- /dev/null +++ b/node_sid/node_modules/core-util-is/float.patch @@ -0,0 +1,604 @@ +diff --git a/lib/util.js b/lib/util.js +index a03e874..9074e8e 100644 +--- a/lib/util.js ++++ b/lib/util.js +@@ -19,430 +19,6 @@ + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + +-var formatRegExp = /%[sdj%]/g; +-exports.format = function(f) { +- if (!isString(f)) { +- var objects = []; +- for (var i = 0; i < arguments.length; i++) { +- objects.push(inspect(arguments[i])); +- } +- return objects.join(' '); +- } +- +- var i = 1; +- var args = arguments; +- var len = args.length; +- var str = String(f).replace(formatRegExp, function(x) { +- if (x === '%%') return '%'; +- if (i >= len) return x; +- switch (x) { +- case '%s': return String(args[i++]); +- case '%d': return Number(args[i++]); +- case '%j': +- try { +- return JSON.stringify(args[i++]); +- } catch (_) { +- return '[Circular]'; +- } +- default: +- return x; +- } +- }); +- for (var x = args[i]; i < len; x = args[++i]) { +- if (isNull(x) || !isObject(x)) { +- str += ' ' + x; +- } else { +- str += ' ' + inspect(x); +- } +- } +- return str; +-}; +- +- +-// Mark that a method should not be used. +-// Returns a modified function which warns once by default. +-// If --no-deprecation is set, then it is a no-op. +-exports.deprecate = function(fn, msg) { +- // Allow for deprecating things in the process of starting up. +- if (isUndefined(global.process)) { +- return function() { +- return exports.deprecate(fn, msg).apply(this, arguments); +- }; +- } +- +- if (process.noDeprecation === true) { +- return fn; +- } +- +- var warned = false; +- function deprecated() { +- if (!warned) { +- if (process.throwDeprecation) { +- throw new Error(msg); +- } else if (process.traceDeprecation) { +- console.trace(msg); +- } else { +- console.error(msg); +- } +- warned = true; +- } +- return fn.apply(this, arguments); +- } +- +- return deprecated; +-}; +- +- +-var debugs = {}; +-var debugEnviron; +-exports.debuglog = function(set) { +- if (isUndefined(debugEnviron)) +- debugEnviron = process.env.NODE_DEBUG || ''; +- set = set.toUpperCase(); +- if (!debugs[set]) { +- if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { +- var pid = process.pid; +- debugs[set] = function() { +- var msg = exports.format.apply(exports, arguments); +- console.error('%s %d: %s', set, pid, msg); +- }; +- } else { +- debugs[set] = function() {}; +- } +- } +- return debugs[set]; +-}; +- +- +-/** +- * Echos the value of a value. Trys to print the value out +- * in the best way possible given the different types. +- * +- * @param {Object} obj The object to print out. +- * @param {Object} opts Optional options object that alters the output. +- */ +-/* legacy: obj, showHidden, depth, colors*/ +-function inspect(obj, opts) { +- // default options +- var ctx = { +- seen: [], +- stylize: stylizeNoColor +- }; +- // legacy... +- if (arguments.length >= 3) ctx.depth = arguments[2]; +- if (arguments.length >= 4) ctx.colors = arguments[3]; +- if (isBoolean(opts)) { +- // legacy... +- ctx.showHidden = opts; +- } else if (opts) { +- // got an "options" object +- exports._extend(ctx, opts); +- } +- // set default options +- if (isUndefined(ctx.showHidden)) ctx.showHidden = false; +- if (isUndefined(ctx.depth)) ctx.depth = 2; +- if (isUndefined(ctx.colors)) ctx.colors = false; +- if (isUndefined(ctx.customInspect)) ctx.customInspect = true; +- if (ctx.colors) ctx.stylize = stylizeWithColor; +- return formatValue(ctx, obj, ctx.depth); +-} +-exports.inspect = inspect; +- +- +-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +-inspect.colors = { +- 'bold' : [1, 22], +- 'italic' : [3, 23], +- 'underline' : [4, 24], +- 'inverse' : [7, 27], +- 'white' : [37, 39], +- 'grey' : [90, 39], +- 'black' : [30, 39], +- 'blue' : [34, 39], +- 'cyan' : [36, 39], +- 'green' : [32, 39], +- 'magenta' : [35, 39], +- 'red' : [31, 39], +- 'yellow' : [33, 39] +-}; +- +-// Don't use 'blue' not visible on cmd.exe +-inspect.styles = { +- 'special': 'cyan', +- 'number': 'yellow', +- 'boolean': 'yellow', +- 'undefined': 'grey', +- 'null': 'bold', +- 'string': 'green', +- 'date': 'magenta', +- // "name": intentionally not styling +- 'regexp': 'red' +-}; +- +- +-function stylizeWithColor(str, styleType) { +- var style = inspect.styles[styleType]; +- +- if (style) { +- return '\u001b[' + inspect.colors[style][0] + 'm' + str + +- '\u001b[' + inspect.colors[style][1] + 'm'; +- } else { +- return str; +- } +-} +- +- +-function stylizeNoColor(str, styleType) { +- return str; +-} +- +- +-function arrayToHash(array) { +- var hash = {}; +- +- array.forEach(function(val, idx) { +- hash[val] = true; +- }); +- +- return hash; +-} +- +- +-function formatValue(ctx, value, recurseTimes) { +- // Provide a hook for user-specified inspect functions. +- // Check that value is an object with an inspect function on it +- if (ctx.customInspect && +- value && +- isFunction(value.inspect) && +- // Filter out the util module, it's inspect function is special +- value.inspect !== exports.inspect && +- // Also filter out any prototype objects using the circular check. +- !(value.constructor && value.constructor.prototype === value)) { +- var ret = value.inspect(recurseTimes, ctx); +- if (!isString(ret)) { +- ret = formatValue(ctx, ret, recurseTimes); +- } +- return ret; +- } +- +- // Primitive types cannot have properties +- var primitive = formatPrimitive(ctx, value); +- if (primitive) { +- return primitive; +- } +- +- // Look up the keys of the object. +- var keys = Object.keys(value); +- var visibleKeys = arrayToHash(keys); +- +- if (ctx.showHidden) { +- keys = Object.getOwnPropertyNames(value); +- } +- +- // Some type of object without properties can be shortcutted. +- if (keys.length === 0) { +- if (isFunction(value)) { +- var name = value.name ? ': ' + value.name : ''; +- return ctx.stylize('[Function' + name + ']', 'special'); +- } +- if (isRegExp(value)) { +- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); +- } +- if (isDate(value)) { +- return ctx.stylize(Date.prototype.toString.call(value), 'date'); +- } +- if (isError(value)) { +- return formatError(value); +- } +- } +- +- var base = '', array = false, braces = ['{', '}']; +- +- // Make Array say that they are Array +- if (isArray(value)) { +- array = true; +- braces = ['[', ']']; +- } +- +- // Make functions say that they are functions +- if (isFunction(value)) { +- var n = value.name ? ': ' + value.name : ''; +- base = ' [Function' + n + ']'; +- } +- +- // Make RegExps say that they are RegExps +- if (isRegExp(value)) { +- base = ' ' + RegExp.prototype.toString.call(value); +- } +- +- // Make dates with properties first say the date +- if (isDate(value)) { +- base = ' ' + Date.prototype.toUTCString.call(value); +- } +- +- // Make error with message first say the error +- if (isError(value)) { +- base = ' ' + formatError(value); +- } +- +- if (keys.length === 0 && (!array || value.length == 0)) { +- return braces[0] + base + braces[1]; +- } +- +- if (recurseTimes < 0) { +- if (isRegExp(value)) { +- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); +- } else { +- return ctx.stylize('[Object]', 'special'); +- } +- } +- +- ctx.seen.push(value); +- +- var output; +- if (array) { +- output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); +- } else { +- output = keys.map(function(key) { +- return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); +- }); +- } +- +- ctx.seen.pop(); +- +- return reduceToSingleString(output, base, braces); +-} +- +- +-function formatPrimitive(ctx, value) { +- if (isUndefined(value)) +- return ctx.stylize('undefined', 'undefined'); +- if (isString(value)) { +- var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') +- .replace(/'/g, "\\'") +- .replace(/\\"/g, '"') + '\''; +- return ctx.stylize(simple, 'string'); +- } +- if (isNumber(value)) { +- // Format -0 as '-0'. Strict equality won't distinguish 0 from -0, +- // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 . +- if (value === 0 && 1 / value < 0) +- return ctx.stylize('-0', 'number'); +- return ctx.stylize('' + value, 'number'); +- } +- if (isBoolean(value)) +- return ctx.stylize('' + value, 'boolean'); +- // For some reason typeof null is "object", so special case here. +- if (isNull(value)) +- return ctx.stylize('null', 'null'); +-} +- +- +-function formatError(value) { +- return '[' + Error.prototype.toString.call(value) + ']'; +-} +- +- +-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { +- var output = []; +- for (var i = 0, l = value.length; i < l; ++i) { +- if (hasOwnProperty(value, String(i))) { +- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, +- String(i), true)); +- } else { +- output.push(''); +- } +- } +- keys.forEach(function(key) { +- if (!key.match(/^\d+$/)) { +- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, +- key, true)); +- } +- }); +- return output; +-} +- +- +-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { +- var name, str, desc; +- desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; +- if (desc.get) { +- if (desc.set) { +- str = ctx.stylize('[Getter/Setter]', 'special'); +- } else { +- str = ctx.stylize('[Getter]', 'special'); +- } +- } else { +- if (desc.set) { +- str = ctx.stylize('[Setter]', 'special'); +- } +- } +- if (!hasOwnProperty(visibleKeys, key)) { +- name = '[' + key + ']'; +- } +- if (!str) { +- if (ctx.seen.indexOf(desc.value) < 0) { +- if (isNull(recurseTimes)) { +- str = formatValue(ctx, desc.value, null); +- } else { +- str = formatValue(ctx, desc.value, recurseTimes - 1); +- } +- if (str.indexOf('\n') > -1) { +- if (array) { +- str = str.split('\n').map(function(line) { +- return ' ' + line; +- }).join('\n').substr(2); +- } else { +- str = '\n' + str.split('\n').map(function(line) { +- return ' ' + line; +- }).join('\n'); +- } +- } +- } else { +- str = ctx.stylize('[Circular]', 'special'); +- } +- } +- if (isUndefined(name)) { +- if (array && key.match(/^\d+$/)) { +- return str; +- } +- name = JSON.stringify('' + key); +- if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { +- name = name.substr(1, name.length - 2); +- name = ctx.stylize(name, 'name'); +- } else { +- name = name.replace(/'/g, "\\'") +- .replace(/\\"/g, '"') +- .replace(/(^"|"$)/g, "'"); +- name = ctx.stylize(name, 'string'); +- } +- } +- +- return name + ': ' + str; +-} +- +- +-function reduceToSingleString(output, base, braces) { +- var numLinesEst = 0; +- var length = output.reduce(function(prev, cur) { +- numLinesEst++; +- if (cur.indexOf('\n') >= 0) numLinesEst++; +- return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; +- }, 0); +- +- if (length > 60) { +- return braces[0] + +- (base === '' ? '' : base + '\n ') + +- ' ' + +- output.join(',\n ') + +- ' ' + +- braces[1]; +- } +- +- return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +-} +- +- + // NOTE: These type checking functions intentionally don't use `instanceof` + // because it is fragile and can be easily faked with `Object.create()`. + function isArray(ar) { +@@ -522,166 +98,10 @@ function isPrimitive(arg) { + exports.isPrimitive = isPrimitive; + + function isBuffer(arg) { +- return arg instanceof Buffer; ++ return Buffer.isBuffer(arg); + } + exports.isBuffer = isBuffer; + + function objectToString(o) { + return Object.prototype.toString.call(o); +-} +- +- +-function pad(n) { +- return n < 10 ? '0' + n.toString(10) : n.toString(10); +-} +- +- +-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', +- 'Oct', 'Nov', 'Dec']; +- +-// 26 Feb 16:19:34 +-function timestamp() { +- var d = new Date(); +- var time = [pad(d.getHours()), +- pad(d.getMinutes()), +- pad(d.getSeconds())].join(':'); +- return [d.getDate(), months[d.getMonth()], time].join(' '); +-} +- +- +-// log is just a thin wrapper to console.log that prepends a timestamp +-exports.log = function() { +- console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +-}; +- +- +-/** +- * Inherit the prototype methods from one constructor into another. +- * +- * The Function.prototype.inherits from lang.js rewritten as a standalone +- * function (not on Function.prototype). NOTE: If this file is to be loaded +- * during bootstrapping this function needs to be rewritten using some native +- * functions as prototype setup using normal JavaScript does not work as +- * expected during bootstrapping (see mirror.js in r114903). +- * +- * @param {function} ctor Constructor function which needs to inherit the +- * prototype. +- * @param {function} superCtor Constructor function to inherit prototype from. +- */ +-exports.inherits = function(ctor, superCtor) { +- ctor.super_ = superCtor; +- ctor.prototype = Object.create(superCtor.prototype, { +- constructor: { +- value: ctor, +- enumerable: false, +- writable: true, +- configurable: true +- } +- }); +-}; +- +-exports._extend = function(origin, add) { +- // Don't do anything if add isn't an object +- if (!add || !isObject(add)) return origin; +- +- var keys = Object.keys(add); +- var i = keys.length; +- while (i--) { +- origin[keys[i]] = add[keys[i]]; +- } +- return origin; +-}; +- +-function hasOwnProperty(obj, prop) { +- return Object.prototype.hasOwnProperty.call(obj, prop); +-} +- +- +-// Deprecated old stuff. +- +-exports.p = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- console.error(exports.inspect(arguments[i])); +- } +-}, 'util.p: Use console.error() instead'); +- +- +-exports.exec = exports.deprecate(function() { +- return require('child_process').exec.apply(this, arguments); +-}, 'util.exec is now called `child_process.exec`.'); +- +- +-exports.print = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stdout.write(String(arguments[i])); +- } +-}, 'util.print: Use console.log instead'); +- +- +-exports.puts = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stdout.write(arguments[i] + '\n'); +- } +-}, 'util.puts: Use console.log instead'); +- +- +-exports.debug = exports.deprecate(function(x) { +- process.stderr.write('DEBUG: ' + x + '\n'); +-}, 'util.debug: Use console.error instead'); +- +- +-exports.error = exports.deprecate(function(x) { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stderr.write(arguments[i] + '\n'); +- } +-}, 'util.error: Use console.error instead'); +- +- +-exports.pump = exports.deprecate(function(readStream, writeStream, callback) { +- var callbackCalled = false; +- +- function call(a, b, c) { +- if (callback && !callbackCalled) { +- callback(a, b, c); +- callbackCalled = true; +- } +- } +- +- readStream.addListener('data', function(chunk) { +- if (writeStream.write(chunk) === false) readStream.pause(); +- }); +- +- writeStream.addListener('drain', function() { +- readStream.resume(); +- }); +- +- readStream.addListener('end', function() { +- writeStream.end(); +- }); +- +- readStream.addListener('close', function() { +- call(); +- }); +- +- readStream.addListener('error', function(err) { +- writeStream.end(); +- call(err); +- }); +- +- writeStream.addListener('error', function(err) { +- readStream.destroy(); +- call(err); +- }); +-}, 'util.pump(): Use readableStream.pipe() instead'); +- +- +-var uv; +-exports._errnoException = function(err, syscall) { +- if (isUndefined(uv)) uv = process.binding('uv'); +- var errname = uv.errname(err); +- var e = new Error(syscall + ' ' + errname); +- e.code = errname; +- e.errno = errname; +- e.syscall = syscall; +- return e; +-}; ++} \ No newline at end of file diff --git a/node_sid/node_modules/core-util-is/lib/util.js b/node_sid/node_modules/core-util-is/lib/util.js new file mode 100644 index 0000000..ff4c851 --- /dev/null +++ b/node_sid/node_modules/core-util-is/lib/util.js @@ -0,0 +1,107 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. + +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = Buffer.isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} diff --git a/node_sid/node_modules/core-util-is/package.json b/node_sid/node_modules/core-util-is/package.json new file mode 100644 index 0000000..3368e95 --- /dev/null +++ b/node_sid/node_modules/core-util-is/package.json @@ -0,0 +1,32 @@ +{ + "name": "core-util-is", + "version": "1.0.2", + "description": "The `util.is*` functions introduced in Node v0.12.", + "main": "lib/util.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/core-util-is" + }, + "keywords": [ + "util", + "isBuffer", + "isArray", + "isNumber", + "isString", + "isRegExp", + "isThis", + "isThat", + "polyfill" + ], + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "MIT", + "bugs": { + "url": "https://github.com/isaacs/core-util-is/issues" + }, + "scripts": { + "test": "tap test.js" + }, + "devDependencies": { + "tap": "^2.3.0" + } +} diff --git a/node_sid/node_modules/core-util-is/test.js b/node_sid/node_modules/core-util-is/test.js new file mode 100644 index 0000000..1a490c6 --- /dev/null +++ b/node_sid/node_modules/core-util-is/test.js @@ -0,0 +1,68 @@ +var assert = require('tap'); + +var t = require('./lib/util'); + +assert.equal(t.isArray([]), true); +assert.equal(t.isArray({}), false); + +assert.equal(t.isBoolean(null), false); +assert.equal(t.isBoolean(true), true); +assert.equal(t.isBoolean(false), true); + +assert.equal(t.isNull(null), true); +assert.equal(t.isNull(undefined), false); +assert.equal(t.isNull(false), false); +assert.equal(t.isNull(), false); + +assert.equal(t.isNullOrUndefined(null), true); +assert.equal(t.isNullOrUndefined(undefined), true); +assert.equal(t.isNullOrUndefined(false), false); +assert.equal(t.isNullOrUndefined(), true); + +assert.equal(t.isNumber(null), false); +assert.equal(t.isNumber('1'), false); +assert.equal(t.isNumber(1), true); + +assert.equal(t.isString(null), false); +assert.equal(t.isString('1'), true); +assert.equal(t.isString(1), false); + +assert.equal(t.isSymbol(null), false); +assert.equal(t.isSymbol('1'), false); +assert.equal(t.isSymbol(1), false); +assert.equal(t.isSymbol(Symbol()), true); + +assert.equal(t.isUndefined(null), false); +assert.equal(t.isUndefined(undefined), true); +assert.equal(t.isUndefined(false), false); +assert.equal(t.isUndefined(), true); + +assert.equal(t.isRegExp(null), false); +assert.equal(t.isRegExp('1'), false); +assert.equal(t.isRegExp(new RegExp()), true); + +assert.equal(t.isObject({}), true); +assert.equal(t.isObject([]), true); +assert.equal(t.isObject(new RegExp()), true); +assert.equal(t.isObject(new Date()), true); + +assert.equal(t.isDate(null), false); +assert.equal(t.isDate('1'), false); +assert.equal(t.isDate(new Date()), true); + +assert.equal(t.isError(null), false); +assert.equal(t.isError({ err: true }), false); +assert.equal(t.isError(new Error()), true); + +assert.equal(t.isFunction(null), false); +assert.equal(t.isFunction({ }), false); +assert.equal(t.isFunction(function() {}), true); + +assert.equal(t.isPrimitive(null), true); +assert.equal(t.isPrimitive(''), true); +assert.equal(t.isPrimitive(0), true); +assert.equal(t.isPrimitive(new Date()), false); + +assert.equal(t.isBuffer(null), false); +assert.equal(t.isBuffer({}), false); +assert.equal(t.isBuffer(new Buffer(0)), true); diff --git a/node_sid/node_modules/dashdash/CHANGES.md b/node_sid/node_modules/dashdash/CHANGES.md new file mode 100644 index 0000000..d7c8f4e --- /dev/null +++ b/node_sid/node_modules/dashdash/CHANGES.md @@ -0,0 +1,364 @@ +# node-dashdash changelog + +## not yet released + +(nothing yet) + +## 1.14.1 + +- [issue #30] Change the output used by dashdash's Bash completion support to + indicate "there are no completions for this argument" to cope with different + sorting rules on different Bash/platforms. For example: + + $ triton -v -p test2 package get # before + ##-no -tritonpackage- completions-## + + $ triton -v -p test2 package get # after + ##-no-completion- -results-## + +## 1.14.0 + +- New `synopsisFromOpt(

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