From 30d647fd8694a7b4fe0054f66d83fad7df1a936c Mon Sep 17 00:00:00 2001 From: Gerrit Linnemann Date: Mon, 11 Mar 2019 17:26:18 +0100 Subject: [PATCH] Skelleton extended. --- html/RentForCamp/app.js | 8 + html/RentForCamp/app/database.js | 38 + html/RentForCamp/app/helper.js | 139 + html/RentForCamp/app/logging.js | 105 + html/RentForCamp/node_modules/.bin/jsonlint | 1 + html/RentForCamp/node_modules/.bin/strip-ansi | 1 + html/RentForCamp/node_modules/JSV/.project | 11 + .../RentForCamp/node_modules/JSV/CHANGELOG.md | 41 + html/RentForCamp/node_modules/JSV/README.md | 211 ++ .../node_modules/JSV/docs/files.html | 235 ++ .../node_modules/JSV/docs/index.html | 258 ++ .../JSV/docs/symbols/Environment.html | 954 ++++++ .../node_modules/JSV/docs/symbols/Error.html | 263 ++ .../JSV/docs/symbols/InitializationError.html | 346 +++ .../JSV/docs/symbols/JSONInstance.html | 826 +++++ .../JSV/docs/symbols/JSONSchema.html | 753 +++++ .../node_modules/JSV/docs/symbols/JSV.html | 1511 +++++++++ .../node_modules/JSV/docs/symbols/Report.html | 743 +++++ .../JSV/docs/symbols/ValidationError.html | 501 +++ .../JSV/docs/symbols/_global_.html | 261 ++ .../JSV/docs/symbols/src/jsv.js.html | 1504 +++++++++ .../node_modules/JSV/examples/index.html | 260 ++ .../node_modules/JSV/jsdoc-toolkit/README.txt | 183 ++ .../JSV/jsdoc-toolkit/app/frame.js | 33 + .../JSV/jsdoc-toolkit/app/frame/Chain.js | 102 + .../JSV/jsdoc-toolkit/app/frame/Dumper.js | 144 + .../JSV/jsdoc-toolkit/app/frame/Hash.js | 84 + .../JSV/jsdoc-toolkit/app/frame/Link.js | 173 ++ .../JSV/jsdoc-toolkit/app/frame/Namespace.js | 10 + .../JSV/jsdoc-toolkit/app/frame/Opt.js | 134 + .../JSV/jsdoc-toolkit/app/frame/Reflection.js | 26 + .../JSV/jsdoc-toolkit/app/frame/String.js | 93 + .../JSV/jsdoc-toolkit/app/frame/Testrun.js | 129 + .../JSV/jsdoc-toolkit/app/handlers/FOODOC.js | 26 + .../JSV/jsdoc-toolkit/app/handlers/XMLDOC.js | 26 + .../app/handlers/XMLDOC/DomReader.js | 159 + .../app/handlers/XMLDOC/XMLDoc.js | 16 + .../app/handlers/XMLDOC/XMLParse.js | 292 ++ .../JSV/jsdoc-toolkit/app/lib/JSDOC.js | 106 + .../jsdoc-toolkit/app/lib/JSDOC/DocComment.js | 204 ++ .../JSV/jsdoc-toolkit/app/lib/JSDOC/DocTag.js | 294 ++ .../JSV/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js | 140 + .../jsdoc-toolkit/app/lib/JSDOC/JsPlate.js | 109 + .../JSV/jsdoc-toolkit/app/lib/JSDOC/Lang.js | 144 + .../JSV/jsdoc-toolkit/app/lib/JSDOC/Parser.js | 146 + .../app/lib/JSDOC/PluginManager.js | 33 + .../JSV/jsdoc-toolkit/app/lib/JSDOC/Symbol.js | 644 ++++ .../jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js | 243 ++ .../jsdoc-toolkit/app/lib/JSDOC/TextStream.js | 41 + .../JSV/jsdoc-toolkit/app/lib/JSDOC/Token.js | 18 + .../app/lib/JSDOC/TokenReader.js | 332 ++ .../app/lib/JSDOC/TokenStream.js | 133 + .../JSV/jsdoc-toolkit/app/lib/JSDOC/Util.js | 32 + .../JSV/jsdoc-toolkit/app/lib/JSDOC/Walker.js | 507 +++ .../JSV/jsdoc-toolkit/app/main.js | 111 + .../app/plugins/commentSrcJson.js | 20 + .../app/plugins/frameworkPrototype.js | 16 + .../jsdoc-toolkit/app/plugins/functionCall.js | 10 + .../app/plugins/publishSrcHilite.js | 62 + .../jsdoc-toolkit/app/plugins/symbolLink.js | 10 + .../app/plugins/tagParamConfig.js | 31 + .../jsdoc-toolkit/app/plugins/tagSynonyms.js | 43 + .../node_modules/JSV/jsdoc-toolkit/app/run.js | 348 +++ .../JSV/jsdoc-toolkit/app/t/TestDoc.js | 144 + .../JSV/jsdoc-toolkit/app/t/runner.js | 13 + .../JSV/jsdoc-toolkit/app/test.js | 342 +++ .../JSV/jsdoc-toolkit/app/test/addon.js | 24 + .../JSV/jsdoc-toolkit/app/test/anon_inner.js | 14 + .../JSV/jsdoc-toolkit/app/test/augments.js | 31 + .../JSV/jsdoc-toolkit/app/test/augments2.js | 26 + .../JSV/jsdoc-toolkit/app/test/borrows.js | 46 + .../JSV/jsdoc-toolkit/app/test/borrows2.js | 23 + .../JSV/jsdoc-toolkit/app/test/config.js | 22 + .../JSV/jsdoc-toolkit/app/test/constructs.js | 18 + .../JSV/jsdoc-toolkit/app/test/encoding.js | 10 + .../jsdoc-toolkit/app/test/encoding_other.js | 12 + .../JSV/jsdoc-toolkit/app/test/event.js | 54 + .../JSV/jsdoc-toolkit/app/test/exports.js | 14 + .../jsdoc-toolkit/app/test/functions_anon.js | 39 + .../app/test/functions_nested.js | 33 + .../JSV/jsdoc-toolkit/app/test/global.js | 13 + .../JSV/jsdoc-toolkit/app/test/globals.js | 25 + .../JSV/jsdoc-toolkit/app/test/ignore.js | 10 + .../JSV/jsdoc-toolkit/app/test/inner.js | 16 + .../JSV/jsdoc-toolkit/app/test/jsdoc_test.js | 477 +++ .../JSV/jsdoc-toolkit/app/test/lend.js | 33 + .../JSV/jsdoc-toolkit/app/test/memberof.js | 19 + .../JSV/jsdoc-toolkit/app/test/memberof2.js | 38 + .../JSV/jsdoc-toolkit/app/test/memberof3.js | 33 + .../app/test/memberof_constructor.js | 17 + .../JSV/jsdoc-toolkit/app/test/module.js | 17 + .../jsdoc-toolkit/app/test/multi_methods.js | 25 + .../JSV/jsdoc-toolkit/app/test/name.js | 19 + .../app/test/namespace_nested.js | 23 + .../JSV/jsdoc-toolkit/app/test/nocode.js | 13 + .../JSV/jsdoc-toolkit/app/test/oblit_anon.js | 20 + .../JSV/jsdoc-toolkit/app/test/overview.js | 20 + .../jsdoc-toolkit/app/test/param_inline.js | 37 + .../jsdoc-toolkit/app/test/params_optional.js | 8 + .../JSV/jsdoc-toolkit/app/test/prototype.js | 17 + .../app/test/prototype_nested.js | 9 + .../jsdoc-toolkit/app/test/prototype_oblit.js | 13 + .../app/test/prototype_oblit_constructor.js | 24 + .../JSV/jsdoc-toolkit/app/test/public.js | 10 + .../jsdoc-toolkit/app/test/scripts/code.js | 5 + .../app/test/scripts/notcode.txt | 5 + .../JSV/jsdoc-toolkit/app/test/shared.js | 42 + .../JSV/jsdoc-toolkit/app/test/shared2.js | 2 + .../JSV/jsdoc-toolkit/app/test/shortcuts.js | 22 + .../JSV/jsdoc-toolkit/app/test/static_this.js | 13 + .../JSV/jsdoc-toolkit/app/test/synonyms.js | 31 + .../JSV/jsdoc-toolkit/app/test/tosource.js | 23 + .../app/test/variable_redefine.js | 14 + .../JSV/jsdoc-toolkit/changes.txt | 124 + .../JSV/jsdoc-toolkit/conf/sample.conf | 31 + .../JSV/jsdoc-toolkit/java/build.xml | 36 + .../JSV/jsdoc-toolkit/java/build_1.4.xml | 36 + .../JSV/jsdoc-toolkit/java/classes/js.jar | Bin 0 -> 819369 bytes .../jsdoc-toolkit/java/src/JsDebugRun.java | 21 + .../JSV/jsdoc-toolkit/java/src/JsRun.java | 21 + .../JSV/jsdoc-toolkit/jsdebug.jar | Bin 0 -> 1307 bytes .../node_modules/JSV/jsdoc-toolkit/jsrun.jar | Bin 0 -> 1303 bytes .../node_modules/JSV/jsdoc-toolkit/jsrun.sh | 52 + .../templates/bluelabel/.npmignore | 1 + .../templates/bluelabel/allclasses.tmpl | 16 + .../templates/bluelabel/allfiles.tmpl | 72 + .../templates/bluelabel/class.tmpl | 675 ++++ .../templates/bluelabel/index.tmpl | 50 + .../templates/bluelabel/publish.js | 215 ++ .../templates/bluelabel/static/index.html | 19 + .../bluelabel/stylesheets/blue_label.gif | Bin 0 -> 730 bytes .../bluelabel/stylesheets/body_noise.gif | Bin 0 -> 869 bytes .../stylesheets/body_wrapper_noise.gif | Bin 0 -> 1148 bytes .../bluelabel/stylesheets/box_noise.gif | Bin 0 -> 297 bytes .../stylesheets/box_wrapper_noise.gif | Bin 0 -> 101 bytes .../bluelabel/stylesheets/default.css | 237 ++ .../bluelabel/stylesheets/title_bullet.gif | Bin 0 -> 353 bytes .../templates/bluelabel/symbol.tmpl | 35 + .../templates/codeview/allclasses.tmpl | 15 + .../templates/codeview/allfiles.tmpl | 76 + .../templates/codeview/class.tmpl | 713 +++++ .../templates/codeview/css/all.css | 340 ++ .../css/fonts/mplus-1m-bold-webfont.eot | Bin 0 -> 18590 bytes .../css/fonts/mplus-1m-bold-webfont.svg | 134 + .../css/fonts/mplus-1m-bold-webfont.ttf | Bin 0 -> 18428 bytes .../css/fonts/mplus-1m-bold-webfont.woff | Bin 0 -> 11772 bytes .../css/fonts/mplus-1m-regular-webfont.eot | Bin 0 -> 19518 bytes .../css/fonts/mplus-1m-regular-webfont.svg | 134 + .../css/fonts/mplus-1m-regular-webfont.ttf | Bin 0 -> 19344 bytes .../css/fonts/mplus-1m-regular-webfont.woff | Bin 0 -> 12304 bytes .../codeview/css/fonts/stylesheet.css | 44 + .../templates/codeview/css/handheld.css | 207 ++ .../templates/codeview/css/screen.css | 280 ++ .../templates/codeview/index.tmpl | 54 + .../wbos.csstools.mediaqueryfallback.js | 185 ++ .../templates/codeview/publish.js | 228 ++ .../templates/codeview/static/header.html | 2 + .../templates/codeview/static/index.html | 19 + .../templates/codeview/symbol.tmpl | 35 + .../templates/jsdoc/allclasses.tmpl | 17 + .../templates/jsdoc/allfiles.tmpl | 56 + .../jsdoc-toolkit/templates/jsdoc/class.tmpl | 649 ++++ .../jsdoc-toolkit/templates/jsdoc/index.tmpl | 39 + .../jsdoc-toolkit/templates/jsdoc/publish.js | 201 ++ .../templates/jsdoc/static/default.css | 162 + .../templates/jsdoc/static/header.html | 2 + .../templates/jsdoc/static/index.html | 19 + .../jsdoc-toolkit/templates/jsdoc/symbol.tmpl | 35 + .../node_modules/JSV/lib/environments.js | 3 + .../JSV/lib/json-schema-draft-01.js | 953 ++++++ .../JSV/lib/json-schema-draft-02.js | 982 ++++++ .../JSV/lib/json-schema-draft-03.js | 1552 ++++++++++ html/RentForCamp/node_modules/JSV/lib/jsv.js | 1497 +++++++++ .../node_modules/JSV/lib/uri/schemes/urn.js | 86 + .../node_modules/JSV/lib/uri/uri.js | 710 +++++ .../RentForCamp/node_modules/JSV/package.json | 98 + .../json-schema-draft-01/empty-schema.json | 1 + .../json-schema-draft-01/hyper-schema.json | 68 + .../json-schema-draft-01/json-ref.json | 26 + .../schemas/json-schema-draft-01/links.json | 33 + .../schemas/json-schema-draft-01/schema.json | 155 + .../json-schema-draft-02/empty-schema.json | 1 + .../json-schema-draft-02/hyper-schema.json | 68 + .../json-schema-draft-02/json-ref.json | 26 + .../schemas/json-schema-draft-02/links.json | 35 + .../schemas/json-schema-draft-02/schema.json | 165 + .../json-schema-draft-03/hyper-schema.json | 60 + .../json-schema-draft-03/json-ref.json | 26 + .../schemas/json-schema-draft-03/links.json | 32 + .../schemas/json-schema-draft-03/schema.json | 173 ++ .../node_modules/JSV/tests/index.html | 21 + .../node_modules/JSV/tests/index3.html | 20 + .../node_modules/JSV/tests/index3b.html | 20 + .../node_modules/JSV/tests/qunit.css | 118 + .../node_modules/JSV/tests/qunit.js | 1042 +++++++ .../node_modules/JSV/tests/tests.js | 452 +++ .../node_modules/JSV/tests/tests3.js | 567 ++++ .../node_modules/JSV/tests/tests3b.js | 211 ++ .../node_modules/ansi-styles/ansi-styles.js | 38 + .../node_modules/ansi-styles/package.json | 109 + .../node_modules/ansi-styles/readme.md | 65 + .../node_modules/bignumber.js/LICENCE | 23 + .../node_modules/bignumber.js/README.md | 415 +++ .../node_modules/bignumber.js/bignumber.d.ts | 1295 ++++++++ .../node_modules/bignumber.js/bignumber.js | 2734 +++++++++++++++++ .../bignumber.js/bignumber.js.map | 1 + .../bignumber.js/bignumber.min.js | 3 + .../node_modules/bignumber.js/bignumber.mjs | 2717 ++++++++++++++++ .../node_modules/bignumber.js/bower.json | 36 + .../node_modules/bignumber.js/doc/API.html | 2197 +++++++++++++ .../node_modules/bignumber.js/package.json | 104 + html/RentForCamp/node_modules/chalk/index.js | 63 + .../node_modules/chalk/package.json | 111 + html/RentForCamp/node_modules/chalk/readme.md | 158 + .../node_modules/dateformat/LICENSE | 20 + .../node_modules/dateformat/Readme.md | 162 + .../node_modules/dateformat/lib/dateformat.js | 229 ++ .../node_modules/dateformat/package.json | 126 + .../RentForCamp/node_modules/eyespect/LICENSE | 20 + .../node_modules/eyespect/Makefile | 4 + .../node_modules/eyespect/README.md | 73 + .../node_modules/eyespect/lib/eyes.js | 235 ++ .../node_modules/eyespect/package.json | 101 + .../node_modules/eyespect/test/eyes-test.js | 56 + .../node_modules/has-color/index.js | 32 + .../node_modules/has-color/package.json | 105 + .../node_modules/has-color/readme.md | 30 + .../node_modules/isarray/.npmignore | 1 + .../node_modules/isarray/.travis.yml | 4 + .../RentForCamp/node_modules/isarray/Makefile | 6 + .../node_modules/isarray/README.md | 60 + .../node_modules/isarray/component.json | 19 + .../RentForCamp/node_modules/isarray/index.js | 5 + .../node_modules/isarray/package.json | 104 + html/RentForCamp/node_modules/isarray/test.js | 20 + .../node_modules/jsonlint/Makefile | 17 + .../node_modules/jsonlint/README.md | 64 + .../node_modules/jsonlint/bower.json | 16 + .../node_modules/jsonlint/lib/cli.js | 179 ++ .../node_modules/jsonlint/lib/formatter.js | 92 + .../node_modules/jsonlint/lib/jsonlint.js | 432 +++ .../node_modules/jsonlint/package.json | 108 + .../node_modules/jsonlint/scripts/bundle.js | 8 + .../node_modules/jsonlint/src/jsonlint.l | 24 + .../node_modules/jsonlint/src/jsonlint.y | 86 + .../node_modules/jsonlint/test/all-tests.js | 232 ++ .../node_modules/jsonlint/test/fails/10.json | 1 + .../node_modules/jsonlint/test/fails/11.json | 1 + .../node_modules/jsonlint/test/fails/12.json | 1 + .../node_modules/jsonlint/test/fails/13.json | 1 + .../node_modules/jsonlint/test/fails/14.json | 1 + .../node_modules/jsonlint/test/fails/15.json | 1 + .../node_modules/jsonlint/test/fails/16.json | 1 + .../node_modules/jsonlint/test/fails/17.json | 1 + .../node_modules/jsonlint/test/fails/19.json | 1 + .../node_modules/jsonlint/test/fails/2.json | 1 + .../node_modules/jsonlint/test/fails/20.json | 1 + .../node_modules/jsonlint/test/fails/21.json | 1 + .../node_modules/jsonlint/test/fails/22.json | 1 + .../node_modules/jsonlint/test/fails/23.json | 1 + .../node_modules/jsonlint/test/fails/24.json | 1 + .../node_modules/jsonlint/test/fails/25.json | 1 + .../node_modules/jsonlint/test/fails/26.json | 1 + .../node_modules/jsonlint/test/fails/27.json | 2 + .../node_modules/jsonlint/test/fails/28.json | 2 + .../node_modules/jsonlint/test/fails/29.json | 1 + .../node_modules/jsonlint/test/fails/3.json | 1 + .../node_modules/jsonlint/test/fails/30.json | 1 + .../node_modules/jsonlint/test/fails/31.json | 1 + .../node_modules/jsonlint/test/fails/32.json | 1 + .../node_modules/jsonlint/test/fails/33.json | 1 + .../node_modules/jsonlint/test/fails/34.json | 1 + .../node_modules/jsonlint/test/fails/4.json | 1 + .../node_modules/jsonlint/test/fails/5.json | 1 + .../node_modules/jsonlint/test/fails/6.json | 1 + .../node_modules/jsonlint/test/fails/7.json | 1 + .../node_modules/jsonlint/test/fails/8.json | 1 + .../node_modules/jsonlint/test/fails/9.json | 1 + .../node_modules/jsonlint/test/passes/1.json | 58 + .../node_modules/jsonlint/test/passes/2.json | 1 + .../node_modules/jsonlint/test/passes/3.json | 6 + .../node_modules/jsonlint/web/json2.js | 334 ++ .../node_modules/jsonlint/web/jsonlint.html | 59 + .../node_modules/jsonlint/web/jsonlint.js | 1 + .../RentForCamp/node_modules/mysql/Changes.md | 536 ++++ html/RentForCamp/node_modules/mysql/License | 19 + html/RentForCamp/node_modules/mysql/Readme.md | 1504 +++++++++ html/RentForCamp/node_modules/mysql/index.js | 161 + .../node_modules/mysql/lib/Connection.js | 505 +++ .../mysql/lib/ConnectionConfig.js | 201 ++ .../node_modules/mysql/lib/Pool.js | 294 ++ .../node_modules/mysql/lib/PoolCluster.js | 288 ++ .../node_modules/mysql/lib/PoolConfig.js | 32 + .../node_modules/mysql/lib/PoolConnection.js | 65 + .../node_modules/mysql/lib/PoolNamespace.js | 136 + .../node_modules/mysql/lib/PoolSelector.js | 31 + .../node_modules/mysql/lib/protocol/Auth.js | 152 + .../mysql/lib/protocol/BufferList.js | 25 + .../mysql/lib/protocol/PacketHeader.js | 5 + .../mysql/lib/protocol/PacketWriter.js | 211 ++ .../node_modules/mysql/lib/protocol/Parser.js | 476 +++ .../mysql/lib/protocol/Protocol.js | 457 +++ .../mysql/lib/protocol/ResultSet.js | 7 + .../mysql/lib/protocol/SqlString.js | 1 + .../node_modules/mysql/lib/protocol/Timer.js | 33 + .../mysql/lib/protocol/constants/charsets.js | 262 ++ .../mysql/lib/protocol/constants/client.js | 26 + .../mysql/lib/protocol/constants/errors.js | 2416 +++++++++++++++ .../lib/protocol/constants/field_flags.js | 18 + .../lib/protocol/constants/server_status.js | 39 + .../lib/protocol/constants/ssl_profiles.js | 740 +++++ .../mysql/lib/protocol/constants/types.js | 33 + .../packets/AuthSwitchRequestPacket.js | 20 + .../packets/AuthSwitchResponsePacket.js | 14 + .../packets/ClientAuthenticationPacket.js | 54 + .../protocol/packets/ComChangeUserPacket.js | 26 + .../lib/protocol/packets/ComPingPacket.js | 12 + .../lib/protocol/packets/ComQueryPacket.js | 15 + .../lib/protocol/packets/ComQuitPacket.js | 12 + .../protocol/packets/ComStatisticsPacket.js | 12 + .../mysql/lib/protocol/packets/EmptyPacket.js | 6 + .../mysql/lib/protocol/packets/EofPacket.js | 25 + .../mysql/lib/protocol/packets/ErrorPacket.js | 35 + .../mysql/lib/protocol/packets/Field.js | 34 + .../mysql/lib/protocol/packets/FieldPacket.js | 93 + .../packets/HandshakeInitializationPacket.js | 103 + .../protocol/packets/LocalDataFilePacket.js | 15 + .../mysql/lib/protocol/packets/OkPacket.js | 44 + .../lib/protocol/packets/OldPasswordPacket.js | 15 + .../protocol/packets/ResultSetHeaderPacket.js | 25 + .../lib/protocol/packets/RowDataPacket.js | 133 + .../lib/protocol/packets/SSLRequestPacket.js | 27 + .../lib/protocol/packets/StatisticsPacket.js | 20 + .../protocol/packets/UseOldPasswordPacket.js | 14 + .../mysql/lib/protocol/packets/index.js | 22 + .../lib/protocol/sequences/ChangeUser.js | 41 + .../mysql/lib/protocol/sequences/Handshake.js | 127 + .../mysql/lib/protocol/sequences/Ping.js | 19 + .../mysql/lib/protocol/sequences/Query.js | 218 ++ .../mysql/lib/protocol/sequences/Quit.js | 40 + .../mysql/lib/protocol/sequences/Sequence.js | 125 + .../lib/protocol/sequences/Statistics.js | 30 + .../mysql/lib/protocol/sequences/index.js | 7 + .../node_modules/mysql/package.json | 150 + .../node_modules/nomnom/.npmignore | 1 + html/RentForCamp/node_modules/nomnom/LICENSE | 20 + .../RentForCamp/node_modules/nomnom/README.md | 325 ++ .../RentForCamp/node_modules/nomnom/nomnom.js | 584 ++++ .../node_modules/nomnom/num-vals-fix.diff | 31 + .../node_modules/nomnom/package.json | 90 + html/RentForCamp/node_modules/nomnom/test.js | 23 + .../node_modules/nomnom/test/callback.js | 33 + .../node_modules/nomnom/test/commands.js | 120 + .../node_modules/nomnom/test/expected.js | 60 + .../node_modules/nomnom/test/matching.js | 70 + .../node_modules/nomnom/test/option.js | 44 + .../node_modules/nomnom/test/transform.js | 65 + .../node_modules/nomnom/test/usage.js | 121 + .../node_modules/nomnom/test/values.js | 75 + .../process-nextick-args/index.js | 44 + .../process-nextick-args/license.md | 19 + .../process-nextick-args/package.json | 87 + .../process-nextick-args/readme.md | 18 + .../node_modules/readable-stream/.travis.yml | 55 + .../readable-stream/CONTRIBUTING.md | 38 + .../readable-stream/GOVERNANCE.md | 136 + .../node_modules/readable-stream/LICENSE | 47 + .../node_modules/readable-stream/README.md | 58 + .../doc/wg-meetings/2015-01-30.md | 60 + .../readable-stream/duplex-browser.js | 1 + .../node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 131 + .../lib/_stream_passthrough.js | 47 + .../readable-stream/lib/_stream_readable.js | 1019 ++++++ .../readable-stream/lib/_stream_transform.js | 214 ++ .../readable-stream/lib/_stream_writable.js | 687 +++++ .../lib/internal/streams/BufferList.js | 79 + .../lib/internal/streams/destroy.js | 74 + .../lib/internal/streams/stream-browser.js | 1 + .../lib/internal/streams/stream.js | 1 + .../node_modules/readable-stream/package.json | 140 + .../readable-stream/passthrough.js | 1 + .../readable-stream/readable-browser.js | 7 + .../node_modules/readable-stream/readable.js | 19 + .../node_modules/readable-stream/transform.js | 1 + .../readable-stream/writable-browser.js | 1 + .../node_modules/readable-stream/writable.js | 8 + .../node_modules/sqlstring/HISTORY.md | 43 + .../node_modules/sqlstring/LICENSE | 19 + .../node_modules/sqlstring/README.md | 206 ++ .../node_modules/sqlstring/index.js | 1 + .../node_modules/sqlstring/lib/SqlString.js | 237 ++ .../node_modules/sqlstring/package.json | 144 + .../node_modules/string_decoder/.travis.yml | 50 + .../node_modules/string_decoder/LICENSE | 48 + .../node_modules/string_decoder/README.md | 47 + .../string_decoder/lib/string_decoder.js | 296 ++ .../node_modules/string_decoder/package.json | 114 + .../node_modules/strip-ansi/cli.js | 27 + .../node_modules/strip-ansi/index.js | 4 + .../node_modules/strip-ansi/package.json | 115 + .../node_modules/strip-ansi/readme.md | 46 + .../node_modules/underscore/LICENSE | 23 + .../node_modules/underscore/README.md | 22 + .../node_modules/underscore/package.json | 101 + .../node_modules/underscore/underscore-min.js | 6 + .../node_modules/underscore/underscore.js | 1343 ++++++++ .../node_modules/util-deprecate/History.md | 16 + .../node_modules/util-deprecate/LICENSE | 24 + .../node_modules/util-deprecate/README.md | 53 + .../node_modules/util-deprecate/browser.js | 67 + .../node_modules/util-deprecate/node.js | 6 + .../node_modules/util-deprecate/package.json | 89 + html/RentForCamp/npm-debug.log | 45 - html/RentForCamp/package.json | 4 + html/RentForCamp/routes/index.js | 2 +- 416 files changed, 62069 insertions(+), 46 deletions(-) create mode 100644 html/RentForCamp/app/database.js create mode 100644 html/RentForCamp/app/helper.js create mode 100644 html/RentForCamp/app/logging.js create mode 120000 html/RentForCamp/node_modules/.bin/jsonlint create mode 120000 html/RentForCamp/node_modules/.bin/strip-ansi create mode 100644 html/RentForCamp/node_modules/JSV/.project create mode 100644 html/RentForCamp/node_modules/JSV/CHANGELOG.md create mode 100644 html/RentForCamp/node_modules/JSV/README.md create mode 100644 html/RentForCamp/node_modules/JSV/docs/files.html create mode 100644 html/RentForCamp/node_modules/JSV/docs/index.html create mode 100644 html/RentForCamp/node_modules/JSV/docs/symbols/Environment.html create mode 100644 html/RentForCamp/node_modules/JSV/docs/symbols/Error.html create mode 100644 html/RentForCamp/node_modules/JSV/docs/symbols/InitializationError.html create mode 100644 html/RentForCamp/node_modules/JSV/docs/symbols/JSONInstance.html create mode 100644 html/RentForCamp/node_modules/JSV/docs/symbols/JSONSchema.html create mode 100644 html/RentForCamp/node_modules/JSV/docs/symbols/JSV.html create mode 100644 html/RentForCamp/node_modules/JSV/docs/symbols/Report.html create mode 100644 html/RentForCamp/node_modules/JSV/docs/symbols/ValidationError.html create mode 100644 html/RentForCamp/node_modules/JSV/docs/symbols/_global_.html create mode 100644 html/RentForCamp/node_modules/JSV/docs/symbols/src/jsv.js.html create mode 100644 html/RentForCamp/node_modules/JSV/examples/index.html create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/README.txt create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Chain.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Dumper.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Hash.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Link.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Namespace.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Opt.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Reflection.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/String.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Testrun.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/FOODOC.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocComment.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocTag.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Lang.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Parser.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Symbol.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TextStream.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Token.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Util.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Walker.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/main.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/commentSrcJson.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/frameworkPrototype.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/functionCall.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/publishSrcHilite.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/symbolLink.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/tagParamConfig.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/tagSynonyms.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/run.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/t/TestDoc.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/t/runner.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/addon.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/anon_inner.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/augments.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/augments2.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/borrows.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/borrows2.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/config.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/constructs.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/encoding.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/encoding_other.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/event.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/exports.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/functions_anon.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/functions_nested.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/global.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/globals.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/ignore.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/inner.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/jsdoc_test.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/lend.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof2.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof3.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof_constructor.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/module.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/multi_methods.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/name.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/namespace_nested.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/nocode.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/oblit_anon.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/overview.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/param_inline.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/params_optional.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_nested.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit_constructor.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/public.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/scripts/code.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/scripts/notcode.txt create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shared.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shared2.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shortcuts.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/static_this.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/synonyms.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/tosource.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/variable_redefine.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/changes.txt create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/conf/sample.conf create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/build.xml create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/build_1.4.xml create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/classes/js.jar create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/src/JsDebugRun.java create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/src/JsRun.java create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/jsdebug.jar create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/jsrun.jar create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/jsrun.sh create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/.npmignore create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/allclasses.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/allfiles.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/class.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/index.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/publish.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/static/index.html create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/blue_label.gif create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/body_noise.gif create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/body_wrapper_noise.gif create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/box_noise.gif create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/box_wrapper_noise.gif create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/default.css create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/title_bullet.gif create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/symbol.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/allclasses.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/allfiles.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/class.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/all.css create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.eot create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.svg create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.ttf create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.woff create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-regular-webfont.eot create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-regular-webfont.svg create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-regular-webfont.ttf create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-regular-webfont.woff create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/stylesheet.css create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/handheld.css create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/screen.css create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/index.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/javascript/wbos.csstools.mediaqueryfallback.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/publish.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/static/header.html create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/static/index.html create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/symbol.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/class.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/index.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/publish.js create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/default.css create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/header.html create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/index.html create mode 100644 html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/symbol.tmpl create mode 100644 html/RentForCamp/node_modules/JSV/lib/environments.js create mode 100644 html/RentForCamp/node_modules/JSV/lib/json-schema-draft-01.js create mode 100644 html/RentForCamp/node_modules/JSV/lib/json-schema-draft-02.js create mode 100644 html/RentForCamp/node_modules/JSV/lib/json-schema-draft-03.js create mode 100644 html/RentForCamp/node_modules/JSV/lib/jsv.js create mode 100644 html/RentForCamp/node_modules/JSV/lib/uri/schemes/urn.js create mode 100644 html/RentForCamp/node_modules/JSV/lib/uri/uri.js create mode 100644 html/RentForCamp/node_modules/JSV/package.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/empty-schema.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/hyper-schema.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/json-ref.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/links.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/schema.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/empty-schema.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/hyper-schema.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/json-ref.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/links.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/schema.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/hyper-schema.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/json-ref.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/links.json create mode 100644 html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/schema.json create mode 100644 html/RentForCamp/node_modules/JSV/tests/index.html create mode 100644 html/RentForCamp/node_modules/JSV/tests/index3.html create mode 100644 html/RentForCamp/node_modules/JSV/tests/index3b.html create mode 100644 html/RentForCamp/node_modules/JSV/tests/qunit.css create mode 100644 html/RentForCamp/node_modules/JSV/tests/qunit.js create mode 100644 html/RentForCamp/node_modules/JSV/tests/tests.js create mode 100644 html/RentForCamp/node_modules/JSV/tests/tests3.js create mode 100644 html/RentForCamp/node_modules/JSV/tests/tests3b.js create mode 100644 html/RentForCamp/node_modules/ansi-styles/ansi-styles.js create mode 100644 html/RentForCamp/node_modules/ansi-styles/package.json create mode 100644 html/RentForCamp/node_modules/ansi-styles/readme.md create mode 100644 html/RentForCamp/node_modules/bignumber.js/LICENCE create mode 100644 html/RentForCamp/node_modules/bignumber.js/README.md create mode 100644 html/RentForCamp/node_modules/bignumber.js/bignumber.d.ts create mode 100644 html/RentForCamp/node_modules/bignumber.js/bignumber.js create mode 100644 html/RentForCamp/node_modules/bignumber.js/bignumber.js.map create mode 100644 html/RentForCamp/node_modules/bignumber.js/bignumber.min.js create mode 100644 html/RentForCamp/node_modules/bignumber.js/bignumber.mjs create mode 100644 html/RentForCamp/node_modules/bignumber.js/bower.json create mode 100644 html/RentForCamp/node_modules/bignumber.js/doc/API.html create mode 100644 html/RentForCamp/node_modules/bignumber.js/package.json create mode 100644 html/RentForCamp/node_modules/chalk/index.js create mode 100644 html/RentForCamp/node_modules/chalk/package.json create mode 100644 html/RentForCamp/node_modules/chalk/readme.md create mode 100644 html/RentForCamp/node_modules/dateformat/LICENSE create mode 100644 html/RentForCamp/node_modules/dateformat/Readme.md create mode 100644 html/RentForCamp/node_modules/dateformat/lib/dateformat.js create mode 100644 html/RentForCamp/node_modules/dateformat/package.json create mode 100644 html/RentForCamp/node_modules/eyespect/LICENSE create mode 100644 html/RentForCamp/node_modules/eyespect/Makefile create mode 100644 html/RentForCamp/node_modules/eyespect/README.md create mode 100644 html/RentForCamp/node_modules/eyespect/lib/eyes.js create mode 100644 html/RentForCamp/node_modules/eyespect/package.json create mode 100644 html/RentForCamp/node_modules/eyespect/test/eyes-test.js create mode 100644 html/RentForCamp/node_modules/has-color/index.js create mode 100644 html/RentForCamp/node_modules/has-color/package.json create mode 100644 html/RentForCamp/node_modules/has-color/readme.md create mode 100644 html/RentForCamp/node_modules/isarray/.npmignore create mode 100644 html/RentForCamp/node_modules/isarray/.travis.yml create mode 100644 html/RentForCamp/node_modules/isarray/Makefile create mode 100644 html/RentForCamp/node_modules/isarray/README.md create mode 100644 html/RentForCamp/node_modules/isarray/component.json create mode 100644 html/RentForCamp/node_modules/isarray/index.js create mode 100644 html/RentForCamp/node_modules/isarray/package.json create mode 100644 html/RentForCamp/node_modules/isarray/test.js create mode 100644 html/RentForCamp/node_modules/jsonlint/Makefile create mode 100644 html/RentForCamp/node_modules/jsonlint/README.md create mode 100644 html/RentForCamp/node_modules/jsonlint/bower.json create mode 100755 html/RentForCamp/node_modules/jsonlint/lib/cli.js create mode 100644 html/RentForCamp/node_modules/jsonlint/lib/formatter.js create mode 100644 html/RentForCamp/node_modules/jsonlint/lib/jsonlint.js create mode 100644 html/RentForCamp/node_modules/jsonlint/package.json create mode 100644 html/RentForCamp/node_modules/jsonlint/scripts/bundle.js create mode 100644 html/RentForCamp/node_modules/jsonlint/src/jsonlint.l create mode 100644 html/RentForCamp/node_modules/jsonlint/src/jsonlint.y create mode 100644 html/RentForCamp/node_modules/jsonlint/test/all-tests.js create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/10.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/11.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/12.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/13.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/14.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/15.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/16.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/17.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/19.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/2.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/20.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/21.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/22.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/23.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/24.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/25.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/26.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/27.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/28.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/29.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/3.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/30.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/31.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/32.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/33.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/34.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/4.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/5.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/6.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/7.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/8.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/fails/9.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/passes/1.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/passes/2.json create mode 100644 html/RentForCamp/node_modules/jsonlint/test/passes/3.json create mode 100644 html/RentForCamp/node_modules/jsonlint/web/json2.js create mode 100644 html/RentForCamp/node_modules/jsonlint/web/jsonlint.html create mode 100644 html/RentForCamp/node_modules/jsonlint/web/jsonlint.js create mode 100644 html/RentForCamp/node_modules/mysql/Changes.md create mode 100644 html/RentForCamp/node_modules/mysql/License create mode 100644 html/RentForCamp/node_modules/mysql/Readme.md create mode 100644 html/RentForCamp/node_modules/mysql/index.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/Connection.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/ConnectionConfig.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/Pool.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/PoolCluster.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/PoolConfig.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/PoolConnection.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/PoolNamespace.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/PoolSelector.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/Auth.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/BufferList.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/PacketHeader.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/PacketWriter.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/Parser.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/Protocol.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/ResultSet.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/SqlString.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/Timer.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/constants/charsets.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/constants/client.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/constants/errors.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/constants/field_flags.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/constants/server_status.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/constants/ssl_profiles.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/constants/types.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/AuthSwitchRequestPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/AuthSwitchResponsePacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/ClientAuthenticationPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComChangeUserPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComPingPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComQueryPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComQuitPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComStatisticsPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/EmptyPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/EofPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/ErrorPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/Field.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/FieldPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/HandshakeInitializationPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/LocalDataFilePacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/OkPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/OldPasswordPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/ResultSetHeaderPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/RowDataPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/SSLRequestPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/StatisticsPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/UseOldPasswordPacket.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/packets/index.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/sequences/ChangeUser.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Handshake.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Ping.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Query.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Quit.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Sequence.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Statistics.js create mode 100644 html/RentForCamp/node_modules/mysql/lib/protocol/sequences/index.js create mode 100644 html/RentForCamp/node_modules/mysql/package.json create mode 100644 html/RentForCamp/node_modules/nomnom/.npmignore create mode 100644 html/RentForCamp/node_modules/nomnom/LICENSE create mode 100644 html/RentForCamp/node_modules/nomnom/README.md create mode 100644 html/RentForCamp/node_modules/nomnom/nomnom.js create mode 100644 html/RentForCamp/node_modules/nomnom/num-vals-fix.diff create mode 100644 html/RentForCamp/node_modules/nomnom/package.json create mode 100644 html/RentForCamp/node_modules/nomnom/test.js create mode 100644 html/RentForCamp/node_modules/nomnom/test/callback.js create mode 100644 html/RentForCamp/node_modules/nomnom/test/commands.js create mode 100644 html/RentForCamp/node_modules/nomnom/test/expected.js create mode 100644 html/RentForCamp/node_modules/nomnom/test/matching.js create mode 100644 html/RentForCamp/node_modules/nomnom/test/option.js create mode 100644 html/RentForCamp/node_modules/nomnom/test/transform.js create mode 100644 html/RentForCamp/node_modules/nomnom/test/usage.js create mode 100644 html/RentForCamp/node_modules/nomnom/test/values.js create mode 100644 html/RentForCamp/node_modules/process-nextick-args/index.js create mode 100644 html/RentForCamp/node_modules/process-nextick-args/license.md create mode 100644 html/RentForCamp/node_modules/process-nextick-args/package.json create mode 100644 html/RentForCamp/node_modules/process-nextick-args/readme.md create mode 100644 html/RentForCamp/node_modules/readable-stream/.travis.yml create mode 100644 html/RentForCamp/node_modules/readable-stream/CONTRIBUTING.md create mode 100644 html/RentForCamp/node_modules/readable-stream/GOVERNANCE.md create mode 100644 html/RentForCamp/node_modules/readable-stream/LICENSE create mode 100644 html/RentForCamp/node_modules/readable-stream/README.md create mode 100644 html/RentForCamp/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md create mode 100644 html/RentForCamp/node_modules/readable-stream/duplex-browser.js create mode 100644 html/RentForCamp/node_modules/readable-stream/duplex.js create mode 100644 html/RentForCamp/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 html/RentForCamp/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 html/RentForCamp/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 html/RentForCamp/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 html/RentForCamp/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 html/RentForCamp/node_modules/readable-stream/lib/internal/streams/BufferList.js create mode 100644 html/RentForCamp/node_modules/readable-stream/lib/internal/streams/destroy.js create mode 100644 html/RentForCamp/node_modules/readable-stream/lib/internal/streams/stream-browser.js create mode 100644 html/RentForCamp/node_modules/readable-stream/lib/internal/streams/stream.js create mode 100644 html/RentForCamp/node_modules/readable-stream/package.json create mode 100644 html/RentForCamp/node_modules/readable-stream/passthrough.js create mode 100644 html/RentForCamp/node_modules/readable-stream/readable-browser.js create mode 100644 html/RentForCamp/node_modules/readable-stream/readable.js create mode 100644 html/RentForCamp/node_modules/readable-stream/transform.js create mode 100644 html/RentForCamp/node_modules/readable-stream/writable-browser.js create mode 100644 html/RentForCamp/node_modules/readable-stream/writable.js create mode 100644 html/RentForCamp/node_modules/sqlstring/HISTORY.md create mode 100644 html/RentForCamp/node_modules/sqlstring/LICENSE create mode 100644 html/RentForCamp/node_modules/sqlstring/README.md create mode 100644 html/RentForCamp/node_modules/sqlstring/index.js create mode 100644 html/RentForCamp/node_modules/sqlstring/lib/SqlString.js create mode 100644 html/RentForCamp/node_modules/sqlstring/package.json create mode 100644 html/RentForCamp/node_modules/string_decoder/.travis.yml create mode 100644 html/RentForCamp/node_modules/string_decoder/LICENSE create mode 100644 html/RentForCamp/node_modules/string_decoder/README.md create mode 100644 html/RentForCamp/node_modules/string_decoder/lib/string_decoder.js create mode 100644 html/RentForCamp/node_modules/string_decoder/package.json create mode 100755 html/RentForCamp/node_modules/strip-ansi/cli.js create mode 100644 html/RentForCamp/node_modules/strip-ansi/index.js create mode 100644 html/RentForCamp/node_modules/strip-ansi/package.json create mode 100644 html/RentForCamp/node_modules/strip-ansi/readme.md create mode 100644 html/RentForCamp/node_modules/underscore/LICENSE create mode 100644 html/RentForCamp/node_modules/underscore/README.md create mode 100644 html/RentForCamp/node_modules/underscore/package.json create mode 100644 html/RentForCamp/node_modules/underscore/underscore-min.js create mode 100644 html/RentForCamp/node_modules/underscore/underscore.js create mode 100644 html/RentForCamp/node_modules/util-deprecate/History.md create mode 100644 html/RentForCamp/node_modules/util-deprecate/LICENSE create mode 100644 html/RentForCamp/node_modules/util-deprecate/README.md create mode 100644 html/RentForCamp/node_modules/util-deprecate/browser.js create mode 100644 html/RentForCamp/node_modules/util-deprecate/node.js create mode 100644 html/RentForCamp/node_modules/util-deprecate/package.json delete mode 100644 html/RentForCamp/npm-debug.log diff --git a/html/RentForCamp/app.js b/html/RentForCamp/app.js index 6856e02..acee97d 100644 --- a/html/RentForCamp/app.js +++ b/html/RentForCamp/app.js @@ -7,6 +7,10 @@ var session = require('express-session'); var helmet = require('helmet'); var logger = require('morgan'); +const Log = require('./app/logging'); +var MainConf = require('./config.json'); +var DB = require('./app/database'); + var indexRouter = require('./routes/index'); var app = express(); @@ -24,6 +28,10 @@ app.use(helmet()); app.use(lessMiddleware(path.join(__dirname, 'public'))); app.use(express.static(path.join(__dirname, 'public'))); +app.set('LOG', Log); +app.set('CONF', MainConf); +app.set('DB', DB.init(app)); + app.use(session({ secret: 'RentForCamp.s3Cur3', name: 'sessionId', diff --git a/html/RentForCamp/app/database.js b/html/RentForCamp/app/database.js new file mode 100644 index 0000000..ddcae84 --- /dev/null +++ b/html/RentForCamp/app/database.js @@ -0,0 +1,38 @@ +var mysql = require('mysql'); + +var app = null +var pool = null +const connectionLimit = 66 + + +exports.init = function(express) { + app = express + + app.get('LOG').log('Database | Server to connect to is ' + app.get('CONF').database.host + '') + + pool = mysql.createPool({ + connectionLimit : connectionLimit, + host : app.get('CONF').database.host, + port : app.get('CONF').database.port, + database : app.get('CONF').database.database, + user : app.get('CONF').database.user, + password : app.get('CONF').database.password, + waitForConnections : true + }); + + var connectionCountTemp = 0; + setInterval(function() { + const connectionCount = pool._freeConnections.length + if(connectionCount != connectionCountTemp) { + connectionCountTemp = connectionCount + + if(connectionCount > (connectionLimit / 2)) { + app.get('LOG').error(`Database | Connection count: ${connectionCount}`) + } else { + app.get('LOG').debug(`Connection count: ${connectionCount}`) + } + } + }, 1000) + + return this; +} \ No newline at end of file diff --git a/html/RentForCamp/app/helper.js b/html/RentForCamp/app/helper.js new file mode 100644 index 0000000..0df0372 --- /dev/null +++ b/html/RentForCamp/app/helper.js @@ -0,0 +1,139 @@ +/** + * File: app/helper.js + * Author: Gerrit Linnemann + * + * Swiss-knife. + */ + + +// load the things we need +var logger = require('./logging') +, jsonlint = require("jsonlint"); + + +exports.init = function(express) { + + return this; +} + +exports.timeSince = function(date) { + + var seconds = Math.floor((new Date() - date) / 1000); + + var interval = Math.floor(seconds / 31536000); + + if (interval > 1) { + return interval + " years"; + } + interval = Math.floor(seconds / 2592000); + if (interval > 1) { + return interval + " months"; + } + interval = Math.floor(seconds / 86400); + if (interval > 1) { + return interval + " days"; + } + interval = Math.floor(seconds / 3600); + if (interval > 1) { + return interval + " hours"; + } + interval = Math.floor(seconds / 60); + if (interval > 1) { + return interval + " minutes"; + } + return Math.floor(seconds) + " seconds"; +} + +exports.isOlderThanXMinutes = function(date, minutes) { + var seconds = Math.floor((new Date() - date) / 1000) + interval = seconds / 60 + + return interval > minutes +} + +exports.dayOfYear = function() { + var now = new Date(); + var start = new Date(now.getFullYear(), 0, 0); + var diff = now - start; + var oneDay = 1000 * 60 * 60 * 24; + var day = Math.floor(diff / oneDay); + + logger.trace('Helper | day of year: ' + day); + return day; +} + +exports.isJSON = function(jsonString) { + try { + return jsonlint.parse(jsonString) + } catch (e) { + if(logger.isDebug()) { + logger.error(e.message) + //logger.inspect('Error checking JSON', e) + } + } + + return false; +} + +exports.isArray = function(toCheck) { + return (Object.prototype.toString.call( toCheck ) === '[object Array]'); +} + +exports.isDefinedAndNotNull = function(toCheck) { + return ( + typeof toCheck !== 'undefined' && + toCheck != null + ); +} + +exports.getRandomInt = function(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +exports.bytesToSize = function(bytes, precision){ + var kilobyte = 1024; + var megabyte = kilobyte * 1024; + var gigabyte = megabyte * 1024; + var terabyte = gigabyte * 1024; + + if ((bytes >= 0) && (bytes < kilobyte)) { + return bytes + ' B'; + + } else if ((bytes >= kilobyte) && (bytes < megabyte)) { + return (bytes / kilobyte).toFixed(precision) + ' KB'; + + } else if ((bytes >= megabyte) && (bytes < gigabyte)) { + return (bytes / megabyte).toFixed(precision) + ' MB'; + + } else if ((bytes >= gigabyte) && (bytes < terabyte)) { + return (bytes / gigabyte).toFixed(precision) + ' GB'; + + } else if (bytes >= terabyte) { + return (bytes / terabyte).toFixed(precision) + ' TB'; + + } else { + return bytes + ' B'; + } +} + +/* private */ +function bytesToGB(bytes, precision) { + var kilobyte = 1024; + var megabyte = kilobyte * 1024; + var gigabyte = megabyte * 1024; + var terabyte = gigabyte * 1024; + + return (bytes / gigabyte).toFixed(precision); +} + +/* private */ +function bytesToMB(bytes, precision) { + var kilobyte = 1024; + var megabyte = kilobyte * 1024; + var gigabyte = megabyte * 1024; + var terabyte = gigabyte * 1024; + + return (bytes / megabyte).toFixed(precision); +} diff --git a/html/RentForCamp/app/logging.js b/html/RentForCamp/app/logging.js new file mode 100644 index 0000000..237172b --- /dev/null +++ b/html/RentForCamp/app/logging.js @@ -0,0 +1,105 @@ +/** + * File: app/logging.js + * Author: Gerrit Linnemann + * + * Logging with several log-level. + * - debug: Printed only in development-state. + * - log: Needed log-output. + * - error: Prints log in error-level. + * - inspect: Prints a message and details of an object. + */ + + +// load the things we need +var Conf = require('../config.json') +, Inspect = require('eyespect').inspector() +, Helper = require('./helper.js') +, DateFormat = require('dateformat'); + + +var eyeFriendly = (Conf.logging.mode === 'friendly'); +var isTrace = (Conf.logging.trace === 'yes'); +var isDebug = true; + + +exports.init = function(express) { + return this; +} + +exports.isEyeFriendlyMode = function() { + return eyeFriendly; +} + +exports.isTrace = function() { + return isTrace; +} + +exports.isDebug = function() { + return isDebug; +} + +exports.trace = function(msg) { + msg = DateFormat(new Date(), "yyyy-mm-dd h:MM:ss TT") + " TRACE " + msg; + if(isTrace) { + consoleOut(msg); + } +} + +exports.debug = function(msg) { + msg = DateFormat(new Date(), "yyyy-mm-dd h:MM:ss TT") + " DEBUG " + msg; + + if(isDebug) { + consoleOut(msg); + } +} + +exports.log = function(msg) { + msg = DateFormat(new Date(), "yyyy-mm-dd h:MM:ss TT") + " INFO " + msg; + consoleOut(msg); +} + +exports.error = function(msg) { + msg = DateFormat(new Date(), "yyyy-mm-dd h:MM:ss TT") + " ERROR " + msg; + consoleErr(msg); +} + +exports.inspect = function(msg, content) { + msg = DateFormat(new Date(), "yyyy-mm-dd h:MM:ss TT") + " INSPECT " + msg; + + if(eyeFriendly) { + Inspect(content, msg); + } else { + var msgOut = msg + (Helper.isDefinedAndNotNull(content) ? ": "+JSON.stringify(content) : ""); + consoleOut(msgOut); + } +} + + + +/* private */ +function consoleOut(msg, content) { + var hasContent = Helper.isDefinedAndNotNull(content); + + if(hasContent) { + var msgAddon = (hasContent ? " | " + content : ""); + if(Helper.isDefinedAndNotNull(msg)) { + console.log(msg + msgAddon); + } + } else if(Helper.isDefinedAndNotNull(msg)) { + console.log(msg); + } +} + +/* private */ +function consoleErr(msg, content) { + var hasContent = Helper.isDefinedAndNotNull(content); + + if(hasContent) { + var msgAddon = (hasContent ? " | " + content : ""); + if(Helper.isDefinedAndNotNull(msg)) { + console.error(msg + msgAddon); + } + } else if(Helper.isDefinedAndNotNull(msg)) { + console.error(msg); + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/.bin/jsonlint b/html/RentForCamp/node_modules/.bin/jsonlint new file mode 120000 index 0000000..aefbf4e --- /dev/null +++ b/html/RentForCamp/node_modules/.bin/jsonlint @@ -0,0 +1 @@ +../jsonlint/lib/cli.js \ No newline at end of file diff --git a/html/RentForCamp/node_modules/.bin/strip-ansi b/html/RentForCamp/node_modules/.bin/strip-ansi new file mode 120000 index 0000000..b65c9f8 --- /dev/null +++ b/html/RentForCamp/node_modules/.bin/strip-ansi @@ -0,0 +1 @@ +../strip-ansi/cli.js \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/.project b/html/RentForCamp/node_modules/JSV/.project new file mode 100644 index 0000000..75cc49c --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/.project @@ -0,0 +1,11 @@ + + + JSV + + + + + + + + diff --git a/html/RentForCamp/node_modules/JSV/CHANGELOG.md b/html/RentForCamp/node_modules/JSV/CHANGELOG.md new file mode 100644 index 0000000..427caa4 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/CHANGELOG.md @@ -0,0 +1,41 @@ +# Changelog + +## 4.0.2 (2012/07/11) + +* Replace "then" with correct "than" in all error messages. (Identified by stefanw) + +## 4.0.1 (2012/05/09) + +* Fixed bug with extended schemas that contain a "pattern" attribute. (Identified by DrDyne) + +## 4.0 (2011/08/23) + +* Added referencing to JSONSchema, allows for soft-linking to other schemas. +* Environment option "validateReferences" now validates references at validation time for any environment. +* Environment option "enforceReferences" will cause invalid references to throw an error at creation time for any environment. +* Fixed floating point errors with "divisibleBy" attribute. +* Fixed typo in JSV.clone. +* Fixed typo in draft-03 hyper-schema.json. +* Updated uri.js to latest version. +* Fixed bug with Report#addError. (Identified by cellog) +* ValidationError#details is now safe to stringify. +* Removed JSONSchema#createEmptySchema. All empty schemas created by Environment#createEmptySchema now have the same URI (urn:jsv:empty-schema#). +* Added example HTML page. + +## 3.5 (2011/03/07) + +* Links to unregistered schemas will now throw an error. This can be disabled by setting the environment option "validateReferences" to false. +* Environment#validate now catches errors (such as InitializationErrors) and adds them to it's returned report. +* Report#addError now accepts instance/schema URI strings. +* Fixed bug where empty schemas would not be registered. +* Added private method Environment#_checkForInvalidInstances, for testing the reliability of circular schemas. +* Fixed bug where schemas in the "disallow" attribute would not validate. (Identified by henchan) + +## 3.4 (2011/03/06) + +* Fixed bug with "id", "$ref", "$schema" attributes not resolving properly under the "http://json-schema.org/draft-03/schema#" schema. (Identified by dougtreder) +* Added dougtreder's referencing tests. + +## Older + +Older releases were not documented. See git commit history for more information. \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/README.md b/html/RentForCamp/node_modules/JSV/README.md new file mode 100644 index 0000000..839296b --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/README.md @@ -0,0 +1,211 @@ +JSV: JSON Schema Validator +========================== + +JSV is a JavaScript implementation of a extendable, fully compliant JSON Schema validator with the following features: + +* The fastest extendable JSON validator available! +* Complete implementation of all current JSON Schema draft revisions. +* Supports creating individual environments (sandboxes) that validate using a particular schema specification. +* Provides an intuitive API for creating new validating schema attributes, or whole new custom schema schemas. +* Supports `self`, `full` and `describedby` hyper links. +* Validates itself, and is bootstrapped from the JSON Schema schemas. +* Includes over 1100 unit tests for testing all parts of the specifications. +* Works in all ECMAScript 3 environments, including all web browsers and Node.js. +* Licensed under the FreeBSD License, a very open license. + +## It's a what? + +**JSON** (an acronym for **JavaScript Object Notation**) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of JavaScript/ECMA-262 3rd Edition. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages. (C, C++, C#, Java, JavaScript, Perl, Python, ...) These properties make JSON an ideal data-interchange language. \[[json.org](http://json.org)\] + +**JSON Schema** is a JSON media type for defining the structure of JSON data. JSON Schema provides a contract for what JSON data is required for a given application and how to interact with it. JSON Schema is intended to define validation, documentation, hyperlink navigation, and interaction control of JSON data. \[[draft-zyp-json-schema-02](http://tools.ietf.org/html/draft-zyp-json-schema-02)\] + +A **JSON validator** is a program that takes JSON data and, with a provided schema, will ensure that the provided JSON is structured in the way defined by the schema. This ensures that if validation has passed, the JSON instance is guaranteed to be in the expected format. It will also provide an explanation on why a particular instance failed validation. + +## Example + +Here's an example on how to validate some JSON with JSV: + + var JSV = require("./jsv").JSV; + var json = {}; + var schema = {"type" : "object"}; + var env = JSV.createEnvironment(); + var report = env.validate(json, schema); + + if (report.errors.length === 0) { + //JSON is valid against the schema + } + +Another example; for the following test: + + env.validate({ a : 1 }, { type : 'object', properties : { a : { type : 'string' }} }); + +The generated report would look like: + + { + errors : [ + { + message : "Instance is not a required type", + uri : "urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#/a", + schemaUri : "urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#/properties/a", + attribute : "type", + details : ["string"] + } + ], + validated : { + "urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#" : ["urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#"], + "urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#/a" : ["urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#/properties/a"], + //... + }, + instance : [JSONInstance object], + schema : [JSONSchema object], + schemaSchema : [JSONSchema object] + } + +## Environments & JSON Schema support + +There is no one way to validate JSON, just like there is no one way to validate XML. Even the JSON Schema specification has gone through several revisions which are not 100% backwards compatible with each other. To solve the issue of using numerous schemas already written to older specifications, JSV provides customizable environments to validate your JSON within. + +When creating an environment, you can optionally specify how you want that environment to behave. For example, this allows you to specify which version of the JSON Schema you would like the environment to behave like. JSV already provides the following environments: + +* `json-schema-draft-03` + + A complete implementation of the [third revision](http://tools.ietf.org/html/draft-zyp-json-schema-03) of the JSON Schema specification. This is the same as the second revision, except: + + * "optional" has been replaced by "required" + * "requires" has been replaced by "dependencies" + * "minimumCanEqual"/"maximumCanEqual" has been replaced by "exclusiveMinimum"/"exclusiveMaximum" + * "self"/"full"/"describedby" links have been moved to the core schema, and are provided by "id"/"$ref"/"$schema" + * Adds the attributes "patternSchema" and "additionalItems" + * Deprecates the attributes "root" and "alternate" + * Schemas are now versioned under the URIs "http://json-schema.org/draft-XX/", where XX is the draft number + + In addition to this, all schemas from the previous versions of the JSON Schema draft are included in this environment, and are backwards compatible (where possible) with it's previous version. + This backwards compatibility can be disabled with the environment option `strict` is set to `true`. + + This is currently the default environment. + +* `json-schema-draft-02` + + A complete implementation of the [second revision](http://tools.ietf.org/html/draft-zyp-json-schema-02) of the JSON Schema specification. This is the same as the first revision, except adds: + + * "targetSchema" attribute + * slash-delimited fragment identifiers, which is now the default behavior + +* `json-schema-draft-01` + + A complete implementation of the [first revision](http://tools.ietf.org/html/draft-zyp-json-schema-01) of the JSON Schema specification, which is exactly the same as the [original draft](http://tools.ietf.org/html/draft-zyp-json-schema-00). + + Users with JSON Schemas written for JSV < v2.1 should use this environment for it's dot-delimited fragment identifiers. + +Environments can also be customized and registered for multiple reuse. (See the section on *Extending Environments* below) + +## Validation API + +The following methods are used to validate JSON data: + +### JSV.createEnvironment(*environmentID?*) *->* *<Environment>* + +* *environmentID* *<String>* *(optional)* The ID of the environment to clone a new Environment from + +Creates an new environment that is a copy of the Environment registered with the provided `environmentID`. If no ID is provided, the latest registered JSON Schema is used as the template. + +See the above section on *Environments* for the default available Environment IDs. + +### *<Environment>*.validate(*json*, *schema*) *->* *<Report>* + +* *json* *<Any|JSONInstance>* The JSON data to validate +* *schema* *<Object|JSONInstance|JSONSchema>* The schema to validate the JSON with + +Validates both the schema and the JSON, and returns a report of the validation. + +### *<Report>*.errors *<Array>* + +An array of error objects from the validation process; each object represents a restriction check that failed. If the array is empty, the validation passed. + +The error objects have the following schema: + + { + "type" : "object", + "properties" : { + "message" : { + "description" : "A user-friendly error message about what failed to validate.", + "type" : "string" + }, + "uri" : { + "description" : "URI of the instance that failed to validate.", + "type" : "string", + "format" : "uri" + }, + "schemaUri" : { + "description" : "URI of the schema instance that reported the error.", + "type" : "string", + "format" : "uri" + }, + "attribute" : { + "description" : "The attribute of the schema instance that failed to validate.", + "type" : "string" + }, + "details" : { + "description" : "The value of the schema attribute that failed to validate.", + "type" : "any" + } + } + } + +## API Documentation + +There are many more APIs available for JSV, too many to detail here. The complete API and documentation can be found in the `docs` directory. + +## Extending Environments + +JSV provides an API for extending available schemas, adding new attributes and validation to currently existing schemas, and creating whole new Environments with unique behaviors. +In fact, in the [eat-your-own-dog-food](http://en.wikipedia.org/wiki/Eating_your_own_dog_food) approach, all the default JSON Schema environments available are implemented using this API. +Details and instruction on this feature will be provided at a later date. + +## Installation + +The preferred method of installation is to download the latest copy from GitHub: + + git clone git://github.com/garycourt/JSV.git + +If you are using JSV within Node.js, you can quickly install it using: + + npm install JSV + +Then you can reference it within your application using: + + var JSV = require("JSV").JSV; + +## Unit Tests + +Open `tests/index.html` and `tests/index3.html` in your web browser to run the unit tests. + +Currently, the unit tests can not be run in Node.js. + +## License + + Copyright 2010 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 or the JSON Schema specification. \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/docs/files.html b/html/RentForCamp/node_modules/JSV/docs/files.html new file mode 100644 index 0000000..0bcc33b --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/files.html @@ -0,0 +1,235 @@ + + + + + + JsDoc Reference - File Index + + + + + + + + +
+
Class Index +| File Index
+
+

Classes

+ +
+
+ +
+

File Index

+ + +
+

jsv.js

+ JSV: JSON Schema Validator +A JavaScript implementation of a extendable, fully compliant JSON Schema validator. +
+ +
Author:
+
Gary Court
+ + +
Version:
+
4.0
+ + + +
+
+
+ + +
+
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Wed Sep 14 2011 18:53:24 GMT-0600 (MDT) +
+ + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/docs/index.html b/html/RentForCamp/node_modules/JSV/docs/index.html new file mode 100644 index 0000000..6ade4ff --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/index.html @@ -0,0 +1,258 @@ + + + + + + JsDoc Reference - Index + + + + + + + + +
+
Class Index +| File Index
+
+

Classes

+ +
+
+ +
+

Class Index

+ + +
+

Environment

+ +
+
+ +
+

InitializationError

+ +
+
+ +
+

JSONInstance

+ +
+
+ +
+

JSONSchema

+ +
+
+ +
+

JSV

+ +
+
+ +
+

Report

+ +
+
+ +
+

ValidationError

+ +
+
+ + +
+
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Wed Sep 14 2011 18:53:24 GMT-0600 (MDT) +
+ + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/docs/symbols/Environment.html b/html/RentForCamp/node_modules/JSV/docs/symbols/Environment.html new file mode 100644 index 0000000..165c450 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/symbols/Environment.html @@ -0,0 +1,954 @@ + + + + + + + JsDoc Reference - Environment + + + + + + + + + + + +
+ +
Class Index +| File Index
+
+

Classes

+ +
+ +
+ +
+ +

+ + Class Environment +

+ + +

+ + + + + + +
Defined in: jsv.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ Environment() +
+
An Environment is a sandbox of schemas thats behavior is different from other environments.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
clone() +
+
Returns a clone of the target environment.
+
  + +
Creates an empty schema.
+
  +
createInstance(data, uri) +
+
Returns a new JSONInstance of the provided data.
+
  +
createSchema(data, schema, uri) +
+
Creates a new JSONSchema from the provided data, and registers it with the environment.
+
  +
findSchema(uri) +
+
Returns the schema registered with the provided URI.
+
  + +
Returns the default fragment delimiter of the environment.
+
  + +
Returns the default schema of the environment.
+
  +
getOption(name) +
+
Returns the specified environment option.
+
  + +
Sets the default fragment delimiter of the environment.
+
  + +
Sets the URI of the default schema for the environment.
+
  +
setOption(name, value) +
+
Sets the specified environment option to the specified value.
+
  +
validate(instanceJSON, schemaJSON) +
+
Validates both the provided schema and the provided instance, and returns a Report.
+
+ + + + + + + + + +
+
+ Class Detail +
+ +
+ Environment() +
+ +
+ An Environment is a sandbox of schemas thats behavior is different from other environments. + +
+ + + + + + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {Environment} + clone() + +
+
+ Returns a clone of the target environment. + + +
+ + + + + + + + +
+
Returns:
+ +
{Environment} A new Environment that is a exact copy of the target environment
+ +
+ + + + +
+ + +
+ + {JSONSchema} + createEmptySchema() + +
+
+ Creates an empty schema. + + +
+ + + + + + + + +
+
Returns:
+ +
{JSONSchema} The empty schema, who's schema is itself.
+ +
+ + + + +
+ + +
+ + {JSONInstance} + createInstance(data, uri) + +
+
+ Returns a new JSONInstance of the provided data. + + +
+ + + + +
+
Parameters:
+ +
+ {JSONInstance|Any} data + +
+
The value of the instance
+ +
+ {String} uri + Optional +
+
The URI of the instance. If undefined, the URI will be a randomly generated UUID.
+ +
+ + + + + +
+
Returns:
+ +
{JSONInstance} A new JSONInstance from the provided data
+ +
+ + + + +
+ + +
+ + {JSONSchema} + createSchema(data, schema, uri) + +
+
+ Creates a new JSONSchema from the provided data, and registers it with the environment. + + +
+ + + + +
+
Parameters:
+ +
+ {JSONInstance|Any} data + +
+
The value of the schema
+ +
+ {JSONSchema|Boolean} schema + Optional +
+
The schema to bind to the instance. If undefined, the environment's default schema will be used. If true, the instance's schema will be itself.
+ +
+ {String} uri + Optional +
+
The URI of the schema. If undefined, the URI will be a randomly generated UUID.
+ +
+ + + + +
+
Throws:
+ +
+ {InitializationError} +
+
If a schema that is not registered with the environment is referenced
+ +
+ + +
+
Returns:
+ +
{JSONSchema} A new JSONSchema from the provided data
+ +
+ + + + +
+ + +
+ + {JSONSchema|undefined} + findSchema(uri) + +
+
+ Returns the schema registered with the provided URI. + + +
+ + + + +
+
Parameters:
+ +
+ {String} uri + +
+
The absolute URI of the required schema
+ +
+ + + + + +
+
Returns:
+ +
{JSONSchema|undefined} The request schema, or undefined if not found
+ +
+ + + + +
+ + +
+ + {String} + getDefaultFragmentDelimiter() + +
+
+ Returns the default fragment delimiter of the environment. + + +
+ + + + + +
+
Deprecated:
+
+ Use Environment#getOption with option "defaultFragmentDelimiter" +
+
+ + + + +
+
Returns:
+ +
{String} The fragment delimiter character
+ +
+ + + + +
+ + +
+ + {JSONSchema} + getDefaultSchema() + +
+
+ Returns the default schema of the environment. + + +
+ + + + + + + + +
+
Returns:
+ +
{JSONSchema} The default schema
+ +
+ + + + +
+ + +
+ + {Any} + getOption(name) + +
+
+ Returns the specified environment option. + + +
+ + + + +
+
Parameters:
+ +
+ {String} name + +
+
The name of the environment option to set
+ +
+ + + + + +
+
Returns:
+ +
{Any} The value of the environment option
+ +
+ + + + +
+ + +
+ + + setDefaultFragmentDelimiter(fd) + +
+
+ Sets the default fragment delimiter of the environment. + + +
+ + + + +
+
Parameters:
+ +
+ {String} fd + +
+
The fragment delimiter character
+ +
+ + +
+
Deprecated:
+
+ Use Environment#setOption with option "defaultFragmentDelimiter" +
+
+ + + + + + + +
+ + +
+ + + setDefaultSchemaURI(uri) + +
+
+ Sets the URI of the default schema for the environment. + + +
+ + + + +
+
Parameters:
+ +
+ {String} uri + +
+
The default schema URI
+ +
+ + +
+
Deprecated:
+
+ Use Environment#setOption with option "defaultSchemaURI" +
+
+ + + + + + + +
+ + +
+ + + setOption(name, value) + +
+
+ Sets the specified environment option to the specified value. + + +
+ + + + +
+
Parameters:
+ +
+ {String} name + +
+
The name of the environment option to set
+ +
+ {Any} value + +
+
The new value of the environment option
+ +
+ + + + + + + + +
+ + +
+ + {Report} + validate(instanceJSON, schemaJSON) + +
+
+ Validates both the provided schema and the provided instance, and returns a Report. If the schema fails to validate, the instance will not be validated. + + +
+ + + + +
+
Parameters:
+ +
+ {JSONInstance|Any} instanceJSON + +
+
The JSONInstance or JavaScript value to validate.
+ +
+ {JSONSchema|Any} schemaJSON + +
+
The JSONSchema or JavaScript value to use in the validation. This will also be validated againt the schema's schema.
+ +
+ + + + + +
+
Returns:
+ +
{Report} The result of the validation
+ +
+ + + + + + + + + + + +
+
+ + + +
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Wed Sep 14 2011 18:53:24 GMT-0600 (MDT) +
+ + diff --git a/html/RentForCamp/node_modules/JSV/docs/symbols/Error.html b/html/RentForCamp/node_modules/JSV/docs/symbols/Error.html new file mode 100644 index 0000000..9847576 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/symbols/Error.html @@ -0,0 +1,263 @@ + + + + + + + JsDoc Reference - Error + + + + + + + + + + + +
+ +
Class Index +| File Index
+
+

Classes

+ +
+ +
+ +
+ +

+ + Built-In Namespace Error +

+ + +

+ + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Mon Aug 22 2011 14:52:01 GMT-0600 (MDT) +
+ + diff --git a/html/RentForCamp/node_modules/JSV/docs/symbols/InitializationError.html b/html/RentForCamp/node_modules/JSV/docs/symbols/InitializationError.html new file mode 100644 index 0000000..3ecceb3 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/symbols/InitializationError.html @@ -0,0 +1,346 @@ + + + + + + + JsDoc Reference - InitializationError + + + + + + + + + + + +
+ +
Class Index +| File Index
+
+

Classes

+ +
+ +
+ +
+ +

+ + Class InitializationError +

+ + +

+ + + + + + +
Defined in: jsv.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ InitializationError(instance, schema, attr, message, details) +
+
The exception that is thrown when a schema fails to be created.
+
+ + + + + + + + + + + + +
+
+ Class Detail +
+ +
+ InitializationError(instance, schema, attr, message, details) +
+ +
+ The exception that is thrown when a schema fails to be created. + +
+ + + + + +
+
Parameters:
+ +
+ {JSONInstance|String} instance + +
+
The instance (or instance URI) that is invalid
+ +
+ {JSONSchema|String} schema + +
+
The schema (or schema URI) that was validating the instance
+ +
+ {String} attr + +
+
The attribute that failed to validated
+ +
+ {String} message + +
+
A user-friendly message on why the schema attribute failed to validate the instance
+ +
+ {Any} details + +
+
The value of the schema attribute
+ +
+ + + + + + + + +
+ + + + + + + + + + + +
+
+ + + +
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Wed Sep 14 2011 18:53:24 GMT-0600 (MDT) +
+ + diff --git a/html/RentForCamp/node_modules/JSV/docs/symbols/JSONInstance.html b/html/RentForCamp/node_modules/JSV/docs/symbols/JSONInstance.html new file mode 100644 index 0000000..91a8bb5 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/symbols/JSONInstance.html @@ -0,0 +1,826 @@ + + + + + + + JsDoc Reference - JSONInstance + + + + + + + + + + + +
+ +
Class Index +| File Index
+
+

Classes

+ +
+ +
+ +
+ +

+ + Class JSONInstance +

+ + +

+ + + + + + +
Defined in: jsv.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ JSONInstance(env, json, uri, fd) +
+
A wrapper class for binding an Environment, URI and helper methods to an instance.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
equals(instance) +
+
Return if the provided value is the same as the value of the instance.
+
  + +
Returns the environment the instance is bound to.
+
  + +
Returns all the property instances of the target instance.
+
  +
getProperty(key) +
+
Returns a JSONInstance of the value of the provided property name.
+
  + +
Returns an array of the names of all the properties.
+
  +
getType() +
+
Returns the name of the type of the instance.
+
  +
getURI() +
+
Returns the URI of the instance.
+
  + +
Returns the JSON value of the instance.
+
  + +
Returns the JSON value of the provided property name.
+
  +
resolveURI(uri) +
+
Returns a resolved URI of a provided relative URI against the URI of the instance.
+
+ + + + + + + + + +
+
+ Class Detail +
+ +
+ JSONInstance(env, json, uri, fd) +
+ +
+ A wrapper class for binding an Environment, URI and helper methods to an instance. This class is most commonly instantiated with Environment#createInstance. + +
+ + + + + +
+
Parameters:
+ +
+ {Environment} env + +
+
The environment this instance belongs to
+ +
+ {JSONInstance|Any} json + +
+
The value of the instance
+ +
+ {String} uri + Optional +
+
The URI of the instance. If undefined, the URI will be a randomly generated UUID.
+ +
+ {String} fd + Optional +
+
The fragment delimiter for properties. If undefined, uses the environment default.
+ +
+ + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {Boolean} + equals(instance) + +
+
+ Return if the provided value is the same as the value of the instance. + + +
+ + + + +
+
Parameters:
+ +
+ {JSONInstance|Any} instance + +
+
The value to compare
+ +
+ + + + + +
+
Returns:
+ +
{Boolean} If both the instance and the value match
+ +
+ + + + +
+ + +
+ + {Environment} + getEnvironment() + +
+
+ Returns the environment the instance is bound to. + + +
+ + + + + + + + +
+
Returns:
+ +
{Environment} The environment of the instance
+ +
+ + + + +
+ + +
+ + {Object|Array|undefined} + getProperties() + +
+
+ Returns all the property instances of the target instance.

If the target instance is an Object, then the method will return a hash table of JSONInstances of all the properties. If the target instance is an Array, then the method will return an array of JSONInstances of all the items.

+ + +
+ + + + + + + + +
+
Returns:
+ +
{Object|Array|undefined} The list of instances for all the properties
+ +
+ + + + +
+ + +
+ + {JSONInstance} + getProperty(key) + +
+
+ Returns a JSONInstance of the value of the provided property name. + + +
+ + + + +
+
Parameters:
+ +
+ {String} key + +
+
The name of the property to fetch
+ +
+ + + + + +
+
Returns:
+ +
{JSONInstance} The instance of the property value
+ +
+ + + + +
+ + +
+ + {Array} + getPropertyNames() + +
+
+ Returns an array of the names of all the properties. + + +
+ + + + + + + + +
+
Returns:
+ +
{Array} An array of strings which are the names of all the properties
+ +
+ + + + +
+ + +
+ + {String} + getType() + +
+
+ Returns the name of the type of the instance. + + +
+ + + + + + + + +
+
Returns:
+ +
{String} The name of the type of the instance
+ +
+ + + + +
+ + +
+ + {String} + getURI() + +
+
+ Returns the URI of the instance. + + +
+ + + + + + + + +
+
Returns:
+ +
{String} The URI of the instance
+ +
+ + + + +
+ + +
+ + {Any} + getValue() + +
+
+ Returns the JSON value of the instance. + + +
+ + + + + + + + +
+
Returns:
+ +
{Any} The actual JavaScript value of the instance
+ +
+ + + + +
+ + +
+ + {Any} + getValueOfProperty(key) + +
+
+ Returns the JSON value of the provided property name. This method is a faster version of calling instance.getProperty(key).getValue(). + + +
+ + + + +
+
Parameters:
+ +
+ {String} key + +
+
The name of the property
+ +
+ + + + + +
+
Returns:
+ +
{Any} The JavaScript value of the instance
+ +
+ + + +
+
See:
+ +
JSONInstance#getProperty
+ +
JSONInstance#getValue
+ +
+ + +
+ + +
+ + {String} + resolveURI(uri) + +
+
+ Returns a resolved URI of a provided relative URI against the URI of the instance. + + +
+ + + + +
+
Parameters:
+ +
+ {String} uri + +
+
The relative URI to resolve
+ +
+ + + + + +
+
Returns:
+ +
{String} The resolved URI
+ +
+ + + + + + + + + + + +
+
+ + + +
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Wed Sep 14 2011 18:53:24 GMT-0600 (MDT) +
+ + diff --git a/html/RentForCamp/node_modules/JSV/docs/symbols/JSONSchema.html b/html/RentForCamp/node_modules/JSV/docs/symbols/JSONSchema.html new file mode 100644 index 0000000..8553484 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/symbols/JSONSchema.html @@ -0,0 +1,753 @@ + + + + + + + JsDoc Reference - JSONSchema + + + + + + + + + + + +
+ +
Class Index +| File Index
+
+

Classes

+ +
+ +
+ +
+ +

+ + Class JSONSchema +

+ + +

+ +
Extends + JSONInstance.
+ + + + + +
Defined in: jsv.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ JSONSchema(env, json, uri, schema) +
+
This class binds a JSONInstance with a JSONSchema to provided context aware methods.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
getAttribute(key, arg) +
+
Returns the value of the provided attribute name.
+
  + +
Returns all the attributes of the schema.
+
  +
getLink(rel, instance) +
+
Convenience method for retrieving a link or link object from a schema.
+
  +
getReference(name) +
+
Returns the value of the provided reference name.
+
  + +
Returns the schema of the schema.
+
  +
setReference(name, uri) +
+
Set the provided reference to the given value.
+
  +
validate(instance, report, parent, parentSchema, name) +
+
Validates the provided instance against the target schema and returns a Report.
+
+ + + +
+
Methods borrowed from class JSONInstance:
equals, getEnvironment, getProperties, getProperty, getPropertyNames, getType, getURI, getValue, getValueOfProperty, resolveURI
+
+ + + + + + + +
+
+ Class Detail +
+ +
+ JSONSchema(env, json, uri, schema) +
+ +
+ This class binds a JSONInstance with a JSONSchema to provided context aware methods. + +
+ + + + + +
+
Parameters:
+ +
+ {Environment} env + +
+
The environment this schema belongs to
+ +
+ {JSONInstance|Any} json + +
+
The value of the schema
+ +
+ {String} uri + Optional +
+
The URI of the schema. If undefined, the URI will be a randomly generated UUID.
+ +
+ {JSONSchema|Boolean} schema + Optional +
+
The schema to bind to the instance. If undefined, the environment's default schema will be used. If true, the instance's schema will be itself.
+ +
+ + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
+ + {JSONSchema|Any} + getAttribute(key, arg) + +
+
+ Returns the value of the provided attribute name.

This method is different from JSONInstance#getProperty as the named property is converted using a parser defined by the schema's schema before being returned. This makes the return value of this method attribute dependent.

+ + +
+ + + + +
+
Parameters:
+ +
+ {String} key + +
+
The name of the attribute
+ +
+ {Any} arg + Optional +
+
Some attribute parsers accept special arguments for returning resolved values. This is attribute dependent.
+ +
+ + + + + +
+
Returns:
+ +
{JSONSchema|Any} The value of the attribute
+ +
+ + + + +
+ + +
+ + {Object} + getAttributes() + +
+
+ Returns all the attributes of the schema. + + +
+ + + + + + + + +
+
Returns:
+ +
{Object} A map of all parsed attribute values
+ +
+ + + + +
+ + +
+ + {String|Object|undefined} + getLink(rel, instance) + +
+
+ Convenience method for retrieving a link or link object from a schema. This method is the same as calling schema.getAttribute("links", [rel, instance])[0];. + + +
+ + + + +
+
Parameters:
+ +
+ {String} rel + +
+
The link relationship
+ +
+ {JSONInstance} instance + Optional +
+
The instance to resolve any URIs from
+ +
+ + + + + +
+
Returns:
+ +
{String|Object|undefined} If instance is provided, a string containing the resolve URI of the link is returned. If instance is not provided, a link object is returned with details of the link. If no link with the provided relationship exists, undefined is returned.
+ +
+ + + +
+
See:
+ +
JSONSchema#getAttribute
+ +
+ + +
+ + +
+ + {String} + getReference(name) + +
+
+ Returns the value of the provided reference name. + + +
+ + + + +
+
Parameters:
+ +
+ {String} name + +
+
The name of the reference
+ +
+ + + + + +
+
Returns:
+ +
{String} The value of the provided reference name
+ +
+ + + + +
+ + +
+ + {JSONSchema} + getSchema() + +
+
+ Returns the schema of the schema. + + +
+ + + + + + + + +
+
Returns:
+ +
{JSONSchema} The schema of the schema
+ +
+ + + + +
+ + +
+ + + setReference(name, uri) + +
+
+ Set the provided reference to the given value.
References are used for establishing soft-links to other JSONSchemas. Currently, the following references are natively supported:
full
The value is the URI to the full instance of this instance.
describedby
The value is the URI to the schema of this instance.
+ + +
+ + + + +
+
Parameters:
+ +
+ {String} name + +
+
The name of the reference
+ +
+ {String} uri + +
+
The URI of the schema to refer to
+ +
+ + + + + + + + +
+ + +
+ + {Report} + validate(instance, report, parent, parentSchema, name) + +
+
+ Validates the provided instance against the target schema and returns a Report. + + +
+ + + + +
+
Parameters:
+ +
+ {JSONInstance|Any} instance + +
+
The instance to validate; may be a JSONInstance or any JavaScript value
+ +
+ {Report} report + Optional +
+
A Report to concatenate the result of the validation to. If undefined, a new Report is created.
+ +
+ {JSONInstance} parent + Optional +
+
The parent/containing instance of the provided instance
+ +
+ {JSONSchema} parentSchema + Optional +
+
The schema of the parent/containing instance
+ +
+ {String} name + Optional +
+
The name of the parent object's property that references the instance
+ +
+ + + + + +
+
Returns:
+ +
{Report} The result of the validation
+ +
+ + + + + + + + + + + +
+
+ + + +
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Wed Sep 14 2011 18:53:24 GMT-0600 (MDT) +
+ + diff --git a/html/RentForCamp/node_modules/JSV/docs/symbols/JSV.html b/html/RentForCamp/node_modules/JSV/docs/symbols/JSV.html new file mode 100644 index 0000000..9b8338c --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/symbols/JSV.html @@ -0,0 +1,1511 @@ + + + + + + + JsDoc Reference - JSV + + + + + + + + + + + +
+ +
Class Index +| File Index
+
+

Classes

+ +
+ +
+ +
+ +

+ + Namespace JSV +

+ + +

+ + + + + + +
Defined in: jsv.js. + +

+ + + + + + + + + + + + + + + + + +
Namespace Summary
Constructor AttributesConstructor Name and Description
  +
+ JSV +
+
A globaly accessible object that provides the ability to create and manage Environments, as well as providing utility methods.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
<static>   + +
Creates and returns a new Environment that is a clone of the environment registered with the provided ID.
+
<static>   + +
Returns the ID of the default environment.
+
<static>   +
JSV.isJSONInstance(o) +
+
Returns if the provide value is an instance of JSONInstance.
+
<static>   +
JSV.isJSONSchema(o) +
+
Returns if the provide value is an instance of JSONSchema.
+
<static>   +
JSV.registerEnvironment(id, env) +
+
Registers the provided Environment with the provided ID.
+
<static>   + +
Sets which registered ID is the default environment.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Utility Method Summary
Utility Method AttributesUtility Method Name and Description
<static>   +
JSV.clone(o, deep) +
+
Creates a copy of the target object.
+
<static>   +
JSV.createObject(proto) +
+
Return a new object that inherits all of the properties of the provided object.
+
<static>   +
JSV.escapeURIComponent(str) +
+
Properly escapes a URI component for embedding into a URI string.
+
<static>   +
JSV.filterArray(arr, iterator, scope) +
+
Returns a new array that only contains the items allowed by the iterator.
+
<static>   +
JSV.formatURI(uri) +
+
Returns a URI that is formated for JSV.
+
<static>   +
JSV.inherits(base, extra, extension) +
+
Merges two schemas/instance together.
+
<static>   +
JSV.keys(o) +
+
Returns an array of the names of all properties of an object.
+
<static>   +
JSV.mapArray(arr, iterator, scope) +
+
Returns a new array with each item transformed by the iterator.
+
<static>   +
JSV.mapObject(obj, iterator, scope) +
+
Returns a new object with each property transformed by the iterator.
+
<static>   +
JSV.popFirst(arr, o) +
+
Mutates the array by removing the first item that matches the provided value in the array.
+
<static>   +
JSV.pushUnique(arr, o) +
+
Mutates the array by pushing the provided value onto the array only if it is not already there.
+
<static>   +
JSV.randomUUID() +
+
Generates a pseudo-random UUID.
+
<static>   +
JSV.searchArray(arr, o) +
+
Returns the first index in the array that the provided item is located at.
+
<static>   +
JSV.toArray(o) +
+
Returns an array representation of a value.
+
<static>   +
JSV.typeOf(o) +
+
Returns the name of the type of the provided value.
+
+ + + + + + + +
+
+ Namespace Detail +
+ +
+ JSV +
+ +
+ A globaly accessible object that provides the ability to create and manage Environments, as well as providing utility methods. + +
+ + + + + + + + + + + + +
+ + + + + + + +
+ Method Detail +
+ + +
<static> + + {Environment} + JSV.createEnvironment(id) + +
+
+ Creates and returns a new Environment that is a clone of the environment registered with the provided ID. If no environment ID is provided, the default environment is cloned. + + +
+ + + + +
+
Parameters:
+ +
+ {String} id + Optional +
+
The ID of the environment to clone. If undefined, the default environment ID is used.
+ +
+ + + + +
+
Throws:
+ +
+ {Error} +
+
If there is no environment registered with the provided ID
+ +
+ + +
+
Returns:
+ +
{Environment} A newly cloned Environment
+ +
+ + + + +
+ + +
<static> + + {String} + JSV.getDefaultEnvironmentID() + +
+
+ Returns the ID of the default environment. + + +
+ + + + + + + + +
+
Returns:
+ +
{String} The ID of the default environment
+ +
+ + + + +
+ + +
<static> + + {Boolean} + JSV.isJSONInstance(o) + +
+
+ Returns if the provide value is an instance of JSONInstance. + + +
+ + + + +
+
Parameters:
+ +
+ o + +
+
The value to test
+ +
+ + + + + +
+
Returns:
+ +
{Boolean} If the provide value is an instance of JSONInstance
+ +
+ + + + +
+ + +
<static> + + {Boolean} + JSV.isJSONSchema(o) + +
+
+ Returns if the provide value is an instance of JSONSchema. + + +
+ + + + +
+
Parameters:
+ +
+ o + +
+
The value to test
+ +
+ + + + + +
+
Returns:
+ +
{Boolean} If the provide value is an instance of JSONSchema
+ +
+ + + + +
+ + +
<static> + + + JSV.registerEnvironment(id, env) + +
+
+ Registers the provided Environment with the provided ID. + + +
+ + + + +
+
Parameters:
+ +
+ {String} id + +
+
The ID of the environment
+ +
+ {Environment} env + +
+
The environment to register
+ +
+ + + + + + + + +
+ + +
<static> + + + JSV.setDefaultEnvironmentID(id) + +
+
+ Sets which registered ID is the default environment. + + +
+ + + + +
+
Parameters:
+ +
+ {String} id + +
+
The ID of the registered environment that is default
+ +
+ + + + +
+
Throws:
+ +
+ {Error} +
+
If there is no registered environment with the provided ID
+ +
+ + + + + + + + + + + +
+ Utility Method Detail +
+ + +
<static> + + + JSV.clone(o, deep) + +
+
+ Creates a copy of the target object.

This method will create a new instance of the target, and then mixin the properties of the target. If deep is true, then each property will be cloned before mixin.

Warning: This is not a generic clone function, as it will only properly clone objects and arrays.

+ + +
+ + + + +
+
Parameters:
+ +
+ {Any} o + +
+
The value to clone
+ +
+ {Boolean} deep + Optional, Default: false +
+
If each property should be recursively cloned
+ +
+ + + + + +
+
Returns:
+ +
A cloned copy of the provided value
+ +
+ + + + +
+ + +
<static> + + {Object} + JSV.createObject(proto) + +
+
+ Return a new object that inherits all of the properties of the provided object. + + +
+ + + + +
+
Parameters:
+ +
+ {Object} proto + +
+
The prototype of the new object
+ +
+ + + + + +
+
Returns:
+ +
{Object} A new object that inherits all of the properties of the provided object
+ +
+ + + + +
+ + +
<static> + + {String} + JSV.escapeURIComponent(str) + +
+
+ Properly escapes a URI component for embedding into a URI string. + + +
+ + + + +
+
Parameters:
+ +
+ {String} str + +
+
The URI component to escape
+ +
+ + + + + +
+
Returns:
+ +
{String} The escaped URI component
+ +
+ + + + +
+ + +
<static> + + {Array} + JSV.filterArray(arr, iterator, scope) + +
+
+ Returns a new array that only contains the items allowed by the iterator. + + +
+ + + + +
+
Parameters:
+ +
+ {Array} arr + +
+
The array to filter
+ +
+ {Function} iterator + +
+
The function that returns true if the provided property should be added to the array
+ +
+ {Object} scope + +
+
The value of this within the iterator
+ +
+ + + + + +
+
Returns:
+ +
{Array} A new array that contains the items allowed by the iterator
+ +
+ + + + +
+ + +
<static> + + {String} + JSV.formatURI(uri) + +
+
+ Returns a URI that is formated for JSV. Currently, this only ensures that the URI ends with a hash tag (#). + + +
+ + + + +
+
Parameters:
+ +
+ {String} uri + +
+
The URI to format
+ +
+ + + + + +
+
Returns:
+ +
{String} The URI formatted for JSV
+ +
+ + + + +
+ + +
<static> + + {Any} + JSV.inherits(base, extra, extension) + +
+
+ Merges two schemas/instance together. + + +
+ + + + +
+
Parameters:
+ +
+ {JSONSchema|Any} base + +
+
The old value to merge
+ +
+ {JSONSchema|Any} extra + +
+
The new value to merge
+ +
+ {Boolean} extension + +
+
If the merge is a JSON Schema extension
+ +
+ + + + + +
+
Returns:
+ +
{Any} The modified base value
+ +
+ + + + +
+ + +
<static> + + {Array} + JSV.keys(o) + +
+
+ Returns an array of the names of all properties of an object. + + +
+ + + + +
+
Parameters:
+ +
+ {Object|Array} o + +
+
The object in question
+ +
+ + + + + +
+
Returns:
+ +
{Array} The names of all properties
+ +
+ + + + +
+ + +
<static> + + {Array} + JSV.mapArray(arr, iterator, scope) + +
+
+ Returns a new array with each item transformed by the iterator. + + +
+ + + + +
+
Parameters:
+ +
+ {Array} arr + +
+
The array to transform
+ +
+ {Function} iterator + +
+
A function that returns the new value of the provided item
+ +
+ {Object} scope + +
+
The value of this in the iterator
+ +
+ + + + + +
+
Returns:
+ +
{Array} A new array with each item transformed
+ +
+ + + + +
+ + +
<static> + + {Object} + JSV.mapObject(obj, iterator, scope) + +
+
+ Returns a new object with each property transformed by the iterator. + + +
+ + + + +
+
Parameters:
+ +
+ {Object} obj + +
+
The object to transform
+ +
+ {Function} iterator + +
+
A function that returns the new value of the provided property
+ +
+ {Object} scope + Optional +
+
The value of this in the iterator
+ +
+ + + + + +
+
Returns:
+ +
{Object} A new object with each property transformed
+ +
+ + + + +
+ + +
<static> + + {Array} + JSV.popFirst(arr, o) + +
+
+ Mutates the array by removing the first item that matches the provided value in the array. + + +
+ + + + +
+
Parameters:
+ +
+ {Array} arr + +
+
The array to modify
+ +
+ {Any} o + +
+
The object to remove from the array
+ +
+ + + + + +
+
Returns:
+ +
{Array} The provided array for chaining
+ +
+ + + + +
+ + +
<static> + + {Array} + JSV.pushUnique(arr, o) + +
+
+ Mutates the array by pushing the provided value onto the array only if it is not already there. + + +
+ + + + +
+
Parameters:
+ +
+ {Array} arr + +
+
The array to modify
+ +
+ {Any} o + +
+
The object to add to the array if it is not already there
+ +
+ + + + + +
+
Returns:
+ +
{Array} The provided array for chaining
+ +
+ + + + +
+ + +
<static> + + {String} + JSV.randomUUID() + +
+
+ Generates a pseudo-random UUID. + + +
+ + + + + + + + +
+
Returns:
+ +
{String} A new universally unique ID
+ +
+ + + + +
+ + +
<static> + + {Number} + JSV.searchArray(arr, o) + +
+
+ Returns the first index in the array that the provided item is located at. + + +
+ + + + +
+
Parameters:
+ +
+ {Array} arr + +
+
The array to search
+ +
+ {Any} o + +
+
The item being searched for
+ +
+ + + + + +
+
Returns:
+ +
{Number} The index of the item in the array, or -1 if not found
+ +
+ + + + +
+ + +
<static> + + {Array} + JSV.toArray(o) + +
+
+ Returns an array representation of a value.
  • For array-like objects, the value will be casted as an Array type.
  • If an array is provided, the function will simply return the same array.
  • For a null or undefined value, the result will be an empty Array.
  • For all other values, the value will be the first element in a new Array.
+ + +
+ + + + +
+
Parameters:
+ +
+ {Any} o + +
+
The value to convert into an array
+ +
+ + + + + +
+
Returns:
+ +
{Array} The value as an array
+ +
+ + + + +
+ + +
<static> + + {String} + JSV.typeOf(o) + +
+
+ Returns the name of the type of the provided value. + + +
+ + + + +
+
Parameters:
+ +
+ {Any} o + +
+
The value to determine the type of
+ +
+ + + + + +
+
Returns:
+ +
{String} The name of the type of the value
+ +
+ + + + + + + + +
+
+ + + +
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Wed Sep 14 2011 18:53:24 GMT-0600 (MDT) +
+ + diff --git a/html/RentForCamp/node_modules/JSV/docs/symbols/Report.html b/html/RentForCamp/node_modules/JSV/docs/symbols/Report.html new file mode 100644 index 0000000..529343d --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/symbols/Report.html @@ -0,0 +1,743 @@ + + + + + + + JsDoc Reference - Report + + + + + + + + + + + +
+ +
Class Index +| File Index
+
+

Classes

+ +
+ +
+ +
+ +

+ + Class Report +

+ + +

+ + + + + + +
Defined in: jsv.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  +
+ Report() +
+
Reports are returned from validation methods to describe the result of a validation.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ errors +
+
An array of ValidationError objects that define all the errors generated by the schema against the instance.
+
  +
+ instance +
+
If the report is generated by Environment#validate, this field is the generated instance.
+
  +
+ schema +
+
If the report is generated by Environment#validate, this field is the generated schema.
+
  + +
If the report is generated by Environment#validate, this field is the schema's schema.
+
  +
+ validated +
+
A hash table of every instance and what schemas were validated against it.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
  +
addError(instance, schema, attr, message, details) +
+
Adds a ValidationError object to the errors field.
+
  +
isValidatedBy(uri, schemaUri) +
+
Returns if an instance with the provided URI has been validated by the schema with the provided URI.
+
  +
registerValidation(uri, schemaUri) +
+
Registers that the provided instance URI has been validated by the provided schema URI.
+
+ + + + + + + + + +
+
+ Class Detail +
+ +
+ Report() +
+ +
+ Reports are returned from validation methods to describe the result of a validation. + +
+ + + + + + + + + + + +
+
See:
+ +
JSONSchema#validate
+ +
Environment#validate
+ +
+ + +
+ + + + +
+ Field Detail +
+ + +
+ + {Array} + errors + +
+
+ An array of ValidationError objects that define all the errors generated by the schema against the instance. + + +
+ + + + + + +
+
See:
+ +
Report#addError
+ +
+ + + +
+ + +
+ + {JSONInstance} + instance + +
+
+ If the report is generated by Environment#validate, this field is the generated instance. + + +
+ + + + + + +
+
See:
+ +
Environment#validate
+ +
+ + + +
+ + +
+ + {JSONSchema} + schema + +
+
+ If the report is generated by Environment#validate, this field is the generated schema. + + +
+ + + + + + +
+
See:
+ +
Environment#validate
+ +
+ + + +
+ + +
+ + {JSONSchema} + schemaSchema + +
+
+ If the report is generated by Environment#validate, this field is the schema's schema. This value is the same as calling schema.getSchema(). + + +
+ + + + + + +
+
See:
+ +
Environment#validate
+ +
JSONSchema#getSchema
+ +
+ + + +
+ + +
+ + {Object} + validated + +
+
+ A hash table of every instance and what schemas were validated against it.

The key of each item in the table is the URI of the instance that was validated. The value of this key is an array of strings of URIs of the schema that validated it.

+ + +
+ + + + + + +
+
See:
+ +
Report#registerValidation
+ +
Report#isValidatedBy
+ +
+ + + + + + + + + +
+ Method Detail +
+ + +
+ + + addError(instance, schema, attr, message, details) + +
+
+ Adds a ValidationError object to the errors field. + + +
+ + + + +
+
Parameters:
+ +
+ {JSONInstance|String} instance + +
+
The instance (or instance URI) that is invalid
+ +
+ {JSONSchema|String} schema + +
+
The schema (or schema URI) that was validating the instance
+ +
+ {String} attr + +
+
The attribute that failed to validated
+ +
+ {String} message + +
+
A user-friendly message on why the schema attribute failed to validate the instance
+ +
+ {Any} details + +
+
The value of the schema attribute
+ +
+ + + + + + + + +
+ + +
+ + {Boolean} + isValidatedBy(uri, schemaUri) + +
+
+ Returns if an instance with the provided URI has been validated by the schema with the provided URI. + + +
+ + + + +
+
Parameters:
+ +
+ {String} uri + +
+
The URI of the instance
+ +
+ {String} schemaUri + +
+
The URI of a schema
+ +
+ + + + + +
+
Returns:
+ +
{Boolean} If the instance has been validated by the schema.
+ +
+ + + + +
+ + +
+ + + registerValidation(uri, schemaUri) + +
+
+ Registers that the provided instance URI has been validated by the provided schema URI. This is recorded in the validated field. + + +
+ + + + +
+
Parameters:
+ +
+ {String} uri + +
+
The URI of the instance that was validated
+ +
+ {String} schemaUri + +
+
The URI of the schema that validated the instance
+ +
+ + + + + + + + + + + + + + + +
+
+ + + +
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Wed Sep 14 2011 18:53:24 GMT-0600 (MDT) +
+ + diff --git a/html/RentForCamp/node_modules/JSV/docs/symbols/ValidationError.html b/html/RentForCamp/node_modules/JSV/docs/symbols/ValidationError.html new file mode 100644 index 0000000..d3781c9 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/symbols/ValidationError.html @@ -0,0 +1,501 @@ + + + + + + + JsDoc Reference - ValidationError + + + + + + + + + + + +
+ +
Class Index +| File Index
+
+

Classes

+ +
+ +
+ +
+ +

+ + Class ValidationError +

+ + +

+ + + + + + +
Defined in: jsv.js. + +

+ + + + + + + + + + + + + + + + + +
Class Summary
Constructor AttributesConstructor Name and Description
  + +
Defines an error, found by a schema, with an instance.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
  +
+ attribute +
+
The name of the schema attribute that generated the error.
+
  +
+ details +
+
The value of the schema attribute that generated the error.
+
  +
+ message +
+
An user-friendly (English) message about what failed to validate.
+
  +
+ schemaUri +
+
The URI of the schema that generated the error.
+
  +
+ uri +
+
The URI of the instance that has the error.
+
+ + + + + + + + + + + + +
+
+ Class Detail +
+ +
+ ValidationError() +
+ +
+ Defines an error, found by a schema, with an instance. This class can only be instantiated by Report#addError. + +
+ + + + + + + + + + + +
+
See:
+ +
Report#addError
+ +
+ + +
+ + + + +
+ Field Detail +
+ + +
+ + {String} + attribute + +
+
+ The name of the schema attribute that generated the error. + + +
+ + + + + + + + +
+ + +
+ + {Any} + details + +
+
+ The value of the schema attribute that generated the error. + + +
+ + + + + + + + +
+ + +
+ + {String} + message + +
+
+ An user-friendly (English) message about what failed to validate. + + +
+ + + + + + + + +
+ + +
+ + {String} + schemaUri + +
+
+ The URI of the schema that generated the error. + + +
+ + + + + + + + +
+ + +
+ + {String} + uri + +
+
+ The URI of the instance that has the error. + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Wed Sep 14 2011 18:53:24 GMT-0600 (MDT) +
+ + diff --git a/html/RentForCamp/node_modules/JSV/docs/symbols/_global_.html b/html/RentForCamp/node_modules/JSV/docs/symbols/_global_.html new file mode 100644 index 0000000..c3a5852 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/symbols/_global_.html @@ -0,0 +1,261 @@ + + + + + + + JsDoc Reference - _global_ + + + + + + + + + + + +
+ +
Class Index +| File Index
+
+

Classes

+ +
+ +
+ +
+ +

+ + Built-In Namespace _global_ +

+ + +

+ + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + Documentation generated by JsDoc Toolkit 2.4.0 on Wed Sep 14 2011 18:53:23 GMT-0600 (MDT) +
+ + diff --git a/html/RentForCamp/node_modules/JSV/docs/symbols/src/jsv.js.html b/html/RentForCamp/node_modules/JSV/docs/symbols/src/jsv.js.html new file mode 100644 index 0000000..1576b25 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/docs/symbols/src/jsv.js.html @@ -0,0 +1,1504 @@ +
  1 /**
+  2  * JSV: JSON Schema Validator
+  3  * 
+  4  * @fileOverview A JavaScript implementation of a extendable, fully compliant JSON Schema validator.
+  5  * @author <a href="mailto:gary.court@gmail.com">Gary Court</a>
+  6  * @version 4.0
+  7  * @see http://github.com/garycourt/JSV
+  8  */
+  9 
+ 10 /*
+ 11  * Copyright 2010 Gary Court. All rights reserved.
+ 12  * 
+ 13  * Redistribution and use in source and binary forms, with or without modification, are
+ 14  * permitted provided that the following conditions are met:
+ 15  * 
+ 16  *    1. Redistributions of source code must retain the above copyright notice, this list of
+ 17  *       conditions and the following disclaimer.
+ 18  * 
+ 19  *    2. Redistributions in binary form must reproduce the above copyright notice, this list
+ 20  *       of conditions and the following disclaimer in the documentation and/or other materials
+ 21  *       provided with the distribution.
+ 22  * 
+ 23  * THIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ 24  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ 25  * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR
+ 26  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ 27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ 28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ 29  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ 30  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ 31  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ 32  * 
+ 33  * The views and conclusions contained in the software and documentation are those of the
+ 34  * authors and should not be interpreted as representing official policies, either expressed
+ 35  * or implied, of Gary Court or the JSON Schema specification.
+ 36  */
+ 37 
+ 38 /*jslint white: true, sub: true, onevar: true, undef: true, eqeqeq: true, newcap: true, immed: true, indent: 4 */
+ 39 
+ 40 var exports = exports || this,
+ 41 	require = require || function () {
+ 42 		return exports;
+ 43 	};
+ 44 
+ 45 (function () {
+ 46 	
+ 47 	var URI = require("./uri/uri").URI,
+ 48 		O = {},
+ 49 		I2H = "0123456789abcdef".split(""),
+ 50 		mapArray, filterArray, searchArray,
+ 51 		
+ 52 		JSV;
+ 53 	
+ 54 	//
+ 55 	// Utility functions
+ 56 	//
+ 57 	
+ 58 	function typeOf(o) {
+ 59 		return o === undefined ? "undefined" : (o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase());
+ 60 	}
+ 61 	
+ 62 	/** @inner */
+ 63 	function F() {}
+ 64 	
+ 65 	function createObject(proto) {
+ 66 		F.prototype = proto || {};
+ 67 		return new F();
+ 68 	}
+ 69 	
+ 70 	function mapObject(obj, func, scope) {
+ 71 		var newObj = {}, key;
+ 72 		for (key in obj) {
+ 73 			if (obj[key] !== O[key]) {
+ 74 				newObj[key] = func.call(scope, obj[key], key, obj);
+ 75 			}
+ 76 		}
+ 77 		return newObj;
+ 78 	}
+ 79 	
+ 80 	/** @ignore */
+ 81 	mapArray = function (arr, func, scope) {
+ 82 		var x = 0, xl = arr.length, newArr = new Array(xl);
+ 83 		for (; x < xl; ++x) {
+ 84 			newArr[x] = func.call(scope, arr[x], x, arr);
+ 85 		}
+ 86 		return newArr;
+ 87 	};
+ 88 		
+ 89 	if (Array.prototype.map) {
+ 90 		/** @ignore */
+ 91 		mapArray = function (arr, func, scope) {
+ 92 			return Array.prototype.map.call(arr, func, scope);
+ 93 		};
+ 94 	}
+ 95 	
+ 96 	/** @ignore */
+ 97 	filterArray = function (arr, func, scope) {
+ 98 		var x = 0, xl = arr.length, newArr = [];
+ 99 		for (; x < xl; ++x) {
+100 			if (func.call(scope, arr[x], x, arr)) {
+101 				newArr[newArr.length] = arr[x];
+102 			}
+103 		}
+104 		return newArr;
+105 	};
+106 	
+107 	if (Array.prototype.filter) {
+108 		/** @ignore */
+109 		filterArray = function (arr, func, scope) {
+110 			return Array.prototype.filter.call(arr, func, scope);
+111 		};
+112 	}
+113 	
+114 	/** @ignore */
+115 	searchArray = function (arr, o) {
+116 		var x = 0, xl = arr.length;
+117 		for (; x < xl; ++x) {
+118 			if (arr[x] === o) {
+119 				return x;
+120 			}
+121 		}
+122 		return -1;
+123 	};
+124 	
+125 	if (Array.prototype.indexOf) {
+126 		/** @ignore */
+127 		searchArray = function (arr, o) {
+128 			return Array.prototype.indexOf.call(arr, o);
+129 		};
+130 	}
+131 	
+132 	function toArray(o) {
+133 		return o !== undefined && o !== null ? (o instanceof Array && !o.callee ? o : (typeof o.length !== "number" || o.split || o.setInterval || o.call ? [ o ] : Array.prototype.slice.call(o))) : [];
+134 	}
+135 	
+136 	function keys(o) {
+137 		var result = [], key;
+138 		
+139 		switch (typeOf(o)) {
+140 		case "object":
+141 			for (key in o) {
+142 				if (o[key] !== O[key]) {
+143 					result[result.length] = key;
+144 				}
+145 			}
+146 			break;
+147 		case "array":
+148 			for (key = o.length - 1; key >= 0; --key) {
+149 				result[key] = key;
+150 			}
+151 			break;
+152 		}
+153 		
+154 		return result;
+155 	}
+156 	
+157 	function pushUnique(arr, o) {
+158 		if (searchArray(arr, o) === -1) {
+159 			arr.push(o);
+160 		}
+161 		return arr;
+162 	}
+163 	
+164 	function popFirst(arr, o) {
+165 		var index = searchArray(arr, o);
+166 		if (index > -1) {
+167 			arr.splice(index, 1);
+168 		}
+169 		return arr;
+170 	}
+171 	
+172 	function randomUUID() {
+173 		return [
+174 			I2H[Math.floor(Math.random() * 0x10)],
+175 			I2H[Math.floor(Math.random() * 0x10)],
+176 			I2H[Math.floor(Math.random() * 0x10)],
+177 			I2H[Math.floor(Math.random() * 0x10)],
+178 			I2H[Math.floor(Math.random() * 0x10)],
+179 			I2H[Math.floor(Math.random() * 0x10)],
+180 			I2H[Math.floor(Math.random() * 0x10)],
+181 			I2H[Math.floor(Math.random() * 0x10)],
+182 			"-",
+183 			I2H[Math.floor(Math.random() * 0x10)],
+184 			I2H[Math.floor(Math.random() * 0x10)],
+185 			I2H[Math.floor(Math.random() * 0x10)],
+186 			I2H[Math.floor(Math.random() * 0x10)],
+187 			"-4",  //set 4 high bits of time_high field to version
+188 			I2H[Math.floor(Math.random() * 0x10)],
+189 			I2H[Math.floor(Math.random() * 0x10)],
+190 			I2H[Math.floor(Math.random() * 0x10)],
+191 			"-",
+192 			I2H[(Math.floor(Math.random() * 0x10) & 0x3) | 0x8],  //specify 2 high bits of clock sequence
+193 			I2H[Math.floor(Math.random() * 0x10)],
+194 			I2H[Math.floor(Math.random() * 0x10)],
+195 			I2H[Math.floor(Math.random() * 0x10)],
+196 			"-",
+197 			I2H[Math.floor(Math.random() * 0x10)],
+198 			I2H[Math.floor(Math.random() * 0x10)],
+199 			I2H[Math.floor(Math.random() * 0x10)],
+200 			I2H[Math.floor(Math.random() * 0x10)],
+201 			I2H[Math.floor(Math.random() * 0x10)],
+202 			I2H[Math.floor(Math.random() * 0x10)],
+203 			I2H[Math.floor(Math.random() * 0x10)],
+204 			I2H[Math.floor(Math.random() * 0x10)],
+205 			I2H[Math.floor(Math.random() * 0x10)],
+206 			I2H[Math.floor(Math.random() * 0x10)],
+207 			I2H[Math.floor(Math.random() * 0x10)],
+208 			I2H[Math.floor(Math.random() * 0x10)]
+209 		].join("");
+210 	}
+211 	
+212 	function escapeURIComponent(str) {
+213 		return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A');
+214 	}
+215 	
+216 	function formatURI(uri) {
+217 		if (typeof uri === "string" && uri.indexOf("#") === -1) {
+218 			uri += "#";
+219 		}
+220 		return uri;
+221 	}
+222 	
+223 	function stripInstances(o) {
+224 		if (o instanceof JSONInstance) {
+225 			return o.getURI();
+226 		}
+227 		
+228 		switch (typeOf(o)) {
+229 		case "undefined":
+230 		case "null":
+231 		case "boolean":
+232 		case "number":
+233 		case "string":
+234 			return o;  //do nothing
+235 		
+236 		case "object":
+237 			return mapObject(o, stripInstances);
+238 		
+239 		case "array":
+240 			return mapArray(o, stripInstances);
+241 		
+242 		default:
+243 			return o.toString();
+244 		}
+245 	}
+246 	
+247 	/**
+248 	 * The exception that is thrown when a schema fails to be created.
+249 	 * 
+250 	 * @name InitializationError
+251 	 * @class
+252 	 * @param {JSONInstance|String} instance The instance (or instance URI) that is invalid
+253 	 * @param {JSONSchema|String} schema The schema (or schema URI) that was validating the instance
+254 	 * @param {String} attr The attribute that failed to validated
+255 	 * @param {String} message A user-friendly message on why the schema attribute failed to validate the instance
+256 	 * @param {Any} details The value of the schema attribute
+257 	 */
+258 	
+259 	function InitializationError(instance, schema, attr, message, details) {
+260 		Error.call(this, message);
+261 		
+262 		this.uri = instance instanceof JSONInstance ? instance.getURI() : instance;
+263 		this.schemaUri = schema instanceof JSONInstance ? schema.getURI() : schema;
+264 		this.attribute = attr;
+265 		this.message = message;
+266 		this.description = message;  //IE
+267 		this.details = details;
+268 	}
+269 	
+270 	InitializationError.prototype = new Error();
+271 	InitializationError.prototype.constructor = InitializationError;
+272 	InitializationError.prototype.name = "InitializationError";
+273 	
+274 	/**
+275 	 * Defines an error, found by a schema, with an instance.
+276 	 * This class can only be instantiated by {@link Report#addError}. 
+277 	 * 
+278 	 * @name ValidationError
+279 	 * @class
+280 	 * @see Report#addError
+281 	 */
+282 	
+283 	/**
+284 	 * The URI of the instance that has the error.
+285 	 * 
+286 	 * @name ValidationError.prototype.uri
+287 	 * @type String
+288 	 */
+289 	
+290 	/**
+291 	 * The URI of the schema that generated the error.
+292 	 * 
+293 	 * @name ValidationError.prototype.schemaUri
+294 	 * @type String
+295 	 */
+296 	
+297 	/**
+298 	 * The name of the schema attribute that generated the error.
+299 	 * 
+300 	 * @name ValidationError.prototype.attribute
+301 	 * @type String
+302 	 */
+303 	
+304 	/**
+305 	 * An user-friendly (English) message about what failed to validate.
+306 	 * 
+307 	 * @name ValidationError.prototype.message
+308 	 * @type String
+309 	 */
+310 	
+311 	/**
+312 	 * The value of the schema attribute that generated the error.
+313 	 * 
+314 	 * @name ValidationError.prototype.details
+315 	 * @type Any
+316 	 */
+317 	
+318 	/**
+319 	 * Reports are returned from validation methods to describe the result of a validation.
+320 	 * 
+321 	 * @name Report
+322 	 * @class
+323 	 * @see JSONSchema#validate
+324 	 * @see Environment#validate
+325 	 */
+326 	
+327 	function Report() {
+328 		/**
+329 		 * An array of {@link ValidationError} objects that define all the errors generated by the schema against the instance.
+330 		 * 
+331 		 * @name Report.prototype.errors
+332 		 * @type Array
+333 		 * @see Report#addError
+334 		 */
+335 		this.errors = [];
+336 		
+337 		/**
+338 		 * A hash table of every instance and what schemas were validated against it.
+339 		 * <p>
+340 		 * The key of each item in the table is the URI of the instance that was validated.
+341 		 * The value of this key is an array of strings of URIs of the schema that validated it.
+342 		 * </p>
+343 		 * 
+344 		 * @name Report.prototype.validated
+345 		 * @type Object
+346 		 * @see Report#registerValidation
+347 		 * @see Report#isValidatedBy
+348 		 */
+349 		this.validated = {};
+350 		
+351 		/**
+352 		 * If the report is generated by {@link Environment#validate}, this field is the generated instance.
+353 		 * 
+354 		 * @name Report.prototype.instance
+355 		 * @type JSONInstance
+356 		 * @see Environment#validate
+357 		 */
+358 		
+359 		/**
+360 		 * If the report is generated by {@link Environment#validate}, this field is the generated schema.
+361 		 * 
+362 		 * @name Report.prototype.schema
+363 		 * @type JSONSchema
+364 		 * @see Environment#validate
+365 		 */
+366 		 
+367 		/**
+368 		 * If the report is generated by {@link Environment#validate}, this field is the schema's schema.
+369 		 * This value is the same as calling <code>schema.getSchema()</code>.
+370 		 * 
+371 		 * @name Report.prototype.schemaSchema
+372 		 * @type JSONSchema
+373 		 * @see Environment#validate
+374 		 * @see JSONSchema#getSchema
+375 		 */
+376 	}
+377 	
+378 	/**
+379 	 * Adds a {@link ValidationError} object to the <a href="#errors"><code>errors</code></a> field.
+380 	 * 
+381 	 * @param {JSONInstance|String} instance The instance (or instance URI) that is invalid
+382 	 * @param {JSONSchema|String} schema The schema (or schema URI) that was validating the instance
+383 	 * @param {String} attr The attribute that failed to validated
+384 	 * @param {String} message A user-friendly message on why the schema attribute failed to validate the instance
+385 	 * @param {Any} details The value of the schema attribute
+386 	 */
+387 	
+388 	Report.prototype.addError = function (instance, schema, attr, message, details) {
+389 		this.errors.push({
+390 			uri : instance instanceof JSONInstance ? instance.getURI() : instance,
+391 			schemaUri : schema instanceof JSONInstance ? schema.getURI() : schema,
+392 			attribute : attr,
+393 			message : message,
+394 			details : stripInstances(details)
+395 		});
+396 	};
+397 	
+398 	/**
+399 	 * Registers that the provided instance URI has been validated by the provided schema URI. 
+400 	 * This is recorded in the <a href="#validated"><code>validated</code></a> field.
+401 	 * 
+402 	 * @param {String} uri The URI of the instance that was validated
+403 	 * @param {String} schemaUri The URI of the schema that validated the instance
+404 	 */
+405 	
+406 	Report.prototype.registerValidation = function (uri, schemaUri) {
+407 		if (!this.validated[uri]) {
+408 			this.validated[uri] = [ schemaUri ];
+409 		} else {
+410 			this.validated[uri].push(schemaUri);
+411 		}
+412 	};
+413 	
+414 	/**
+415 	 * Returns if an instance with the provided URI has been validated by the schema with the provided URI. 
+416 	 * 
+417 	 * @param {String} uri The URI of the instance
+418 	 * @param {String} schemaUri The URI of a schema
+419 	 * @returns {Boolean} If the instance has been validated by the schema.
+420 	 */
+421 	
+422 	Report.prototype.isValidatedBy = function (uri, schemaUri) {
+423 		return !!this.validated[uri] && searchArray(this.validated[uri], schemaUri) !== -1;
+424 	};
+425 	
+426 	/**
+427 	 * A wrapper class for binding an Environment, URI and helper methods to an instance. 
+428 	 * This class is most commonly instantiated with {@link Environment#createInstance}.
+429 	 * 
+430 	 * @name JSONInstance
+431 	 * @class
+432 	 * @param {Environment} env The environment this instance belongs to
+433 	 * @param {JSONInstance|Any} json The value of the instance
+434 	 * @param {String} [uri] The URI of the instance. If undefined, the URI will be a randomly generated UUID. 
+435 	 * @param {String} [fd] The fragment delimiter for properties. If undefined, uses the environment default.
+436 	 */
+437 	
+438 	function JSONInstance(env, json, uri, fd) {
+439 		if (json instanceof JSONInstance) {
+440 			if (typeof fd !== "string") {
+441 				fd = json._fd;
+442 			}
+443 			if (typeof uri !== "string") {
+444 				uri = json._uri;
+445 			}
+446 			json = json._value;
+447 		}
+448 		
+449 		if (typeof uri !== "string") {
+450 			uri = "urn:uuid:" + randomUUID() + "#";
+451 		} else if (uri.indexOf(":") === -1) {
+452 			uri = formatURI(URI.resolve("urn:uuid:" + randomUUID() + "#", uri));
+453 		}
+454 		
+455 		this._env = env;
+456 		this._value = json;
+457 		this._uri = uri;
+458 		this._fd = fd || this._env._options["defaultFragmentDelimiter"];
+459 	}
+460 	
+461 	/**
+462 	 * Returns the environment the instance is bound to.
+463 	 * 
+464 	 * @returns {Environment} The environment of the instance
+465 	 */
+466 	
+467 	JSONInstance.prototype.getEnvironment = function () {
+468 		return this._env;
+469 	};
+470 	
+471 	/**
+472 	 * Returns the name of the type of the instance.
+473 	 * 
+474 	 * @returns {String} The name of the type of the instance
+475 	 */
+476 	
+477 	JSONInstance.prototype.getType = function () {
+478 		return typeOf(this._value);
+479 	};
+480 	
+481 	/**
+482 	 * Returns the JSON value of the instance.
+483 	 * 
+484 	 * @returns {Any} The actual JavaScript value of the instance
+485 	 */
+486 	
+487 	JSONInstance.prototype.getValue = function () {
+488 		return this._value;
+489 	};
+490 	
+491 	/**
+492 	 * Returns the URI of the instance.
+493 	 * 
+494 	 * @returns {String} The URI of the instance
+495 	 */
+496 	
+497 	JSONInstance.prototype.getURI = function () {
+498 		return this._uri;
+499 	};
+500 	
+501 	/**
+502 	 * Returns a resolved URI of a provided relative URI against the URI of the instance.
+503 	 * 
+504 	 * @param {String} uri The relative URI to resolve
+505 	 * @returns {String} The resolved URI
+506 	 */
+507 	
+508 	JSONInstance.prototype.resolveURI = function (uri) {
+509 		return formatURI(URI.resolve(this._uri, uri));
+510 	};
+511 	
+512 	/**
+513 	 * Returns an array of the names of all the properties.
+514 	 * 
+515 	 * @returns {Array} An array of strings which are the names of all the properties
+516 	 */
+517 	
+518 	JSONInstance.prototype.getPropertyNames = function () {
+519 		return keys(this._value);
+520 	};
+521 	
+522 	/**
+523 	 * Returns a {@link JSONInstance} of the value of the provided property name. 
+524 	 * 
+525 	 * @param {String} key The name of the property to fetch
+526 	 * @returns {JSONInstance} The instance of the property value
+527 	 */
+528 	
+529 	JSONInstance.prototype.getProperty = function (key) {
+530 		var value = this._value ? this._value[key] : undefined;
+531 		if (value instanceof JSONInstance) {
+532 			return value;
+533 		}
+534 		//else
+535 		return new JSONInstance(this._env, value, this._uri + this._fd + escapeURIComponent(key), this._fd);
+536 	};
+537 	
+538 	/**
+539 	 * Returns all the property instances of the target instance.
+540 	 * <p>
+541 	 * If the target instance is an Object, then the method will return a hash table of {@link JSONInstance}s of all the properties. 
+542 	 * If the target instance is an Array, then the method will return an array of {@link JSONInstance}s of all the items.
+543 	 * </p> 
+544 	 * 
+545 	 * @returns {Object|Array|undefined} The list of instances for all the properties
+546 	 */
+547 	
+548 	JSONInstance.prototype.getProperties = function () {
+549 		var type = typeOf(this._value),
+550 			self = this;
+551 		
+552 		if (type === "object") {
+553 			return mapObject(this._value, function (value, key) {
+554 				if (value instanceof JSONInstance) {
+555 					return value;
+556 				}
+557 				return new JSONInstance(self._env, value, self._uri + self._fd + escapeURIComponent(key), self._fd);
+558 			});
+559 		} else if (type === "array") {
+560 			return mapArray(this._value, function (value, key) {
+561 				if (value instanceof JSONInstance) {
+562 					return value;
+563 				}
+564 				return new JSONInstance(self._env, value, self._uri + self._fd + escapeURIComponent(key), self._fd);
+565 			});
+566 		}
+567 	};
+568 	
+569 	/**
+570 	 * Returns the JSON value of the provided property name. 
+571 	 * This method is a faster version of calling <code>instance.getProperty(key).getValue()</code>.
+572 	 * 
+573 	 * @param {String} key The name of the property
+574 	 * @returns {Any} The JavaScript value of the instance
+575 	 * @see JSONInstance#getProperty
+576 	 * @see JSONInstance#getValue
+577 	 */
+578 	
+579 	JSONInstance.prototype.getValueOfProperty = function (key) {
+580 		if (this._value) {
+581 			if (this._value[key] instanceof JSONInstance) {
+582 				return this._value[key]._value;
+583 			}
+584 			return this._value[key];
+585 		}
+586 	};
+587 	
+588 	/**
+589 	 * Return if the provided value is the same as the value of the instance.
+590 	 * 
+591 	 * @param {JSONInstance|Any} instance The value to compare
+592 	 * @returns {Boolean} If both the instance and the value match
+593 	 */
+594 	
+595 	JSONInstance.prototype.equals = function (instance) {
+596 		if (instance instanceof JSONInstance) {
+597 			return this._value === instance._value;
+598 		}
+599 		//else
+600 		return this._value === instance;
+601 	};
+602 	
+603 	/**
+604 	 * Warning: Not a generic clone function
+605 	 * Produces a JSV acceptable clone
+606 	 */
+607 	
+608 	function clone(obj, deep) {
+609 		var newObj, x;
+610 		
+611 		if (obj instanceof JSONInstance) {
+612 			obj = obj.getValue();
+613 		}
+614 		
+615 		switch (typeOf(obj)) {
+616 		case "object":
+617 			if (deep) {
+618 				newObj = {};
+619 				for (x in obj) {
+620 					if (obj[x] !== O[x]) {
+621 						newObj[x] = clone(obj[x], deep);
+622 					}
+623 				}
+624 				return newObj;
+625 			} else {
+626 				return createObject(obj);
+627 			}
+628 			break;
+629 		case "array":
+630 			if (deep) {
+631 				newObj = new Array(obj.length);
+632 				x = obj.length;
+633 				while (--x >= 0) {
+634 					newObj[x] = clone(obj[x], deep);
+635 				}
+636 				return newObj;
+637 			} else {
+638 				return Array.prototype.slice.call(obj);
+639 			}
+640 			break;
+641 		default:
+642 			return obj;
+643 		}
+644 	}
+645 	
+646 	/**
+647 	 * This class binds a {@link JSONInstance} with a {@link JSONSchema} to provided context aware methods. 
+648 	 * 
+649 	 * @name JSONSchema
+650 	 * @class
+651 	 * @param {Environment} env The environment this schema belongs to
+652 	 * @param {JSONInstance|Any} json The value of the schema
+653 	 * @param {String} [uri] The URI of the schema. If undefined, the URI will be a randomly generated UUID. 
+654 	 * @param {JSONSchema|Boolean} [schema] The schema to bind to the instance. If <code>undefined</code>, the environment's default schema will be used. If <code>true</code>, the instance's schema will be itself.
+655 	 * @extends JSONInstance
+656 	 */
+657 	
+658 	function JSONSchema(env, json, uri, schema) {
+659 		var fr;
+660 		JSONInstance.call(this, env, json, uri);
+661 		
+662 		if (schema === true) {
+663 			this._schema = this;
+664 		} else if (json instanceof JSONSchema && !(schema instanceof JSONSchema)) {
+665 			this._schema = json._schema;  //TODO: Make sure cross environments don't mess everything up
+666 		} else {
+667 			this._schema = schema instanceof JSONSchema ? schema : this._env.getDefaultSchema() || this._env.createEmptySchema();
+668 		}
+669 		
+670 		//determine fragment delimiter from schema
+671 		fr = this._schema.getValueOfProperty("fragmentResolution");
+672 		if (fr === "dot-delimited") {
+673 			this._fd = ".";
+674 		} else if (fr === "slash-delimited") {
+675 			this._fd = "/";
+676 		}
+677 		
+678 		return this.rebuild();  //this works even when called with "new"
+679 	}
+680 	
+681 	JSONSchema.prototype = createObject(JSONInstance.prototype);
+682 	
+683 	/**
+684 	 * Returns the schema of the schema.
+685 	 * 
+686 	 * @returns {JSONSchema} The schema of the schema
+687 	 */
+688 	
+689 	JSONSchema.prototype.getSchema = function () {
+690 		var uri = this._refs && this._refs["describedby"],
+691 			newSchema;
+692 		
+693 		if (uri) {
+694 			newSchema = uri && this._env.findSchema(uri);
+695 			
+696 			if (newSchema) {
+697 				if (!newSchema.equals(this._schema)) {
+698 					this._schema = newSchema;
+699 					this.rebuild();  //if the schema has changed, the context has changed - so everything must be rebuilt
+700 				}
+701 			} else if (this._env._options["enforceReferences"]) {
+702 				throw new InitializationError(this, this._schema, "{describedby}", "Unknown schema reference", uri);
+703 			}
+704 		}
+705 		
+706 		return this._schema;
+707 	};
+708 	
+709 	/**
+710 	 * Returns the value of the provided attribute name.
+711 	 * <p>
+712 	 * This method is different from {@link JSONInstance#getProperty} as the named property 
+713 	 * is converted using a parser defined by the schema's schema before being returned. This
+714 	 * makes the return value of this method attribute dependent.
+715 	 * </p>
+716 	 * 
+717 	 * @param {String} key The name of the attribute
+718 	 * @param {Any} [arg] Some attribute parsers accept special arguments for returning resolved values. This is attribute dependent.
+719 	 * @returns {JSONSchema|Any} The value of the attribute
+720 	 */
+721 	
+722 	JSONSchema.prototype.getAttribute = function (key, arg) {
+723 		var schemaProperty, parser, property, result,
+724 			schema = this.getSchema();  //we do this here to make sure the "describedby" reference has not changed, and that the attribute cache is up-to-date
+725 		
+726 		if (!arg && this._attributes && this._attributes.hasOwnProperty(key)) {
+727 			return this._attributes[key];
+728 		}
+729 		
+730 		schemaProperty = schema.getProperty("properties").getProperty(key);
+731 		parser = schemaProperty.getValueOfProperty("parser");
+732 		property = this.getProperty(key);
+733 		if (typeof parser === "function") {
+734 			result = parser(property, schemaProperty, arg);
+735 			if (!arg && this._attributes) {
+736 				this._attributes[key] = result;
+737 			}
+738 			return result;
+739 		}
+740 		//else
+741 		return property.getValue();
+742 	};
+743 	
+744 	/**
+745 	 * Returns all the attributes of the schema.
+746 	 * 
+747 	 * @returns {Object} A map of all parsed attribute values
+748 	 */
+749 	
+750 	JSONSchema.prototype.getAttributes = function () {
+751 		var properties, schemaProperties, key, schemaProperty, parser,
+752 			schema = this.getSchema();  //we do this here to make sure the "describedby" reference has not changed, and that the attribute cache is up-to-date
+753 		
+754 		if (!this._attributes && this.getType() === "object") {
+755 			properties = this.getProperties();
+756 			schemaProperties = schema.getProperty("properties");
+757 			this._attributes = {};
+758 			for (key in properties) {
+759 				if (properties[key] !== O[key]) {
+760 					schemaProperty = schemaProperties && schemaProperties.getProperty(key);
+761 					parser = schemaProperty && schemaProperty.getValueOfProperty("parser");
+762 					if (typeof parser === "function") {
+763 						this._attributes[key] = parser(properties[key], schemaProperty);
+764 					} else {
+765 						this._attributes[key] = properties[key].getValue();
+766 					}
+767 				}
+768 			}
+769 		}
+770 		
+771 		return clone(this._attributes, false);
+772 	};
+773 	
+774 	/**
+775 	 * Convenience method for retrieving a link or link object from a schema. 
+776 	 * This method is the same as calling <code>schema.getAttribute("links", [rel, instance])[0];</code>.
+777 	 * 
+778 	 * @param {String} rel The link relationship
+779 	 * @param {JSONInstance} [instance] The instance to resolve any URIs from
+780 	 * @returns {String|Object|undefined} If <code>instance</code> is provided, a string containing the resolve URI of the link is returned.
+781 	 *   If <code>instance</code> is not provided, a link object is returned with details of the link.
+782 	 *   If no link with the provided relationship exists, <code>undefined</code> is returned.
+783 	 * @see JSONSchema#getAttribute
+784 	 */
+785 	
+786 	JSONSchema.prototype.getLink = function (rel, instance) {
+787 		var schemaLinks = this.getAttribute("links", [rel, instance]);
+788 		if (schemaLinks && schemaLinks.length && schemaLinks[schemaLinks.length - 1]) {
+789 			return schemaLinks[schemaLinks.length - 1];
+790 		}
+791 	};
+792 	
+793 	/**
+794 	 * Validates the provided instance against the target schema and returns a {@link Report}.
+795 	 * 
+796 	 * @param {JSONInstance|Any} instance The instance to validate; may be a {@link JSONInstance} or any JavaScript value
+797 	 * @param {Report} [report] A {@link Report} to concatenate the result of the validation to. If <code>undefined</code>, a new {@link Report} is created. 
+798 	 * @param {JSONInstance} [parent] The parent/containing instance of the provided instance
+799 	 * @param {JSONSchema} [parentSchema] The schema of the parent/containing instance
+800 	 * @param {String} [name] The name of the parent object's property that references the instance
+801 	 * @returns {Report} The result of the validation
+802 	 */
+803 	
+804 	JSONSchema.prototype.validate = function (instance, report, parent, parentSchema, name) {
+805 		var schemaSchema = this.getSchema(),
+806 			validator = schemaSchema.getValueOfProperty("validator");
+807 		
+808 		if (!(instance instanceof JSONInstance)) {
+809 			instance = this.getEnvironment().createInstance(instance);
+810 		}
+811 		
+812 		if (!(report instanceof Report)) {
+813 			report = new Report();
+814 		}
+815 		
+816 		if (this._env._options["validateReferences"] && this._refs) {
+817 			if (this._refs["describedby"] && !this._env.findSchema(this._refs["describedby"])) {
+818 				report.addError(this, this._schema, "{describedby}", "Unknown schema reference", this._refs["describedby"]);
+819 			}
+820 			if (this._refs["full"] && !this._env.findSchema(this._refs["full"])) {
+821 				report.addError(this, this._schema, "{full}", "Unknown schema reference", this._refs["full"]);
+822 			}
+823 		}
+824 		
+825 		if (typeof validator === "function" && !report.isValidatedBy(instance.getURI(), this.getURI())) {
+826 			report.registerValidation(instance.getURI(), this.getURI());
+827 			validator(instance, this, schemaSchema, report, parent, parentSchema, name);
+828 		}
+829 		
+830 		return report;
+831 	};
+832 	
+833 	/** @inner */
+834 	function createFullLookupWrapper(func) {
+835 		return /** @inner */ function fullLookupWrapper() {
+836 			var scope = this,
+837 				stack = [],
+838 				uri = scope._refs && scope._refs["full"],
+839 				schema;
+840 			
+841 			while (uri) {
+842 				schema = scope._env.findSchema(uri);
+843 				if (schema) {
+844 					if (schema._value === scope._value) {
+845 						break;
+846 					}
+847 					scope = schema;
+848 					stack.push(uri);
+849 					uri = scope._refs && scope._refs["full"];
+850 					if (stack.indexOf(uri) > -1) {
+851 						break;  //stop infinite loop
+852 					}
+853 				} else if (scope._env._options["enforceReferences"]) {
+854 					throw new InitializationError(scope, scope._schema, "{full}", "Unknown schema reference", uri);
+855 				} else {
+856 					uri = null;
+857 				}
+858 			}
+859 			return func.apply(scope, arguments);
+860 		};
+861 	}
+862 	
+863 	/**
+864 	 * Wraps all JSONInstance methods with a function that resolves the "full" reference.
+865 	 * 
+866 	 * @inner
+867 	 */
+868 	
+869 	(function () {
+870 		var key;
+871 		for (key in JSONSchema.prototype) {
+872 			if (JSONSchema.prototype[key] !== O[key] && typeOf(JSONSchema.prototype[key]) === "function") {
+873 				JSONSchema.prototype[key] = createFullLookupWrapper(JSONSchema.prototype[key]);
+874 			}
+875 		}
+876 	}());
+877 	
+878 	/**
+879 	 * Reinitializes/re-registers/rebuilds the schema.
+880 	 * <br/>
+881 	 * This is used internally, and should only be called when a schema's private variables are modified directly.
+882 	 * 
+883 	 * @private
+884 	 * @return {JSONSchema} The newly rebuilt schema
+885 	 */
+886 	
+887 	JSONSchema.prototype.rebuild = function () {
+888 		var instance = this,
+889 			initializer = instance.getSchema().getValueOfProperty("initializer");
+890 		
+891 		//clear previous built values
+892 		instance._refs = null;
+893 		instance._attributes = null;
+894 		
+895 		if (typeof initializer === "function") {
+896 			instance = initializer(instance);
+897 		}
+898 		
+899 		//register schema
+900 		instance._env._schemas[instance._uri] = instance;
+901 		
+902 		//build & cache the rest of the schema
+903 		instance.getAttributes();
+904 		
+905 		return instance;
+906 	};
+907 	
+908 	/**
+909 	 * Set the provided reference to the given value.
+910 	 * <br/>
+911 	 * References are used for establishing soft-links to other {@link JSONSchema}s.
+912 	 * Currently, the following references are natively supported:
+913 	 * <dl>
+914 	 *   <dt><code>full</code></dt>
+915 	 *   <dd>The value is the URI to the full instance of this instance.</dd>
+916 	 *   <dt><code>describedby</code></dt>
+917 	 *   <dd>The value is the URI to the schema of this instance.</dd>
+918 	 * </dl>
+919 	 * 
+920 	 * @param {String} name The name of the reference
+921 	 * @param {String} uri The URI of the schema to refer to
+922 	 */
+923 	
+924 	JSONSchema.prototype.setReference = function (name, uri) {
+925 		if (!this._refs) {
+926 			this._refs = {};
+927 		}
+928 		this._refs[name] = this.resolveURI(uri);
+929 	};
+930 	
+931 	/**
+932 	 * Returns the value of the provided reference name.
+933 	 * 
+934 	 * @param {String} name The name of the reference
+935 	 * @return {String} The value of the provided reference name
+936 	 */
+937 	
+938 	JSONSchema.prototype.getReference = function (name) {
+939 		return this._refs && this._refs[name];
+940 	};
+941 	
+942 	/**
+943 	 * Merges two schemas/instances together.
+944 	 */
+945 	
+946 	function inherits(base, extra, extension) {
+947 		var baseType = typeOf(base),
+948 			extraType = typeOf(extra),
+949 			child, x;
+950 		
+951 		if (extraType === "undefined") {
+952 			return clone(base, true);
+953 		} else if (baseType === "undefined" || extraType !== baseType) {
+954 			return clone(extra, true);
+955 		} else if (extraType === "object") {
+956 			if (base instanceof JSONSchema) {
+957 				base = base.getAttributes();
+958 			}
+959 			if (extra instanceof JSONSchema) {
+960 				extra = extra.getAttributes();
+961 				if (extra["extends"] && extension && extra["extends"] instanceof JSONSchema) {
+962 					extra["extends"] = [ extra["extends"] ];
+963 				}
+964 			}
+965 			child = clone(base, true);  //this could be optimized as some properties get overwritten
+966 			for (x in extra) {
+967 				if (extra[x] !== O[x]) {
+968 					child[x] = inherits(base[x], extra[x], extension);
+969 				}
+970 			}
+971 			return child;
+972 		} else {
+973 			return clone(extra, true);
+974 		}
+975 	}
+976 	
+977 	/**
+978 	 * An Environment is a sandbox of schemas thats behavior is different from other environments.
+979 	 * 
+980 	 * @name Environment
+981 	 * @class
+982 	 */
+983 	
+984 	function Environment() {
+985 		this._id = randomUUID();
+986 		this._schemas = {};
+987 		this._options = {};
+988 		
+989 		this.createSchema({}, true, "urn:jsv:empty-schema#");
+990 	}
+991 	
+992 	/**
+993 	 * Returns a clone of the target environment.
+994 	 * 
+995 	 * @returns {Environment} A new {@link Environment} that is a exact copy of the target environment 
+996 	 */
+997 	
+998 	Environment.prototype.clone = function () {
+999 		var env = new Environment();
+1000 		env._schemas = createObject(this._schemas);
+1001 		env._options = createObject(this._options);
+1002 		
+1003 		return env;
+1004 	};
+1005 	
+1006 	/**
+1007 	 * Returns a new {@link JSONInstance} of the provided data.
+1008 	 * 
+1009 	 * @param {JSONInstance|Any} data The value of the instance
+1010 	 * @param {String} [uri] The URI of the instance. If undefined, the URI will be a randomly generated UUID. 
+1011 	 * @returns {JSONInstance} A new {@link JSONInstance} from the provided data
+1012 	 */
+1013 	
+1014 	Environment.prototype.createInstance = function (data, uri) {
+1015 		uri = formatURI(uri);
+1016 		
+1017 		if (data instanceof JSONInstance && (!uri || data.getURI() === uri)) {
+1018 			return data;
+1019 		}
+1020 
+1021 		return new JSONInstance(this, data, uri);
+1022 	};
+1023 	
+1024 	/**
+1025 	 * Creates a new {@link JSONSchema} from the provided data, and registers it with the environment. 
+1026 	 * 
+1027 	 * @param {JSONInstance|Any} data The value of the schema
+1028 	 * @param {JSONSchema|Boolean} [schema] The schema to bind to the instance. If <code>undefined</code>, the environment's default schema will be used. If <code>true</code>, the instance's schema will be itself.
+1029 	 * @param {String} [uri] The URI of the schema. If undefined, the URI will be a randomly generated UUID. 
+1030 	 * @returns {JSONSchema} A new {@link JSONSchema} from the provided data
+1031 	 * @throws {InitializationError} If a schema that is not registered with the environment is referenced 
+1032 	 */
+1033 	
+1034 	Environment.prototype.createSchema = function (data, schema, uri) {
+1035 		uri = formatURI(uri);
+1036 		
+1037 		if (data instanceof JSONSchema && (!uri || data._uri === uri) && (!schema || data.getSchema().equals(schema))) {
+1038 			return data;
+1039 		}
+1040 		
+1041 		return new JSONSchema(this, data, uri, schema);
+1042 	};
+1043 	
+1044 	/**
+1045 	 * Creates an empty schema.
+1046 	 * 
+1047 	 * @returns {JSONSchema} The empty schema, who's schema is itself.
+1048 	 */
+1049 	
+1050 	Environment.prototype.createEmptySchema = function () {
+1051 		return this._schemas["urn:jsv:empty-schema#"];
+1052 	};
+1053 	
+1054 	/**
+1055 	 * Returns the schema registered with the provided URI.
+1056 	 * 
+1057 	 * @param {String} uri The absolute URI of the required schema
+1058 	 * @returns {JSONSchema|undefined} The request schema, or <code>undefined</code> if not found
+1059 	 */
+1060 	
+1061 	Environment.prototype.findSchema = function (uri) {
+1062 		return this._schemas[formatURI(uri)];
+1063 	};
+1064 	
+1065 	/**
+1066 	 * Sets the specified environment option to the specified value.
+1067 	 * 
+1068 	 * @param {String} name The name of the environment option to set
+1069 	 * @param {Any} value The new value of the environment option
+1070 	 */
+1071 	
+1072 	Environment.prototype.setOption = function (name, value) {
+1073 		this._options[name] = value;
+1074 	};
+1075 	
+1076 	/**
+1077 	 * Returns the specified environment option.
+1078 	 * 
+1079 	 * @param {String} name The name of the environment option to set
+1080 	 * @returns {Any} The value of the environment option
+1081 	 */
+1082 	
+1083 	Environment.prototype.getOption = function (name) {
+1084 		return this._options[name];
+1085 	};
+1086 	
+1087 	/**
+1088 	 * Sets the default fragment delimiter of the environment.
+1089 	 * 
+1090 	 * @deprecated Use {@link Environment#setOption} with option "defaultFragmentDelimiter"
+1091 	 * @param {String} fd The fragment delimiter character
+1092 	 */
+1093 	
+1094 	Environment.prototype.setDefaultFragmentDelimiter = function (fd) {
+1095 		if (typeof fd === "string" && fd.length > 0) {
+1096 			this._options["defaultFragmentDelimiter"] = fd;
+1097 		}
+1098 	};
+1099 	
+1100 	/**
+1101 	 * Returns the default fragment delimiter of the environment.
+1102 	 * 
+1103 	 * @deprecated Use {@link Environment#getOption} with option "defaultFragmentDelimiter"
+1104 	 * @returns {String} The fragment delimiter character
+1105 	 */
+1106 	
+1107 	Environment.prototype.getDefaultFragmentDelimiter = function () {
+1108 		return this._options["defaultFragmentDelimiter"];
+1109 	};
+1110 	
+1111 	/**
+1112 	 * Sets the URI of the default schema for the environment.
+1113 	 * 
+1114 	 * @deprecated Use {@link Environment#setOption} with option "defaultSchemaURI"
+1115 	 * @param {String} uri The default schema URI
+1116 	 */
+1117 	
+1118 	Environment.prototype.setDefaultSchemaURI = function (uri) {
+1119 		if (typeof uri === "string") {
+1120 			this._options["defaultSchemaURI"] = formatURI(uri);
+1121 		}
+1122 	};
+1123 	
+1124 	/**
+1125 	 * Returns the default schema of the environment.
+1126 	 * 
+1127 	 * @returns {JSONSchema} The default schema
+1128 	 */
+1129 	
+1130 	Environment.prototype.getDefaultSchema = function () {
+1131 		return this.findSchema(this._options["defaultSchemaURI"]);
+1132 	};
+1133 	
+1134 	/**
+1135 	 * Validates both the provided schema and the provided instance, and returns a {@link Report}. 
+1136 	 * If the schema fails to validate, the instance will not be validated.
+1137 	 * 
+1138 	 * @param {JSONInstance|Any} instanceJSON The {@link JSONInstance} or JavaScript value to validate.
+1139 	 * @param {JSONSchema|Any} schemaJSON The {@link JSONSchema} or JavaScript value to use in the validation. This will also be validated againt the schema's schema.
+1140 	 * @returns {Report} The result of the validation
+1141 	 */
+1142 	
+1143 	Environment.prototype.validate = function (instanceJSON, schemaJSON) {
+1144 		var instance,
+1145 			schema,
+1146 			schemaSchema,
+1147 			report = new Report();
+1148 		
+1149 		try {
+1150 			instance = this.createInstance(instanceJSON);
+1151 			report.instance = instance;
+1152 		} catch (e) {
+1153 			report.addError(e.uri, e.schemaUri, e.attribute, e.message, e.details);
+1154 		}
+1155 		
+1156 		try {
+1157 			schema = this.createSchema(schemaJSON);
+1158 			report.schema = schema;
+1159 			
+1160 			schemaSchema = schema.getSchema();
+1161 			report.schemaSchema = schemaSchema;
+1162 		} catch (f) {
+1163 			report.addError(f.uri, f.schemaUri, f.attribute, f.message, f.details);
+1164 		}
+1165 		
+1166 		if (schemaSchema) {
+1167 			schemaSchema.validate(schema, report);
+1168 		}
+1169 			
+1170 		if (report.errors.length) {
+1171 			return report;
+1172 		}
+1173 		
+1174 		return schema.validate(instance, report);
+1175 	};
+1176 	
+1177 	/**
+1178 	 * @private
+1179 	 */
+1180 	
+1181 	Environment.prototype._checkForInvalidInstances = function (stackSize, schemaURI) {
+1182 		var result = [],
+1183 			stack = [
+1184 				[schemaURI, this._schemas[schemaURI]]
+1185 			], 
+1186 			counter = 0,
+1187 			item, uri, instance, properties, key;
+1188 		
+1189 		while (counter++ < stackSize && stack.length) {
+1190 			item = stack.shift();
+1191 			uri = item[0];
+1192 			instance = item[1];
+1193 			
+1194 			if (instance instanceof JSONSchema) {
+1195 				if (this._schemas[instance._uri] !== instance) {
+1196 					result.push("Instance " + uri + " does not match " + instance._uri);
+1197 				} else {
+1198 					//schema = instance.getSchema();
+1199 					//stack.push([uri + "/{schema}", schema]);
+1200 					
+1201 					properties = instance.getAttributes();
+1202 					for (key in properties) {
+1203 						if (properties[key] !== O[key]) {
+1204 							stack.push([uri + "/" + escapeURIComponent(key), properties[key]]);
+1205 						}
+1206 					}
+1207 				}
+1208 			} else if (typeOf(instance) === "object") {
+1209 				properties = instance;
+1210 				for (key in properties) {
+1211 					if (properties.hasOwnProperty(key)) {
+1212 						stack.push([uri + "/" + escapeURIComponent(key), properties[key]]);
+1213 					}
+1214 				}
+1215 			} else if (typeOf(instance) === "array") {
+1216 				properties = instance;
+1217 				for (key = 0; key < properties.length; ++key) {
+1218 					stack.push([uri + "/" + escapeURIComponent(key), properties[key]]);
+1219 				}
+1220 			}
+1221 		}
+1222 		
+1223 		return result.length ? result : counter;
+1224 	};
+1225 	
+1226 	/**
+1227 	 * A globaly accessible object that provides the ability to create and manage {@link Environments},
+1228 	 * as well as providing utility methods.
+1229 	 * 
+1230 	 * @namespace
+1231 	 */
+1232 	
+1233 	JSV = {
+1234 		_environments : {},
+1235 		_defaultEnvironmentID : "",
+1236 		
+1237 		/**
+1238 		 * Returns if the provide value is an instance of {@link JSONInstance}.
+1239 		 * 
+1240 		 * @param o The value to test
+1241 		 * @returns {Boolean} If the provide value is an instance of {@link JSONInstance}
+1242 		 */
+1243 		
+1244 		isJSONInstance : function (o) {
+1245 			return o instanceof JSONInstance;
+1246 		},
+1247 		
+1248 		/**
+1249 		 * Returns if the provide value is an instance of {@link JSONSchema}.
+1250 		 * 
+1251 		 * @param o The value to test
+1252 		 * @returns {Boolean} If the provide value is an instance of {@link JSONSchema}
+1253 		 */
+1254 		
+1255 		isJSONSchema : function (o) {
+1256 			return o instanceof JSONSchema;
+1257 		},
+1258 		
+1259 		/**
+1260 		 * Creates and returns a new {@link Environment} that is a clone of the environment registered with the provided ID.
+1261 		 * If no environment ID is provided, the default environment is cloned.
+1262 		 * 
+1263 		 * @param {String} [id] The ID of the environment to clone. If <code>undefined</code>, the default environment ID is used.
+1264 		 * @returns {Environment} A newly cloned {@link Environment}
+1265 		 * @throws {Error} If there is no environment registered with the provided ID
+1266 		 */
+1267 		
+1268 		createEnvironment : function (id) {
+1269 			id = id || this._defaultEnvironmentID;
+1270 			
+1271 			if (!this._environments[id]) {
+1272 				throw new Error("Unknown Environment ID");
+1273 			}
+1274 			//else
+1275 			return this._environments[id].clone();
+1276 		},
+1277 		
+1278 		Environment : Environment,
+1279 		
+1280 		/**
+1281 		 * Registers the provided {@link Environment} with the provided ID.
+1282 		 * 
+1283 		 * @param {String} id The ID of the environment
+1284 		 * @param {Environment} env The environment to register
+1285 		 */
+1286 		
+1287 		registerEnvironment : function (id, env) {
+1288 			id = id || (env || 0)._id;
+1289 			if (id && !this._environments[id] && env instanceof Environment) {
+1290 				env._id = id;
+1291 				this._environments[id] = env;
+1292 			}
+1293 		},
+1294 		
+1295 		/**
+1296 		 * Sets which registered ID is the default environment.
+1297 		 * 
+1298 		 * @param {String} id The ID of the registered environment that is default
+1299 		 * @throws {Error} If there is no registered environment with the provided ID
+1300 		 */
+1301 		
+1302 		setDefaultEnvironmentID : function (id) {
+1303 			if (typeof id === "string") {
+1304 				if (!this._environments[id]) {
+1305 					throw new Error("Unknown Environment ID");
+1306 				}
+1307 				
+1308 				this._defaultEnvironmentID = id;
+1309 			}
+1310 		},
+1311 		
+1312 		/**
+1313 		 * Returns the ID of the default environment.
+1314 		 * 
+1315 		 * @returns {String} The ID of the default environment
+1316 		 */
+1317 		
+1318 		getDefaultEnvironmentID : function () {
+1319 			return this._defaultEnvironmentID;
+1320 		},
+1321 		
+1322 		//
+1323 		// Utility Functions
+1324 		//
+1325 		
+1326 		/**
+1327 		 * Returns the name of the type of the provided value.
+1328 		 *
+1329 		 * @event //utility
+1330 		 * @param {Any} o The value to determine the type of
+1331 		 * @returns {String} The name of the type of the value
+1332 		 */
+1333 		typeOf : typeOf,
+1334 		
+1335 		/**
+1336 		 * Return a new object that inherits all of the properties of the provided object.
+1337 		 *
+1338 		 * @event //utility
+1339 		 * @param {Object} proto The prototype of the new object
+1340 		 * @returns {Object} A new object that inherits all of the properties of the provided object
+1341 		 */
+1342 		createObject : createObject,
+1343 		
+1344 		/**
+1345 		 * Returns a new object with each property transformed by the iterator.
+1346 		 *
+1347 		 * @event //utility
+1348 		 * @param {Object} obj The object to transform
+1349 		 * @param {Function} iterator A function that returns the new value of the provided property
+1350 		 * @param {Object} [scope] The value of <code>this</code> in the iterator
+1351 		 * @returns {Object} A new object with each property transformed
+1352 		 */
+1353 		mapObject : mapObject,
+1354 		
+1355 		/**
+1356 		 * Returns a new array with each item transformed by the iterator.
+1357 		 * 
+1358 		 * @event //utility
+1359 		 * @param {Array} arr The array to transform
+1360 		 * @param {Function} iterator A function that returns the new value of the provided item
+1361 		 * @param {Object} scope The value of <code>this</code> in the iterator
+1362 		 * @returns {Array} A new array with each item transformed
+1363 		 */
+1364 		mapArray : mapArray,
+1365 		
+1366 		/**
+1367 		 * Returns a new array that only contains the items allowed by the iterator.
+1368 		 *
+1369 		 * @event //utility
+1370 		 * @param {Array} arr The array to filter
+1371 		 * @param {Function} iterator The function that returns true if the provided property should be added to the array
+1372 		 * @param {Object} scope The value of <code>this</code> within the iterator
+1373 		 * @returns {Array} A new array that contains the items allowed by the iterator
+1374 		 */
+1375 		filterArray : filterArray,
+1376 		
+1377 		/**
+1378 		 * Returns the first index in the array that the provided item is located at.
+1379 		 *
+1380 		 * @event //utility
+1381 		 * @param {Array} arr The array to search
+1382 		 * @param {Any} o The item being searched for
+1383 		 * @returns {Number} The index of the item in the array, or <code>-1</code> if not found
+1384 		 */
+1385 		searchArray : searchArray,
+1386 			
+1387 		/**
+1388 		 * Returns an array representation of a value.
+1389 		 * <ul>
+1390 		 * <li>For array-like objects, the value will be casted as an Array type.</li>
+1391 		 * <li>If an array is provided, the function will simply return the same array.</li>
+1392 		 * <li>For a null or undefined value, the result will be an empty Array.</li>
+1393 		 * <li>For all other values, the value will be the first element in a new Array. </li>
+1394 		 * </ul>
+1395 		 *
+1396 		 * @event //utility
+1397 		 * @param {Any} o The value to convert into an array
+1398 		 * @returns {Array} The value as an array
+1399 		 */
+1400 		toArray : toArray,
+1401 		
+1402 		/**
+1403 		 * Returns an array of the names of all properties of an object.
+1404 		 * 
+1405 		 * @event //utility
+1406 		 * @param {Object|Array} o The object in question
+1407 		 * @returns {Array} The names of all properties
+1408 		 */
+1409 		keys : keys,
+1410 		
+1411 		/**
+1412 		 * Mutates the array by pushing the provided value onto the array only if it is not already there.
+1413 		 *
+1414 		 * @event //utility
+1415 		 * @param {Array} arr The array to modify
+1416 		 * @param {Any} o The object to add to the array if it is not already there
+1417 		 * @returns {Array} The provided array for chaining
+1418 		 */
+1419 		pushUnique : pushUnique,
+1420 		
+1421 		/**
+1422 		 * Mutates the array by removing the first item that matches the provided value in the array.
+1423 		 *
+1424 		 * @event //utility
+1425 		 * @param {Array} arr The array to modify
+1426 		 * @param {Any} o The object to remove from the array
+1427 		 * @returns {Array} The provided array for chaining
+1428 		 */
+1429 		popFirst : popFirst,
+1430 		
+1431 		/**
+1432 		 * Creates a copy of the target object.
+1433 		 * <p>
+1434 		 * This method will create a new instance of the target, and then mixin the properties of the target.
+1435 		 * If <code>deep</code> is <code>true</code>, then each property will be cloned before mixin.
+1436 		 * </p>
+1437 		 * <p><b>Warning</b>: This is not a generic clone function, as it will only properly clone objects and arrays.</p>
+1438 		 * 
+1439 		 * @event //utility
+1440 		 * @param {Any} o The value to clone 
+1441 		 * @param {Boolean} [deep=false] If each property should be recursively cloned
+1442 		 * @returns A cloned copy of the provided value
+1443 		 */
+1444 		clone : clone,
+1445 		
+1446 		/**
+1447 		 * Generates a pseudo-random UUID.
+1448 		 * 
+1449 		 * @event //utility
+1450 		 * @returns {String} A new universally unique ID
+1451 		 */
+1452 		randomUUID : randomUUID,
+1453 		
+1454 		/**
+1455 		 * Properly escapes a URI component for embedding into a URI string.
+1456 		 * 
+1457 		 * @event //utility
+1458 		 * @param {String} str The URI component to escape
+1459 		 * @returns {String} The escaped URI component
+1460 		 */
+1461 		escapeURIComponent : escapeURIComponent,
+1462 		
+1463 		/**
+1464 		 * Returns a URI that is formated for JSV. Currently, this only ensures that the URI ends with a hash tag (<code>#</code>).
+1465 		 * 
+1466 		 * @event //utility
+1467 		 * @param {String} uri The URI to format
+1468 		 * @returns {String} The URI formatted for JSV
+1469 		 */
+1470 		formatURI : formatURI,
+1471 		
+1472 		/**
+1473 		 * Merges two schemas/instance together.
+1474 		 * 
+1475 		 * @event //utility
+1476 		 * @param {JSONSchema|Any} base The old value to merge
+1477 		 * @param {JSONSchema|Any} extra The new value to merge
+1478 		 * @param {Boolean} extension If the merge is a JSON Schema extension
+1479 		 * @return {Any} The modified base value
+1480 		 */
+1481 		 
+1482 		inherits : inherits,
+1483 		
+1484 		/**
+1485 		 * @private
+1486 		 * @event //utility
+1487 		 */
+1488 		
+1489 		InitializationError : InitializationError
+1490 	};
+1491 	
+1492 	this.JSV = JSV;  //set global object
+1493 	exports.JSV = JSV;  //export to CommonJS
+1494 	
+1495 	require("./environments");  //load default environments
+1496 	
+1497 }());
\ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/examples/index.html b/html/RentForCamp/node_modules/JSV/examples/index.html new file mode 100644 index 0000000..752ab66 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/examples/index.html @@ -0,0 +1,260 @@ + + + + JSV: JSON Schema Validator + + + +
+

JSV: JSON Schema Validator

+

+
+ +
+
+
+
+ + +
+
+
+ +
+
+
+ Input + + + + +
+
+ +
+
+ Schema + + + + +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/README.txt b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/README.txt new file mode 100644 index 0000000..3782da8 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/README.txt @@ -0,0 +1,183 @@ +====================================================================== + +DESCRIPTION: + +This is the source code for JsDoc Toolkit, an automatic documentation +generation tool for JavaScript. It is written in JavaScript and is run +from a command line (or terminal) using Java and Mozilla's Rhino +JavaScript runtime engine. + +Using this tool you can automatically turn JavaDoc-like comments in +your JavaScript source code into published output files, such as HTML +or XML. + +For more information, to report a bug, or to browse the technical +documentation for this tool please visit the official JsDoc Toolkit +project homepage at http://code.google.com/p/jsdoc-toolkit/ + +For the most up-to-date documentation on JsDoc Toolkit see the +official wiki at http://code.google.com/p/jsdoc-toolkit/w/list + +====================================================================== + +REQUIREMENTS: + +JsDoc Toolkit is known to work with: +java version "1.6.0_03" +Java(TM) SE Runtime Environment (build 1.6.0_03-b05) +on Windows XP, +and java version "1.5.0_19" +Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_19-b02-304) +on Mac OS X 10.5. + +Other versions of java may or may not work with JsDoc Toolkit. + +====================================================================== + +USAGE: + +Running JsDoc Toolkit requires you to have Java installed on your +computer. For more information see http://www.java.com/getjava/ + +Before running the JsDoc Toolkit app you should change your current +working directory to the jsdoc-toolkit folder. Then follow the +examples below, or as shown on the project wiki. + +On a computer running Windows a valid command line to run JsDoc +Toolkit might look like this: + +> java -jar jsrun.jar app\run.js -a -t=templates\jsdoc mycode.js + +On Mac OS X or Linux the same command would look like this: + +$ java -jar jsrun.jar app/run.js -a -t=templates/jsdoc mycode.js + +The above assumes your current working directory contains jsrun.jar, +the "app" and "templates" subdirectories from the standard JsDoc +Toolkit distribution and that the relative path to the code you wish +to document is "mycode.js". + +The output documentation files will be saved to a new directory named +"out" (by default) in the current directory, or if you specify a +-d=somewhere_else option, to the somewhere_else directory. + +For help (usage notes) enter this on the command line: + +$ java -jar jsrun.jar app/run.js --help + +More information about the various command line options used by JsDoc +Toolkit are available on the project wiki. + +====================================================================== + +RUNNING VIA SHELL SCRIPT + +Avi Deitcher has contributed the file jsrun.sh with the following usage notes: + +A script to simplify running jsdoc from the command-line, especially when +running from within a development or build environment such as ant. + +Normally, to run jsdoc, you need a command-line as the following: +java -Djsdoc.dir=/some/long/dir/path/to/jsdoc -jar +/some/long/dir/path/to/jsdoc/jsrun.jar /some/long/dir/path/to/jsdoc/app/run.js +-t=template -r=4 /some/long/dir/path/to/my/src/code + +This can get tedious to redo time and again, and difficult to use from within a build environment. + +To simplify the process, jsrun.sh will automatically run this path, as well as passing through any arguments. + +Usage: jsrun.sh + +All will be passed through. +Additionally, jsrun.sh will take the following actions: +1) If the environment variable JSDOCDIR is set, it will add +"-Djsdoc.dir=$JSDOCDIR" to the command-line +2) If the environment variable JSDOCTEMPLATEDIR is set, it will add +"-Djsdoc.template.dir=$JSDOCTEMPLATEDIR" to the command-line +3) java with the appropriate path to jsrun.jar and run.js will be instantiated + +If not variables are set, it is assumed that the path to jsrun.jar and app/ is in the current working directory. + +Example: +# jsrun.sh ./src/ +Assuming JSDOCDIR=/some/path/to/my/jsdoc will cause the following command to +execute: +java -Djsdoc.dir=/some/path/to/my/jsdoc -jar /some/path/to/my/jsdoc/jsrun.jar +/some/path/to/my/jsdoc/app/run.js ./src/ + +====================================================================== + +TESTING: + +To run the suite of unit tests included with JsDoc Toolkit enter this +on the command line: + +$ java -jar jsrun.jar app/run.js -T + +To see a dump of the internal data structure that JsDoc Toolkit has +built from your source files use this command: + +$ java -jar jsrun.jar app/run.js mycode.js -Z + +====================================================================== + +LICENSE: + +JSDoc.pm + +This project is based on the JSDoc.pm tool, created by Michael +Mathews and Gabriel Reid. More information on JsDoc.pm can +be found on the JSDoc.pm homepage: http://jsdoc.sourceforge.net/ + +Complete documentation on JsDoc Toolkit can be found on the project +wiki at http://code.google.com/p/jsdoc-toolkit/w/list + +Rhino + +Rhino (JavaScript in Java) is open source and licensed by Mozilla +under the MPL 1.1 or later/GPL 2.0 or later licenses, the text of +which is available at http://www.mozilla.org/MPL/ + +You can obtain the source code for Rhino from the Mozilla web site at +http://www.mozilla.org/rhino/download.html + +JsDoc Toolkit is a larger work that uses the Rhino JavaScript engine +but is not derived from it in any way. The Rhino library is used +without modification and without any claims whatsoever. + +The Rhino Debugger + +You can obtain more information about the Rhino Debugger from the +Mozilla web site at http://www.mozilla.org/rhino/debugger.html + +JsDoc Toolkit is a larger work that uses the Rhino Debugger but +is not derived from it in any way. The Rhino Debugger is used +without modification and without any claims whatsoever. + +JsDoc Toolkit + +All code specific to JsDoc Toolkit are free, open source and licensed +for use under the X11/MIT License. + +JsDoc Toolkit is Copyright (c)2009 Michael Mathews + +This program is free software; you can redistribute it and/or +modify it under the terms below. + +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 must 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/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame.js new file mode 100644 index 0000000..1beb405 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame.js @@ -0,0 +1,33 @@ +IO.include("frame/Opt.js"); +IO.include("frame/Chain.js"); +IO.include("frame/Link.js"); +IO.include("frame/String.js"); +IO.include("frame/Hash.js"); +IO.include("frame/Namespace.js"); +//IO.include("frame/Reflection.js"); + +/** A few helper functions to make life a little easier. */ + +function defined(o) { + return (o !== undefined); +} + +function copy(o) { // todo check for circular refs + if (o == null || typeof(o) != 'object') return o; + var c = new o.constructor(); + for(var p in o) c[p] = copy(o[p]); + return c; +} + +function isUnique(arr) { + var l = arr.length; + for(var i = 0; i < l; i++ ) { + if (arr.lastIndexOf(arr[i]) > i) return false; + } + return true; +} + +/** Returns the given string with all regex meta characters backslashed. */ +RegExp.escapeMeta = function(str) { + return str.replace(/([$^\\\/()|?+*\[\]{}.-])/g, "\\$1"); +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Chain.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Chain.js new file mode 100644 index 0000000..506469d --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Chain.js @@ -0,0 +1,102 @@ +/**@constructor*/ +function ChainNode(object, link) { + this.value = object; + this.link = link; // describes this node's relationship to the previous node +} + +/**@constructor*/ +function Chain(valueLinks) { + this.nodes = []; + this.cursor = -1; + + if (valueLinks && valueLinks.length > 0) { + this.push(valueLinks[0], "//"); + for (var i = 1, l = valueLinks.length; i < l; i+=2) { + this.push(valueLinks[i+1], valueLinks[i]); + } + } +} + +Chain.prototype.push = function(o, link) { + if (this.nodes.length > 0 && link) this.nodes.push(new ChainNode(o, link)); + else this.nodes.push(new ChainNode(o)); +} + +Chain.prototype.unshift = function(o, link) { + if (this.nodes.length > 0 && link) this.nodes[0].link = link; + this.nodes.unshift(new ChainNode(o)); + this.cursor++; +} + +Chain.prototype.get = function() { + if (this.cursor < 0 || this.cursor > this.nodes.length-1) return null; + return this.nodes[this.cursor]; +} + +Chain.prototype.first = function() { + this.cursor = 0; + return this.get(); +} + +Chain.prototype.last = function() { + this.cursor = this.nodes.length-1; + return this.get(); +} + +Chain.prototype.next = function() { + this.cursor++; + return this.get(); +} + +Chain.prototype.prev = function() { + this.cursor--; + return this.get(); +} + +Chain.prototype.toString = function() { + var string = ""; + for (var i = 0, l = this.nodes.length; i < l; i++) { + if (this.nodes[i].link) string += " -("+this.nodes[i].link+")-> "; + string += this.nodes[i].value.toString(); + } + return string; +} + +Chain.prototype.joinLeft = function() { + var result = ""; + for (var i = 0, l = this.cursor; i < l; i++) { + if (result && this.nodes[i].link) result += this.nodes[i].link; + result += this.nodes[i].value.toString(); + } + return result; +} + + +/* USAGE: + +var path = "one/two/three.four/five-six"; +var pathChain = new Chain(path.split(/([\/.-])/)); +print(pathChain); + +var lineage = new Chain(); +lineage.push("Port"); +lineage.push("Les", "son"); +lineage.push("Dawn", "daughter"); +lineage.unshift("Purdie", "son"); + +print(lineage); + +// walk left +for (var node = lineage.last(); node !== null; node = lineage.prev()) { + print("< "+node.value); +} + +// walk right +var node = lineage.first() +while (node !== null) { + print(node.value); + node = lineage.next(); + if (node && node.link) print("had a "+node.link+" named"); +} + +*/ \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Dumper.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Dumper.js new file mode 100644 index 0000000..d8b007b --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Dumper.js @@ -0,0 +1,144 @@ +/** + * @class +
+This is a lightly modified version of Kevin Jones' JavaScript
+library Data.Dump. To download the original visit:
+    http://openjsan.org/doc/k/ke/kevinj/Data/Dump/
+
+AUTHORS
+
+The Data.Dump JavaScript module is written by Kevin Jones 
+(kevinj@cpan.org), based on Data::Dump by Gisle Aas (gisle@aas.no),
+based on Data::Dumper by Gurusamy Sarathy (gsar@umich.edu).
+
+COPYRIGHT
+
+Copyright 2007 Kevin Jones. Copyright 1998-2000,2003-2004 Gisle Aas.
+Copyright 1996-1998 Gurusamy Sarathy.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the Perl Artistic License
+
+See http://www.perl.com/perl/misc/Artistic.html
+
+ * @static + */ +Dumper = { + /** @param [...] The objects to dump. */ + dump: function () { + if (arguments.length > 1) + return this._dump(arguments); + else if (arguments.length == 1) + return this._dump(arguments[0]); + else + return "()"; + }, + + _dump: function (obj) { + if (typeof obj == 'undefined') return 'undefined'; + var out; + if (obj.serialize) { return obj.serialize(); } + var type = this._typeof(obj); + if (obj.circularReference) obj.circularReference++; + switch (type) { + case 'circular': + out = "{ //circularReference\n}"; + break; + case 'object': + var pairs = new Array; + + for (var prop in obj) { + if (prop != "circularReference" && obj.hasOwnProperty(prop)) { //hide inherited properties + pairs.push(prop + ': ' + this._dump(obj[prop])); + } + } + + out = '{' + this._format_list(pairs) + '}'; + break; + + case 'string': + for (var prop in Dumper.ESC) { + if (Dumper.ESC.hasOwnProperty(prop)) { + obj = obj.replace(prop, Dumper.ESC[prop]); + } + } + + // Escape UTF-8 Strings + if (obj.match(/^[\x00-\x7f]*$/)) { + out = '"' + obj.replace(/\"/g, "\\\"").replace(/([\n\r]+)/g, "\\$1") + '"'; + } + else { + out = "unescape('"+escape(obj)+"')"; + } + break; + + case 'array': + var elems = new Array; + + for (var i=0; i 60 ? '\n' : ' '; + return nl + list.join(',' + nl) + nl; + }, + + _typeof: function (obj) { + if (obj && obj.circularReference && obj.circularReference > 1) return 'circular'; + if (Array.prototype.isPrototypeOf(obj)) return 'array'; + if (Date.prototype.isPrototypeOf(obj)) return 'date'; + if (typeof obj.nodeType != 'undefined') return 'element'; + return typeof(obj); + }, + + _dump_dom: function (obj) { + return '"' + Dumper.nodeTypes[obj.nodeType] + '"'; + } +}; + +Dumper.ESC = { + "\t": "\\t", + "\n": "\\n", + "\f": "\\f" +}; + +Dumper.nodeTypes = { + 1: "ELEMENT_NODE", + 2: "ATTRIBUTE_NODE", + 3: "TEXT_NODE", + 4: "CDATA_SECTION_NODE", + 5: "ENTITY_REFERENCE_NODE", + 6: "ENTITY_NODE", + 7: "PROCESSING_INSTRUCTION_NODE", + 8: "COMMENT_NODE", + 9: "DOCUMENT_NODE", + 10: "DOCUMENT_TYPE_NODE", + 11: "DOCUMENT_FRAGMENT_NODE", + 12: "NOTATION_NODE" +}; \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Hash.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Hash.js new file mode 100644 index 0000000..62cfad6 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Hash.js @@ -0,0 +1,84 @@ +/** + @constructor + @example + var _index = new Hash(); + _index.set("a", "apple"); + _index.set("b", "blue"); + _index.set("c", "coffee"); + + for (var p = _index.first(); p; p = _index.next()) { + print(p.key+" is for "+p.value); + } + + */ +var Hash = function() { + this._map = {}; + this._keys = []; + this._vals = []; + this.reset(); +} + +Hash.prototype.set = function(k, v) { + if (k != "") { + this._keys.push(k); + this._map["="+k] = this._vals.length; + this._vals.push(v); + } +} + +Hash.prototype.replace = function(k, k2, v) { + if (k == k2) return; + + var offset = this._map["="+k]; + this._keys[offset] = k2; + if (typeof v != "undefined") this._vals[offset] = v; + this._map["="+k2] = offset; + delete(this._map["="+k]); +} + +Hash.prototype.drop = function(k) { + if (k != "") { + var offset = this._map["="+k]; + this._keys.splice(offset, 1); + this._vals.splice(offset, 1); + delete(this._map["="+k]); + for (var p in this._map) { + if (this._map[p] >= offset) this._map[p]--; + } + if (this._cursor >= offset && this._cursor > 0) this._cursor--; + } +} + +Hash.prototype.get = function(k) { + if (k != "") { + return this._vals[this._map["="+k]]; + } +} + +Hash.prototype.keys = function() { + return this._keys; +} + +Hash.prototype.hasKey = function(k) { + if (k != "") { + return (typeof this._map["="+k] != "undefined"); + } +} + +Hash.prototype.values = function() { + return this._vals; +} + +Hash.prototype.reset = function() { + this._cursor = 0; +} + +Hash.prototype.first = function() { + this.reset(); + return this.next(); +} + +Hash.prototype.next = function() { + if (this._cursor++ < this._keys.length) + return {key: this._keys[this._cursor-1], value: this._vals[this._cursor-1]}; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Link.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Link.js new file mode 100644 index 0000000..1e6241b --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Link.js @@ -0,0 +1,173 @@ +/** Handle the creation of HTML links to documented symbols. + @constructor +*/ +function Link() { + this.alias = ""; + this.src = ""; + this.file = ""; + this.text = ""; + this.innerName = ""; + this.classLink = false; + this.targetName = ""; + + this.target = function(targetName) { + if (defined(targetName)) this.targetName = targetName; + return this; + } + this.inner = function(inner) { + if (defined(inner)) this.innerName = inner; + return this; + } + this.withText = function(text) { + if (defined(text)) this.text = text; + return this; + } + this.toSrc = function(filename) { + if (defined(filename)) this.src = filename; + return this; + } + this.toSymbol = function(alias) { + if (defined(alias)) this.alias = new String(alias); + return this; + } + this.toClass = function(alias) { + this.classLink = true; + return this.toSymbol(alias); + } + this.toFile = function(file) { + if (defined(file)) this.file = file; + return this; + } + + this.toString = function() { + var linkString; + var thisLink = this; + + if (this.alias) { + linkString = this.alias.replace(/(^|[^a-z$0-9_#.:^-])([|a-z$0-9_#.:^-]+)($|[^a-z$0-9_#.:^-])/i, + function(match, prematch, symbolName, postmatch) { + var symbolNames = symbolName.split("|"); + var links = []; + for (var i = 0, l = symbolNames.length; i < l; i++) { + thisLink.alias = symbolNames[i]; + links.push(thisLink._makeSymbolLink(symbolNames[i])); + } + return prematch+links.join("|")+postmatch; + } + ); + } + else if (this.src) { + linkString = thisLink._makeSrcLink(this.src); + } + else if (this.file) { + linkString = thisLink._makeFileLink(this.file); + } + + return linkString; + } +} + +/** prefixed for hashes */ +Link.hashPrefix = ""; + +/** Appended to the front of relative link paths. */ +Link.base = ""; + +Link.symbolNameToLinkName = function(symbol) { + var linker = "", + ns = ""; + + if (symbol.isStatic) linker = "."; + else if (symbol.isInner) linker = "-"; + + if (symbol.isEvent && !/^event:/.test(symbol.name)) { + ns = "event:"; + } + return Link.hashPrefix+linker+ns+symbol.name; +} + +Link.getSymbol= function(alias) { + var symbol= Link.symbolSet.getSymbol(alias); + + if (symbol) + return symbol; + + if ('#'!==alias.charAt(0) || !Link.currentSymbol) + return null; + + // resolve relative name + var container= Link.currentSymbol; + + while (container) + { + symbol= Link.symbolSet.getSymbol(container.alias + alias); + if (symbol) + return symbol; + + // No superclass + if (!container.augments.length) + return null; + + container= Link.symbolSet.getSymbol(container.augments[0].desc); + } + + return null; +} + +/** Create a link to another symbol. */ +Link.prototype._makeSymbolLink = function(alias) { + var linkBase = Link.base+publish.conf.symbolsDir; + var linkTo = Link.getSymbol(alias); + var linkPath; + var target = (this.targetName)? " target=\""+this.targetName+"\"" : ""; + + // if there is no symbol by that name just return the name unaltered + if (!linkTo) + return this.text || alias; + + // it's a symbol in another file + else { + if (!linkTo.is("CONSTRUCTOR") && !linkTo.isNamespace) { // it's a method or property + linkPath= (Link.filemap) ? Link.filemap[linkTo.memberOf] : + escape(linkTo.memberOf) || "_global_"; + linkPath += publish.conf.ext + "#" + Link.symbolNameToLinkName(linkTo); + } + else { + linkPath = (Link.filemap)? Link.filemap[linkTo.alias] : escape(linkTo.alias); + linkPath += publish.conf.ext;// + (this.classLink? "":"#" + Link.hashPrefix + "constructor"); + } + linkPath = linkBase + linkPath + } + + var linkText= this.text || alias; + + var link = {linkPath: linkPath, linkText: linkText, linkInner: (this.innerName? "#"+this.innerName : "")}; + + if (typeof JSDOC.PluginManager != "undefined") { + JSDOC.PluginManager.run("onSymbolLink", link); + } + + return ""+link.linkText+""; +} + +/** Create a link to a source file. */ +Link.prototype._makeSrcLink = function(srcFilePath) { + var target = (this.targetName)? " target=\""+this.targetName+"\"" : ""; + + // transform filepath into a filename + var srcFile = srcFilePath.replace(/\.\.?[\\\/]/g, "").replace(/[:\\\/]/g, "_"); + var outFilePath = Link.base + publish.conf.srcDir + srcFile + publish.conf.ext; + + if (!this.text) this.text = FilePath.fileName(srcFilePath); + return ""+this.text+""; +} + +/** Create a link to a source file. */ +Link.prototype._makeFileLink = function(filePath) { + var target = (this.targetName)? " target=\""+this.targetName+"\"" : ""; + + var outFilePath = Link.base + filePath; + + if (!this.text) this.text = filePath; + return ""+this.text+""; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Namespace.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Namespace.js new file mode 100644 index 0000000..fa1e41d --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Namespace.js @@ -0,0 +1,10 @@ +_global_ = this; + +function Namespace(name, f) { + var n = name.split("."); + for (var o = _global_, i = 0, l = n.length; i < l; i++) { + o = o[n[i]] = o[n[i]] || {}; + } + + if (f) f(); +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Opt.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Opt.js new file mode 100644 index 0000000..352f159 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Opt.js @@ -0,0 +1,134 @@ +/** @namespace */ +Opt = { + /** + * Get commandline option values. + * @param {Array} args Commandline arguments. Like ["-a=xml", "-b", "--class=new", "--debug"] + * @param {object} optNames Map short names to long names. Like {a:"accept", b:"backtrace", c:"class", d:"debug"}. + * @return {object} Short names and values. Like {a:"xml", b:true, c:"new", d:true} + */ + get: function(args, optNames) { + var opt = {"_": []}; // the unnamed option allows multiple values + for (var i = 0; i < args.length; i++) { + var arg = new String(args[i]); + var name; + var value; + if (arg.charAt(0) == "-") { + if (arg.charAt(1) == "-") { // it's a longname like --foo + arg = arg.substring(2); + var m = arg.split("="); + name = m.shift(); + value = m.shift(); + if (typeof value == "undefined") value = true; + + for (var n in optNames) { // convert it to a shortname + if (name == optNames[n]) { + name = n; + } + } + } + else { // it's a shortname like -f + arg = arg.substring(1); + var m = arg.split("="); + name = m.shift(); + value = m.shift(); + if (typeof value == "undefined") value = true; + + for (var n in optNames) { // find the matching key + if (name == n || name+'[]' == n) { + name = n; + break; + } + } + } + if (name.match(/(.+)\[\]$/)) { // it's an array type like n[] + name = RegExp.$1; + if (!opt[name]) opt[name] = []; + } + + if (opt[name] && opt[name].push) { + opt[name].push(value); + } + else { + opt[name] = value; + } + } + else { // not associated with any optname + opt._.push(args[i]); + } + } + return opt; + } +} + +/*t: + plan(11, "Testing Opt."); + + is( + typeof Opt, + "object", + "Opt is an object." + ); + + is( + typeof Opt.get, + "function", + "Opt.get is a function." + ); + + var optNames = {a:"accept", b:"backtrace", c:"class", d:"debug", "e[]":"exceptions"}; + var t_options = Opt.get(["-a=xml", "-b", "--class=new", "--debug", "-e=one", "-e=two", "foo", "bar"], optNames); + + is( + t_options.a, + "xml", + "an option defined with a short name can be accessed by its short name." + ); + + is( + t_options.b, + true, + "an option defined with a short name and no value are true." + ); + + is( + t_options.c, + "new", + "an option defined with a long name can be accessed by its short name." + ); + + is( + t_options.d, + true, + "an option defined with a long name and no value are true." + ); + + is( + typeof t_options.e, + "object", + "an option that can accept multiple values is defined." + ); + + is( + t_options.e.length, + 2, + "an option that can accept multiple values can have more than one value." + ); + + is( + t_options.e[1], + "two", + "an option that can accept multiple values can be accessed as an array." + ); + + is( + typeof t_options._, + "object", + "the property '_' is defined for unnamed options." + ); + + is( + t_options._[0], + "foo", + "the property '_' can be accessed as an array." + ); + */ \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Reflection.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Reflection.js new file mode 100644 index 0000000..0968f1c --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/Reflection.js @@ -0,0 +1,26 @@ +/**@constructor*/ +function Reflection(obj) { + this.obj = obj; +} + +Reflection.prototype.getConstructorName = function() { + if (this.obj.constructor.name) return this.obj.constructor.name; + var src = this.obj.constructor.toSource(); + var name = src.substring(name.indexOf("function")+8, src.indexOf('(')).replace(/ /g,''); + return name; +} + +Reflection.prototype.getMethod = function(name) { + for (var p in this.obj) { + if (p == name && typeof(this.obj[p]) == "function") return this.obj[p]; + } + return null; +} + +Reflection.prototype.getParameterNames = function() { + var src = this.obj.toSource(); + src = src.substring( + src.indexOf("(", 8)+1, src.indexOf(")") + ); + return src.split(/, ?/); +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/String.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/String.js new file mode 100644 index 0000000..c183c27 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/frame/String.js @@ -0,0 +1,93 @@ +/** + @name String + @class Additions to the core string object. +*/ + +/** @author Steven Levithan, released as public domain. */ +String.prototype.trim = function() { + var str = this.replace(/^\s+/, ''); + for (var i = str.length - 1; i >= 0; i--) { + if (/\S/.test(str.charAt(i))) { + str = str.substring(0, i + 1); + break; + } + } + return str; +} +/*t: + plan(6, "Testing String.prototype.trim."); + + var s = " a bc ".trim(); + is(s, "a bc", "multiple spaces front and back are trimmed."); + + s = "a bc\n\n".trim(); + is(s, "a bc", "newlines only in back are trimmed."); + + s = "\ta bc".trim(); + is(s, "a bc", "tabs only in front are trimmed."); + + s = "\n \t".trim(); + is(s, "", "an all-space string is trimmed to empty."); + + s = "a b\nc".trim(); + is(s, "a b\nc", "a string with no spaces in front or back is trimmed to itself."); + + s = "".trim(); + is(s, "", "an empty string is trimmed to empty."); + +*/ + +String.prototype.balance = function(open, close) { + var i = 0; + while (this.charAt(i) != open) { + if (i == this.length) return [-1, -1]; + i++; + } + + var j = i+1; + var balance = 1; + while (j < this.length) { + if (this.charAt(j) == open) balance++; + if (this.charAt(j) == close) balance--; + if (balance == 0) break; + j++; + if (j == this.length) return [-1, -1]; + } + + return [i, j]; +} +/*t: + plan(16, "Testing String.prototype.balance."); + + var s = "{abc}".balance("{","}"); + is(s[0], 0, "opener in first is found."); + is(s[1], 4, "closer in last is found."); + + s = "ab{c}de".balance("{","}"); + is(s[0], 2, "opener in middle is found."); + is(s[1], 4, "closer in middle is found."); + + s = "a{b{c}de}f".balance("{","}"); + is(s[0], 1, "nested opener is found."); + is(s[1], 8, "nested closer is found."); + + s = "{}".balance("{","}"); + is(s[0], 0, "opener with no content is found."); + is(s[1], 1, "closer with no content is found."); + + s = "".balance("{","}"); + is(s[0], -1, "empty string opener is -1."); + is(s[1], -1, "empty string closer is -1."); + + s = "{abc".balance("{","}"); + is(s[0], -1, "opener with no closer returns -1."); + is(s[1], -1, "no closer returns -1."); + + s = "abc".balance("{","}"); + is(s[0], -1, "no opener or closer returns -1 for opener."); + is(s[1], -1, "no opener or closer returns -1 for closer."); + + s = "aX11/MIT License + * (See the accompanying README file for full details.) + */ + +/** + Yet another unit testing tool for JavaScript. + @author Michael Mathews micmath@gmail.com + @param {object} testCases Properties are testcase names, values are functions to execute as tests. +*/ +function testrun(testCases) { + var ran = 0; + for (t in testCases) { + var result = testCases[t](); + ran++; + } + + return testrun.reportOut+"-------------------------------\n"+((testrun.fails>0)? ":( Failed "+testrun.fails+"/" : ":) Passed all ")+testrun.count+" test"+((testrun.count == 1)? "":"s")+".\n"; +} + + +testrun.count = 0; +testrun.current = null; +testrun.passes = 0; +testrun.fails = 0; +testrun.reportOut = ""; + +/** @private */ +testrun.report = function(text) { + testrun.reportOut += text+"\n"; +} + +/** + Check if test evaluates to true. + @param {string} test To be evaluated. + @param {string} message Optional. To be displayed in the report. + @return {boolean} True if the string test evaluates to true. +*/ +ok = function(test, message) { + testrun.count++; + + var result; + try { + result = eval(test); + + if (result) { + testrun.passes++; + testrun.report(" OK "+testrun.count+" - "+((message != null)? message : "")); + } + else { + testrun.fails++; + testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : "")); + } + } + catch(e) { + testrun.fails++ + testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : "")); + + } +} + +/** + Check if test is same as expected. + @param {string} test To be evaluated. + @param {string} expected + @param {string} message Optional. To be displayed in the report. + @return {boolean} True if (test == expected). Note that the comparison is not a strict equality check. +*/ +is = function(test, expected, message) { + testrun.count++; + + var result; + try { + result = eval(test); + + if (result == expected) { + testrun.passes++ + testrun.report(" OK "+testrun.count+" - "+((message != null)? message : "")); + } + else { + testrun.fails++ + testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : "")); + testrun.report("expected: "+expected); + testrun.report(" got: "+result); + } + } + catch(e) { + testrun.fails++ + testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : "")); + testrun.report("expected: "+expected); + testrun.report(" got: "+result);} +} + +/** + Check if test matches pattern. + @param {string} test To be evaluated. + @param {string} pattern Used to create a RegExp. + @param {string} message Optional. To be displayed in the report. + @return {boolean} True if test matches pattern. +*/ +like = function(test, pattern, message) { + testrun.count++; + + var result; + try { + result = eval(test); + var rgx = new RegExp(pattern); + + if (rgx.test(result)) { + testrun.passes++ + testrun.report(" OK "+testrun.count+" - "+((message != null)? message : "")); + } + else { + testrun.fails++ + testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : "")); + testrun.report(" this: "+result); + testrun.report("is not like: "+pattern); + } + } + catch(e) { + testrun.fails++ + testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : "")); + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/FOODOC.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/FOODOC.js new file mode 100644 index 0000000..b208f55 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/FOODOC.js @@ -0,0 +1,26 @@ +/** + This is the main container for the FOODOC handler. + @namespace +*/ +FOODOC = { +}; + +/** The current version string of this application. */ +FOODOC.VERSION = "1.0"; + +FOODOC.handle = function(srcFile, src) { + LOG.inform("Handling file '" + srcFile + "'"); + + return [ + new JSDOC.Symbol( + "foo", + [], + "VIRTUAL", + new JSDOC.DocComment("/** This is a foo. */") + ) + ]; +}; + +FOODOC.publish = function(symbolgroup) { + LOG.inform("Publishing symbolgroup."); +}; diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC.js new file mode 100644 index 0000000..40f87b3 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC.js @@ -0,0 +1,26 @@ +/** + * This is the main container for the XMLDOC handler. + * @namespace + * @author Brett Fattori (bfattori@fry.com) + * @version $Revision: 498 $ + */ +XMLDOC = { + +}; + +/** The current version string of this application. */ +XMLDOC.VERSION = "1.0"; + +/** Include the library necessary to handle XML files */ +IO.includeDir("handlers/XMLDOC/"); + +/** + * @type Symbol[] + */ +XMLDOC.handle = function(srcFile, src) { + +}; + +XMLDOC.publish = function(symbolgroup) { + +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js new file mode 100644 index 0000000..240563d --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js @@ -0,0 +1,159 @@ +LOG.inform("XMLDOC.DomReader loaded"); + +XMLDOC.DomReader = function(root) { + + this.dom = root; + + /** + * The current node the reader is on + */ + this.node = root; + + /** + * Get the current node the reader is on + * @type XMLDOC.Parser.node + */ + XMLDOC.DomReader.prototype.getNode = function() { + return this.node; + }; + + /** + * Set the node the reader should be positioned on. + * @param node {XMLDOC.Parser.node} + */ + XMLDOC.DomReader.prototype.setNode = function(node) { + this.node = node; + }; + + /** + * A helper method to make sure the current node will + * never return null, unless null is passed as the root. + * @param step {String} An expression to evaluate - should return a node or null + */ + XMLDOC.DomReader.prototype.navigate = function(step) { + var n; + if ((n = step) != null) + { + this.node = n; + return this.node; + } + return null; + }; + + /** + * Get the root node of the current node's document. + */ + XMLDOC.DomReader.prototype.root = function() { + this.navigate(this.dom); + }; + + /** + * Get the parent of the current node. + */ + XMLDOC.DomReader.prototype.parent = function() { + return this.navigate(this.node.parentNode()); + }; + + /** + * Get the first child of the current node. + */ + XMLDOC.DomReader.prototype.firstChild = function() { + return this.navigate(this.node.firstChild()); + }; + + /** + * Get the last child of the current node. + */ + XMLDOC.DomReader.prototype.lastChild = function() { + return this.navigate(this.node.lastChild()); + }; + + /** + * Get the next sibling of the current node. + */ + XMLDOC.DomReader.prototype.nextSibling = function() { + return this.navigate(this.node.nextSibling()); + }; + + /** + * Get the previous sibling of the current node. + */ + XMLDOC.DomReader.prototype.prevSibling = function() { + return this.navigate(this.node.prevSibling()); + }; + + //=============================================================================================== + // Support methods + + /** + * Walk the tree starting with the current node, calling the plug-in for + * each node visited. Each time the plug-in is called, the DomReader + * is passed as the only parameter. Use the {@link XMLDOC.DomReader#getNode} method + * to access the current node. This method uses a depth first traversal pattern. + * + * @param srcFile {String} The source file being evaluated + */ + XMLDOC.DomReader.prototype.getSymbols = function(srcFile) + { + XMLDOC.DomReader.symbols = []; + XMLDOC.DomReader.currentFile = srcFile; + JSDOC.Symbol.srcFile = (srcFile || ""); + + if (defined(JSDOC.PluginManager)) { + JSDOC.PluginManager.run("onDomGetSymbols", this); + } + + return XMLDOC.DomReader.symbols; + }; + + /** + * Find the node with the given name using a depth first traversal. + * Does not modify the DomReader's current node. + * + * @param name {String} The name of the node to find + * @return the node that was found, or null if not found + */ + XMLDOC.DomReader.prototype.findNode = function(name) + { + var findNode = null; + + // Start at the current node and move into the subtree, + // looking for the node with the given name + function deeper(node, find) + { + var look = null; + + if (node) { + if (node.name == find) + { + return node; + } + + if (node.firstChild()) + { + look = deeper(node.firstChild(), find); + } + + if (!look && node.nextSibling()) + { + look = deeper(node.nextSibling(), find); + } + } + + return look; + } + + return deeper(this.getNode().firstChild(), name); + }; + + /** + * Find the next node with the given name using a depth first traversal. + * + * @param name {String} The name of the node to find + */ + XMLDOC.DomReader.prototype.findPreviousNode = function(name) + { + }; + +}; + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js new file mode 100644 index 0000000..e9b3e3c --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js @@ -0,0 +1,16 @@ +LOG.inform("XMLDOC.symbolize loaded"); + +/** + * Convert the source file to a set of symbols + */ +XMLDOC.symbolize = function(srcFile, src) { + + LOG.inform("Symbolizing file '" + srcFile + "'"); + + // XML files already have a defined structure, so we don't need to + // do anything but parse them. The DOM reader can create a symbol + // table from the parsed XML. + var dr = new XMLDOC.DomReader(XMLDOC.Parser.parse(src)); + return dr.getSymbols(srcFile); + +}; diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js new file mode 100644 index 0000000..78e8f45 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js @@ -0,0 +1,292 @@ +LOG.inform("XMLDOC.Parser loaded"); + +/** + * XML Parser object. Returns an {@link #XMLDOC.Parser.node} which is + * the root element of the parsed document. + *

+ * By default, this parser will only handle well formed XML. To + * allow the parser to handle HTML, set the XMLDOC.Parser.strictMode + * variable to false before calling XMLDOC.Parser.parse(). + *

+ * Note: If you pass poorly formed XML, it will cause the parser to throw + * an exception. + * + * @author Brett Fattori (bfattori@fry.com) + * @author $Author: micmath $ + * @version $Revision: 497 $ + */ +XMLDOC.Parser = {}; + +/** + * Strict mode setting. Setting this to false allows HTML-style source to + * be parsed. Normally, well formed XML has defined end tags, or empty tags + * are properly formed. Default: true + * @type Boolean + */ +XMLDOC.Parser.strictMode = true; + +/** + * A node in an XML Document. Node types are ROOT, ELEMENT, COMMENT, PI, and TEXT. + * @param parent {XMLDOC.Parser.node} The parent node + * @param name {String} The node name + * @param type {String} One of the types + */ +XMLDOC.Parser.node = function(parent, name, type) +{ + this.name = name; + this.type = type || "ELEMENT"; + this.parent = parent; + this.charData = ""; + this.attrs = {}; + this.nodes = []; + this.cPtr = 0; + + XMLDOC.Parser.node.prototype.getAttributeNames = function() { + var a = []; + for (var o in this.attrs) + { + a.push(o); + } + + return a; + }; + + XMLDOC.Parser.node.prototype.getAttribute = function(attr) { + return this.attrs[attr]; + }; + + XMLDOC.Parser.node.prototype.setAttribute = function(attr, val) { + this.attrs[attr] = val; + }; + + XMLDOC.Parser.node.prototype.getChild = function(idx) { + return this.nodes[idx]; + }; + + XMLDOC.Parser.node.prototype.parentNode = function() { + return this.parent; + }; + + XMLDOC.Parser.node.prototype.firstChild = function() { + return this.nodes[0]; + }; + + XMLDOC.Parser.node.prototype.lastChild = function() { + return this.nodes[this.nodes.length - 1]; + }; + + XMLDOC.Parser.node.prototype.nextSibling = function() { + var p = this.parent; + if (p && (p.nodes.indexOf(this) + 1 != p.nodes.length)) + { + return p.getChild(p.nodes.indexOf(this) + 1); + } + return null; + }; + + XMLDOC.Parser.node.prototype.prevSibling = function() { + var p = this.parent; + if (p && (p.nodes.indexOf(this) - 1 >= 0)) + { + return p.getChild(p.nodes.indexOf(this) - 1); + } + return null; + }; +}; + +/** + * Parse an XML Document from the specified source. The XML should be + * well formed, unless strict mode is disabled, then the parser will + * handle HTML-style XML documents. + * @param src {String} The source to parse + */ +XMLDOC.Parser.parse = function(src) +{ + var A = []; + + // Normailize whitespace + A = src.split("\r\n"); + src = A.join("\n"); + A = src.split("\r"); + src = A.join("\n"); + + // Remove XML and DOCTYPE specifier + src.replace(/<\?XML .*\?>/i, ""); + src.replace(//i, ""); + + // The document is the root node and cannot be modified or removed + var doc = new XMLDOC.Parser.node(null, "ROOT", "DOCUMENT"); + + // Let's break it down + XMLDOC.Parser.eat(doc, src); + + return doc; +}; + +/** + * The XML fragment processing routine. This method is private and should not be called + * directly. + * @param parentNode {XMLDOC.Parser.node} The node which is the parent of this fragment + * @param src {String} The source within the fragment to process + * @private + */ +XMLDOC.Parser.eat = function(parentNode, src) +{ + // A simple tag def + var reTag = new RegExp("<(!|)(\\?|--|)((.|\\s)*?)\\2>","g"); + + // Special tag types + var reCommentTag = //; + var rePITag = /<\?((.|\s)*?)\?>/; + + // A start tag (with potential empty marker) + var reStartTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*(\/)?>/; + + // An empty HTML style tag (not proper XML, but we'll accept it so we can process HTML) + var reHTMLEmptyTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*>/; + + // Fully enclosing tag with nested tags + var reEnclosingTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*?)\4)*>((.|\s)*?)<\/\1>/; + + // Breaks down attributes + var reAttributes = new RegExp(" +([\\w_\\-]*)=(\"|')(.*?)\\2","g"); + + // Find us a tag + var tag; + while ((tag = reTag.exec(src)) != null) + { + if (tag.index > 0) + { + // The next tag has some text before it + var text = src.substring(0, tag.index).replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1"); + + if (text.length > 0 && (text != "\n")) + { + var txtnode = new XMLDOC.Parser.node(parentNode, "", "TEXT"); + txtnode.charData = text; + + // Append the new text node + parentNode.nodes.push(txtnode); + } + + // Reset the lastIndex of reTag + reTag.lastIndex -= src.substring(0, tag.index).length; + + // Eat the text + src = src.substring(tag.index); + } + + if (reCommentTag.test(tag[0])) + { + // Is this a comment? + var comment = new XMLDOC.Parser.node(parentNode, "", "COMMENT"); + comment.charData = reCommentTag.exec(tag[0])[1]; + + // Append the comment + parentNode.nodes.push(comment); + + // Move the lastIndex of reTag + reTag.lastIndex -= tag[0].length; + + // Eat the tag + src = src.replace(reCommentTag, ""); + } + else if (rePITag.test(tag[0])) + { + // Is this a processing instruction? + var pi = new XMLDOC.Parser.node(parentNode, "", "PI"); + pi.charData = rePITag.exec(tag[0])[1]; + + // Append the processing instruction + parentNode.nodes.push(pi); + + // Move the lastIndex of reTag + reTag.lastIndex -= tag[0].length; + + // Eat the tag + src = src.replace(rePITag, ""); + } + else if (reStartTag.test(tag[0])) + { + // Break it down + var e = reStartTag.exec(tag[0]); + var elem = new XMLDOC.Parser.node(parentNode, e[1], "ELEMENT"); + + // Get attributes from the tag + var a; + while ((a = reAttributes.exec(e[2])) != null ) + { + elem.attrs[a[1]] = a[3]; + } + + // Is this an empty XML-style tag? + if (e[6] == "/") + { + // Append the empty element + parentNode.nodes.push(elem); + + // Move the lastIndex of reTag (include the start tag length) + reTag.lastIndex -= e[0].length; + + // Eat the tag + src = src.replace(reStartTag, ""); + } + else + { + // Check for malformed XML tags + var htmlParsed = false; + var htmlStartTag = reHTMLEmptyTag.exec(src); + + // See if there isn't an end tag within this block + var reHTMLEndTag = new RegExp(""); + var htmlEndTag = reHTMLEndTag.exec(src); + + if (XMLDOC.Parser.strictMode && htmlEndTag == null) + { + // Poorly formed XML fails in strict mode + var err = new Error("Malformed XML passed to XMLDOC.Parser... Error contains malformed 'src'"); + err.src = src; + throw err; + } + else if (htmlEndTag == null) + { + // This is an HTML-style empty tag, store the element for it in non-strict mode + parentNode.nodes.push(elem); + + // Eat the tag + src = src.replace(reHTMLEmptyTag, ""); + htmlParsed = true; + } + + // If we didn't parse HTML-style, it must be an enclosing tag + if (!htmlParsed) + { + var enc = reEnclosingTag.exec(src); + + // Go deeper into the document + XMLDOC.Parser.eat(elem, enc[6]); + + // Append the new element node + parentNode.nodes.push(elem); + + // Eat the tag + src = src.replace(reEnclosingTag, ""); + } + } + + // Reset the lastIndex of reTag + reTag.lastIndex = 0; + } + } + + // No tag was found... append the text if there is any + src = src.replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1"); + if (src.length > 0 && (src != "\n")) + { + var txtNode = new XMLDOC.Parser.node(parentNode, "", "TEXT"); + txtNode.charData = src; + + // Append the new text node + parentNode.nodes.push(txtNode); + } +}; diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC.js new file mode 100644 index 0000000..5de7b9e --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC.js @@ -0,0 +1,106 @@ +/** + @overview + @date $Date: 2010-06-13 22:02:44 +0100 (Sun, 13 Jun 2010) $ + @version $Revision: 837 $ + @location $HeadURL: https://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.4.0/jsdoc-toolkit/app/lib/JSDOC.js $ + @name JSDOC.js + */ + +/** + This is the main container for the JSDOC application. + @namespace +*/ +JSDOC = { +}; + +/** + @requires Opt + */ +if (typeof arguments == "undefined") arguments = []; +JSDOC.opt = Opt.get( + arguments, + { + a: "allfunctions", + c: "conf", + d: "directory", + "D[]": "define", + e: "encoding", + "E[]": "exclude", + h: "help", + m: "multiple", + n: "nocode", + o: "out", + p: "private", + q: "quiet", + r: "recurse", + S: "securemodules", + s: "suppress", + t: "template", + T: "testmode", + u: "unique", + v: "verbose", + x: "ext" + } +); + +/** The current version string of this application. */ +JSDOC.VERSION = "2.4.0"; + +/** Print out usage information and quit. */ +JSDOC.usage = function() { + print("USAGE: java -jar jsrun.jar app/run.js [OPTIONS] ..."); + print(""); + print("OPTIONS:"); + print(" -a or --allfunctions\n Include all functions, even undocumented ones.\n"); + print(" -c or --conf\n Load a configuration file.\n"); + print(" -d= or --directory=\n Output to this directory (defaults to \"out\").\n"); + print(" -D=\"myVar:My value\" or --define=\"myVar:My value\"\n Multiple. Define a variable, available in JsDoc as JSDOC.opt.D.myVar.\n"); + print(" -e= or --encoding=\n Use this encoding to read and write files.\n"); + print(" -E=\"REGEX\" or --exclude=\"REGEX\"\n Multiple. Exclude files based on the supplied regex.\n"); + print(" -h or --help\n Show this message and exit.\n"); + print(" -m or --multiples\n Don't warn about symbols being documented more than once.\n"); + print(" -n or --nocode\n Ignore all code, only document comments with @name tags.\n"); + print(" -o= or --out=\n Print log messages to a file (defaults to stdout).\n"); + print(" -p or --private\n Include symbols tagged as private, underscored and inner symbols.\n"); + print(" -q or --quiet\n Do not output any messages, not even warnings.\n"); + print(" -r= or --recurse=\n Descend into src directories.\n"); + print(" -s or --suppress\n Suppress source code output.\n"); + print(" -S or --securemodules\n Use Secure Modules mode to parse source code.\n"); + print(" -t= or --template=\n Required. Use this template to format the output.\n"); + print(" -T or --test\n Run all unit tests and exit.\n"); + print(" -u or --unique\n Force file names to be unique, but not based on symbol names.\n"); + print(" -v or --verbose\n Provide verbose feedback about what is happening.\n"); + print(" -x=[,EXT]... or --ext=[,EXT]...\n Scan source files with the given extension/s (defaults to js).\n"); + + quit(); +} + +/*t: + plan(4, "Testing JSDOC namespace."); + + is( + typeof JSDOC, + "object", + "JSDOC.usage is a function." + ); + + is( + typeof JSDOC.VERSION, + "string", + "JSDOC.VERSION is a string." + ); + + is( + typeof JSDOC.usage, + "function", + "JSDOC.usage is a function." + ); + + is( + typeof JSDOC.opt, + "object", + "JSDOC.opt is a object." + ); + */ + +if (this.IO) IO.includeDir("lib/JSDOC/"); diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocComment.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocComment.js new file mode 100644 index 0000000..4b21cd7 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocComment.js @@ -0,0 +1,204 @@ +if (typeof JSDOC == "undefined") JSDOC = {}; + +/** + Create a new DocComment. This takes a raw documentation comment, + and wraps it in useful accessors. + @class Represents a documentation comment object. + */ +JSDOC.DocComment = function(/**String*/comment) { + this.init(); + if (typeof comment != "undefined") { + this.parse(comment); + } +} + +JSDOC.DocComment.prototype.init = function() { + this.isUserComment = true; + this.src = ""; + this.meta = ""; + this.tagTexts = []; + this.tags = []; +} + +/** + @requires JSDOC.DocTag + */ +JSDOC.DocComment.prototype.parse = function(/**String*/comment) { + if (comment == "") { + comment = "/** @desc */"; + this.isUserComment = false; + } + + this.src = JSDOC.DocComment.unwrapComment(comment); + + this.meta = ""; + if (this.src.indexOf("#") == 0) { + this.src.match(/#(.+[+-])([\s\S]*)$/); + if (RegExp.$1) this.meta = RegExp.$1; + if (RegExp.$2) this.src = RegExp.$2; + } + + if (typeof JSDOC.PluginManager != "undefined") { + JSDOC.PluginManager.run("onDocCommentSrc", this); + } + + this.fixDesc(); + + this.src = JSDOC.DocComment.shared+"\n"+this.src; + + this.tagTexts = + this.src + .split(/(^|[\r\n])\s*@/) + .filter(function($){return $.match(/\S/)}); + + /** + The tags found in the comment. + @type JSDOC.DocTag[] + */ + this.tags = this.tagTexts.map(function($){return new JSDOC.DocTag($)}); + + if (typeof JSDOC.PluginManager != "undefined") { + JSDOC.PluginManager.run("onDocCommentTags", this); + } +} + +/*t: + plan(5, "testing JSDOC.DocComment"); + requires("../frame/String.js"); + requires("../lib/JSDOC/DocTag.js"); + + var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/"); + is(com.tagTexts[0], "foo some\ncomment here", "first tag text is found."); + is(com.tags[0].title, "foo", "the title is found in a comment with one tag."); + + var com = new JSDOC.DocComment("/** @foo first\n* @bar second*"+"/"); + is(com.getTag("bar").length, 1, "getTag() returns one tag by that title."); + + JSDOC.DocComment.shared = "@author John Smith"; + var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/"); + is(com.tags[0].title, "author", "shared comment is added."); + is(com.tags[1].title, "foo", "shared comment is added to existing tag."); +*/ + +/** + If no @desc tag is provided, this function will add it. + */ +JSDOC.DocComment.prototype.fixDesc = function() { + if (this.meta && this.meta != "@+") return; + if (/^\s*[^@\s]/.test(this.src)) { + this.src = "@desc "+this.src; + } +} + +/*t: + plan(5, "testing JSDOC.DocComment#fixDesc"); + + var com = new JSDOC.DocComment(); + + com.src = "this is a desc\n@author foo"; + com.fixDesc(); + is(com.src, "@desc this is a desc\n@author foo", "if no @desc tag is provided one is added."); + + com.src = "x"; + com.fixDesc(); + is(com.src, "@desc x", "if no @desc tag is provided one is added to a single character."); + + com.src = "\nx"; + com.fixDesc(); + is(com.src, "@desc \nx", "if no @desc tag is provided one is added to return and character."); + + com.src = " "; + com.fixDesc(); + is(com.src, " ", "if no @desc tag is provided one is not added to just whitespace."); + + com.src = ""; + com.fixDesc(); + is(com.src, "", "if no @desc tag is provided one is not added to empty."); +*/ + +/** + Remove slash-star comment wrapper from a raw comment string. + @type String + */ +JSDOC.DocComment.unwrapComment = function(/**String*/comment) { + if (!comment) return ""; + var unwrapped = comment.replace(/(^\/\*\*|\*\/$)/g, "").replace(/^\s*\* ?/gm, ""); + return unwrapped; +} + +/*t: + plan(5, "testing JSDOC.DocComment.unwrapComment"); + + var com = "/**x*"+"/"; + var unwrapped = JSDOC.DocComment.unwrapComment(com); + is(unwrapped, "x", "a single character jsdoc is found."); + + com = "/***x*"+"/"; + unwrapped = JSDOC.DocComment.unwrapComment(com); + is(unwrapped, "x", "three stars are allowed in the opener."); + + com = "/****x*"+"/"; + unwrapped = JSDOC.DocComment.unwrapComment(com); + is(unwrapped, "*x", "fourth star in the opener is kept."); + + com = "/**x\n * y\n*"+"/"; + unwrapped = JSDOC.DocComment.unwrapComment(com); + is(unwrapped, "x\ny\n", "leading stars and spaces are trimmed."); + + com = "/**x\n * y\n*"+"/"; + unwrapped = JSDOC.DocComment.unwrapComment(com); + is(unwrapped, "x\n y\n", "only first space after leading stars are trimmed."); +*/ + +/** + Provides a printable version of the comment. + @type String + */ +JSDOC.DocComment.prototype.toString = function() { + return this.src; +} + +/*t: + plan(1, "testing JSDOC.DocComment#fixDesc"); + var com = new JSDOC.DocComment(); + com.src = "foo"; + is(""+com, "foo", "stringifying a comment returns the unwrapped src."); +*/ + +/** + Given the title of a tag, returns all tags that have that title. + @type JSDOC.DocTag[] + */ +JSDOC.DocComment.prototype.getTag = function(/**String*/tagTitle) { + return this.tags.filter(function($){return $.title == tagTitle}); +} + +JSDOC.DocComment.prototype.deleteTag = function(/**String*/tagTitle) { + this.tags = this.tags.filter(function($){return $.title != tagTitle}) +} + +/*t: + plan(1, "testing JSDOC.DocComment#getTag"); + requires("../frame/String.js"); + requires("../lib/JSDOC/DocTag.js"); + + var com = new JSDOC.DocComment("/**@foo some\n* @bar\n* @bar*"+"/"); + is(com.getTag("bar").length, 2, "getTag returns expected number of tags."); +*/ + +/** + Used to store the currently shared tag text. +*/ +JSDOC.DocComment.shared = ""; + +/*t: + plan(2, "testing JSDOC.DocComment.shared"); + requires("../frame/String.js"); + requires("../lib/JSDOC/DocTag.js"); + + JSDOC.DocComment.shared = "@author Michael"; + + var com = new JSDOC.DocComment("/**@foo\n* @foo*"+"/"); + is(com.getTag("author").length, 1, "getTag returns shared tag."); + is(com.getTag("foo").length, 2, "getTag returns unshared tags too."); +*/ \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocTag.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocTag.js new file mode 100644 index 0000000..77ec07c --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/DocTag.js @@ -0,0 +1,294 @@ +if (typeof JSDOC == "undefined") JSDOC = {}; + +/** + @constructor + */ +JSDOC.DocTag = function(src) { + this.init(); + if (typeof src != "undefined") { + this.parse(src); + } +} + +/** + Create and initialize the properties of this. + */ +JSDOC.DocTag.prototype.init = function() { + this.title = ""; + this.type = ""; + this.name = ""; + this.isOptional = false; + this.defaultValue = ""; + this.desc = ""; + + return this; +} + +/** + Populate the properties of this from the given tag src. + @param {string} src + */ +JSDOC.DocTag.prototype.parse = function(src) { + if (typeof src != "string") throw "src must be a string not "+(typeof src); + + try { + src = this.nibbleTitle(src); + if (JSDOC.PluginManager) { + JSDOC.PluginManager.run("onDocTagSynonym", this); + } + + src = this.nibbleType(src); + + // only some tags are allowed to have names. + if (this.title == "param" || this.title == "property" || this.title == "config") { // @config is deprecated + src = this.nibbleName(src); + } + } + catch(e) { + if (LOG) LOG.warn(e); + else throw e; + } + this.desc = src; // whatever is left + + // example tags need to have whitespace preserved + if (this.title != "example") this.desc = this.desc.trim(); + + if (JSDOC.PluginManager) { + JSDOC.PluginManager.run("onDocTag", this); + } +} + +/** + Automatically called when this is stringified. + */ +JSDOC.DocTag.prototype.toString = function() { + return this.desc; +} + +/*t: + plan(1, "testing JSDOC.DocTag#toString"); + + var tag = new JSDOC.DocTag("param {object} date A valid date."); + is(""+tag, "A valid date.", "stringifying a tag returns the desc."); + */ + +/** + Find and shift off the title of a tag. + @param {string} src + @return src + */ +JSDOC.DocTag.prototype.nibbleTitle = function(src) { + if (typeof src != "string") throw "src must be a string not "+(typeof src); + + var parts = src.match(/^\s*(\S+)(?:\s([\s\S]*))?$/); + + if (parts && parts[1]) this.title = parts[1]; + if (parts && parts[2]) src = parts[2]; + else src = ""; + + return src; +} + +/*t: + plan(8, "testing JSDOC.DocTag#nibbleTitle"); + + var tag = new JSDOC.DocTag(); + + tag.init().nibbleTitle("aTitleGoesHere"); + is(tag.title, "aTitleGoesHere", "a title can be found in a single-word string."); + + var src = tag.init().nibbleTitle("aTitleGoesHere and the rest"); + is(tag.title, "aTitleGoesHere", "a title can be found in a multi-word string."); + is(src, "and the rest", "the rest is returned when the title is nibbled off."); + + src = tag.init().nibbleTitle(""); + is(tag.title, "", "given an empty string the title is empty."); + is(src, "", "the rest is empty when the tag is empty."); + + var src = tag.init().nibbleTitle(" aTitleGoesHere\n a description"); + is(tag.title, "aTitleGoesHere", "leading and trailing spaces are not part of the title."); + is(src, " a description", "leading spaces (less one) are part of the description."); + + tag.init().nibbleTitle("a.Title::Goes_Here foo"); + is(tag.title, "a.Title::Goes_Here", "titles with punctuation are allowed."); + */ + +/** + Find and shift off the type of a tag. + @requires frame/String.js + @param {string} src + @return src + */ +JSDOC.DocTag.prototype.nibbleType = function(src) { + if (typeof src != "string") throw "src must be a string not "+(typeof src); + + if (src.match(/^\s*\{/)) { + var typeRange = src.balance("{", "}"); + if (typeRange[1] == -1) { + throw "Malformed comment tag ignored. Tag type requires an opening { and a closing }: "+src; + } + this.type = src.substring(typeRange[0]+1, typeRange[1]).trim(); + this.type = this.type.replace(/\s*,\s*/g, "|"); // multiples can be separated by , or | + src = src.substring(typeRange[1]+1); + } + + return src; +} + +/*t: + plan(5, "testing JSDOC.DocTag.parser.nibbleType"); + requires("../frame/String.js"); + + var tag = new JSDOC.DocTag(); + + tag.init().nibbleType("{String[]} aliases"); + is(tag.type, "String[]", "type can have non-alpha characters."); + + tag.init().nibbleType("{ aTypeGoesHere } etc etc"); + is(tag.type, "aTypeGoesHere", "type is trimmed."); + + tag.init().nibbleType("{ oneType, twoType ,\n threeType } etc etc"); + is(tag.type, "oneType|twoType|threeType", "multiple types can be separated by commas."); + + var error; + try { tag.init().nibbleType("{widget foo"); } + catch(e) { error = e; } + is(typeof error, "string", "malformed tag type throws error."); + isnt(error.indexOf("Malformed"), -1, "error message tells tag is malformed."); + */ + +/** + Find and shift off the name of a tag. + @requires frame/String.js + @param {string} src + @return src + */ +JSDOC.DocTag.prototype.nibbleName = function(src) { + if (typeof src != "string") throw "src must be a string not "+(typeof src); + + src = src.trim(); + + // is optional? + if (src.charAt(0) == "[") { + var nameRange = src.balance("[", "]"); + if (nameRange[1] == -1) { + throw "Malformed comment tag ignored. Tag optional name requires an opening [ and a closing ]: "+src; + } + this.name = src.substring(nameRange[0]+1, nameRange[1]).trim(); + this.isOptional = true; + + src = src.substring(nameRange[1]+1); + + // has default value? + var nameAndValue = this.name.split("="); + if (nameAndValue.length) { + this.name = nameAndValue.shift().trim(); + this.defaultValue = nameAndValue.join("="); + } + } + else { + var parts = src.match(/^(\S+)(?:\s([\s\S]*))?$/); + if (parts) { + if (parts[1]) this.name = parts[1]; + if (parts[2]) src = parts[2].trim(); + else src = ""; + } + } + + return src; +} + +/*t: + requires("../frame/String.js"); + plan(9, "testing JSDOC.DocTag.parser.nibbleName"); + + var tag = new JSDOC.DocTag(); + + tag.init().nibbleName("[foo] This is a description."); + is(tag.isOptional, true, "isOptional syntax is detected."); + is(tag.name, "foo", "optional param name is found."); + + tag.init().nibbleName("[foo] This is a description."); + is(tag.isOptional, true, "isOptional syntax is detected when no type."); + is(tag.name, "foo", "optional param name is found when no type."); + + tag.init().nibbleName("[foo=7] This is a description."); + is(tag.name, "foo", "optional param name is found when default value."); + is(tag.defaultValue, 7, "optional param default value is found when default value."); + + //tag.init().nibbleName("[foo= a value] This is a description."); + //is(tag.defaultValue, " a value", "optional param default value is found when default value has spaces (issue #112)."); + + tag.init().nibbleName("[foo=[]] This is a description."); + is(tag.defaultValue, "[]", "optional param default value is found when default value is [] (issue #95)."); + + tag.init().nibbleName("[foo=a=b] This is a description."); + is(tag.name, "foo", "optional param name is found when default value is a=b."); + is(tag.defaultValue, "a=b", "optional param default value is found when default value is a=b.") + */ + +/*t: + plan(32, "Testing JSDOC.DocTag.parser."); + requires("../frame/String.js"); + + var tag = new JSDOC.DocTag(); + + is(typeof tag, "object", "JSDOC.DocTag.parser with an empty string returns an object."); + is(typeof tag.title, "string", "returned object has a string property 'title'."); + is(typeof tag.type, "string", "returned object has a string property 'type'."); + is(typeof tag.name, "string", "returned object has a string property 'name'."); + is(typeof tag.defaultValue, "string", "returned object has a string property 'defaultValue'."); + is(typeof tag.isOptional, "boolean", "returned object has a boolean property 'isOptional'."); + is(typeof tag.desc, "string", "returned object has a string property 'desc'."); + + tag = new JSDOC.DocTag("param {widget} foo"); + is(tag.title, "param", "param title is found."); + is(tag.name, "foo", "param name is found when desc is missing."); + is(tag.desc, "", "param desc is empty when missing."); + + tag = new JSDOC.DocTag("param {object} date A valid date."); + is(tag.name, "date", "param name is found with a type."); + is(tag.type, "object", "param type is found."); + is(tag.desc, "A valid date.", "param desc is found with a type."); + + tag = new JSDOC.DocTag("param aName a description goes\n here."); + is(tag.name, "aName", "param name is found without a type."); + is(tag.desc, "a description goes\n here.", "param desc is found without a type."); + + tag = new JSDOC.DocTag("param {widget}"); + is(tag.name, "", "param name is empty when it is not given."); + + tag = new JSDOC.DocTag("param {widget} [foo] This is a description."); + is(tag.name, "foo", "optional param name is found."); + + tag = new JSDOC.DocTag("return {aType} This is a description."); + is(tag.type, "aType", "when return tag has no name, type is found."); + is(tag.desc, "This is a description.", "when return tag has no name, desc is found."); + + tag = new JSDOC.DocTag("author Joe Coder "); + is(tag.title, "author", "author tag has a title."); + is(tag.type, "", "the author tag has no type."); + is(tag.name, "", "the author tag has no name."); + is(tag.desc, "Joe Coder ", "author tag has desc."); + + tag = new JSDOC.DocTag("private \t\n "); + is(tag.title, "private", "private tag has a title."); + is(tag.type, "", "the private tag has no type."); + is(tag.name, "", "the private tag has no name."); + is(tag.desc, "", "private tag has no desc."); + + tag = new JSDOC.DocTag("example\n example(code);\n more();"); + is(tag.desc, " example(code);\n more();", "leading whitespace (less one) in examples code is preserved."); + + tag = new JSDOC.DocTag("param theName \n"); + is(tag.name, "theName", "name only is found."); + + tag = new JSDOC.DocTag("type theDesc \n"); + is(tag.desc, "theDesc", "desc only is found."); + + tag = new JSDOC.DocTag("type {theType} \n"); + is(tag.type, "theType", "type only is found."); + + tag = new JSDOC.DocTag(""); + is(tag.title, "", "title is empty when tag is empty."); + */ \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js new file mode 100644 index 0000000..02275a6 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js @@ -0,0 +1,140 @@ +/** + @constructor + @param [opt] Used to override the commandline options. Useful for testing. + @version $Id: JsDoc.js 831 2010-03-09 14:24:56Z micmath $ +*/ +JSDOC.JsDoc = function(/**object*/ opt) { + if (opt) { + JSDOC.opt = opt; + } + + if (JSDOC.opt.h) { + JSDOC.usage(); + quit(); + } + + // defend against options that are not sane + if (JSDOC.opt._.length == 0) { + LOG.warn("No source files to work on. Nothing to do."); + quit(); + } + if (JSDOC.opt.t === true || JSDOC.opt.d === true) { + JSDOC.usage(); + } + + if (typeof JSDOC.opt.d == "string") { + if (!JSDOC.opt.d.charAt(JSDOC.opt.d.length-1).match(/[\\\/]/)) { + JSDOC.opt.d = JSDOC.opt.d+"/"; + } + LOG.inform("Output directory set to '"+JSDOC.opt.d+"'."); + IO.mkPath(JSDOC.opt.d); + } + if (JSDOC.opt.e) IO.setEncoding(JSDOC.opt.e); + + // the -r option: scan source directories recursively + if (typeof JSDOC.opt.r == "boolean") JSDOC.opt.r = 10; + else if (!isNaN(parseInt(JSDOC.opt.r))) JSDOC.opt.r = parseInt(JSDOC.opt.r); + else JSDOC.opt.r = 1; + + // the -D option: define user variables + var D = {}; + if (JSDOC.opt.D) { + for (var i = 0; i < JSDOC.opt.D.length; i++) { + var param = JSDOC.opt.D[i]; + // remove first and last character if both == " + if ( + param.length > 1 + && param.charAt(0) == '"' + && param.charAt(param.length-1) == '"' + ) { + param = param.substr(1, param.length-2); + } + var defineParts = param.split(":"); + if (defineParts && defineParts.length > 1) { + for ( var dpIdx = 2; dpIdx < defineParts.length; dpIdx++ ) { + defineParts[1] += ':' + defineParts[dpIdx]; + } + D[defineParts[0]] = defineParts[1]; + } + } + } + JSDOC.opt.D = D; + // combine any conf file D options with the commandline D options + if (defined(JSDOC.conf)) for (var c in JSDOC.conf.D) { + if (!defined(JSDOC.opt.D[c])) { + JSDOC.opt.D[c] = JSDOC.conf.D[c]; + } + } + + // Give plugins a chance to initialize + if (defined(JSDOC.PluginManager)) { + JSDOC.PluginManager.run("onInit", JSDOC.opt); + } + + JSDOC.opt.srcFiles = JSDOC.JsDoc._getSrcFiles(); + JSDOC.JsDoc._parseSrcFiles(); + JSDOC.JsDoc.symbolSet = JSDOC.Parser.symbols; +} + +/** + Retrieve source file list. + @returns {String[]} The pathnames of the files to be parsed. + */ +JSDOC.JsDoc._getSrcFiles = function() { + JSDOC.JsDoc.srcFiles = []; + + var ext = ["js"]; + if (JSDOC.opt.x) { + ext = JSDOC.opt.x.split(",").map(function($) {return $.toLowerCase()}); + } + + for (var i = 0; i < JSDOC.opt._.length; i++) { + JSDOC.JsDoc.srcFiles = JSDOC.JsDoc.srcFiles.concat( + IO.ls(JSDOC.opt._[i], JSDOC.opt.r).filter( + function($) { + var thisExt = $.split(".").pop().toLowerCase(); + + if (JSDOC.opt.E) { + for(var n = 0; n < JSDOC.opt.E.length; n++) { + if ($.match(new RegExp(JSDOC.opt.E[n]))) { + LOG.inform("Excluding " + $); + return false; // if the file matches the regex then it's excluded. + } + } + } + + return (ext.indexOf(thisExt) > -1); // we're only interested in files with certain extensions + } + ) + ); + } + + return JSDOC.JsDoc.srcFiles; +} + +JSDOC.JsDoc._parseSrcFiles = function() { + JSDOC.Parser.init(); + for (var i = 0, l = JSDOC.JsDoc.srcFiles.length; i < l; i++) { + var srcFile = JSDOC.JsDoc.srcFiles[i]; + + if (JSDOC.opt.v) LOG.inform("Parsing file: " + srcFile); + + try { + var src = IO.readFile(srcFile); + } + catch(e) { + LOG.warn("Can't read source file '"+srcFile+"': "+e.message); + } + + var tr = new JSDOC.TokenReader(); + var ts = new JSDOC.TokenStream(tr.tokenize(new JSDOC.TextStream(src))); + + JSDOC.Parser.parse(ts, srcFile); + + } + JSDOC.Parser.finish(); + + if (JSDOC.PluginManager) { + JSDOC.PluginManager.run("onFinishedParsing", JSDOC.Parser.symbols); + } +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js new file mode 100644 index 0000000..bcaebc9 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js @@ -0,0 +1,109 @@ +/** + @constructor +*/ +JSDOC.JsPlate = function(templateFile) { + if (templateFile) this.template = IO.readFile(templateFile); + + this.templateFile = templateFile; + this.code = ""; + this.parse(); +} + +JSDOC.JsPlate.prototype.parse = function() { + this.template = this.template.replace(/\{#[\s\S]+?#\}/gi, ""); + this.code = "var output=\u001e"+this.template; + + this.code = this.code.replace( + //gi, + function (match, eachName, inName) { + return "\u001e;\rvar $"+eachName+"_keys = keys("+inName+");\rfor(var $"+eachName+"_i = 0; $"+eachName+"_i < $"+eachName+"_keys.length; $"+eachName+"_i++) {\rvar $"+eachName+"_last = ($"+eachName+"_i == $"+eachName+"_keys.length-1);\rvar $"+eachName+"_key = $"+eachName+"_keys[$"+eachName+"_i];\rvar "+eachName+" = "+inName+"[$"+eachName+"_key];\routput+=\u001e"; + } + ); + this.code = this.code.replace(//g, "\u001e;\rif ($1) { output+=\u001e"); + this.code = this.code.replace(//g, "\u001e;}\relse if ($1) { output+=\u001e"); + this.code = this.code.replace(//g, "\u001e;}\relse { output+=\u001e"); + this.code = this.code.replace(/<\/(if|for)>/g, "\u001e;\r};\routput+=\u001e"); + this.code = this.code.replace( + /\{\+\s*([\s\S]+?)\s*\+\}/gi, + function (match, code) { + code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code + code = code.replace(/(\r?\n)/g, " "); + return "\u001e+ ("+code+") +\u001e"; + } + ); + this.code = this.code.replace( + /\{!\s*([\s\S]+?)\s*!\}/gi, + function (match, code) { + code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code + code = code.replace(/(\n)/g, " "); + return "\u001e; "+code+";\routput+=\u001e"; + } + ); + this.code = this.code+"\u001e;"; + + this.code = this.code.replace(/(\r?\n)/g, "\\n"); + this.code = this.code.replace(/"/g, "\\\""); + this.code = this.code.replace(/\u001e/g, "\""); +} + +JSDOC.JsPlate.prototype.toCode = function() { + return this.code; +} + +JSDOC.JsPlate.keys = function(obj) { + var keys = []; + if (obj.constructor.toString().indexOf("Array") > -1) { + for (var i = 0; i < obj.length; i++) { + keys.push(i); + } + } + else { + for (var i in obj) { + keys.push(i); + } + } + return keys; +}; + +JSDOC.JsPlate.values = function(obj) { + var values = []; + if (obj.constructor.toString().indexOf("Array") > -1) { + for (var i = 0; i < obj.length; i++) { + values.push(obj[i]); + } + } + else { + for (var i in obj) { + values.push(obj[i]); + } + } + return values; +}; + +JSDOC.JsPlate.prototype.process = function(data, compact) { + var keys = JSDOC.JsPlate.keys; + var values = JSDOC.JsPlate.values; + + try { + eval(this.code); + } + catch (e) { + print(">> There was an error evaluating the compiled code from template: "+this.templateFile); + print(" The error was on line "+e.lineNumber+" "+e.name+": "+e.message); + var lines = this.code.split("\r"); + if (e.lineNumber-2 >= 0) print("line "+(e.lineNumber-1)+": "+lines[e.lineNumber-2]); + print("line "+e.lineNumber+": "+lines[e.lineNumber-1]); + print(""); + } + + if (compact) { // patch by mcbain.asm + // Remove lines that contain only space-characters, usually left by lines in the template + // which originally only contained JSPlate tags or code. This makes it easier to write + // non-tricky templates which still put out nice code (not bloated with extra lines). + // Lines purposely left blank (just a line ending) are left alone. + output = output.replace(/\s+?(\r?)\n/g, "$1\n"); + } + + /*debug*///print(this.code); + return output; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Lang.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Lang.js new file mode 100644 index 0000000..62919d7 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Lang.js @@ -0,0 +1,144 @@ +/** + @namespace +*/ +JSDOC.Lang = { +} + +JSDOC.Lang.isBuiltin = function(name) { + return (JSDOC.Lang.isBuiltin.coreObjects.indexOf(name) > -1); +} +JSDOC.Lang.isBuiltin.coreObjects = ['_global_', 'Array', 'Boolean', 'Date', 'Error', 'Function', 'Math', 'Number', 'Object', 'RegExp', 'String']; + +JSDOC.Lang.whitespace = function(ch) { + return JSDOC.Lang.whitespace.names[ch]; +} +JSDOC.Lang.whitespace.names = { + " ": "SPACE", + "\f": "FORMFEED", + "\t": "TAB", + "\u0009": "UNICODE_TAB", + "\u000A": "UNICODE_NBR", + "\u0008": "VERTICAL_TAB" +}; + +JSDOC.Lang.newline = function(ch) { + return JSDOC.Lang.newline.names[ch]; +} +JSDOC.Lang.newline.names = { + "\n": "NEWLINE", + "\r": "RETURN", + "\u000A": "UNICODE_LF", + "\u000D": "UNICODE_CR", + "\u2029": "UNICODE_PS", + "\u2028": "UNICODE_LS" +}; + +JSDOC.Lang.keyword = function(word) { + return JSDOC.Lang.keyword.names["="+word]; +} +JSDOC.Lang.keyword.names = { + "=break": "BREAK", + "=case": "CASE", + "=catch": "CATCH", + "=const": "VAR", + "=continue": "CONTINUE", + "=default": "DEFAULT", + "=delete": "DELETE", + "=do": "DO", + "=else": "ELSE", + "=false": "FALSE", + "=finally": "FINALLY", + "=for": "FOR", + "=function": "FUNCTION", + "=if": "IF", + "=in": "IN", + "=instanceof": "INSTANCEOF", + "=new": "NEW", + "=null": "NULL", + "=return": "RETURN", + "=switch": "SWITCH", + "=this": "THIS", + "=throw": "THROW", + "=true": "TRUE", + "=try": "TRY", + "=typeof": "TYPEOF", + "=void": "VOID", + "=while": "WHILE", + "=with": "WITH", + "=var": "VAR" +}; + +JSDOC.Lang.punc = function(ch) { + return JSDOC.Lang.punc.names[ch]; +} +JSDOC.Lang.punc.names = { + ";": "SEMICOLON", + ",": "COMMA", + "?": "HOOK", + ":": "COLON", + "||": "OR", + "&&": "AND", + "|": "BITWISE_OR", + "^": "BITWISE_XOR", + "&": "BITWISE_AND", + "===": "STRICT_EQ", + "==": "EQ", + "=": "ASSIGN", + "!==": "STRICT_NE", + "!=": "NE", + "<<": "LSH", + "<=": "LE", + "<": "LT", + ">>>": "URSH", + ">>": "RSH", + ">=": "GE", + ">": "GT", + "++": "INCREMENT", + "--": "DECREMENT", + "+": "PLUS", + "-": "MINUS", + "*": "MUL", + "/": "DIV", + "%": "MOD", + "!": "NOT", + "~": "BITWISE_NOT", + ".": "DOT", + "[": "LEFT_BRACKET", + "]": "RIGHT_BRACKET", + "{": "LEFT_CURLY", + "}": "RIGHT_CURLY", + "(": "LEFT_PAREN", + ")": "RIGHT_PAREN" +}; + +JSDOC.Lang.matching = function(name) { + return JSDOC.Lang.matching.names[name]; +} +JSDOC.Lang.matching.names = { + "LEFT_PAREN": "RIGHT_PAREN", + "RIGHT_PAREN": "LEFT_PAREN", + "LEFT_CURLY": "RIGHT_CURLY", + "RIGHT_CURLY": "LEFT_CURLY", + "LEFT_BRACE": "RIGHT_BRACE", + "RIGHT_BRACE": "LEFT_BRACE" +} + +JSDOC.Lang.isNumber = function(str) { + return /^(\.[0-9]|[0-9]+\.|[0-9])[0-9]*([eE][+-][0-9]+)?$/i.test(str); +} + +JSDOC.Lang.isHexDec = function(str) { + return /^0x[0-9A-F]+$/i.test(str); +} + +JSDOC.Lang.isWordChar = function(str) { + return /^[a-zA-Z0-9$_.]+$/.test(str); +} + +JSDOC.Lang.isSpace = function(str) { + return (typeof JSDOC.Lang.whitespace(str) != "undefined"); +} + +JSDOC.Lang.isNewline = function(str) { + return (typeof JSDOC.Lang.newline(str) != "undefined"); +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Parser.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Parser.js new file mode 100644 index 0000000..e489c61 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Parser.js @@ -0,0 +1,146 @@ +if (typeof JSDOC == "undefined") JSDOC = {}; + +/** + @namespace + @requires JSDOC.Walker + @requires JSDOC.Symbol + @requires JSDOC.DocComment +*/ +JSDOC.Parser = { + conf: { + ignoreCode: JSDOC.opt.n, + ignoreAnonymous: true, // factory: true + treatUnderscoredAsPrivate: true, // factory: true + explain: false // factory: false + }, + + addSymbol: function(symbol) { + + if (JSDOC.Parser.rename) { + for (var n in JSDOC.Parser.rename) { + if (symbol.alias.indexOf(n) == 0) { + if (symbol.name == symbol.alias) { + symbol.name = symbol.name.replace(n, JSDOC.Parser.rename[n]); + } + symbol.alias = symbol.alias.replace(n, JSDOC.Parser.rename[n]); + } + } + } + + if (JSDOC.opt.S) { + if (typeof JSDOC.Parser.secureModules == "undefined") JSDOC.Parser.secureModules = {}; + if (/^exports\./.test(symbol.alias)) { + symbol.srcFile.match(/(^|[\\\/])([^\\\/]+)\.js/i); + var fileNS = RegExp.$2; + + // need to create the namespace associated with this file first + if (!JSDOC.Parser.secureModules[fileNS]) { + JSDOC.Parser.secureModules[fileNS] = 1; + var nsSymbol = new JSDOC.Symbol(fileNS, [], "GLOBAL", new JSDOC.DocComment("")); + nsSymbol.isNamespace = true; + nsSymbol.srcFile = ""; + nsSymbol.isPrivate = false; + nsSymbol.srcFile = symbol.srcFile; + nsSymbol.desc = (JSDOC.Parser.symbols.getSymbol(symbol.srcFile) || {desc: ""}).desc; + JSDOC.Parser.addSymbol(nsSymbol); + } + + symbol.alias = symbol.alias.replace(/^exports\./, fileNS + '.'); + symbol.name = symbol.name.replace(/^exports\./, ''); + symbol.memberOf = fileNS; + symbol.isStatic = true; + } + } + + // if a symbol alias is documented more than once the first one with the user docs wins + if (JSDOC.Parser.symbols.hasSymbol(symbol.alias)) { + var oldSymbol = JSDOC.Parser.symbols.getSymbol(symbol.alias); + if (oldSymbol.comment.isUserComment) { + if (JSDOC.opt.m) return; + if (symbol.comment.isUserComment) { // old and new are both documented + LOG.warn("The symbol '"+symbol.alias+"' is documented more than once."); + return; + } + else { // old is documented but new isn't + return; + } + } + } + + // we don't document anonymous things + if (JSDOC.Parser.conf.ignoreAnonymous && symbol.name.match(/\$anonymous\b/)) return; + + // uderscored things may be treated as if they were marked private, this cascades + if (JSDOC.Parser.conf.treatUnderscoredAsPrivate && symbol.name.match(/[.#-]_[^.#-]+$/)) { + if (!symbol.comment.getTag("public").length > 0) symbol.isPrivate = true; + } + + // -p flag is required to document private things + if (!JSDOC.opt.p && symbol.isPrivate) return; // issue #161 fixed by mcbain.asm + + // ignored things are not documented, this doesn't cascade + if (symbol.isIgnored) return; + JSDOC.Parser.symbols.addSymbol(symbol); + }, + + addBuiltin: function(name) { + var builtin = new JSDOC.Symbol(name, [], "CONSTRUCTOR", new JSDOC.DocComment("")); + builtin.isNamespace = true; + builtin.srcFile = ""; + builtin.isPrivate = false; + JSDOC.Parser.addSymbol(builtin); + return builtin; + }, + + init: function() { + JSDOC.Parser.symbols = new JSDOC.SymbolSet(); + JSDOC.Parser.walker = new JSDOC.Walker(); + }, + + finish: function() { + JSDOC.Parser.symbols.relate(); + + // make a litle report about what was found + if (JSDOC.Parser.conf.explain) { + var symbols = JSDOC.Parser.symbols.toArray(); + var srcFile = ""; + for (var i = 0, l = symbols.length; i < l; i++) { + var symbol = symbols[i]; + if (srcFile != symbol.srcFile) { + srcFile = symbol.srcFile; + print("\n"+srcFile+"\n-------------------"); + } + print(i+":\n alias => "+symbol.alias + "\n name => "+symbol.name+ "\n isa => "+symbol.isa + "\n memberOf => " + symbol.memberOf + "\n isStatic => " + symbol.isStatic + ", isInner => " + symbol.isInner+ ", isPrivate => " + symbol.isPrivate); + } + print("-------------------\n"); + } + } +} + +JSDOC.Parser.parse = function(/**JSDOC.TokenStream*/ts, /**String*/srcFile) { + JSDOC.Symbol.srcFile = (srcFile || ""); + JSDOC.DocComment.shared = ""; // shared comments don't cross file boundaries + + if (!JSDOC.Parser.walker) JSDOC.Parser.init(); + JSDOC.Parser.walker.walk(ts); // adds to our symbols + + // filter symbols by option + for (var p = JSDOC.Parser.symbols._index.first(); p; p = JSDOC.Parser.symbols._index.next()) { + var symbol = p.value; + + if (!symbol) continue; + + if (symbol.is("FILE") || symbol.is("GLOBAL")) { + continue; + } + else if (!JSDOC.opt.a && !symbol.comment.isUserComment) { + JSDOC.Parser.symbols.deleteSymbol(symbol.alias); + } + + if (/#$/.test(symbol.alias)) { // we don't document prototypes + JSDOC.Parser.symbols.deleteSymbol(symbol.alias); + } + } + + return JSDOC.Parser.symbols.toArray(); +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js new file mode 100644 index 0000000..9c91193 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js @@ -0,0 +1,33 @@ +/** + @namespace Holds functionality related to running plugins. +*/ +JSDOC.PluginManager = { +} + +/** + @param name A unique name that identifies that plugin. + @param handlers A collection of named functions. The names correspond to hooks in the core code. +*/ +JSDOC.PluginManager.registerPlugin = function(/**String*/name, /**Object*/handlers) { + if (!defined(JSDOC.PluginManager.plugins)) + /** The collection of all plugins. Requires a unique name for each. + */ + JSDOC.PluginManager.plugins = {}; + + + JSDOC.PluginManager.plugins[name] = handlers; +} + +/** + @param hook The name of the hook that is being caught. + @param target Any object. This will be passed as the only argument to the handler whose + name matches the hook name. Handlers cannot return a value, so must modify the target + object to have an effect. +*/ +JSDOC.PluginManager.run = function(/**String*/hook, /**Mixed*/target) { + for (var name in JSDOC.PluginManager.plugins) { + if (defined(JSDOC.PluginManager.plugins[name][hook])) { + JSDOC.PluginManager.plugins[name][hook](target); + } + } +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Symbol.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Symbol.js new file mode 100644 index 0000000..1aa44da --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Symbol.js @@ -0,0 +1,644 @@ +if (typeof JSDOC == "undefined") JSDOC = {}; + +/** + Create a new Symbol. + @class Represents a symbol in the source code. + */ +JSDOC.Symbol = function() { + this.init(); + if (arguments.length) this.populate.apply(this, arguments); +} + +JSDOC.Symbol.count = 0; + +JSDOC.Symbol.prototype.init = function() { + this._name = ""; + this._params = []; + this.$args = []; + this.addOn = ""; + this.alias = ""; + this.augments = []; + this.author = ""; + this.classDesc = ""; + this.comment = {}; + this.defaultValue = undefined; + this.deprecated = ""; + this.desc = ""; + this.example = []; + this.exceptions = []; + this.fires = []; + this.id = JSDOC.Symbol.count++; + this.inherits = []; + this.inheritsFrom = []; + this.isa = "OBJECT"; + this.isConstant = false; + this.isEvent = false; + this.isIgnored = false; + this.isInner = false; + this.isNamespace = false; + this.isPrivate = false; + this.isStatic = false; + this.memberOf = ""; + this.methods = []; + this.properties = []; + this.requires = []; + this.returns = []; + this.see = []; + this.since = ""; + this.srcFile = {}; + this.type = ""; + this.version = ""; +} + +JSDOC.Symbol.prototype.serialize = function() { + var keys = []; + for (var p in this) { + keys.push (p); + } + keys = keys.sort(); + + var out = ""; + for (var i in keys) { + if (typeof this[keys[i]] == "function") continue; + out += keys[i]+" => "+Dumper.dump(this[keys[i]])+",\n"; + } + return "\n{\n" + out + "}\n"; +} + +JSDOC.Symbol.prototype.clone = function() { + var clone = new JSDOC.Symbol(); + clone.populate.apply(clone, this.$args); // repopulate using the original arguments + clone.srcFile = this.srcFile; // not the current srcFile, the one when the original was made + return clone; +} + +JSDOC.Symbol.prototype.__defineSetter__("name", + function(n) { n = n.replace(/^_global_[.#-]/, ""); n = n.replace(/\.prototype\.?/g, '#'); this._name = n; } +); +JSDOC.Symbol.prototype.__defineGetter__("name", + function() { return this._name; } +); +JSDOC.Symbol.prototype.__defineSetter__("params", + function(v) { + for (var i = 0, l = v.length; i < l; i++) { + if (v[i].constructor != JSDOC.DocTag) { // may be a generic object parsed from signature, like {type:..., name:...} + this._params[i] = new JSDOC.DocTag("param"+((v[i].type)?" {"+v[i].type+"}":"")+" "+v[i].name); + } + else { + this._params[i] = v[i]; + } + } + } +); +JSDOC.Symbol.prototype.__defineGetter__("params", + function() { return this._params; } +); + +JSDOC.Symbol.prototype.getEvents = function() { + var events = []; + for (var i = 0, l = this.methods.length; i < l; i++) { + if (this.methods[i].isEvent) { + this.methods[i].name = this.methods[i].name.replace("event:", ""); + events.push(this.methods[i]); + } + } + return events; +} + +JSDOC.Symbol.prototype.getMethods = function() { + var nonEvents = []; + for (var i = 0, l = this.methods.length; i < l; i++) { + if (!this.methods[i].isEvent) { + nonEvents.push(this.methods[i]); + } + } + return nonEvents; +} + + +JSDOC.Symbol.prototype.populate = function( + /** String */ name, + /** Object[] */ params, + /** String */ isa, + /** JSDOC.DocComment */ comment +) { + this.$args = arguments; + + this.name = name; + this.alias = this.name; + + this.params = params; + this.isa = (isa == "VIRTUAL")? "OBJECT":isa; + this.comment = comment || new JSDOC.DocComment(""); + this.srcFile = JSDOC.Symbol.srcFile; + + if (this.is("FILE") && !this.alias) this.alias = this.srcFile; + + this.setTags(); + + if (typeof JSDOC.PluginManager != "undefined") { + JSDOC.PluginManager.run("onSymbol", this); + } +} + +JSDOC.Symbol.prototype.setTags = function() { + // @author + var authors = this.comment.getTag("author"); + if (authors.length) { + this.author = authors.map(function($){return $.desc;}).join(", "); + } + + /*t: + plan(34, "testing JSDOC.Symbol"); + + requires("../lib/JSDOC/DocComment.js"); + requires("../frame/String.js"); + requires("../lib/JSDOC/DocTag.js"); + + var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@author Joe Smith*"+"/")); + is(sym.author, "Joe Smith", "@author tag, author is found."); + */ + + // @desc + var descs = this.comment.getTag("desc"); + if (descs.length) { + this.desc = descs.map(function($){return $.desc;}).join("\n"); // multiple descriptions are concatenated into one + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@desc This is a description.*"+"/")); + is(sym.desc, "This is a description.", "@desc tag, description is found."); + */ + + // @overview + if (this.is("FILE")) { + if (!this.alias) this.alias = this.srcFile; + + var overviews = this.comment.getTag("overview"); + if (overviews.length) { + this.desc = [this.desc].concat(overviews.map(function($){return $.desc;})).join("\n"); + } + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@overview This is an overview.*"+"/")); + is(sym.desc, "\nThis is an overview.", "@overview tag, description is found."); + */ + + // @since + var sinces = this.comment.getTag("since"); + if (sinces.length) { + this.since = sinces.map(function($){return $.desc;}).join(", "); + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@since 1.01*"+"/")); + is(sym.since, "1.01", "@since tag, description is found."); + */ + + // @constant + if (this.comment.getTag("constant").length) { + this.isConstant = true; + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@constant*"+"/")); + is(sym.isConstant, true, "@constant tag, isConstant set."); + */ + + // @version + var versions = this.comment.getTag("version"); + if (versions.length) { + this.version = versions.map(function($){return $.desc;}).join(", "); + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@version 2.0x*"+"/")); + is(sym.version, "2.0x", "@version tag, version is found."); + */ + + // @deprecated + var deprecateds = this.comment.getTag("deprecated"); + if (deprecateds.length) { + this.deprecated = deprecateds.map(function($){return $.desc;}).join("\n"); + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@deprecated Use other method.*"+"/")); + is(sym.deprecated, "Use other method.", "@deprecated tag, desc is found."); + */ + + // @example + var examples = this.comment.getTag("example"); + if (examples.length) { + this.example = examples.map( + // trim trailing whitespace + function($) { + $.desc = $.desc.replace(/\s+$/, ""); + return $; + } + ); + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@example This\n is an example. \n*"+"/")); + isnt(typeof sym.example[0], "undefined", "@example tag, creates sym.example array."); + is(sym.example[0], "This\n is an example.", "@example tag, desc is found."); + */ + + // @see + var sees = this.comment.getTag("see"); + if (sees.length) { + var thisSee = this.see; + sees.map(function($){thisSee.push($.desc);}); + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@see The other thing.*"+"/")); + is(sym.see, "The other thing.", "@see tag, desc is found."); + */ + + // @class + var classes = this.comment.getTag("class"); + if (classes.length) { + this.isa = "CONSTRUCTOR"; + this.classDesc = classes[0].desc; // desc can't apply to the constructor as there is none. + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@class This describes the class.*"+"/")); + is(sym.isa, "CONSTRUCTOR", "@class tag, makes symbol a constructor."); + is(sym.classDesc, "This describes the class.", "@class tag, class description is found."); + */ + + // @namespace + var namespaces = this.comment.getTag("namespace"); + if (namespaces.length) { + this.classDesc = namespaces[0].desc; + this.isNamespace = true; + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@namespace This describes the namespace.*"+"/")); + is(sym.classDesc, "This describes the namespace.", "@namespace tag, class description is found."); + */ + + // @param + var params = this.comment.getTag("param"); + if (params.length) { + // user-defined params overwrite those with same name defined by the parser + var thisParams = this.params; + + if (thisParams.length == 0) { // none exist yet, so just bung all these user-defined params straight in + this.params = params; + } + else { // need to overlay these user-defined params on to existing parser-defined params + for (var i = 0, l = params.length; i < l; i++) { + if (thisParams[i]) { + if (params[i].type) thisParams[i].type = params[i].type; + thisParams[i].name = params[i].name; + thisParams[i].desc = params[i].desc; + thisParams[i].isOptional = params[i].isOptional; + thisParams[i].defaultValue = params[i].defaultValue; + } + else thisParams[i] = params[i]; + } + } + } + + /*t: + var sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.*"+"/")); + is(sym.params.length, 1, "parser defined param is found."); + + sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages*"+"/")); + is(sym.params.length, 1, "user defined param is found."); + is(sym.params[0].type, "array", "user defined param type is found."); + is(sym.params[0].name, "pages", "user defined param name is found."); + + sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/")); + is(sym.params.length, 1, "user defined param overwrites parser defined param."); + is(sym.params[0].type, "string", "user defined param type overwrites parser defined param type."); + is(sym.params[0].name, "uid", "user defined param name overwrites parser defined param name."); + + sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}, {type: "number", name: "count"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/")); + is(sym.params.length, 2, "user defined params overlay parser defined params."); + is(sym.params[1].type, "number", "user defined param type overlays parser defined param type."); + is(sym.params[1].name, "count", "user defined param name overlays parser defined param name."); + + sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages The pages description.*"+"/")); + is(sym.params.length, 1, "user defined param with description is found."); + is(sym.params[0].desc, "The pages description.", "user defined param description is found."); + */ + + // @constructor + if (this.comment.getTag("constructor").length) { + this.isa = "CONSTRUCTOR"; + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@constructor*"+"/")); + is(sym.isa, "CONSTRUCTOR", "@constructor tag, makes symbol a constructor."); + */ + + // @static + if (this.comment.getTag("static").length) { + this.isStatic = true; + if (this.isa == "CONSTRUCTOR") { + this.isNamespace = true; + } + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@static\n@constructor*"+"/")); + is(sym.isStatic, true, "@static tag, makes isStatic true."); + is(sym.isNamespace, true, "@static and @constructor tag, makes isNamespace true."); + */ + + // @inner + if (this.comment.getTag("inner").length) { + this.isInner = true; + this.isStatic = false; + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@inner*"+"/")); + is(sym.isStatic, false, "@inner tag, makes isStatic false."); + is(sym.isInner, true, "@inner makes isInner true."); + */ + + // @name + var names = this.comment.getTag("name"); + if (names.length) { + this.name = names[0].desc; + } + + /*t: + // todo + */ + + // @field + if (this.comment.getTag("field").length) { + this.isa = "OBJECT"; + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**@field*"+"/")); + is(sym.isa, "OBJECT", "@field tag, makes symbol an object."); + */ + + // @function + if (this.comment.getTag("function").length) { + this.isa = "FUNCTION"; + if (/event:/.test(this.alias)) this.isEvent = true; + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@function*"+"/")); + is(sym.isa, "FUNCTION", "@function tag, makes symbol a function."); + */ + + // @event + var events = this.comment.getTag("event"); + if (events.length) { + this.isa = "FUNCTION"; + this.isEvent = true; + if (!/event:/.test(this.alias)) + this.alias = this.alias.replace(/^(.*[.#-])([^.#-]+)$/, "$1event:$2"); + } + + /*t: + var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@event*"+"/")); + is(sym.isa, "FUNCTION", "@event tag, makes symbol a function."); + is(sym.isEvent, true, "@event makes isEvent true."); + */ + + // @fires + var fires = this.comment.getTag("fires"); + if (fires.length) { + for (var i = 0; i < fires.length; i++) { + this.fires.push(fires[i].desc); + } + } + + /*t: + // todo + */ + + // @property + var properties = this.comment.getTag("property"); + if (properties.length) { + thisProperties = this.properties; + for (var i = 0; i < properties.length; i++) { + var property = new JSDOC.Symbol(this.alias+"#"+properties[i].name, [], "OBJECT", new JSDOC.DocComment("/**"+properties[i].desc+"*/")); + // TODO: shouldn't the following happen in the addProperty method of Symbol? + if (properties[i].type) property.type = properties[i].type; + if (properties[i].defaultValue) property.defaultValue = properties[i].defaultValue; + this.addProperty(property); + if (!JSDOC.Parser.symbols.getSymbolByName(property.name)) + JSDOC.Parser.addSymbol(property); + } + } + + /*t: + // todo + */ + + // @return + var returns = this.comment.getTag("return"); + if (returns.length) { // there can be many return tags in a single doclet + this.returns = returns; + this.type = returns.map(function($){return $.type}).join(", "); + } + + /*t: + // todo + */ + + // @exception + this.exceptions = this.comment.getTag("throws"); + + /*t: + // todo + */ + + // @requires + var requires = this.comment.getTag("requires"); + if (requires.length) { + this.requires = requires.map(function($){return $.desc}); + } + + /*t: + // todo + */ + + // @type + var types = this.comment.getTag("type"); + if (types.length) { + this.type = types[0].desc; //multiple type tags are ignored + } + + /*t: + // todo + */ + + // @private + if (this.comment.getTag("private").length || this.isInner) { + this.isPrivate = true; + } + + // @ignore + if (this.comment.getTag("ignore").length) { + this.isIgnored = true; + } + + /*t: + // todo + */ + + // @inherits ... as ... + var inherits = this.comment.getTag("inherits"); + if (inherits.length) { + for (var i = 0; i < inherits.length; i++) { + if (/^\s*([a-z$0-9_.#:-]+)(?:\s+as\s+([a-z$0-9_.#:-]+))?/i.test(inherits[i].desc)) { + var inAlias = RegExp.$1; + var inAs = RegExp.$2 || inAlias; + + if (inAlias) inAlias = inAlias.replace(/\.prototype\.?/g, "#"); + + if (inAs) { + inAs = inAs.replace(/\.prototype\.?/g, "#"); + inAs = inAs.replace(/^this\.?/, "#"); + } + + if (inAs.indexOf(inAlias) != 0) { //not a full namepath + var joiner = "."; + if (this.alias.charAt(this.alias.length-1) == "#" || inAs.charAt(0) == "#") { + joiner = ""; + } + inAs = this.alias + joiner + inAs; + } + } + this.inherits.push({alias: inAlias, as: inAs}); + } + } + + /*t: + // todo + */ + + // @augments + this.augments = this.comment.getTag("augments"); + + // @default + var defaults = this.comment.getTag("default"); + if (defaults.length) { + if (this.is("OBJECT")) { + this.defaultValue = defaults[0].desc; + } + } + + /*t: + // todo + */ + + // @memberOf + var memberOfs = this.comment.getTag("memberOf"); + if (memberOfs.length) { + this.memberOf = memberOfs[0].desc; + this.memberOf = this.memberOf.replace(/\.prototype\.?/g, "#"); + } + + /*t: + // todo + */ + + // @public + if (this.comment.getTag("public").length) { + this.isPrivate = false; + } + + /*t: + // todo + */ + + if (JSDOC.PluginManager) { + JSDOC.PluginManager.run("onSetTags", this); + } +} + +JSDOC.Symbol.prototype.is = function(what) { + return this.isa === what; +} + +JSDOC.Symbol.prototype.isBuiltin = function() { + return JSDOC.Lang.isBuiltin(this.alias); +} + +JSDOC.Symbol.prototype.setType = function(/**String*/comment, /**Boolean*/overwrite) { + if (!overwrite && this.type) return; + var typeComment = JSDOC.DocComment.unwrapComment(comment); + this.type = typeComment; +} + +JSDOC.Symbol.prototype.inherit = function(symbol) { + if (!this.hasMember(symbol.name) && !symbol.isInner) { + if (symbol.is("FUNCTION")) + this.methods.push(symbol); + else if (symbol.is("OBJECT")) + this.properties.push(symbol); + } +} + +JSDOC.Symbol.prototype.hasMember = function(name) { + return (this.hasMethod(name) || this.hasProperty(name)); +} + +JSDOC.Symbol.prototype.addMember = function(symbol) { + if (symbol.is("FUNCTION")) { this.addMethod(symbol); } + else if (symbol.is("OBJECT")) { this.addProperty(symbol); } +} + +JSDOC.Symbol.prototype.hasMethod = function(name) { + var thisMethods = this.methods; + for (var i = 0, l = thisMethods.length; i < l; i++) { + if (thisMethods[i].name == name) return true; + if (thisMethods[i].alias == name) return true; + } + return false; +} + +JSDOC.Symbol.prototype.addMethod = function(symbol) { + var methodAlias = symbol.alias; + var thisMethods = this.methods; + for (var i = 0, l = thisMethods.length; i < l; i++) { + if (thisMethods[i].alias == methodAlias) { + thisMethods[i] = symbol; // overwriting previous method + return; + } + } + thisMethods.push(symbol); // new method with this alias +} + +JSDOC.Symbol.prototype.hasProperty = function(name) { + var thisProperties = this.properties; + for (var i = 0, l = thisProperties.length; i < l; i++) { + if (thisProperties[i].name == name) return true; + if (thisProperties[i].alias == name) return true; + } + return false; +} + +JSDOC.Symbol.prototype.addProperty = function(symbol) { + var propertyAlias = symbol.alias; + var thisProperties = this.properties; + for (var i = 0, l = thisProperties.length; i < l; i++) { + if (thisProperties[i].alias == propertyAlias) { + thisProperties[i] = symbol; // overwriting previous property + return; + } + } + + thisProperties.push(symbol); // new property with this alias +} + +JSDOC.Symbol.srcFile = ""; //running reference to the current file being parsed diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js new file mode 100644 index 0000000..8e3a2eb --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js @@ -0,0 +1,243 @@ +/** @constructor */ +JSDOC.SymbolSet = function() { + this.init(); +} + +JSDOC.SymbolSet.prototype.init = function() { + this._index = new Hash(); +} + +JSDOC.SymbolSet.prototype.keys = function() { + return this._index.keys(); +} + +JSDOC.SymbolSet.prototype.hasSymbol = function(alias) { + return this._index.hasKey(alias); +} + +JSDOC.SymbolSet.prototype.addSymbol = function(symbol) { + if (JSDOC.opt.a && this.hasSymbol(symbol.alias)) { + LOG.warn("Overwriting symbol documentation for: " + symbol.alias + "."); + this.deleteSymbol(symbol.alias); + } + this._index.set(symbol.alias, symbol); +} + +JSDOC.SymbolSet.prototype.getSymbol = function(alias) { + if (this.hasSymbol(alias)) return this._index.get(alias); +} + +JSDOC.SymbolSet.prototype.getSymbolByName = function(name) { + for (var p = this._index.first(); p; p = this._index.next()) { + var symbol = p.value; + if (symbol.name == name) return symbol; + } +} + +JSDOC.SymbolSet.prototype.toArray = function() { + return this._index.values(); +} + +JSDOC.SymbolSet.prototype.deleteSymbol = function(alias) { + if (!this.hasSymbol(alias)) return; + this._index.drop(alias); +} + +JSDOC.SymbolSet.prototype.renameSymbol = function(oldName, newName) { + // todo: should check if oldname or newname already exist + this._index.replace(oldName, newName); + this._index.get(newName).alias = newName; + return newName; +} + +JSDOC.SymbolSet.prototype.relate = function() { + this.resolveBorrows(); + this.resolveMemberOf(); + this.resolveAugments(); +} + +JSDOC.SymbolSet.prototype.resolveBorrows = function() { + for (var p = this._index.first(); p; p = this._index.next()) { + var symbol = p.value; + if (symbol.is("FILE") || symbol.is("GLOBAL")) continue; + + var borrows = symbol.inherits; + for (var i = 0; i < borrows.length; i++) { + +if (/#$/.test(borrows[i].alias)) { + LOG.warn("Attempted to borrow entire instance of "+borrows[i].alias+" but that feature is not yet implemented."); + return; +} + var borrowed = this.getSymbol(borrows[i].alias); + + if (!borrowed) { + LOG.warn("Can't borrow undocumented "+borrows[i].alias+"."); + continue; + } + + if (borrows[i].as == borrowed.alias) { + var assumedName = borrowed.name.split(/([#.-])/).pop(); + borrows[i].as = symbol.name+RegExp.$1+assumedName; + LOG.inform("Assuming borrowed as name is "+borrows[i].as+" but that feature is experimental."); + } + + var borrowAsName = borrows[i].as; + var borrowAsAlias = borrowAsName; + if (!borrowAsName) { + LOG.warn("Malformed @borrow, 'as' is required."); + continue; + } + + if (borrowAsName.length > symbol.alias.length && borrowAsName.indexOf(symbol.alias) == 0) { + borrowAsName = borrowAsName.replace(borrowed.alias, "") + } + else { + var joiner = ""; + if (borrowAsName.charAt(0) != "#") joiner = "."; + borrowAsAlias = borrowed.alias + joiner + borrowAsName; + } + + borrowAsName = borrowAsName.replace(/^[#.]/, ""); + + if (this.hasSymbol(borrowAsAlias)) continue; + + var clone = borrowed.clone(); + clone.name = borrowAsName; + clone.alias = borrowAsAlias; + this.addSymbol(clone); + } + } +} + +JSDOC.SymbolSet.prototype.resolveMemberOf = function() { + for (var p = this._index.first(); p; p = this._index.next()) { + var symbol = p.value; + + if (symbol.is("FILE") || symbol.is("GLOBAL")) continue; + + // the memberOf value was provided in the @memberOf tag + else if (symbol.memberOf) { + // like foo.bar is a memberOf foo + if (symbol.alias.indexOf(symbol.memberOf) == 0) { + var memberMatch = new RegExp("^("+symbol.memberOf+")[.#-]?(.+)$"); + var aliasParts = symbol.alias.match(memberMatch); + + if (aliasParts) { + symbol.memberOf = aliasParts[1]; + symbol.name = aliasParts[2]; + } + + var nameParts = symbol.name.match(memberMatch); + + if (nameParts) { + symbol.name = nameParts[2]; + } + } + // like bar is a memberOf foo + else { + var joiner = symbol.memberOf.charAt(symbol.memberOf.length-1); + if (!/[.#-]/.test(joiner)) symbol.memberOf += "."; + this.renameSymbol(symbol.alias, symbol.memberOf + symbol.name); + } + } + // the memberOf must be calculated + else { + var parts = symbol.alias.match(/^(.*[.#-])([^.#-]+)$/); + + if (parts) { + symbol.memberOf = parts[1]; + symbol.name = parts[2]; + } + } + + // set isStatic, isInner + if (symbol.memberOf) { + switch (symbol.memberOf.charAt(symbol.memberOf.length-1)) { + case '#' : + symbol.isStatic = false; + symbol.isInner = false; + break; + case '.' : + symbol.isStatic = true; + symbol.isInner = false; + break; + case '-' : + symbol.isStatic = false; + symbol.isInner = true; + break; + default: // memberOf ends in none of the above + symbol.isStatic = true; + break; + } + } + + // unowned methods and fields belong to the global object + if (!symbol.is("CONSTRUCTOR") && !symbol.isNamespace && symbol.memberOf == "") { + symbol.memberOf = "_global_"; + } + + // clean up + if (symbol.memberOf.match(/[.#-]$/)) { + symbol.memberOf = symbol.memberOf.substr(0, symbol.memberOf.length-1); + } + // add to parent's methods or properties list + if (symbol.memberOf) { + + var container = this.getSymbol(symbol.memberOf); + if (!container) { + if (JSDOC.Lang.isBuiltin(symbol.memberOf)) container = JSDOC.Parser.addBuiltin(symbol.memberOf); + else { + LOG.warn("Trying to document "+symbol.name +" as a member of undocumented symbol "+symbol.memberOf+"."); + } + } + + if (container) container.addMember(symbol); + } + } +} + +JSDOC.SymbolSet.prototype.resolveAugments = function() { + for (var p = this._index.first(); p; p = this._index.next()) { + var symbol = p.value; + + if (symbol.alias == "_global_" || symbol.is("FILE")) continue; + JSDOC.SymbolSet.prototype.walk.apply(this, [symbol]); + } +} + +JSDOC.SymbolSet.prototype.walk = function(symbol) { + var augments = symbol.augments; + for(var i = 0; i < augments.length; i++) { + var contributer = this.getSymbol(augments[i]); + if (!contributer && JSDOC.Lang.isBuiltin(''+augments[i])) { + contributer = new JSDOC.Symbol("_global_."+augments[i], [], augments[i], new JSDOC.DocComment("Built in.")); + contributer.isNamespace = true; + contributer.srcFile = ""; + contributer.isPrivate = false; + JSDOC.Parser.addSymbol(contributer); + } + + if (contributer) { + if (contributer.augments.length) { + JSDOC.SymbolSet.prototype.walk.apply(this, [contributer]); + } + + symbol.inheritsFrom.push(contributer.alias); + //if (!isUnique(symbol.inheritsFrom)) { + // LOG.warn("Can't resolve augments: Circular reference: "+symbol.alias+" inherits from "+contributer.alias+" more than once."); + //} + //else { + var cmethods = contributer.methods; + var cproperties = contributer.properties; + + for (var ci = 0, cl = cmethods.length; ci < cl; ci++) { + if (!cmethods[ci].isStatic) symbol.inherit(cmethods[ci]); + } + for (var ci = 0, cl = cproperties.length; ci < cl; ci++) { + if (!cproperties[ci].isStatic) symbol.inherit(cproperties[ci]); + } + //} + } + else LOG.warn("Can't augment contributer: "+augments[i]+", not found."); + } +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TextStream.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TextStream.js new file mode 100644 index 0000000..ccc48a8 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TextStream.js @@ -0,0 +1,41 @@ + +/** + @constructor +*/ +JSDOC.TextStream = function(text) { + if (typeof(text) == "undefined") text = ""; + text = ""+text; + this.text = text; + this.cursor = 0; +} + +JSDOC.TextStream.prototype.look = function(n) { + if (typeof n == "undefined") n = 0; + + if (this.cursor+n < 0 || this.cursor+n >= this.text.length) { + var result = new String(""); + result.eof = true; + return result; + } + return this.text.charAt(this.cursor+n); +} + +JSDOC.TextStream.prototype.next = function(n) { + if (typeof n == "undefined") n = 1; + if (n < 1) return null; + + var pulled = ""; + for (var i = 0; i < n; i++) { + if (this.cursor+i < this.text.length) { + pulled += this.text.charAt(this.cursor+i); + } + else { + var result = new String(""); + result.eof = true; + return result; + } + } + + this.cursor += n; + return pulled; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Token.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Token.js new file mode 100644 index 0000000..fb7f9d9 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Token.js @@ -0,0 +1,18 @@ +if (typeof JSDOC == "undefined") JSDOC = {}; + +/** + @constructor +*/ +JSDOC.Token = function(data, type, name) { + this.data = data; + this.type = type; + this.name = name; +} + +JSDOC.Token.prototype.toString = function() { + return "<"+this.type+" name=\""+this.name+"\">"+this.data+""; +} + +JSDOC.Token.prototype.is = function(what) { + return this.name === what || this.type === what; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js new file mode 100644 index 0000000..9f658fb --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js @@ -0,0 +1,332 @@ +if (typeof JSDOC == "undefined") JSDOC = {}; + +/** + @class Search a {@link JSDOC.TextStream} for language tokens. +*/ +JSDOC.TokenReader = function() { + this.keepDocs = true; + this.keepWhite = false; + this.keepComments = false; +} + +/** + @type {JSDOC.Token[]} + */ +JSDOC.TokenReader.prototype.tokenize = function(/**JSDOC.TextStream*/stream) { + var tokens = []; + /**@ignore*/ tokens.last = function() { return tokens[tokens.length-1]; } + /**@ignore*/ tokens.lastSym = function() { + for (var i = tokens.length-1; i >= 0; i--) { + if (!(tokens[i].is("WHIT") || tokens[i].is("COMM"))) return tokens[i]; + } + } + + while (!stream.look().eof) { + if (this.read_mlcomment(stream, tokens)) continue; + if (this.read_slcomment(stream, tokens)) continue; + if (this.read_dbquote(stream, tokens)) continue; + if (this.read_snquote(stream, tokens)) continue; + if (this.read_regx(stream, tokens)) continue; + if (this.read_numb(stream, tokens)) continue; + if (this.read_punc(stream, tokens)) continue; + if (this.read_newline(stream, tokens)) continue; + if (this.read_space(stream, tokens)) continue; + if (this.read_word(stream, tokens)) continue; + + // if execution reaches here then an error has happened + tokens.push(new JSDOC.Token(stream.next(), "TOKN", "UNKNOWN_TOKEN")); + } + return tokens; +} + +/** + @returns {Boolean} Was the token found? + */ +JSDOC.TokenReader.prototype.read_word = function(/**JSDOC.TokenStream*/stream, tokens) { + var found = ""; + while (!stream.look().eof && JSDOC.Lang.isWordChar(stream.look())) { + found += stream.next(); + } + + if (found === "") { + return false; + } + else { + var name; + if ((name = JSDOC.Lang.keyword(found))) tokens.push(new JSDOC.Token(found, "KEYW", name)); + else tokens.push(new JSDOC.Token(found, "NAME", "NAME")); + return true; + } +} + +/** + @returns {Boolean} Was the token found? + */ +JSDOC.TokenReader.prototype.read_punc = function(/**JSDOC.TokenStream*/stream, tokens) { + var found = ""; + var name; + while (!stream.look().eof && JSDOC.Lang.punc(found+stream.look())) { + found += stream.next(); + } + + if (found === "") { + return false; + } + else { + tokens.push(new JSDOC.Token(found, "PUNC", JSDOC.Lang.punc(found))); + return true; + } +} + +/** + @returns {Boolean} Was the token found? + */ +JSDOC.TokenReader.prototype.read_space = function(/**JSDOC.TokenStream*/stream, tokens) { + var found = ""; + + while (!stream.look().eof && JSDOC.Lang.isSpace(stream.look())) { + found += stream.next(); + } + + if (found === "") { + return false; + } + else { + if (this.collapseWhite) found = " "; + if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "SPACE")); + return true; + } +} + +/** + @returns {Boolean} Was the token found? + */ +JSDOC.TokenReader.prototype.read_newline = function(/**JSDOC.TokenStream*/stream, tokens) { + var found = ""; + + while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look())) { + found += stream.next(); + } + + if (found === "") { + return false; + } + else { + if (this.collapseWhite) found = "\n"; + if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "NEWLINE")); + return true; + } +} + +/** + @returns {Boolean} Was the token found? + */ +JSDOC.TokenReader.prototype.read_mlcomment = function(/**JSDOC.TokenStream*/stream, tokens) { + if (stream.look() == "/" && stream.look(1) == "*") { + var found = stream.next(2); + + while (!stream.look().eof && !(stream.look(-1) == "/" && stream.look(-2) == "*")) { + found += stream.next(); + } + + // to start doclet we allow /** or /*** but not /**/ or /**** + if (/^\/\*\*([^\/]|\*[^*])/.test(found) && this.keepDocs) tokens.push(new JSDOC.Token(found, "COMM", "JSDOC")); + else if (this.keepComments) tokens.push(new JSDOC.Token(found, "COMM", "MULTI_LINE_COMM")); + return true; + } + return false; +} + +/** + @returns {Boolean} Was the token found? + */ +JSDOC.TokenReader.prototype.read_slcomment = function(/**JSDOC.TokenStream*/stream, tokens) { + var found; + if ( + (stream.look() == "/" && stream.look(1) == "/" && (found=stream.next(2))) + || + (stream.look() == "<" && stream.look(1) == "!" && stream.look(2) == "-" && stream.look(3) == "-" && (found=stream.next(4))) + ) { + + while (!stream.look().eof && !JSDOC.Lang.isNewline(stream.look())) { + found += stream.next(); + } + + if (this.keepComments) { + tokens.push(new JSDOC.Token(found, "COMM", "SINGLE_LINE_COMM")); + } + return true; + } + return false; +} + +/** + @returns {Boolean} Was the token found? + */ +JSDOC.TokenReader.prototype.read_dbquote = function(/**JSDOC.TokenStream*/stream, tokens) { + if (stream.look() == "\"") { + // find terminator + var string = stream.next(); + + while (!stream.look().eof) { + if (stream.look() == "\\") { + if (JSDOC.Lang.isNewline(stream.look(1))) { + do { + stream.next(); + } while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look())); + string += "\\\n"; + } + else { + string += stream.next(2); + } + } + else if (stream.look() == "\"") { + string += stream.next(); + tokens.push(new JSDOC.Token(string, "STRN", "DOUBLE_QUOTE")); + return true; + } + else { + string += stream.next(); + } + } + } + return false; // error! unterminated string +} + +/** + @returns {Boolean} Was the token found? + */ +JSDOC.TokenReader.prototype.read_snquote = function(/**JSDOC.TokenStream*/stream, tokens) { + if (stream.look() == "'") { + // find terminator + var string = stream.next(); + + while (!stream.look().eof) { + if (stream.look() == "\\") { // escape sequence + string += stream.next(2); + } + else if (stream.look() == "'") { + string += stream.next(); + tokens.push(new JSDOC.Token(string, "STRN", "SINGLE_QUOTE")); + return true; + } + else { + string += stream.next(); + } + } + } + return false; // error! unterminated string +} + +/** + @returns {Boolean} Was the token found? + */ +JSDOC.TokenReader.prototype.read_numb = function(/**JSDOC.TokenStream*/stream, tokens) { + if (stream.look() === "0" && stream.look(1) == "x") { + return this.read_hex(stream, tokens); + } + + var found = ""; + + while (!stream.look().eof && JSDOC.Lang.isNumber(found+stream.look())){ + found += stream.next(); + } + + if (found === "") { + return false; + } + else { + if (/^0[0-7]/.test(found)) tokens.push(new JSDOC.Token(found, "NUMB", "OCTAL")); + else tokens.push(new JSDOC.Token(found, "NUMB", "DECIMAL")); + return true; + } +} +/*t: + requires("../lib/JSDOC/TextStream.js"); + requires("../lib/JSDOC/Token.js"); + requires("../lib/JSDOC/Lang.js"); + + plan(3, "testing JSDOC.TokenReader.prototype.read_numb"); + + //// setup + var src = "function foo(num){while (num+8.0 >= 0x20 && num < 0777){}}"; + var tr = new JSDOC.TokenReader(); + var tokens = tr.tokenize(new JSDOC.TextStream(src)); + + var hexToken, octToken, decToken; + for (var i = 0; i < tokens.length; i++) { + if (tokens[i].name == "HEX_DEC") hexToken = tokens[i]; + if (tokens[i].name == "OCTAL") octToken = tokens[i]; + if (tokens[i].name == "DECIMAL") decToken = tokens[i]; + } + //// + + is(decToken.data, "8.0", "decimal number is found in source."); + is(hexToken.data, "0x20", "hexdec number is found in source (issue #99)."); + is(octToken.data, "0777", "octal number is found in source."); +*/ + +/** + @returns {Boolean} Was the token found? + */ +JSDOC.TokenReader.prototype.read_hex = function(/**JSDOC.TokenStream*/stream, tokens) { + var found = stream.next(2); + + while (!stream.look().eof) { + if (JSDOC.Lang.isHexDec(found) && !JSDOC.Lang.isHexDec(found+stream.look())) { // done + tokens.push(new JSDOC.Token(found, "NUMB", "HEX_DEC")); + return true; + } + else { + found += stream.next(); + } + } + return false; +} + +/** + @returns {Boolean} Was the token found? + */ +JSDOC.TokenReader.prototype.read_regx = function(/**JSDOC.TokenStream*/stream, tokens) { + var last; + if ( + stream.look() == "/" + && + ( + + ( + !(last = tokens.lastSym()) // there is no last, the regex is the first symbol + || + ( + !last.is("NUMB") + && !last.is("NAME") + && !last.is("RIGHT_PAREN") + && !last.is("RIGHT_BRACKET") + ) + ) + ) + ) { + var regex = stream.next(); + + while (!stream.look().eof) { + if (stream.look() == "\\") { // escape sequence + regex += stream.next(2); + } + else if (stream.look() == "/") { + regex += stream.next(); + + while (/[gmi]/.test(stream.look())) { + regex += stream.next(); + } + + tokens.push(new JSDOC.Token(regex, "REGX", "REGX")); + return true; + } + else { + regex += stream.next(); + } + } + // error: unterminated regex + } + return false; +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js new file mode 100644 index 0000000..1eeb44c --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js @@ -0,0 +1,133 @@ +if (typeof JSDOC == "undefined") JSDOC = {}; + +/** + @constructor +*/ +JSDOC.TokenStream = function(tokens) { + this.tokens = (tokens || []); + this.rewind(); +} + +/** + @constructor + @private +*/ +function VoidToken(/**String*/type) { + this.toString = function() {return ""}; + this.is = function(){return false;} +} + +JSDOC.TokenStream.prototype.rewind = function() { + this.cursor = -1; +} + +/** + @type JSDOC.Token +*/ +JSDOC.TokenStream.prototype.look = function(/**Number*/n, /**Boolean*/considerWhitespace) { + if (typeof n == "undefined") n = 0; + + if (considerWhitespace == true) { + if (this.cursor+n < 0 || this.cursor+n > this.tokens.length) return {}; + return this.tokens[this.cursor+n]; + } + else { + var count = 0; + var i = this.cursor; + + while (true) { + if (i < 0) return new JSDOC.Token("", "VOID", "START_OF_STREAM"); + else if (i > this.tokens.length) return new JSDOC.Token("", "VOID", "END_OF_STREAM"); + + if (i != this.cursor && (this.tokens[i] === undefined || this.tokens[i].is("WHIT"))) { + if (n < 0) i--; else i++; + continue; + } + + if (count == Math.abs(n)) { + return this.tokens[i]; + } + count++; + (n < 0)? i-- : i++; + } + + return new JSDOC.Token("", "VOID", "STREAM_ERROR"); // because null isn't an object and caller always expects an object + } +} + +/** + @type JSDOC.Token|JSDOC.Token[] +*/ +JSDOC.TokenStream.prototype.next = function(/**Number*/howMany) { + if (typeof howMany == "undefined") howMany = 1; + if (howMany < 1) return null; + var got = []; + + for (var i = 1; i <= howMany; i++) { + if (this.cursor+i >= this.tokens.length) { + return null; + } + got.push(this.tokens[this.cursor+i]); + } + this.cursor += howMany; + + if (howMany == 1) { + return got[0]; + } + else return got; +} + +/** + @type JSDOC.Token[] +*/ +JSDOC.TokenStream.prototype.balance = function(/**String*/start, /**String*/stop) { + if (!stop) stop = JSDOC.Lang.matching(start); + + var depth = 0; + var got = []; + var started = false; + + while ((token = this.look())) { + if (token.is(start)) { + depth++; + started = true; + } + + if (started) { + got.push(token); + } + + if (token.is(stop)) { + depth--; + if (depth == 0) return got; + } + if (!this.next()) break; + } +} + +JSDOC.TokenStream.prototype.getMatchingToken = function(/**String*/start, /**String*/stop) { + var depth = 0; + var cursor = this.cursor; + + if (!start) { + start = JSDOC.Lang.matching(stop); + depth = 1; + } + if (!stop) stop = JSDOC.Lang.matching(start); + + while ((token = this.tokens[cursor])) { + if (token.is(start)) { + depth++; + } + + if (token.is(stop) && cursor) { + depth--; + if (depth == 0) return this.tokens[cursor]; + } + cursor++; + } +} + +JSDOC.TokenStream.prototype.insertAhead = function(/**JSDOC.Token*/token) { + this.tokens.splice(this.cursor+1, 0, token); +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Util.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Util.js new file mode 100644 index 0000000..6d7edb3 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Util.js @@ -0,0 +1,32 @@ +/** + * @namespace + * @deprecated Use {@link FilePath} instead. + */ +JSDOC.Util = { +} + +/** + * @deprecated Use {@link FilePath.fileName} instead. + */ +JSDOC.Util.fileName = function(path) { + LOG.warn("JSDOC.Util.fileName is deprecated. Use FilePath.fileName instead."); + var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0); + return path.substring(nameStart); +} + +/** + * @deprecated Use {@link FilePath.fileExtension} instead. + */ +JSDOC.Util.fileExtension = function(filename) { + LOG.warn("JSDOC.Util.fileExtension is deprecated. Use FilePath.fileExtension instead."); + return filename.split(".").pop().toLowerCase(); +}; + +/** + * @deprecated Use {@link FilePath.dir} instead. + */ +JSDOC.Util.dir = function(path) { + LOG.warn("JSDOC.Util.dir is deprecated. Use FilePath.dir instead."); + var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0); + return path.substring(0, nameStart-1); +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Walker.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Walker.js new file mode 100644 index 0000000..6ecaea8 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/lib/JSDOC/Walker.js @@ -0,0 +1,507 @@ +if (typeof JSDOC == "undefined") JSDOC = {}; + +/** @constructor */ +JSDOC.Walker = function(/**JSDOC.TokenStream*/ts) { + this.init(); + if (typeof ts != "undefined") { + this.walk(ts); + } +} + +JSDOC.Walker.prototype.init = function() { + this.ts = null; + + var globalSymbol = new JSDOC.Symbol("_global_", [], "GLOBAL", new JSDOC.DocComment("")); + globalSymbol.isNamespace = true; + globalSymbol.srcFile = ""; + globalSymbol.isPrivate = false; + JSDOC.Parser.addSymbol(globalSymbol); + this.lastDoc = null; + this.token = null; + + /** + The chain of symbols under which we are currently nested. + @type Array + */ + this.namescope = [globalSymbol]; + this.namescope.last = function(n){ if (!n) n = 0; return this[this.length-(1+n)] || "" }; +} + +JSDOC.Walker.prototype.walk = function(/**JSDOC.TokenStream*/ts) { + this.ts = ts; + while (this.token = this.ts.look()) { + if (this.token.popNamescope) { + + var symbol = this.namescope.pop(); + if (symbol.is("FUNCTION")) { + if (this.ts.look(1).is("LEFT_PAREN") && symbol.comment.getTag("function").length == 0) { + symbol.isa = "OBJECT"; + } + } + } + this.step(); + if (!this.ts.next()) break; + } +} + +JSDOC.Walker.prototype.step = function() { + if (this.token.is("JSDOC")) { // it's a doc comment + + var doc = new JSDOC.DocComment(this.token.data); + + + if (doc.getTag("exports").length > 0) { + var exports = doc.getTag("exports")[0]; + + exports.desc.match(/(\S+) as (\S+)/i); + var n1 = RegExp.$1; + var n2 = RegExp.$2; + + if (!n1 && n2) throw "@exports tag requires a value like: 'name as ns.name'"; + + JSDOC.Parser.rename = (JSDOC.Parser.rename || {}); + JSDOC.Parser.rename[n1] = n2 + } + + if (doc.getTag("lends").length > 0) { + var lends = doc.getTag("lends")[0]; + + var name = lends.desc + if (!name) throw "@lends tag requires a value."; + + var symbol = new JSDOC.Symbol(name, [], "OBJECT", doc); + + this.namescope.push(symbol); + + var matching = this.ts.getMatchingToken("LEFT_CURLY"); + if (matching) matching.popNamescope = name; + else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); + + this.lastDoc = null; + return true; + } + else if (doc.getTag("name").length > 0 && doc.getTag("overview").length == 0) { // it's a virtual symbol + var virtualName = doc.getTag("name")[0].desc; + if (!virtualName) throw "@name tag requires a value."; + + if (doc.getTag("memberOf").length > 0) { + virtualName = (doc.getTag("memberOf")[0] + "." + virtualName) + .replace(/([#.])\./, "$1"); + doc.deleteTag("memberOf"); + } + + var symbol = new JSDOC.Symbol(virtualName, [], "VIRTUAL", doc); + + JSDOC.Parser.addSymbol(symbol); + + this.lastDoc = null; + return true; + } + else if (doc.meta) { // it's a meta doclet + if (doc.meta == "@+") JSDOC.DocComment.shared = doc.src; + else if (doc.meta == "@-") JSDOC.DocComment.shared = ""; + else if (doc.meta == "nocode+") JSDOC.Parser.conf.ignoreCode = true; + else if (doc.meta == "nocode-") JSDOC.Parser.conf.ignoreCode = JSDOC.opt.n; + else throw "Unrecognized meta comment: "+doc.meta; + + this.lastDoc = null; + return true; + } + else if (doc.getTag("overview").length > 0) { // it's a file overview + symbol = new JSDOC.Symbol("", [], "FILE", doc); + + JSDOC.Parser.addSymbol(symbol); + + this.lastDoc = null; + return true; + } + else { + this.lastDoc = doc; + return false; + } + } + else if (!JSDOC.Parser.conf.ignoreCode) { // it's code + if (this.token.is("NAME")) { // it's the name of something + var symbol; + var name = this.token.data; + var doc = null; if (this.lastDoc) doc = this.lastDoc; + var params = []; + + // it's inside an anonymous object + if (this.ts.look(1).is("COLON") && this.ts.look(-1).is("LEFT_CURLY") && !(this.ts.look(-2).is("JSDOC") || this.namescope.last().comment.getTag("lends").length || this.ts.look(-2).is("ASSIGN") || this.ts.look(-2).is("COLON"))) { + name = "$anonymous"; + name = this.namescope.last().alias+"-"+name + + params = []; + + symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); + + JSDOC.Parser.addSymbol(symbol); + + this.namescope.push(symbol); + + var matching = this.ts.getMatchingToken(null, "RIGHT_CURLY"); + if (matching) matching.popNamescope = name; + else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); + } + // function foo() {} + else if (this.ts.look(-1).is("FUNCTION") && this.ts.look(1).is("LEFT_PAREN")) { + var isInner; + + if (this.lastDoc) doc = this.lastDoc; + + if (doc && doc.getTag("memberOf").length > 0) { + name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#"); + doc.deleteTag("memberOf"); + } + else { + name = this.namescope.last().alias+"-"+name; + if (!this.namescope.last().is("GLOBAL")) isInner = true; + } + + if (!this.namescope.last().is("GLOBAL")) isInner = true; + + params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); + + symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc); + if (isInner) symbol.isInner = true; + + if (this.ts.look(1).is("JSDOC")) { + var inlineReturn = ""+this.ts.look(1).data; + inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, ""); + symbol.type = inlineReturn; + } + + JSDOC.Parser.addSymbol(symbol); + + this.namescope.push(symbol); + + var matching = this.ts.getMatchingToken("LEFT_CURLY"); + if (matching) matching.popNamescope = name; + else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); + } + // foo = function() {} + else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("FUNCTION")) { + var constructs; + var isConstructor = false; + if (doc && (constructs = doc.getTag("constructs")) && constructs.length) { + if (constructs[0].desc) { + name = constructs[0].desc; + isConstructor = true; + } + } + + var isInner; + if (this.ts.look(-1).is("VAR") || this.isInner) { + if (doc && doc.getTag("memberOf").length > 0) { + name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#"); + doc.deleteTag("memberOf"); + } + else { + name = this.namescope.last().alias+"-"+name; + if (!this.namescope.last().is("GLOBAL")) isInner = true; + } + if (!this.namescope.last().is("GLOBAL")) isInner = true; + } + else if (name.indexOf("this.") == 0) { + name = this.resolveThis(name); + } + + if (this.lastDoc) doc = this.lastDoc; + params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); + + symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc); + + if (isInner) symbol.isInner = true; + if (isConstructor) symbol.isa = "CONSTRUCTOR"; + + if (this.ts.look(1).is("JSDOC")) { + var inlineReturn = ""+this.ts.look(1).data; + inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, ""); + symbol.type = inlineReturn; + } + + JSDOC.Parser.addSymbol(symbol); + + this.namescope.push(symbol); + + var matching = this.ts.getMatchingToken("LEFT_CURLY"); + if (matching) matching.popNamescope = name; + else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); + } + // foo = new function() {} or foo = (function() {} + else if (this.ts.look(1).is("ASSIGN") && (this.ts.look(2).is("NEW") || this.ts.look(2).is("LEFT_PAREN")) && this.ts.look(3).is("FUNCTION")) { + var isInner; + if (this.ts.look(-1).is("VAR") || this.isInner) { + name = this.namescope.last().alias+"-"+name + if (!this.namescope.last().is("GLOBAL")) isInner = true; + } + else if (name.indexOf("this.") == 0) { + name = this.resolveThis(name); + } + + this.ts.next(3); // advance past the "new" or "(" + + if (this.lastDoc) doc = this.lastDoc; + params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); + + symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); + if (isInner) symbol.isInner = true; + + if (this.ts.look(1).is("JSDOC")) { + var inlineReturn = ""+this.ts.look(1).data; + inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, ""); + symbol.type = inlineReturn; + } + + JSDOC.Parser.addSymbol(symbol); + + symbol.scopeType = "INSTANCE"; + this.namescope.push(symbol); + + var matching = this.ts.getMatchingToken("LEFT_CURLY"); + if (matching) matching.popNamescope = name; + else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); + } + // foo: function() {} + else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("FUNCTION")) { + name = (this.namescope.last().alias+"."+name).replace("#.", "#"); + + if (this.lastDoc) doc = this.lastDoc; + params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); + + if (doc && doc.getTag("constructs").length) { + name = name.replace(/\.prototype(\.|$)/, "#"); + + if (name.indexOf("#") > -1) name = name.match(/(^[^#]+)/)[0]; + else name = this.namescope.last().alias; + + symbol = new JSDOC.Symbol(name, params, "CONSTRUCTOR", doc); + } + else { + symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc); + } + + if (this.ts.look(1).is("JSDOC")) { + var inlineReturn = ""+this.ts.look(1).data; + inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, ""); + symbol.type = inlineReturn; + } + + JSDOC.Parser.addSymbol(symbol); + + this.namescope.push(symbol); + + var matching = this.ts.getMatchingToken("LEFT_CURLY"); + if (matching) matching.popNamescope = name; + else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); + } + // foo = {} + else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("LEFT_CURLY")) { + var isInner; + if (this.ts.look(-1).is("VAR") || this.isInner) { + name = this.namescope.last().alias+"-"+name + if (!this.namescope.last().is("GLOBAL")) isInner = true; + } + else if (name.indexOf("this.") == 0) { + name = this.resolveThis(name); + } + + if (this.lastDoc) doc = this.lastDoc; + + symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); + if (isInner) symbol.isInner = true; + + + if (doc) JSDOC.Parser.addSymbol(symbol); + + this.namescope.push(symbol); + + var matching = this.ts.getMatchingToken("LEFT_CURLY"); + if (matching) matching.popNamescope = name; + else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); + } + // var foo; + else if (this.ts.look(1).is("SEMICOLON")) { + var isInner; + + if (this.ts.look(-1).is("VAR") || this.isInner) { + name = this.namescope.last().alias+"-"+name + if (!this.namescope.last().is("GLOBAL")) isInner = true; + + if (this.lastDoc) doc = this.lastDoc; + + symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); + if (isInner) symbol.isInner = true; + + + if (doc) JSDOC.Parser.addSymbol(symbol); + } + } + // foo = x + else if (this.ts.look(1).is("ASSIGN")) { + var isInner; + if (this.ts.look(-1).is("VAR") || this.isInner) { + name = this.namescope.last().alias+"-"+name + if (!this.namescope.last().is("GLOBAL")) isInner = true; + } + else if (name.indexOf("this.") == 0) { + name = this.resolveThis(name); + } + + if (this.lastDoc) doc = this.lastDoc; + + symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); + if (isInner) symbol.isInner = true; + + + if (doc) JSDOC.Parser.addSymbol(symbol); + } + // foo: {} + else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("LEFT_CURLY")) { + name = (this.namescope.last().alias+"."+name).replace("#.", "#"); + + if (this.lastDoc) doc = this.lastDoc; + + symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); + + + if (doc) JSDOC.Parser.addSymbol(symbol); + + this.namescope.push(symbol); + + var matching = this.ts.getMatchingToken("LEFT_CURLY"); + if (matching) matching.popNamescope = name; + else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); + } + // foo: x + else if (this.ts.look(1).is("COLON")) { + name = (this.namescope.last().alias+"."+name).replace("#.", "#");; + + if (this.lastDoc) doc = this.lastDoc; + + symbol = new JSDOC.Symbol(name, params, "OBJECT", doc); + + + if (doc) JSDOC.Parser.addSymbol(symbol); + } + // foo(...) + else if (this.ts.look(1).is("LEFT_PAREN")) { + if (typeof JSDOC.PluginManager != "undefined") { + var functionCall = {name: name}; + + var cursor = this.ts.cursor; + params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); + this.ts.cursor = cursor; + + for (var i = 0; i < params.length; i++) + functionCall["arg" + (i + 1)] = params[i].name; + + JSDOC.PluginManager.run("onFunctionCall", functionCall); + if (functionCall.doc) { + this.ts.insertAhead(new JSDOC.Token(functionCall.doc, "COMM", "JSDOC")); + } + } + } + this.lastDoc = null; + } + else if (this.token.is("FUNCTION")) { // it's an anonymous function + if ( + (!this.ts.look(-1).is("COLON") || !this.ts.look(-1).is("ASSIGN")) + && !this.ts.look(1).is("NAME") + ) { + if (this.lastDoc) doc = this.lastDoc; + + name = "$anonymous"; + name = this.namescope.last().alias+"-"+name + + params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN")); + + symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc); + + JSDOC.Parser.addSymbol(symbol); + + this.namescope.push(symbol); + + var matching = this.ts.getMatchingToken("LEFT_CURLY"); + if (matching) matching.popNamescope = name; + else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + "."); + } + } + } + return true; +} + +/** + Resolves what "this." means when it appears in a name. + @param name The name that starts with "this.". + @returns The name with "this." resolved. + */ +JSDOC.Walker.prototype.resolveThis = function(name) { + name.match(/^this\.(.+)$/) + var nameFragment = RegExp.$1; + if (!nameFragment) return name; + + var symbol = this.namescope.last(); + var scopeType = symbol.scopeType || symbol.isa; + + // if we are in a constructor function, `this` means the instance + if (scopeType == "CONSTRUCTOR") { + name = symbol.alias+"#"+nameFragment; + } + + // if we are in an anonymous constructor function, `this` means the instance + else if (scopeType == "INSTANCE") { + name = symbol.alias+"."+nameFragment; + } + + // if we are in a function, `this` means the container (possibly the global) + else if (scopeType == "FUNCTION") { + // in a method of a prototype, so `this` means the constructor + if (symbol.alias.match(/(^.*)[#.-][^#.-]+/)) { + var parentName = RegExp.$1; + var parent = JSDOC.Parser.symbols.getSymbol(parentName); + + if (!parent) { + if (JSDOC.Lang.isBuiltin(parentName)) parent = JSDOC.Parser.addBuiltin(parentName); + else { + if (symbol.alias.indexOf("$anonymous") < 0) // these will be ignored eventually + LOG.warn("Trying to document "+symbol.alias+" without first documenting "+parentName+"."); + } + } + if (parent) name = parentName+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment; + } + else { + parent = this.namescope.last(1); + name = parent.alias+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment; + } + } + // otherwise it means the global + else { + name = nameFragment; + } + + return name; +} + +JSDOC.Walker.onParamList = function(/**Array*/paramTokens) { + if (!paramTokens) { + LOG.warn("Malformed parameter list. Can't parse code."); + return []; + } + var params = []; + for (var i = 0, l = paramTokens.length; i < l; i++) { + if (paramTokens[i].is("JSDOC")) { + var paramType = paramTokens[i].data.replace(/(^\/\*\* *| *\*\/$)/g, ""); + + if (paramTokens[i+1] && paramTokens[i+1].is("NAME")) { + i++; + params.push({type: paramType, name: paramTokens[i].data}); + } + } + else if (paramTokens[i].is("NAME")) { + params.push({name: paramTokens[i].data}); + } + } + return params; +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/main.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/main.js new file mode 100644 index 0000000..f9008c8 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/main.js @@ -0,0 +1,111 @@ +/** + * @version $Id: main.js 818 2009-11-08 14:51:41Z micmath $ + */ + +function main() { + IO.include("lib/JSDOC.js"); + IO.includeDir("plugins/"); + + // process the options + + // the -c option: options are defined in a configuration file + if (JSDOC.opt.c) { + eval("JSDOC.conf = " + IO.readFile(JSDOC.opt.c)); + + LOG.inform("Using configuration file at '"+JSDOC.opt.c+"'."); + + for (var c in JSDOC.conf) { + if (c !== "D" && !defined(JSDOC.opt[c])) { // commandline overrules config file + JSDOC.opt[c] = JSDOC.conf[c]; + } + } + + if (typeof JSDOC.conf["_"] != "undefined") { + JSDOC.opt["_"] = JSDOC.opt["_"].concat(JSDOC.conf["_"]); + } + + LOG.inform("With configuration: "); + for (var o in JSDOC.opt) { + LOG.inform(" "+o+": "+JSDOC.opt[o]); + } + } + + // be verbose + if (JSDOC.opt.v) LOG.verbose = true; + + // send log messages to a file + if (JSDOC.opt.o) LOG.out = IO.open(JSDOC.opt.o); + + // run the unit tests + if (JSDOC.opt.T) { + LOG.inform("JsDoc Toolkit running in test mode at "+new Date()+"."); + IO.include("frame/Testrun.js"); + IO.include("test.js"); + } + else { + // a template must be defined and must be a directory path + if (!JSDOC.opt.t && System.getProperty("jsdoc.template.dir")) { + JSDOC.opt.t = System.getProperty("jsdoc.template.dir"); + } + if (JSDOC.opt.t && SYS.slash != JSDOC.opt.t.slice(-1)) { + JSDOC.opt.t += SYS.slash; + } + + // verbose messages about the options we were given + LOG.inform("JsDoc Toolkit main() running at "+new Date()+"."); + LOG.inform("With options: "); + for (var o in JSDOC.opt) { + LOG.inform(" "+o+": "+JSDOC.opt[o]); + } + + // initialize and build a symbolSet from your code + JSDOC.JsDoc(); + + // debugger's option: dump the entire symbolSet produced from your code + if (JSDOC.opt.Z) { + LOG.warn("So you want to see the data structure, eh? This might hang if you have circular refs..."); + IO.include("frame/Dumper.js"); + var symbols = JSDOC.JsDoc.symbolSet.toArray(); + for (var i = 0, l = symbols.length; i < l; i++) { + var symbol = symbols[i]; + print("// symbol: " + symbol.alias); + print(symbol.serialize()); + } + } + else { + if (typeof JSDOC.opt.t != "undefined") { + try { + // a file named "publish.js" must exist in the template directory + load(JSDOC.opt.t+"publish.js"); + + // and must define a function named "publish" + if (!publish) { + LOG.warn("No publish() function is defined in that template so nothing to do."); + } + else { + // which will be called with the symbolSet produced from your code + publish(JSDOC.JsDoc.symbolSet); + } + } + catch(e) { + LOG.warn("Sorry, that doesn't seem to be a valid template: "+JSDOC.opt.t+"publish.js : "+e); + } + } + else { + LOG.warn("No template given. Might as well read the usage notes."); + JSDOC.usage(); + } + } + } + + // notify of any warnings + if (!JSDOC.opt.q && LOG.warnings.length) { + print(LOG.warnings.length+" warning"+(LOG.warnings.length != 1? "s":"")+"."); + } + + // stop sending log messages to a file + if (LOG.out) { + LOG.out.flush(); + LOG.out.close(); + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/commentSrcJson.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/commentSrcJson.js new file mode 100644 index 0000000..e826b57 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/commentSrcJson.js @@ -0,0 +1,20 @@ +JSDOC.PluginManager.registerPlugin( + "JSDOC.commentSrcJson", + { + onDocCommentSrc: function(comment) { + var json; + if (/^\s*@json\b/.test(comment)) { + comment.src = new String(comment.src).replace("@json", ""); + + eval("json = "+comment.src); + var tagged = ""; + for (var i in json) { + var tag = json[i]; + // todo handle cases where tag is an object + tagged += "@"+i+" "+tag+"\n"; + } + comment.src = tagged; + } + } + } +); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/frameworkPrototype.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/frameworkPrototype.js new file mode 100644 index 0000000..9c41751 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/frameworkPrototype.js @@ -0,0 +1,16 @@ +JSDOC.PluginManager.registerPlugin( + "JSDOC.frameworkPrototype", + { + onPrototypeClassCreate: function(classCreator) { + var desc = ""; + if (classCreator.comment) { + desc = classCreator.comment; + } + var insert = desc+"/** @name "+classCreator.name+"\n@constructor\n@scope "+classCreator.name+".prototype */" + + insert = insert.replace(/\*\/\/\*\*/g, "\n"); + /*DEBUG*///print("insert is "+insert); + classCreator.addComment.data = insert; + } + } +); diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/functionCall.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/functionCall.js new file mode 100644 index 0000000..6f87705 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/functionCall.js @@ -0,0 +1,10 @@ +JSDOC.PluginManager.registerPlugin( + "JSDOC.functionCall", + { + onFunctionCall: function(functionCall) { + if (functionCall.name == "dojo.define" && functionCall.arg1) { + functionCall.doc = "/** @lends "+eval(functionCall.arg1)+".prototype */"; + } + } + } +); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/publishSrcHilite.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/publishSrcHilite.js new file mode 100644 index 0000000..65514f2 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/publishSrcHilite.js @@ -0,0 +1,62 @@ +JSDOC.PluginManager.registerPlugin( + "JSDOC.publishSrcHilite", + { + onPublishSrc: function(src) { + if (src.path in JsHilite.cache) { + return; // already generated src code + } + else JsHilite.cache[src.path] = true; + + try { + var sourceCode = IO.readFile(src.path); + } + catch(e) { + print(e.message); + quit(); + } + + var hiliter = new JsHilite(sourceCode, src.charset); + src.hilited = hiliter.hilite(); + } + } +); + +function JsHilite(src, charset) { + + var tr = new JSDOC.TokenReader(); + + tr.keepComments = true; + tr.keepDocs = true; + tr.keepWhite = true; + + this.tokens = tr.tokenize(new JSDOC.TextStream(src)); + + // TODO is redefining toString() the best way? + JSDOC.Token.prototype.toString = function() { + return ""+this.data.replace(/"; + } + + if (!charset) charset = "utf-8"; + + this.header = ' '+ + "

";
+	this.footer = "
"; + this.showLinenumbers = true; +} + +JsHilite.cache = {}; + +JsHilite.prototype.hilite = function() { + var hilited = this.tokens.join(""); + var line = 1; + if (this.showLinenumbers) hilited = hilited.replace(/(^|\n)/g, function(m){return m+""+((line<10)? " ":"")+((line<100)? " ":"")+(line++)+" "}); + + return this.header+hilited+this.footer; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/symbolLink.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/symbolLink.js new file mode 100644 index 0000000..c87f1ca --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/symbolLink.js @@ -0,0 +1,10 @@ +JSDOC.PluginManager.registerPlugin( + "JSDOC.symbolLink", + { + onSymbolLink: function(link) { + // modify link.linkPath (the href part of the link) + // or link.linkText (the text displayed) + // or link.linkInner (the #name part of the link) + } + } +); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/tagParamConfig.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/tagParamConfig.js new file mode 100644 index 0000000..3ea8a1b --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/tagParamConfig.js @@ -0,0 +1,31 @@ +JSDOC.PluginManager.registerPlugin( + "JSDOC.tagParamConfig", + { + onDocCommentTags: function(comment) { + var currentParam = null; + var tags = comment.tags; + for (var i = 0, l = tags.length; i < l; i++) { + + if (tags[i].title == "param") { + if (tags[i].name.indexOf(".") == -1) { + currentParam = i; + } + } + else if (tags[i].title == "config") { + tags[i].title = "param"; + if (currentParam == null) { + tags[i].name = "arguments"+"."+tags[i].name; + } + else if (tags[i].name.indexOf(tags[currentParam].name+".") != 0) { + tags[i].name = tags[currentParam].name+"."+tags[i].name; + } + currentParam != null + //tags[currentParam].properties.push(tags[i]); + } + else { + currentParam = null; + } + } + } + } +); diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/tagSynonyms.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/tagSynonyms.js new file mode 100644 index 0000000..49a874f --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/plugins/tagSynonyms.js @@ -0,0 +1,43 @@ +JSDOC.PluginManager.registerPlugin( + "JSDOC.tagSynonyms", + { + onDocCommentSrc: function(comment) { + comment.src = comment.src.replace(/@methodOf\b/i, "@function\n@memberOf"); + comment.src = comment.src.replace(/@fieldOf\b/i, "@field\n@memberOf"); + }, + + onDocCommentTags: function(comment) { + for (var i = 0, l = comment.tags.length; i < l; i++) { + var title = comment.tags[i].title.toLowerCase(); + var syn; + if ((syn = JSDOC.tagSynonyms.synonyms["="+title])) { + comment.tags[i].title = syn; + } + } + } + } +); + +new Namespace( + "JSDOC.tagSynonyms", + function() { + JSDOC.tagSynonyms.synonyms = { + "=member": "memberOf", + "=memberof": "memberOf", + "=description": "desc", + "=exception": "throws", + "=argument": "param", + "=returns": "return", + "=classdescription": "class", + "=fileoverview": "overview", + "=extends": "augments", + "=base": "augments", + "=projectdescription": "overview", + "=classdescription": "class", + "=link": "see", + "=borrows": "inherits", + "=scope": "lends", + "=construct": "constructor" + } + } +); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/run.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/run.js new file mode 100644 index 0000000..1f875cd --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/run.js @@ -0,0 +1,348 @@ +/** + * @fileOverview + * A bootstrap script that creates some basic required objects + * for loading other scripts. + * @author Michael Mathews, micmath@gmail.com + * @version $Id: run.js 756 2009-01-07 21:32:58Z micmath $ + */ + +/** + * @namespace Keep track of any messages from the running script. + */ +LOG = { + warn: function(msg, e) { + if (JSDOC.opt.q) return; + if (e) msg = e.fileName+", line "+e.lineNumber+": "+msg; + + msg = ">> WARNING: "+msg; + LOG.warnings.push(msg); + if (LOG.out) LOG.out.write(msg+"\n"); + else print(msg); + }, + + inform: function(msg) { + if (JSDOC.opt.q) return; + msg = " > "+msg; + if (LOG.out) LOG.out.write(msg+"\n"); + else if (typeof LOG.verbose != "undefined" && LOG.verbose) print(msg); + } +}; +LOG.warnings = []; +LOG.verbose = false +LOG.out = undefined; + +/** + * @class Manipulate a filepath. + */ +function FilePath(absPath, separator) { + this.slash = separator || "/"; + this.root = this.slash; + this.path = []; + this.file = ""; + + var parts = absPath.split(/[\\\/]/); + if (parts) { + if (parts.length) this.root = parts.shift() + this.slash; + if (parts.length) this.file = parts.pop() + if (parts.length) this.path = parts; + } + + this.path = this.resolvePath(); +} + +/** Collapse any dot-dot or dot items in a filepath. */ +FilePath.prototype.resolvePath = function() { + var resolvedPath = []; + for (var i = 0; i < this.path.length; i++) { + if (this.path[i] == "..") resolvedPath.pop(); + else if (this.path[i] != ".") resolvedPath.push(this.path[i]); + } + return resolvedPath; +} + +/** Trim off the filename. */ +FilePath.prototype.toDir = function() { + if (this.file) this.file = ""; + return this; +} + +/** Go up a directory. */ +FilePath.prototype.upDir = function() { + this.toDir(); + if (this.path.length) this.path.pop(); + return this; +} + +FilePath.prototype.toString = function() { + return this.root + + this.path.join(this.slash) + + ((this.path.length > 0)? this.slash : "") + + this.file; +} + +/** + * Turn a path into just the name of the file. + */ +FilePath.fileName = function(path) { + var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0); + return path.substring(nameStart); +} + +/** + * Get the extension of a filename + */ +FilePath.fileExtension = function(filename) { + return filename.split(".").pop().toLowerCase(); +}; + +/** + * Turn a path into just the directory part. + */ +FilePath.dir = function(path) { + var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0); + return path.substring(0, nameStart-1); +} + + +importClass(java.lang.System); + +/** + * @namespace A collection of information about your system. + */ +SYS = { + /** + * Information about your operating system: arch, name, version. + * @type string + */ + os: [ + new String(System.getProperty("os.arch")), + new String(System.getProperty("os.name")), + new String(System.getProperty("os.version")) + ].join(", "), + + /** + * Which way does your slash lean. + * @type string + */ + slash: System.getProperty("file.separator")||"/", + + /** + * The path to the working directory where you ran java. + * @type string + */ + userDir: new String(System.getProperty("user.dir")), + + /** + * Where is Java's home folder. + * @type string + */ + javaHome: new String(System.getProperty("java.home")), + + /** + * The absolute path to the directory containing this script. + * @type string + */ + pwd: undefined +}; + +// jsrun appends an argument, with the path to here. +if (arguments[arguments.length-1].match(/^-j=(.+)/)) { + if (RegExp.$1.charAt(0) == SYS.slash || RegExp.$1.charAt(1) == ":") { // absolute path to here + SYS.pwd = new FilePath(RegExp.$1).toDir().toString(); + } + else { // relative path to here + SYS.pwd = new FilePath(SYS.userDir + SYS.slash + RegExp.$1).toDir().toString(); + } + arguments.pop(); +} +else { + print("The run.js script requires you use jsrun.jar."); + quit(); +} + +// shortcut +var File = Packages.java.io.File; + +/** + * @namespace A collection of functions that deal with reading a writing to disk. + */ +IO = { + + /** + * Create a new file in the given directory, with the given name and contents. + */ + saveFile: function(/**string*/ outDir, /**string*/ fileName, /**string*/ content) { + var out = new Packages.java.io.PrintWriter( + new Packages.java.io.OutputStreamWriter( + new Packages.java.io.FileOutputStream(outDir+SYS.slash+fileName), + IO.encoding + ) + ); + out.write(content); + out.flush(); + out.close(); + }, + + /** + * @type string + */ + readFile: function(/**string*/ path) { + if (!IO.exists(path)) { + throw "File doesn't exist there: "+path; + } + return readFile(path, IO.encoding); + }, + + /** + * @param inFile + * @param outDir + * @param [fileName=The original filename] + */ + copyFile: function(/**string*/ inFile, /**string*/ outDir, /**string*/ fileName) { + if (fileName == null) fileName = FilePath.fileName(inFile); + + var inFile = new File(inFile); + var outFile = new File(outDir+SYS.slash+fileName); + + var bis = new Packages.java.io.BufferedInputStream(new Packages.java.io.FileInputStream(inFile), 4096); + var bos = new Packages.java.io.BufferedOutputStream(new Packages.java.io.FileOutputStream(outFile), 4096); + var theChar; + while ((theChar = bis.read()) != -1) { + bos.write(theChar); + } + bos.close(); + bis.close(); + }, + + /** + * Creates a series of nested directories. + */ + mkPath: function(/**Array*/ path) { + if (path.constructor != Array) path = path.split(/[\\\/]/); + var make = ""; + for (var i = 0, l = path.length; i < l; i++) { + make += path[i] + SYS.slash; + if (! IO.exists(make)) { + IO.makeDir(make); + } + } + }, + + /** + * Creates a directory at the given path. + */ + makeDir: function(/**string*/ path) { + (new File(path)).mkdir(); + }, + + /** + * @type string[] + * @param dir The starting directory to look in. + * @param [recurse=1] How many levels deep to scan. + * @returns An array of all the paths to files in the given dir. + */ + ls: function(/**string*/ dir, /**number*/ recurse, _allFiles, _path) { + if (_path === undefined) { // initially + var _allFiles = []; + var _path = [dir]; + } + if (_path.length == 0) return _allFiles; + if (recurse === undefined) recurse = 1; + + dir = new File(dir); + if (!dir.directory) return [String(dir)]; + var files = dir.list(); + + for (var f = 0; f < files.length; f++) { + var file = String(files[f]); + if (file.match(/^\.[^\.\/\\]/)) continue; // skip dot files + + if ((new File(_path.join(SYS.slash)+SYS.slash+file)).list()) { // it's a directory + _path.push(file); + if (_path.length-1 < recurse) IO.ls(_path.join(SYS.slash), recurse, _allFiles, _path); + _path.pop(); + } + else { + _allFiles.push((_path.join(SYS.slash)+SYS.slash+file).replace(SYS.slash+SYS.slash, SYS.slash)); + } + } + + return _allFiles; + }, + + /** + * @type boolean + */ + exists: function(/**string*/ path) { + file = new File(path); + + if (file.isDirectory()){ + return true; + } + if (!file.exists()){ + return false; + } + if (!file.canRead()){ + return false; + } + return true; + }, + + /** + * + */ + open: function(/**string*/ path, /**string*/ append) { + var append = true; + var outFile = new File(path); + var out = new Packages.java.io.PrintWriter( + new Packages.java.io.OutputStreamWriter( + new Packages.java.io.FileOutputStream(outFile, append), + IO.encoding + ) + ); + return out; + }, + + /** + * Sets {@link IO.encoding}. + * Encoding is used when reading and writing text to files, + * and in the meta tags of HTML output. + */ + setEncoding: function(/**string*/ encoding) { + if (/ISO-8859-([0-9]+)/i.test(encoding)) { + IO.encoding = "ISO8859_"+RegExp.$1; + } + else { + IO.encoding = encoding; + } + }, + + /** + * @default "utf-8" + * @private + */ + encoding: "utf-8", + + /** + * Load the given script. + */ + include: function(relativePath) { + load(SYS.pwd+relativePath); + }, + + /** + * Loads all scripts from the given directory path. + */ + includeDir: function(path) { + if (!path) return; + + for (var lib = IO.ls(SYS.pwd+path), i = 0; i < lib.length; i++) + if (/\.js$/i.test(lib[i])) load(lib[i]); + } +} + +// now run the application +IO.include("frame.js"); +IO.include("main.js"); + +main(); diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/t/TestDoc.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/t/TestDoc.js new file mode 100644 index 0000000..c0768b7 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/t/TestDoc.js @@ -0,0 +1,144 @@ +var TestDoc = { + fails: 0, + plans: 0, + passes: 0, + results: [] +}; + +TestDoc.record = function(result) { + TestDoc.results.push(result); + if (typeof result.verdict == "boolean") { + if (result.verdict === false) TestDoc.fails++; + if (result.verdict === true) TestDoc.passes++; + } +} + +TestDoc.prove = function(filePath) { + if (typeof document != "undefined" && typeof document.write != "undefined") { + if (TestDoc.console) print = function(s) { TestDoc.console.appendChild(document.createTextNode(s+"\n")); } + else print = function(s) { document.write(s+"
"); } + } + TestDoc.run(TestDoc.readFile(filePath)); +} + +TestDoc.run = function(src) { + try { eval(src); } catch(e) { print("# ERROR! "+e); } + + var chunks = src.split(/\/\*t:/); + + var run = function(chunk) { + // local shortcuts + var is = TestDoc.assertEquals; + var isnt = TestDoc.assertNotEquals; + var plan = TestDoc.plan; + var requires = TestDoc.requires; + + try { eval(chunk); } catch(e) { print("# ERROR! "+e); } + } + for (var start = -1, end = 0; (start = src.indexOf("/*t:", end)) > end; start = end) { + run( + src.substring( + start+4, + (end = src.indexOf("*/", start)) + ) + ); + } +} + +TestDoc.Result = function(verdict, message) { + this.verdict = verdict; + this.message = message; +} + +TestDoc.Result.prototype.toString = function() { + if (typeof this.verdict == "boolean") { + return (this.verdict? "ok" : "not ok") + " " + (++TestDoc.report.counter) + " - " + this.message; + } + + return "# " + this.message; +} + +TestDoc.requires = function(file) { + if (!TestDoc.requires.loaded[file]) { + load(file); + TestDoc.requires.loaded[file] = true; + } +} +TestDoc.requires.loaded = {}; + +TestDoc.report = function() { + TestDoc.report.counter = 0; + print("1.."+TestDoc.plans); + for (var i = 0; i < TestDoc.results.length; i++) { + print(TestDoc.results[i]); + } + print("----------------------------------------"); + if (TestDoc.fails == 0 && TestDoc.passes == TestDoc.plans) { + print("All tests successful."); + } + else { + print("Failed " + TestDoc.fails + "/" + TestDoc.plans + " tests, "+((TestDoc.plans == 0)? 0 : Math.round(TestDoc.passes/(TestDoc.passes+TestDoc.fails)*10000)/100)+"% okay. Planned to run "+TestDoc.plans+", did run "+(TestDoc.passes+TestDoc.fails)+".") + } +} + +TestDoc.plan = function(n, message) { + TestDoc.plans += n; + TestDoc.record(new TestDoc.Result(null, message+" ("+n+" tests)")); +} + +TestDoc.assertEquals = function(a, b, message) { + var result = (a == b); + if (!result) message += "\n#\n# " + a + " does not equal " + b + "\n#"; + TestDoc.record(new TestDoc.Result(result, message)); +} + +TestDoc.assertNotEquals = function(a, b, message) { + var result = (a != b); + if (!result) message += "\n#\n# " + a + " equals " + b + "\n#"; + TestDoc.record(new TestDoc.Result(result, message)); +} + +TestDoc.readFile = (function(){ + // rhino + if (typeof readFile == "function") { + return function(url) { + var text = readFile(url); + return text || ""; + } + } + + // a web browser + else { + return function(url) { + var httpRequest; + + if (window.XMLHttpRequest) { // Mozilla, Safari, etc + httpRequest = new XMLHttpRequest(); + } + else if (window.ActiveXObject) { // IE + try { + httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); + } + catch (e) { + try { + httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); + } + catch (e) { + } + } + } + + if (!httpRequest) { throw "Cannot create HTTP Request."; } + + httpRequest.open('GET', url, false); + httpRequest.send(''); + if (httpRequest.readyState == 4) { + if (httpRequest.status >= 400) { + throw "The HTTP Request returned an error code: "+httpRequest.status; + } + } + + return httpRequest.responseText || ""; + } + } +})(); diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/t/runner.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/t/runner.js new file mode 100644 index 0000000..3f9fb4c --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/t/runner.js @@ -0,0 +1,13 @@ +// try: java -jar ../../jsrun.jar runner.js + +load("TestDoc.js"); + +TestDoc.prove("../frame/Opt.js"); +TestDoc.prove("../lib/JSDOC.js"); +TestDoc.prove("../frame/String.js"); +TestDoc.prove("../lib/JSDOC/DocTag.js"); +TestDoc.prove("../lib/JSDOC/DocComment.js"); +TestDoc.prove("../lib/JSDOC/TokenReader.js"); +TestDoc.prove("../lib/JSDOC/Symbol.js"); + +TestDoc.report(); diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test.js new file mode 100644 index 0000000..8b2dc8b --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test.js @@ -0,0 +1,342 @@ +load("app/frame/Dumper.js"); +function symbolize(opt) { + symbols = null; + JSDOC.JsDoc(opt); + symbols = JSDOC.JsDoc.symbolSet; +} + +var testCases = [ + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/overview.js"]}); + //print(Dumper.dump(symbols)); + is('symbols.getSymbolByName("My Cool Library").name', 'My Cool Library', 'File overview can be found by alias.'); + } + , + function() { + symbolize({_: [SYS.pwd+"test/name.js"]}); + + is('symbols.getSymbol("Response").name', "Response", 'Virtual class name is found.'); + is('symbols.getSymbol("Response#text").alias', "Response#text", 'Virtual method name is found.'); + is('symbols.getSymbol("Response#text").memberOf', "Response", 'Virtual method parent name is found.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype.js"]}); + + is('symbols.getSymbol("Article").name', "Article", 'Function set to constructor prototype with inner constructor name is found.'); + is('symbols.getSymbol("Article").hasMethod("init")', true, 'The initializer method name of prototype function is correct.'); + is('symbols.getSymbol("Article").hasMember("counter")', true, 'A static property set in the prototype definition is found.'); + is('symbols.getSymbol("Article").hasMember("title")', true, 'An instance property set in the prototype is found.'); + is('symbols.getSymbol("Article#title").isStatic', false, 'An instance property has isStatic set to false.'); + is('symbols.getSymbol("Article.counter").name', "counter", 'A static property set in the initializer has the name set correctly.'); + is('symbols.getSymbol("Article.counter").memberOf', "Article", 'A static property set in the initializer has the memberOf set correctly.'); + is('symbols.getSymbol("Article.counter").isStatic', true, 'A static property set in the initializer has isStatic set to true.'); + } + , + function() { + symbolize({a:true, _: [SYS.pwd+"test/prototype_oblit.js"]}); + + is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype name is found.'); + is('typeof symbols.getSymbol("Article.prototype")', "undefined", 'The prototype oblit is not a symbol.'); + is('symbols.getSymbol("Article#getTitle").name', "getTitle", 'The nonstatic method name of prototype oblit is correct.'); + is('symbols.getSymbol("Article#getTitle").alias', "Article#getTitle", 'The alias of non-static method of prototype oblit is correct.'); + is('symbols.getSymbol("Article#getTitle").isStatic', false, 'The isStatic of a nonstatic method of prototype oblit is correct.'); + is('symbols.getSymbol("Article.getTitle").name', "getTitle", 'The static method name of prototype oblit is correct.'); + is('symbols.getSymbol("Article.getTitle").isStatic', true, 'The isStatic of a static method of prototype oblit is correct.'); + is('symbols.getSymbol("Article#getTitle").isa', "FUNCTION", 'The isa of non-static method of prototype oblit is correct.'); + is('symbols.getSymbol("Article.getTitle").alias', "Article.getTitle", 'The alias of a static method of prototype oblit is correct.'); + is('symbols.getSymbol("Article.getTitle").isa', "FUNCTION", 'The isa of static method of prototype oblit is correct.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype_oblit_constructor.js"]}); + + is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype with inner constructor name is found.'); + is('symbols.getSymbol("Article#init").name', "init", 'The initializer method name of prototype oblit is correct.'); + is('symbols.getSymbol("Article").hasMember("pages")', true, 'Property set by initializer method "this" is on the outer constructor.'); + is('symbols.getSymbol("Article#Title").name', "Title", 'Name of the inner constructor name is found.'); + is('symbols.getSymbol("Article#Title").memberOf', "Article", 'The memberOf of the inner constructor name is found.'); + is('symbols.getSymbol("Article#Title").isa', "CONSTRUCTOR", 'The isa of the inner constructor name is constructor.'); + is('symbols.getSymbol("Article#Title").hasMember("title")', true, 'A property set on the inner constructor "this" is on the inner constructor.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/inner.js"]}); + + is('symbols.getSymbol("Outer").name', "Outer", 'Outer constructor prototype name is found.'); + is('symbols.getSymbol("Outer").methods.length', 1, 'Inner function doesnt appear as a method of the outer.'); + is('symbols.getSymbol("Outer").hasMethod("open")', true, 'Outer constructors methods arent affected by inner function.'); + is('symbols.getSymbol("Outer-Inner").alias', "Outer-Inner", 'Alias of inner function is found.'); + is('symbols.getSymbol("Outer-Inner").isa', "CONSTRUCTOR", 'isa of inner function constructor is found.'); + is('symbols.getSymbol("Outer-Inner").memberOf', "Outer", 'The memberOf of inner function is found.'); + is('symbols.getSymbol("Outer-Inner").name', "Inner", 'The name of inner function is found.'); + is('symbols.getSymbol("Outer-Inner#name").name', "name", 'A member of the inner function constructor, attached to "this" is found on inner.'); + is('symbols.getSymbol("Outer-Inner#name").memberOf', "Outer-Inner", 'The memberOf of an inner function member is found.'); + } + , + function() { + symbolize({a:true, _: [SYS.pwd+"test/prototype_nested.js"]}); + + is('symbols.getSymbol("Word").name', "Word", 'Base constructor name is found.'); + is('symbols.getSymbol("Word").hasMethod("reverse")', true, 'Base constructor method is found.'); + is('symbols.getSymbol("Word").methods.length', 1, 'Base constructor has only one method.'); + is('symbols.getSymbol("Word").memberOf', "", 'Base constructor memberOf is empty.'); + is('symbols.getSymbol("Word#reverse").name', "reverse", 'Member of constructor prototype name is found.'); + is('symbols.getSymbol("Word#reverse").memberOf', "Word", 'Member of constructor prototype memberOf is found.'); + is('symbols.getSymbol("Word#reverse.utf8").name', "utf8", 'Member of constructor prototype method name is found.'); + is('symbols.getSymbol("Word#reverse.utf8").memberOf', "Word#reverse", 'Static nested member memberOf is found.'); + } + , + function() { + symbolize({a:true, _: [SYS.pwd+"test/namespace_nested.js"]}); + + is('symbols.getSymbol("ns1").name', "ns1", 'Base namespace name is found.'); + is('symbols.getSymbol("ns1").memberOf', "", 'Base namespace memberOf is empty (its a constructor).'); + is('symbols.getSymbol("ns1.ns2").name', "ns2", 'Nested namespace name is found.'); + is('symbols.getSymbol("ns1.ns2").alias', "ns1.ns2", 'Nested namespace alias is found.'); + is('symbols.getSymbol("ns1.ns2").memberOf', "ns1", 'Nested namespace memberOf is found.'); + is('symbols.getSymbol("ns1.ns2.Function1").name', "Function1", 'Method of nested namespace name is found.'); + is('symbols.getSymbol("ns1.ns2.Function1").memberOf', "ns1.ns2", 'Constructor of nested namespace memberOf is found.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_nested.js"]}); + + is('symbols.getSymbol("Zop").name', "Zop", 'Any constructor name is found.'); + is('symbols.getSymbol("Zop").isa', "CONSTRUCTOR", 'It isa constructor.'); + is('symbols.getSymbol("Zop").hasMethod("zap")', true, 'Its method name, set later, is in methods array.'); + is('symbols.getSymbol("Foo").name', "Foo", 'The containing constructor name is found.'); + is('symbols.getSymbol("Foo").hasMethod("methodOne")', true, 'Its method name is found.'); + is('symbols.getSymbol("Foo").hasMethod("methodTwo")', true, 'Its second method name is found.'); + is('symbols.getSymbol("Foo#methodOne").alias', "Foo#methodOne", 'A methods alias is found.'); + is('symbols.getSymbol("Foo#methodOne").isStatic', false, 'A methods is not static.'); + is('symbols.getSymbol("Bar").name', "Bar", 'A global function declared inside another function is found.'); + is('symbols.getSymbol("Bar").isa', "FUNCTION", 'It isa function.'); + is('symbols.getSymbol("Bar").memberOf', "_global_", 'It is global.'); + is('symbols.getSymbol("Foo-inner").name', "inner", 'An inner functions name is found.'); + is('symbols.getSymbol("Foo-inner").memberOf', "Foo", 'It is member of the outer function.'); + is('symbols.getSymbol("Foo-inner").isInner', true, 'It is an inner function.'); + } + , + function() { + symbolize({a:true, _: [SYS.pwd+"test/memberof_constructor.js"]}); + + is('symbols.getSymbol("Circle#Tangent").name', "Tangent", 'Constructor set on prototype using @member has correct name.'); + is('symbols.getSymbol("Circle#Tangent").memberOf', "Circle", 'Constructor set on prototype using @member has correct memberOf.'); + is('symbols.getSymbol("Circle#Tangent").alias', "Circle#Tangent", 'Constructor set on prototype using @member has correct alias.'); + is('symbols.getSymbol("Circle#Tangent").isa', "CONSTRUCTOR", 'Constructor set on prototype using @member has correct isa.'); + is('symbols.getSymbol("Circle#Tangent").isStatic', false, 'Constructor set on prototype using @member is not static.'); + is('symbols.getSymbol("Circle#Tangent#getDiameter").name', "getDiameter", 'Method set on prototype using @member has correct name.'); + is('symbols.getSymbol("Circle#Tangent#getDiameter").memberOf', "Circle#Tangent", 'Method set on prototype using @member has correct memberOf.'); + is('symbols.getSymbol("Circle#Tangent#getDiameter").alias', "Circle#Tangent#getDiameter", 'Method set on prototype using @member has correct alias.'); + is('symbols.getSymbol("Circle#Tangent#getDiameter").isa', "FUNCTION", 'Method set on prototype using @member has correct isa.'); + is('symbols.getSymbol("Circle#Tangent#getDiameter").isStatic', false, 'Method set on prototype using @member is not static.'); + } + , + function() { + symbolize({a:true, p: true, _: [SYS.pwd+"test/memberof.js"]}); + + is('symbols.getSymbol("pack.install").alias', "pack.install", 'Using @memberOf sets alias, when parent name is in memberOf tag.'); + is('symbols.getSymbol("pack.install.overwrite").name', "install.overwrite", 'Using @memberOf sets name, even if the name is dotted.'); + is('symbols.getSymbol("pack.install.overwrite").memberOf', "pack", 'Using @memberOf sets memberOf.'); + is('symbols.getSymbol("pack.install.overwrite").isStatic', true, 'Using @memberOf with value not ending in octothorp sets isStatic to true.'); + } + , + function() { + symbolize({a:true, p: true, _: [SYS.pwd+"test/memberof2.js"]}); + + is('symbols.getSymbol("Foo#bar").alias', "Foo#bar", 'An inner function can be documented as an instance method.'); + is('symbols.getSymbol("Foo.zip").alias', "Foo.zip", 'An inner function can be documented as a static method.'); + is('symbols.getSymbol("Foo.Fiz").alias', "Foo.Fiz", 'An inner function can be documented as a static constructor.'); + is('symbols.getSymbol("Foo.Fiz#fipple").alias', "Foo.Fiz#fipple", 'An inner function can be documented as a static constructor with a method.'); + is('symbols.getSymbol("Foo#blat").alias', "Foo#blat", 'An global function can be documented as an instance method.'); + } + , + function() { + symbolize({a:true, p: true, _: [SYS.pwd+"test/memberof3.js"]}); + + is('symbols.getSymbol("Foo#bar").alias', "Foo#bar", 'A virtual field can be documented as an instance method.'); + is('symbols.getSymbol("Foo2#bar").alias', "Foo2#bar", 'A virtual field with the same name can be documented as an instance method.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows.js"]}); + + is('symbols.getSymbol("Layout").name', "Layout", 'Constructor can be found.'); + is('symbols.getSymbol("Layout").hasMethod("init")', true, 'Constructor method name can be found.'); + is('symbols.getSymbol("Layout").hasMember("orientation")', true, 'Constructor property name can be found.'); + + is('symbols.getSymbol("Page").hasMethod("reset")', true, 'Second constructor method name can be found.'); + is('symbols.getSymbol("Page").hasMember("orientation")', true, 'Second constructor borrowed property name can be found in properties.'); + is('symbols.getSymbol("Page#orientation").memberOf', "Page", 'Second constructor borrowed property memberOf can be found.'); + is('symbols.getSymbol("Page-getInnerElements").alias', "Page-getInnerElements", 'Can borrow an inner function and it is still inner.'); + is('symbols.getSymbol("Page.units").alias', "Page.units", 'Can borrow a static function and it is still static.'); + + is('symbols.getSymbol("ThreeColumnPage#init").alias', "ThreeColumnPage#init", 'Third constructor method can be found even though method with same name is borrowed.'); + is('symbols.getSymbol("ThreeColumnPage#reset").alias', "ThreeColumnPage#reset", 'Borrowed method can be found.'); + is('symbols.getSymbol("ThreeColumnPage#orientation").alias', "ThreeColumnPage#orientation", 'Twice borrowed method can be found.'); + + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows2.js"]}); + + is('symbols.getSymbol("Foo").hasMethod("my_zop")', true, 'Borrowed method can be found.'); + is('symbols.getSymbol("Bar").hasMethod("my_zip")', true, 'Second borrowed method can be found.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/constructs.js"]}); + + is('symbols.getSymbol("Person").hasMethod("say")', true, 'The constructs tag creates a class that lends can add a method to.'); + } + , + function() { + symbolize({a: true, _: [SYS.pwd+"test/augments.js", SYS.pwd+"test/augments2.js"]}); + + is('symbols.getSymbol("Page").augments[0]', "Layout", 'An augmented class can be found.'); + is('symbols.getSymbol("Page#reset").alias', "Page#reset", 'Method of augmenter can be found.'); + is('symbols.getSymbol("Page").hasMethod("Layout#init")', true, 'Method from augmented can be found.'); + is('symbols.getSymbol("Page").hasMember("Layout#orientation")', true, 'Property from augmented can be found.'); + is('symbols.getSymbol("Page").methods.length', 3, 'Methods of augmented class are included in methods array.'); + + is('symbols.getSymbol("ThreeColumnPage").augments[0]', "Page", 'The extends tag is a synonym for augments.'); + is('symbols.getSymbol("ThreeColumnPage").hasMethod("ThreeColumnPage#init")', true, 'Local method overrides augmented method of same name.'); + is('symbols.getSymbol("ThreeColumnPage").methods.length', 3, 'Local method count is right.'); + + is('symbols.getSymbol("NewsletterPage").augments[0]', "ThreeColumnPage", 'Can augment across file boundaries.'); + is('symbols.getSymbol("NewsletterPage").augments.length', 2, 'Multiple augments are supported.'); + is('symbols.getSymbol("NewsletterPage").inherits[0].alias', "Junkmail#annoy", 'Inherited method with augments.'); + is('symbols.getSymbol("NewsletterPage").methods.length', 6, 'Methods of augmented class are included in methods array across files.'); + is('symbols.getSymbol("NewsletterPage").properties.length', 1, 'Properties of augmented class are included in properties array across files.'); + } + , + function() { + symbolize({a:true, _: [SYS.pwd+"test/static_this.js"]}); + + is('symbols.getSymbol("box.holder").name', "holder", 'Static namespace name can be found.'); + is('symbols.getSymbol("box.holder.foo").name', "foo", 'Static namespace method name can be found.'); + is('symbols.getSymbol("box.holder").isStatic', true, 'Static namespace method is static.'); + + is('symbols.getSymbol("box.holder.counter").name', "counter", 'Instance namespace property name set on "this" can be found.'); + is('symbols.getSymbol("box.holder.counter").alias', "box.holder.counter", 'Instance namespace property alias set on "this" can be found.'); + is('symbols.getSymbol("box.holder.counter").memberOf', "box.holder", 'Static namespace property memberOf set on "this" can be found.'); + } + , + function() { + symbolize({a:true, p: true, _: [SYS.pwd+"test/lend.js"]}); + + is('symbols.getSymbol("Person").name', "Person", 'Class defined in lend comment is found.'); + is('symbols.getSymbol("Person").hasMethod("initialize")', true, 'Lent instance method name can be found.'); + is('symbols.getSymbol("Person").hasMethod("say")', true, 'Second instance method can be found.'); + is('symbols.getSymbol("Person#sing").isStatic', false, 'Instance method is known to be not static.'); + + is('symbols.getSymbol("Person.getCount").name', "getCount", 'Static method name from second lend comment can be found.'); + is('symbols.getSymbol("Person.getCount").isStatic', true, 'Static method from second lend comment is known to be static.'); + + is('LOG.warnings.filter(function($){if($.indexOf("notok") > -1) return $}).length', 1, 'A warning is emitted when lending to an undocumented parent.'); + } + , + function() { + symbolize({a:true, _: [SYS.pwd+"test/param_inline.js"]}); + + is('symbols.getSymbol("Layout").params[0].type', "int", 'Inline param name is set.'); + is('symbols.getSymbol("Layout").params[0].desc', "The number of columns.", 'Inline param desc is set from comment.'); + is('symbols.getSymbol("Layout#getElement").params[0].name', "id", 'User defined param documentation takes precedence over parser defined.'); + is('symbols.getSymbol("Layout#getElement").params[0].isOptional', true, 'Default for param is to not be optional.'); + is('symbols.getSymbol("Layout#getElement").params[1].isOptional', false, 'Can mark a param as being optional.'); + is('symbols.getSymbol("Layout#getElement").params[1].type', "number|string", 'Type of inline param doc can have multiple values.'); + is('symbols.getSymbol("Layout#Canvas").params[0].type', "", 'Type can be not defined for some params.'); + is('symbols.getSymbol("Layout#Canvas").params[2].type', "int", 'Type can be defined inline for only some params.'); + is('symbols.getSymbol("Layout#rotate").params.length', 0, 'Docomments inside function sig is ignored without a param.'); + is('symbols.getSymbol("Layout#init").params[2].type', "zoppler", 'Doc comment type overrides inline type for param with same name.'); + } + , + function() { + symbolize({a: true, _: [SYS.pwd+"test/shared.js", SYS.pwd+"test/shared2.js"]}); + + is('symbols.getSymbol("Array#some").name', 'some', 'The name of a symbol in a shared section is found.'); + is('symbols.getSymbol("Array#some").alias', 'Array#some', 'The alias of a symbol in a shared section is found.'); + is('symbols.getSymbol("Array#some").desc', "Extension to builtin array.", 'A description can be shared.'); + is('symbols.getSymbol("Array#filter").desc', "Extension to builtin array.\nChange every element of an array.", 'A shared description is appended.'); + is('symbols.getSymbol("Queue").desc', "A first in, first out data structure.", 'A description is not shared when outside a shared section.'); + is('symbols.getSymbol("Queue.rewind").alias', "Queue.rewind", 'Second shared tag can be started.'); + is('symbols.getSymbol("startOver").alias', "startOver", 'Shared tag doesnt cross over files.'); + } + , + function() { + symbolize({a: true, _: [SYS.pwd+"test/config.js"]}); + is('symbols.getSymbol("Contact").params[0].name', 'person', 'The name of a param is found.'); + is('symbols.getSymbol("Contact").params[1].name', 'person.name', 'The name of a param set with a dot name is found.'); + is('symbols.getSymbol("Contact").params[2].name', 'person.age', 'The name of a second param set with a dot name is found.'); + is('symbols.getSymbol("Contact").params[4].name', 'connection', 'The name of a param after config is found.'); + + is('symbols.getSymbol("Family").params[0].name', 'persons', 'Another name of a param is found.'); + is('symbols.getSymbol("Family").params[1].name', 'persons.Father', 'The name of a param+config is found.'); + is('symbols.getSymbol("Family").params[2].name', 'persons.Mother', 'The name of a second param+config is found.'); + is('symbols.getSymbol("Family").params[3].name', 'persons.Children', 'The name of a third param+config is found.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/ignore.js"]}); + is('LOG.warnings.filter(function($){if($.indexOf("undocumented symbol Ignored") > -1) return $}).length', 1, 'A warning is emitted when documenting members of an ignored parent.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_anon.js"]}); + is('symbols.getSymbol("a.b").alias', 'a.b', 'In anonymous constructor this is found to be the container object.'); + is('symbols.getSymbol("a.f").alias', 'a.f', 'In anonymous constructor this can have a method.'); + is('symbols.getSymbol("a.c").alias', 'a.c', 'In anonymous constructor method this is found to be the container object.'); + is('symbols.getSymbol("g").alias', 'g', 'In anonymous function executed inline this is the global.'); + is('symbols.getSymbol("bar2.p").alias', 'bar2.p', 'In named constructor executed inline this is the container object.'); + is('symbols.getSymbol("module.pub").alias', 'module.pub', 'In parenthesized anonymous function executed inline function scoped variables arent documented.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/oblit_anon.js"]}); + is('symbols.getSymbol("opt").name', 'opt', 'Anonymous object properties are created.'); + is('symbols.getSymbol("opt.conf.keep").alias', 'opt.conf.keep', 'Anonymous object first property is assigned to $anonymous.'); + is('symbols.getSymbol("opt.conf.base").alias', 'opt.conf.base', 'Anonymous object second property is assigned to $anonymous.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/params_optional.js"]}); + is('symbols.getSymbol("Document").params.length', 3, 'Correct number of params are found when optional param syntax is used.'); + is('symbols.getSymbol("Document").params[1].name', "id", 'Name of optional param is found.'); + is('symbols.getSymbol("Document").params[1].isOptional', true, 'Optional param is marked isOptional.'); + is('symbols.getSymbol("Document").params[2].name', "title", 'Name of optional param with default value is found.'); + is('symbols.getSymbol("Document").params[2].isOptional', true, 'Optional param with default value is marked isOptional.'); + is('symbols.getSymbol("Document").params[2].defaultValue', " This is untitled.", 'Optional param default value is found.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/synonyms.js"]}); + is('symbols.getSymbol("myObject.myFunc").type', 'function', 'Type can be set to function.'); + } + , + function() { + symbolize({a:true, p:true, _: [SYS.pwd+"test/event.js"]}); + is('symbols.getSymbol("Kitchen#event:cakeEaten").isEvent', true, 'Function with event prefix is an event.'); + is('symbols.getSymbol("Kitchen#cakeEaten").isa', "FUNCTION", 'Function with same name as event isa function.'); + } + , + function() { + symbolize({x:"js", a:true, _: [SYS.pwd+"test/scripts/"]}); + is('JSDOC.JsDoc.srcFiles.length', 1, 'Only js files are scanned when -x=js.'); + } + , + function() { + symbolize({x:"js", a:true, _: [SYS.pwd+"test/exports.js"]}); + is('symbols.getSymbol("mxn.Map#doThings").name', 'doThings', 'Exports creates a documentation alias that can have methods.'); + } + , + function() { + symbolize({p:true, a:true, _: [SYS.pwd+"test/module.js"]}); + is('symbols.getSymbol("myProject.myModule.myPublicMethod").name', 'myPublicMethod', 'A function wrapped in parens can be recognized.'); + is('symbols.getSymbol("myProject.myModule-myPrivateMethod").name', 'myPrivateMethod', 'A private method in the scope of a function wrapped in parens can be recognized.'); + is('symbols.getSymbol("myProject.myModule-myPrivateVar").name', 'myPrivateVar', 'A private member in the scope of a function wrapped in parens can be recognized.'); + } +]; + +//// run and print results +print(testrun(testCases)); diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/addon.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/addon.js new file mode 100644 index 0000000..8886205 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/addon.js @@ -0,0 +1,24 @@ +String.prototype.reverse = function() { +} + +String.prototype.reverse.utf8 = function() { +} + +Function.count = function() { +} + +/** @memberOf Function */ +Function.count.reset = function() { +} + +/** @memberOf Function */ +count.getValue = function() { +} + +/** @memberOf Function.prototype */ +getSig = function() { +} + +/** @memberOf Function.prototype */ +Function.prototype.getProps = function() { +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/anon_inner.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/anon_inner.js new file mode 100644 index 0000000..227eeee --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/anon_inner.js @@ -0,0 +1,14 @@ +/** + * @name bar + * @namespace + */ + +new function() { + /** + * @name bar-foo + * @function + * @param {number} x + */ + function foo(x) { + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/augments.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/augments.js new file mode 100644 index 0000000..12e706e --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/augments.js @@ -0,0 +1,31 @@ +/** +@constructor +*/ +function Layout(p) { + this.init = function(p) { + } + + this.getId = function() { + } + + /** @type Page */ + this.orientation = "landscape"; +} + +/** +@constructor +@augments Layout +*/ +function Page() { + this.reset = function(b) { + } +} + +/** +@extends Page +@constructor +*/ +function ThreeColumnPage() { + this.init = function(resetCode) { + } +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/augments2.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/augments2.js new file mode 100644 index 0000000..e8388f0 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/augments2.js @@ -0,0 +1,26 @@ +/** +@constructor +*/ +function LibraryItem() { + this.reserve = function() { + } +} + +/** +@constructor +*/ +function Junkmail() { + this.annoy = function() { + } +} + +/** +@inherits Junkmail.prototype.annoy as pester +@augments ThreeColumnPage +@augments LibraryItem +@constructor +*/ +function NewsletterPage() { + this.getHeadline = function() { + } +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/borrows.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/borrows.js new file mode 100644 index 0000000..a5d8ea4 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/borrows.js @@ -0,0 +1,46 @@ +/** +@constructor +*/ +function Layout(p) { + /** initilize 1 */ + this.init = function(p) { + } + + /** get the id */ + this.getId = function() { + } + + /** @type string */ + this.orientation = "landscape"; + + function getInnerElements(elementSecretId){ + } +} + +/** A static method. */ +Layout.units = function() { +} + +/** +@constructor +@borrows Layout#orientation +@borrows Layout-getInnerElements +@borrows Layout.units +*/ +function Page() { + /** reset the page */ + this.reset = function(b) { + } +} + +/** +@constructor +@borrows Layout.prototype.orientation as this.orientation +@borrows Layout.prototype.init as #init +@inherits Page.prototype.reset as #reset +*/ +function ThreeColumnPage() { + /** initilize 2 */ + this.init = function(p) { + } +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/borrows2.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/borrows2.js new file mode 100644 index 0000000..c0d5ea2 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/borrows2.js @@ -0,0 +1,23 @@ +// testing circular borrows + +/** + @class + @borrows Bar#zop as this.my_zop +*/ +function Foo() { + /** this is a zip. */ + this.zip = function() {} + + this.my_zop = new Bar().zop; +} + +/** + @class + @borrows Foo#zip as this.my_zip +*/ +function Bar() { + /** this is a zop. */ + this.zop = function() {} + + this.my_zip = new Foo().zip; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/config.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/config.js new file mode 100644 index 0000000..0748a21 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/config.js @@ -0,0 +1,22 @@ +/** + * @constructor + * @param person The person. + * @param {string} person.name The person's name. + * @config {integer} age The person's age. + * @config [id=1] Optional id number to use. + * @param connection + */ +function Contact(person, connection) { + +} + +/** + * @constructor + * @param persons + * @config {string} Father The paternal person. + * @config {string} Mother The maternal person. + * @config {string[]} Children And the rest. + */ +function Family(/**Object*/persons) { + +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/constructs.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/constructs.js new file mode 100644 index 0000000..cca5dbd --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/constructs.js @@ -0,0 +1,18 @@ +var Person = makeClass( + /** + @scope Person + */ + { + /** + This is just another way to define a constructor. + @constructs + @param {string} name The name of the person. + */ + initialize: function(name) { + this.name = name; + }, + say: function(message) { + return this.name + " says: " + message; + } + } +); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/encoding.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/encoding.js new file mode 100644 index 0000000..ba64219 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/encoding.js @@ -0,0 +1,10 @@ + +/** + * @Constructor + * @desc é…置文件 + * @class 什么也ä¸è¿”回 + */ +function Test(conf) { + // do something; +} + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/encoding_other.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/encoding_other.js new file mode 100644 index 0000000..b144da4 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/encoding_other.js @@ -0,0 +1,12 @@ + +/** + * @Constructor + * @desc ðïîÛ + * @class ßàáâãäåæçèçìëêíîï °±²³´µ¡¶·¸¹ + */ +function Test(conf) { + // do something; +} + +// run with commanline option -e=iso-8859-5 + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/event.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/event.js new file mode 100644 index 0000000..7e41d6f --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/event.js @@ -0,0 +1,54 @@ +/** + * @name Kitchen + * @constructor + * @fires Bakery#event:donutOrdered + */ + +/** + * Fired when some cake is eaten. + * @name Kitchen#event:cakeEaten + * @function + * @param {Number} pieces The number of pieces eaten. + */ + +/** + * Find out if cake was eaten. + * @name Kitchen#cakeEaten + * @function + * @param {Boolean} wasEaten + */ + +/** + * @name getDesert + * @function + * @fires Kitchen#event:cakeEaten + */ + +/** + * @name Bakery + * @constructor + * @extends Kitchen + */ + +/** + * Fired when a donut order is made. + * @name Bakery#event:donutOrdered + * @event + * @param {Event} e The event object. + * @param {String} [e.topping] Optional sprinkles. + */ + +/** + * @constructor + * @borrows Bakery#event:donutOrdered as this.event:cakeOrdered + */ +function CakeShop() { +} + +/** @event */ +CakeShop.prototype.icingReady = function(isPink) { +} + +/** @event */ +function amHungry(/**Boolean*/enoughToEatAHorse) { +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/exports.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/exports.js new file mode 100644 index 0000000..63a87cb --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/exports.js @@ -0,0 +1,14 @@ +/** @namespace */ +var mxn = {}; + +(function(){ + /** @exports Map as mxn.Map */ + var Map = + /** @constructor */ + mxn.Map = function() { + }; + + /** A method. */ + Map.prototype.doThings = function() { + }; +})(); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/functions_anon.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/functions_anon.js new file mode 100644 index 0000000..e9dd6c1 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/functions_anon.js @@ -0,0 +1,39 @@ +/** an anonymous constructor executed inline */ +a = new function() { + /** a.b*/ + this.b = 1; + /** a.f */ + this.f = function() { + /** a.c */ + this.c = 2; + } +} + + +/** + named function executed inline +*/ +bar1 = function Zoola1() { + /** property of global */ + this.g = 1; +}(); + +/** + named constructor executed inline +*/ +bar2 = new function Zoola2() { + /** property of bar */ + this.p = 1; +}; + +/** module pattern */ +module = (function () { + /** won't appear in documentation */ + var priv = 1; + + /** @scope module */ + return { + /** will appear as a property of module */ + pub: 1 + } +})(); diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/functions_nested.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/functions_nested.js new file mode 100644 index 0000000..f044faf --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/functions_nested.js @@ -0,0 +1,33 @@ +/** @constructor */ +function Zop() { +} + +/** + @class +*/ +Foo = function(id) { + // this is a bit twisted, but if you call Foo() you will then + // modify Foo(). This is kinda, sorta non-insane, because you + // would have to call Foo() 100% of the time to use Foo's methods + Foo.prototype.methodOne = function(bar) { + alert(bar); + }; + + // same again + Foo.prototype.methodTwo = function(bar2) { + alert(bar2); + }; + + // and these are only executed if the enclosing function is actually called + // and who knows if that will ever happen? + Bar = function(pez) { + alert(pez); + }; + Zop.prototype.zap = function(p){ + alert(p); + }; + + // but this is only visible inside Foo + function inner() { + } +}; diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/global.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/global.js new file mode 100644 index 0000000..5ea4894 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/global.js @@ -0,0 +1,13 @@ +/** ecks */ +var x = [1, 2, 4]; + +var y = { + foo: function(){ + } +} + +bar = function() { +} + +function zop() { +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/globals.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/globals.js new file mode 100644 index 0000000..3f83fb1 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/globals.js @@ -0,0 +1,25 @@ +function example(/**Circle*/a, b) { + /** a global defined in function */ + var number = a; + + var hideNumber = function(){ + } + + setNumber = function(){ + } + alert('You have chosen: ' + b); +} + +function initPage() { + var supported = document.createElement && document.getElementsByTagName; + if (!supported) return; + // start of DOM script + var x = document.getElementById('writeroot'); + // etc. +} + +/** an example var */ +var document = new Document(x, y); + +var getNumber = function(){ +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/ignore.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/ignore.js new file mode 100644 index 0000000..d3fac9e --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/ignore.js @@ -0,0 +1,10 @@ +/** + * A test constructor. + * @constructor + * @ignore + */ +function Ignored() { + /** a method */ + this.bar = function() { + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/inner.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/inner.js new file mode 100644 index 0000000..37cfa9d --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/inner.js @@ -0,0 +1,16 @@ +/** + * @constructor + */ +function Outer() { + /** + * @constructor + */ + function Inner(name) { + /** The name of this. */ + this.name = name; + } + + this.open = function(name) { + return (new Inner(name)); + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/jsdoc_test.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/jsdoc_test.js new file mode 100644 index 0000000..0817712 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/jsdoc_test.js @@ -0,0 +1,477 @@ +/** + * @fileoverview This file is to be used for testing the JSDoc parser + * It is not intended to be an example of good JavaScript OO-programming, + * nor is it intended to fulfill any specific purpose apart from + * demonstrating the functionality of the + * JSDoc parser + * + * @author Gabriel Reid gab_reid@users.sourceforge.net + * @version 0.1 + */ + + +/** + * Construct a new Shape object. + * @class This is the basic Shape class. + * It can be considered an abstract class, even though no such thing + * really existing in JavaScript + * @constructor + * @throws MemoryException if there is no more memory + * @throws GeneralShapeException rarely (if ever) + * @return {Shape|Coordinate} A new shape. + */ +function Shape(){ + + /** + * This is an example of a function that is not given as a property + * of a prototype, but instead it is assigned within a constructor. + * For inner functions like this to be picked up by the parser, the + * function that acts as a constructor must be denoted with + * the @constructor tag in its comment. + * @type String + */ + this.getClassName = function(){ + return "Shape"; + } + + /** + * This is an inner method, just used here as an example + * @since version 0.5 + * @author Sue Smart + */ + function addReference(){ + // Do nothing... + } + +} + +/** + * Create a new Hexagon instance. + * @extends Shape + * @class Hexagon is a class that is a logical sublcass of + * {@link Shape} (thanks to the @extends tag), but in + * reality it is completely unrelated to Shape. + * @param {int} sideLength The length of one side for the new Hexagon + * @example + * var h = new Hexagon(2); + * @example + * if (hasHex) { + * hex = new Hexagon(5); + * color = hex.getColor(); + * } + */ +function Hexagon(sideLength) { +} + + +/** + * This is an unattached (static) function that adds two integers together. + * @param {int} One The first number to add + * @param {int} Two The second number to add + * @author Gabriel Reid + * @deprecated So you shouldn't use it anymore! Use {@link Shape#getClassName} instead. + */ +function Add(One, Two){ + return One + Two; +} + + +/** + * The color of this shape + * @type Color + */ +Shape.prototype.color = null; + +/** + * The border of this shape. + * @field + * @type int + */ +Shape.prototype.border = function(){return border;}; + +/* + * These are all the instance method implementations for Shape + */ + +/** + * Get the coordinates of this shape. It is assumed that we're always talking + * about shapes in a 2D location here. + * @requires The {@link Shape} class + * @returns A Coordinate object representing the location of this Shape + * @type Coordinate[] + */ +Shape.prototype.getCoords = function(){ + return this.coords; +} + +/** + * Get the color of this shape. + * @see #setColor + * @see The Color library. + * @link Shape + * @type Color + */ +Shape.prototype.getColor = function(){ + return this.color; +} + +/** + * Set the coordinates for this Shape + * @param {Coordinate} coordinates The coordinates to set for this Shape + */ +Shape.prototype.setCoords = function(coordinates){ + this.coords = coordinates; +} + +/** + * Set the color for this Shape + * @param {Color} color The color to set for this Shape + * @param other There is no other param, but it can still be documented if + * optional parameters are used + * @throws NonExistantColorException (no, not really!) + * @see #getColor + */ +Shape.prototype.setColor = function(color){ + this.color = color; +} + +/** + * Clone this shape + * @returns A copy of this shape + * @type Shape + * @author Gabriel Reid + */ +Shape.prototype.clone = function(){ + return new Shape(); +} + +/** + * Create a new Rectangle instance. + * @class A basic rectangle class, inherits from Shape. + * This class could be considered a concrete implementation class + * @constructor + * @param {int} width The optional width for this Rectangle + * @param {int} height Thie optional height for this Rectangle + * @author Gabriel Reid + * @see Shape is the base class for this + * @augments Shape + * @hilited + */ +function Rectangle(width, // This is the width + height // This is the height + ){ + if (width){ + this.width = width; + if (height){ + this.height = height; + } + } +} + + +/* Inherit from Shape */ +Rectangle.prototype = new Shape(); + +/** + * Value to represent the width of the Rectangle. + *
Text in bold and italic and a + * link to SourceForge + * @private + * @type int + */ +Rectangle.prototype.width = 0; + +/** + * Value to represent the height of the Rectangle + * @private + * @type int + */ +Rectangle.prototype.height = 0; + +/** + * Get the type of this object. + * @type String + */ +Rectangle.prototype.getClassName= function(){ + return "Rectangle"; +} + +/** + * Get the value of the width for the Rectangle + * @type int + * @see Rectangle#setWidth + */ +Rectangle.prototype.getWidth = function(){ + return this.width; +} + +/** + * Get the value of the height for the Rectangle. + * Another getter is the {@link Shape#getColor} method in the + * {@link Shape} base class. + * @return The height of this Rectangle + * @type int + * @see Rectangle#setHeight + */ +Rectangle.prototype.getHeight = function(){ + return this.height; +} + +/** + * Set the width value for this Rectangle. + * @param {int} width The width value to be set + * @see #setWidth + */ +Rectangle.prototype.setWidth = function(width){ + this.width = width; +} + +/** + * Set the height value for this Rectangle. + * @param {int} height The height value to be set + * @see #getHeight + */ +Rectangle.prototype.setHeight = function(height){ + this.height = height; +} + +/** + * Get the value for the total area of this Rectangle + * @return total area of this Rectangle + * @type int + */ +Rectangle.prototype.getArea = function(){ + return width * height; +} + + +/** + * Create a new Square instance. + * @class A Square is a subclass of {@link Rectangle} + * @param {int} width The optional width for this Rectangle + * @param {int} height The optional height for this Rectangle + * @augments Rectangle + */ +function Square(width, height){ + if (width){ + this.width = width; + if (height){ + this.height = height; + } + } + +} + +/* Square is a subclass of Rectangle */ +Square.prototype = new Rectangle(); + +/** + * Set the width value for this Shape. + * @param {int} width The width value to be set + * @see #getWidth + */ +Square.prototype.setWidth = function(width){ + this.width = this.height = width; +} + +/** + * Set the height value for this Shape + * Sets the {@link Rectangle#height} attribute in the Rectangle. + * @param {int} height The height value to be set + */ +Square.prototype.setHeight = function(height){ + this.height = this.width = height; +} + + +/** + * Create a new Circle instance based on a radius. + * @class Circle class is another subclass of Shape + * @extends Shape + * @param {int} radius The optional radius of this {@link Circle } + * @mixin Square.prototype.setWidth as this.setDiameter + */ +function Circle(radius){ + if (radius) { + /** The radius of the this Circle. */ + this.radius = radius; + } +} + +/* Circle inherits from {@link Shape} */ +Circle.prototype = new Shape(); + +/** + * The radius value for this Circle + * @private + * @type int + */ +Circle.prototype.radius = 0; + +/** + * A very simple class (static) field that is also a constant + * @final + * @type float + */ +Circle.PI = 3.14; + +/** + * Get the radius value for this Circle + * @type int + * @see #setRadius + */ +Circle.prototype.getRadius = function(){ + return this.radius; +} + +/** + * Set the radius value for this Circle + * @param {int} radius The {@link Circle#radius} value to set + * @see #getRadius + */ +Circle.prototype.setRadius = function(radius){ + this.radius = radius; +} + +/** + * An example of a class (static) method that acts as a factory for Circle + * objects. Given a radius value, this method creates a new Circle. + * @param {int} radius The radius value to use for the new Circle. + * @type Circle + */ +Circle.createCircle = function(radius){ + return new Circle(radius); +} + + +/** + * Create a new Coordinate instance based on x and y grid data. + * @class Coordinate is a class that can encapsulate location information. + * @param {int} [x=0] The optional x portion of the Coordinate + * @param {int} [y=0] The optinal y portion of the Coordinate + */ +function Coordinate(x, y){ + if (x){ + this.x = x; + if (y){ + this.y = y; + } + } +} + +/** + * The x portion of the Coordinate + * @type int + * @see #getX + * @see #setX + */ +Coordinate.prototype.x = 0; + +/** + * The y portion of the Coordinate + * @type int + * @see #getY + * @see #setY + */ +Coordinate.prototype.y = 0; + +/** + * Gets the x portion of the Coordinate. + * @type int + * @see #setX + */ +Coordinate.prototype.getX = function(){ + return this.x; +} + +/** + * Get the y portion of the Coordinate. + * @type int + * @see #setY + */ +Coordinate.prototype.getY = function(){ + return this.y; +} + +/** + * Sets the x portion of the Coordinate. + * @param {int} x The x value to set + * @see #getX + */ +Coordinate.prototype.setX = function(x){ + this.x = x; +} + +/** + * Sets the y portion of the Coordinate. + * @param {int} y The y value to set + * @see #getY + */ +Coordinate.prototype.setY = function(y){ + this.y = y; +} + +/** + * @class This class exists to demonstrate the assignment of a class prototype + * as an anonymous block. + */ +function ShapeFactory(){ +} + +ShapeFactory.prototype = { + /** + * Creates a new {@link Shape} instance. + * @return A new {@link Shape} + * @type Shape + */ + createShape: function(){ + return new Shape(); + } +} + +/** + * An example of a singleton class + * @param ... Arguments represent {@link coordinate}s in the shape. + * @constructor + */ +MySingletonShapeFactory = function(){ + + /** + * Get the next {@link Shape} + * @type Shape + * @return A new {@link Shape} + */ + this.getShape = function(){ + return null; + } + +} + + +/** + * Create a new Foo instance. + * @class This is the Foo class. It exists to demonstrate 'nested' classes. + * @constructor + * @see Foo.Bar + */ +function Foo(){} + +/** + * Creates a new instance of Bar. + * @class This class exists to demonstrate 'nested' classes. + * @constructor + * @see Foo.Bar + */ +function Bar(){} + +/** + * Nested class + * @constructor + */ +Foo.Bar = function(){ + /** The x. */ this.x = 2; +} + +Foo.Bar.prototype = new Bar(); +/** The y. */ +Foo.Bar.prototype.y = '3'; diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/lend.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/lend.js new file mode 100644 index 0000000..92b15d5 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/lend.js @@ -0,0 +1,33 @@ + /** @class */ +var Person = Class.create( + /** + @lends Person.prototype + */ + { + initialize: function(name) { + this.name = name; + }, + say: function(message) { + return this.name + ': ' + message; + } + } + ); + +/** @lends Person.prototype */ +{ + /** like say but more musical */ + sing: function(song) { + } +} + +/** @lends Person */ +{ + getCount: function() { + } +} + +/** @lends Unknown.prototype */ +{ + notok: function() { + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof.js new file mode 100644 index 0000000..883bbde --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof.js @@ -0,0 +1,19 @@ +/** @constructor */ +pack = function() { + this.init = function(){} + function config(){} +} + + pack.build = function(task) {}; + +/** @memberOf pack */ +pack.install = function() {} + +/** @memberOf pack */ +pack.install.overwrite = function() {} + +/** @memberOf pack */ +clean = function() {} + +/** @memberOf pack-config */ +install = function() {}; diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof2.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof2.js new file mode 100644 index 0000000..bc3d9d8 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof2.js @@ -0,0 +1,38 @@ +/** + * @constructor + */ +function Foo() { + /** + @memberOf Foo.prototype + */ + function bar(a, b) { + } + + /** + @memberOf Foo + */ + var zip = function(p, q) { + } + + /** + @memberOf Foo + */ + function zop( x,y ) { + } + + /** + @memberOf Foo + @constructor + */ + function Fiz() { + /** A method of Foo#Fiz. */ + this.fipple = function(fop){} + } +} + +/** + @memberOf Foo# + */ +var blat = function() { + +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof3.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof3.js new file mode 100644 index 0000000..8c25942 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof3.js @@ -0,0 +1,33 @@ +/** +* @name Foo +* @class +*/ + +/**#@+ +* @memberOf Foo# +* @field +*/ + +/** +* @name bar +* @type Object[] +*/ + +/**#@-*/ + +/** +* @name Foo2 +* @class +*/ + +/**#@+ +* @memberOf Foo2# +* @field +*/ + +/** +* @name bar +* @type Object[] +*/ + +/**#@-*/ \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof_constructor.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof_constructor.js new file mode 100644 index 0000000..80fde73 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/memberof_constructor.js @@ -0,0 +1,17 @@ +/** @constructor */ +function Circle(){} + +/** + @constructor + @memberOf Circle# + */ +Circle.prototype.Tangent = function(){}; + +// renaming Circle#Tangent to Circle#Circle#Tangent + +/** + @memberOf Circle#Tangent# + */ +Circle.prototype.Tangent.prototype.getDiameter = function(){}; + + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/module.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/module.js new file mode 100644 index 0000000..5b3fe42 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/module.js @@ -0,0 +1,17 @@ +/** @namespace */ +myProject = myProject || {}; + +/** @namespace */ +myProject.myModule = (function () { + /** describe myPrivateVar here */ + var myPrivateVar = ""; + + var myPrivateMethod = function () { + } + + /** @scope myProject.myModule */ + return { + myPublicMethod: function () { + } + }; +})(); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/multi_methods.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/multi_methods.js new file mode 100644 index 0000000..bab35c7 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/multi_methods.js @@ -0,0 +1,25 @@ + +/** + Get the entire flavor. + @name flavor^3 + @function + @returns {Object} The entire flavor hash. +*/ +/** + Get a named flavor. + @name flavor^2 + @function + @param {String} name The name of the flavor to get. + @returns {String} The value of that flavor. +*/ +/** + Set the flavor. + @param {String} name The name of the flavor to set. + @param {String} value The value of the flavor. + @returns {String} The value of that flavor. +*/ +function flavor(name, value) { + if (arguments.length > 1) flavor[name] = value; + else if (arguments.length == 1) return flavor[name]; + else return flavor; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/name.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/name.js new file mode 100644 index 0000000..e88a51a --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/name.js @@ -0,0 +1,19 @@ +/** + @name Response + @class +*/ + +Response.prototype = { + /** + @name Response#text + @function + @description + Gets the body of the response as plain text + @returns {String} + Response as text + */ + + text: function() { + return this.nativeResponse.responseText; + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/namespace_nested.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/namespace_nested.js new file mode 100644 index 0000000..46cafa2 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/namespace_nested.js @@ -0,0 +1,23 @@ +/** + @namespace This is the first namespace. +*/ +ns1 = {}; + +/** + This is the second namespace. + @namespace +*/ +ns1.ns2 = {}; + +/** + This part of ns1.ns2 + @constructor +*/ +ns1.ns2.Function1 = function() { +}; + +ns1.staticFunction = function() { +}; + +/** A static field in a namespace. */ +ns1.ns2.staticField = 1; diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/nocode.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/nocode.js new file mode 100644 index 0000000..1cf99bc --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/nocode.js @@ -0,0 +1,13 @@ +/**#nocode+*/ + /** + @name star + @function + */ + function blahblah() { + + } +/**#nocode-*/ + +function yaddayadda() { + +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/oblit_anon.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/oblit_anon.js new file mode 100644 index 0000000..8d9e941 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/oblit_anon.js @@ -0,0 +1,20 @@ +/** the options */ +opt = Opt.get( + arguments, + { + d: "directory", + c: "conf", + "D[]": "define" + } +); + +/** configuration */ +opt.conf = { + /** keep */ + keep: true, + /** base */ + base: getBase(this, {p: properties}) +} + + + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/overview.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/overview.js new file mode 100644 index 0000000..1dfc09b --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/overview.js @@ -0,0 +1,20 @@ +/** + * @overview This "library" contains a + * lot of classes and functions. + * @example +
+	var x (x < 1);
+	alert("This 'is' \"code\"");
+ 
+ * @name My Cool Library + * @author Joe Smith jsmith@company.com + * @version 0.1 + */ + +/** + * Gets the current foo + * @param {String} fooId The unique identifier for the foo. + * @return {Object} Returns the current foo. + */ +function getFoo(fooID){ +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/param_inline.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/param_inline.js new file mode 100644 index 0000000..09845b2 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/param_inline.js @@ -0,0 +1,37 @@ +/** + @constructor + @param columns The number of columns. +*/ +function Layout(/**int*/columns){ + /** + @param [id] The id of the element. + @param elName The name of the element. + */ + this.getElement = function( + /** string */ elName, + /** number|string */ id + ) { + }; + + /** + @constructor + */ + this.Canvas = function(top, left, /**int*/width, height) { + /** Is it initiated yet? */ + this.initiated = true; + } + + this.rotate = function(/**nothing*/) { + } + + /** + @param x + @param y + @param {zoppler} z*/ + this.init = function(x, y, /**abbler*/z) { + /** The xyz. */ + this.xyz = x+y+z; + this.getXyz = function() { + } + } +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/params_optional.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/params_optional.js new file mode 100644 index 0000000..18bf598 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/params_optional.js @@ -0,0 +1,8 @@ + +/** + * @param {Page[]} pages + * @param {number} [id] Specifies the id, if applicable. + * @param {String} [title = This is untitled.] Specifies the title. + */ +function Document(pages, id, title){ +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype.js new file mode 100644 index 0000000..1147008 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype.js @@ -0,0 +1,17 @@ +/** @constructor */ +function Article() { +} + +Article.prototype.init = function(title) { + /** the instance title */ + this.title = title; + + /** the static counter */ + Article.counter = 1; +} + +a = new Article(); +a.Init("my title"); + +print(a.title); +print(Article.counter); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_nested.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_nested.js new file mode 100644 index 0000000..e8ca1ce --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_nested.js @@ -0,0 +1,9 @@ +/** @constructor */ +function Word() { +} + +Word.prototype.reverse = function() { +} + +Word.prototype.reverse.utf8 = function() { +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit.js new file mode 100644 index 0000000..6cfc39c --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit.js @@ -0,0 +1,13 @@ +/** @constructor */ +function Article() { +} + +Article.prototype = { + /** instance get title */ + getTitle: function(){ + } +} + +/** static get title */ +Article.getTitle = function(){ +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit_constructor.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit_constructor.js new file mode 100644 index 0000000..9248248 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/prototype_oblit_constructor.js @@ -0,0 +1,24 @@ +/** @constructor */ +function Article() { +} + +Article.prototype = { + /** @constructor */ + Title: function(title) { + /** the value of the Title instance */ + this.title = title; + }, + + init: function(pages) { + /** the value of the pages of the Article instance */ + this.pages = pages; + } +} + +f = new Article(); +f.init("one two three"); + +t = new f.Title("my title"); + +print(f.pages); +print(t.title); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/public.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/public.js new file mode 100644 index 0000000..35d34f6 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/public.js @@ -0,0 +1,10 @@ +/**@constructor*/ +function Foo() { + /** + @public + @static + @field + */ + var bar = function(x) { + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/scripts/code.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/scripts/code.js new file mode 100644 index 0000000..e9d7ed2 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/scripts/code.js @@ -0,0 +1,5 @@ +/** + @class + */ +function thisiscode() { +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/scripts/notcode.txt b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/scripts/notcode.txt new file mode 100644 index 0000000..fcd737e --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/scripts/notcode.txt @@ -0,0 +1,5 @@ +(This is not code) +function foo(){{{{ +( +! +@ \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shared.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shared.js new file mode 100644 index 0000000..e1c277a --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shared.js @@ -0,0 +1,42 @@ + +/** + * Builtin object. + * @class + * @name Array + */ + +/**#@+ + * Extension to builtin array. + * @memberOf Array + * @method + */ + +/** + * @returns Boolen if some array members... + */ +Array.prototype.some = function(){}; + +/** + * Change every element of an array. + * @returns Filtered array copy. + */ +Array.prototype.filter = function(){}; + +/**#@-*/ + + +/** + * A first in, first out data structure. + * @constructor + */ +Queue = function(){}; + +/**#@+ + * Extension to Queue. + * @memberOf Queue + */ + +rewind = function(){ +} + +// should close automatically here. \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shared2.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shared2.js new file mode 100644 index 0000000..3f7736a --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shared2.js @@ -0,0 +1,2 @@ +startOver = function(){ +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shortcuts.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shortcuts.js new file mode 100644 index 0000000..f738f1e --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/shortcuts.js @@ -0,0 +1,22 @@ +// /**#=+ +// * { +// * 'D': 'Date.prototype', +// * '$N': 'Number' +// * } +// */ +// var D = Date.prototype, +// $N = Number; +// +// D.locale = function(){ +// }; +// +// /** +// @return {string} The cardinal number string. +// */ +// $N.nth = function(n){ +// }; +// +// LOAD.file = function(){ +// } +// +// /**#=-*/ \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/static_this.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/static_this.js new file mode 100644 index 0000000..9407b20 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/static_this.js @@ -0,0 +1,13 @@ +/** the parent */ +var box = {}; + +/** @namespace */ +box.holder = {} + +box.holder.foo = function() { + /** the counter */ + this.counter = 1; +} + +box.holder.foo(); +print(box.holder.counter); diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/synonyms.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/synonyms.js new file mode 100644 index 0000000..09066b9 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/synonyms.js @@ -0,0 +1,31 @@ +/** + @class + @inherits Bar#zop as #my_zop +*/ +function Foo() { + /** this is a zip. */ + this.zip = function() {} + + /** from Bar */ + this.my_zop = new Bar().zop; +} + +/** + @class + @borrows Foo#zip as this.my_zip +*/ +function Bar() { + /** this is a zop. */ + this.zop = function() {} + + /** from Foo */ + this.my_zip = new Foo().zip; +} + +/** @namespace */ +var myObject = { + /** + @type function + */ + myFunc: getFunction() +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/tosource.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/tosource.js new file mode 100644 index 0000000..706d476 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/tosource.js @@ -0,0 +1,23 @@ +/** + * @param {Object} object + * @return {string} + */ +function valueOf(object) {} + +/** + * @param {Object} object + * @return {string} + */ +function toString(object) {} + +/** + * @param {Object} object + * @return {string} + */ +function toSource(object) {} + +/** + * @param {Object} object + * @return {string} + */ +function constructor(object) {} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/variable_redefine.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/variable_redefine.js new file mode 100644 index 0000000..2c07da0 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/app/test/variable_redefine.js @@ -0,0 +1,14 @@ +/** @constructor */ +function Foo() { + var bar = 1; + bar = 2; // redefining a private + + this.baz = 1; + baz = 2; // global + + /** a private */ + var blap = { + /** in here */ + tada: 1 + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/changes.txt b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/changes.txt new file mode 100644 index 0000000..b0acbab --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/changes.txt @@ -0,0 +1,124 @@ +== 2.4.0 == + + * Fixed bug that added mutiple symbols with the same name to docs. + * Added support for the -m option to suppress warnings for multiple docs. + * Added patch by brownsea42 to support quoted user variables on the command line. ( issue #281 ) + * Fixed bug that sometimes caused links to events to be incorrect. ( issue #292 ) + +== 2.3.3 == + + * Fixed bug that made all fields declared with the @property tag static. ( issue #262 ) + * Minor fix to better handle trailing slash on path to template (from jwmetrocat). ( issue #237 ) + * Fix for @memberOf when applied to inner members. ( issue #264 ) + * Fix for @memberOf when applied to symbols documented with @name. ( issue #260 ) + * Applied patch from kunhualqk, fix for bug where @link to borrowed member did not resolve to parent class. ( issue #218 ) + * Fix for @requires not linking back to the required class + * Added experimental support for @constructs to have an argument, the class name, when applied to a function assignment. + +== 2.3.2 == + + * Minor update to the usage notes and corrected the version number displayed in the output. + +== 2.3.1 == + + * Fixed HTML typo in allfiles template. ( issue #228 ) + * Modified template to display version information for classes. + * Modified template to better support multiple methods with the same name. + * Fixed bug that caused template to error when backtick characters appeared around class names. + +== 2.3.0 == + + * Added option -u, --unique to avoid bug that causes multiple symbols with names that differ only by case to overwrite each others output on case-insensitive filesystems. ( issue #162 ) + * Fixed bug where {@links} in @deprecated tags did not resolve. ( issue #220 ) + * Fixed bug that caused parens around a function to make it to be unrecognized. ( issue #213 ) + * Fixed bug prevented explicit links to named anchors from working (thanks katgao.pku). ( issue #215 ) + * Fixed bug that prevented full description from appearing in file overview. ( issue #224 ) + +== 2.2.1 == + + * Fixed bug with class template, where sorting of methods was accidentally removed (thanks dezfowler). + * Added missing test files for the @exports unit tests. + +== 2.2.0 == + + * Fixed bug that caused exception when given a folder containing non-js files, even with the x commandline option set to "js". ( issue #193 ) + * Fixed typo in index template [patch submitted by olle]. ( issue #198 ) + * Modified @borrows tag experimentally to allow for missing "as ..." clause. + * Added support for the @exports tag, to allow one symbol to be documented as another. + * Added support for the -S option to document code following the Secure Modules pattern. + +== 2.1.0 == + + * Added support for the @event tag. + * Fixed bug that prevented the : character from appearing in symbol names. + * Fixed bug that prevented underscored symbols marked with @public being tagged as private. (issue #184 ) + * Fixed bug that randomly affected the @memberOf tag when the name of the symbol did not include the parent name. + * Fixed bug that prevented templates that were not in the jsdoc-toolkit folder from being found. ( issue #176 ) + * Added ability to check for trailing slash on template path. ( issue #177 ) + * Modified classDesc so that it no longer is appended with the constructor desc. + * Fixed call to plugin onDocCommentSrc. + * Added missing support for inline doc comments for function return types. ( issue #189 ) + * Added command line option -q, --quiet. + * Added command line option -E, --exclude. ( issue #143 ) + * Added 2 more hooks for plugins. ( issue #163 ) + * Added support for extending built-ins. ( issue #160 ) + * Added "compact" option to JSDOC.JsPlate.prototype.process. ( issue #159 ) + * @augments no longer documents static members as inherited. ( issue #138 ) + * @link to a class now goes to the page for that class, not the constructor. ( issue #178 ) + * Warnings of mismatched curly brace now include filename. ( issue #166 ) + * Fixed bug affecting template paths loaded via a configuration file when the trailing slash is missing. ( issue #191 ) + * Minor optimizations. + +== 2.0.2 == + + * Fixed bug that sometimes caused an example of division in the source code to be interpretted as a regex by the JsDoc Toolkit analyzer. ( issue #158 ) + * Fixed a bug that prevented private variables marked as @public from appearing in the documentation. ( issue #161 ) + * Fixed bug that prevented variable names with underscored properties from appearing in summaries. ( issue #173 ) + +== 2.0.1 == + + * Fixed bug that prevented @fileOverview tag from being recognized. + * Added support for @fieldOf as a synonym for @field plus @memberOf. + * Added support for @name tag in a @fileOverview comment to control the displayed name of the file. + * Added support for multiple @example tags. ( issue #152 ) + * Modified style sheet of jsdoc template to make more readable. ( issue #151 ) + * Fixed bug that prevented @since documentation from displaying correctly when it appeared in a class. ( issue #150 ) + * Fixed bug that caused inhertited properties to sometimes not resolve correctly. ( issue #144 ) + * Modified so that trailing whitespace in @example is always trimmed. ( issue #153 ) + * Added support for elseif to JsPlate. (hat tip to fredck) + * Added support for @location urls in the @overview comment to the jsdoc template. + +== Changes From Versions 1.4.0 to 2.0.0 == + + * Upgraded included version of Rhino from 1.6 to 1.7R1. + * Removed circular references in parsed documentation objects. + * Improved inheritance handling, now properties and events can be inherited same as methods. + * Improved handling of cross-file relationships, now having two related objects in separate files is not a problem. + * Improved ability to recognize membership of previously defined objects. + * Added ability to redefine parsing behavior with plugins. + * @methodOf is a synonym for @function and @memberOf. + * Added @default to document default values of members that are objects. + * Added ability to parse and refer to inner functions. + * Fixed bug that appeared when calling a method to set properties of the instance referred to by "this". + * Added ability to automatically create links to other symbols. + * New "jsdoc" template now produces fully W3C valid XHTML. + * Inline parameter type hint comments are now documented. + * Fixed error: Locally scoped variables (declared with var) no longer appear as global. + * It is now possible to run JsDoc Toolkit from any directory. + * Added support for inline {@link ...} tags. + * Added support for the -H command-line option to allow for custom content handlers. + * Tag names @inherits and @scope changed to @borrows and @lends. + ? Combining @constructor in a doclet with @lends now supported. + * Multiple @lend tags now supported. + * Added support for the @constructs tag, used inside a @lends block. + * Added support for the @constant tag. + * Fixed bug that prevented the use of [] as a default value. + * Added support for the @field tag. + * Added support for the @public tag (applied to inner functions). + * @namespace tag can now be applied to functions, not just object literals. + * Added support for the -s command line option to suppress source code output. + * Added new unit test framework. + * Underscored symbols are now treated as if they have a @private tag by default. + * Improved support for anonymous constructors. + * Added support for the nocode meta tag. + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/conf/sample.conf b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/conf/sample.conf new file mode 100644 index 0000000..ad0f08e --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/conf/sample.conf @@ -0,0 +1,31 @@ +/* + This is an example of one way you could set up a configuration file to more + conveniently define some commandline options. You might like to do this if + you frequently reuse the same options. Note that you don't need to define + every option in this file, you can combine a configuration file with + additional options on the commandline if your wish. + + You would include this configuration file by running JsDoc Toolkit like so: + java -jar jsrun.jar app/run.js -c=conf/sample.conf + +*/ + +{ + // source files to use + _: ['app/test/jsdoc_test.js'], + + // document all functions, even uncommented ones + a: true, + + // including those marked @private + p: true, + + // some extra variables I want to include + D: {generatedBy: "Michael Mathews", copyright: "2008"}, + + // use this directory as the output directory + d: "docs", + + // use this template + t: "templates/jsdoc" +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/build.xml b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/build.xml new file mode 100644 index 0000000..bb845ce --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/build.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/build_1.4.xml b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/build_1.4.xml new file mode 100644 index 0000000..ab408a4 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/build_1.4.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/classes/js.jar b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/classes/js.jar new file mode 100644 index 0000000000000000000000000000000000000000..0352cb180c120868ddbc31b4f8e7319d2f26ea62 GIT binary patch literal 819369 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�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%0D0}ve&kyVxrmLD3a%OoJGjT)4!e~>YoAf7U8CGl< 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

jQEKzki`gN5I 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

+j_OKf5Frx{1q8pDOzco2Ak#w2%D2lmQBepw2U* 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 FTg!>M1}ulmZfUl#<@|mVSC@c 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

E_ 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

6Z3{z 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%0D4w-iZ4XS=zBA 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 literal 0 HcmV?d00001 diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/src/JsDebugRun.java b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/src/JsDebugRun.java new file mode 100644 index 0000000..319a5c6 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/src/JsDebugRun.java @@ -0,0 +1,21 @@ +/** + * A trivial bootstrap class that simply adds the path to the + * .js file as an argument to the Rhino call. This little hack + * allows the code in the .js file to have access to it's own + * path via the Rhino arguments object. This is necessary to + * allow the .js code to find resource files in a location + * relative to itself. + * + * USAGE: java -jar jsdebug.jar path/to/file.js + */ +public class JsDebugRun { + public static void main(String[] args) { + String[] jsargs = {"-j="+args[0]}; + + String[] allArgs = new String[jsargs.length + args.length]; + System.arraycopy(args, 0, allArgs, 0, args.length); + System.arraycopy(jsargs, 0, allArgs, args.length ,jsargs.length); + + org.mozilla.javascript.tools.debugger.Main.main(allArgs); + } +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/src/JsRun.java b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/src/JsRun.java new file mode 100644 index 0000000..25f519a --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/java/src/JsRun.java @@ -0,0 +1,21 @@ +/** + * A trivial bootstrap class that simply adds the path to the + * .js file as an argument to the Rhino call. This little hack + * allows the code in the .js file to have access to it's own + * path via the Rhino arguments object. This is necessary to + * allow the .js code to find resource files in a location + * relative to itself. + * + * USAGE: java -jar jsrun.jar path/to/file.js + */ +public class JsRun { + public static void main(String[] args) { + String[] jsargs = {"-j="+args[0]}; + + String[] allArgs = new String[jsargs.length + args.length]; + System.arraycopy(args, 0, allArgs, 0, args.length); + System.arraycopy(jsargs, 0, allArgs, args.length ,jsargs.length); + + org.mozilla.javascript.tools.shell.Main.main(allArgs); + } +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/jsdebug.jar b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/jsdebug.jar new file mode 100644 index 0000000000000000000000000000000000000000..a0ac7daa6bfa2633f1e2d27696b8afa8577e986b GIT binary patch literal 1307 zcmWIWW@h1H0D;(^G7B&RN^ml;F!;KLIO=-(x#|Bq#lR2%Rm#B-15_Gh=^Z)&sB{?+ zivTfPsjs7-r<-eVh@P*T@0pE!O$H*Z5BGZBf7s?J9KC|AJ+Gr%P373Zt1%C?1ay4! z4L`nZJ^S^yzhCRRY9aU1#Ru-b(2LaT^9st^7=T_lsq$iQI1#K0f`^nq8gOKMVSdQfSeUUE)iadB?oX}?1b zBDT(rPHVY39z=hf=+J1g%QbR^G{+GaA)!adn0$kSZY|SQ`w^bkknx87N8mBZgD!HL zccec%cXIFZdB4B@eaF1xNNa=XkxG?{9L@&<{R$@wX17jhFezhslhl9QuAjN-!`8f4 zaWflEKbysJ(0cXipcmS^JSUv8yIOUsTS>ZWeUC&qk4`XQtNg9% zGShSOd#ytyQynaSbUJkZX1Fe;JcFZGVA>9CDfb7`TleVyJU=C1`VJ=bpTaJmVjMqx zeiJrB!D?-{JZiMm3U6pj0Y-}fFj~05(Skch1iisA@`8)WaAHf#j*U*us!MZkB{kJQ zW$QRr*C3xdN6_bqVRv=fJKLS#&+Lr9|K6^Fdk$xW;~e*<<82IlA2}xRm`8eWdL(-v zFe|Hg^XY~%NBqlW@1}BCXx>)fxEGb%>*Rmcw`t0kfVZpkS0$}Tb6;8Amsi$xvyDS= zHOt1ILXK5-rI)YwZhLm&TkE^69kntY7Doj8dpeTme6SGR*eBt*;?ceDXJ;-e_m5rs zG_Z43Zg$%21q!->nw&6s01TzTcq0cCEWWsI0r}7M*Gbh5zyv6N7d1 zJ*UnreLn4SVAZwNc@nD*S>&C*nCt&h=X8PS_ef)&rEa;dY&q_4SR7_dHCcBte2&sW ziAnAX`TJWmjMJmmDfonQOlg|WVX~9I;H+R%=LLbpnY))1a_oyc`*YKO4^GpWr;9h) zyQv(1nreSM@2BCS$@_jV26!_vi7?|X5`ZxR1Og0i9YHia*Fy>jm{#mX1V{r2ENRpR zl5nj^1qQ-$hzaOf6s#R=!doDTo?+2-qo*Ws{n6SHjpF>5PkvDf-E2& E061^!ZU6uP literal 0 HcmV?d00001 diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/jsrun.jar b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/jsrun.jar new file mode 100644 index 0000000000000000000000000000000000000000..49c03f4c6f71d4e24f3897794d40585ffc7c20fe GIT binary patch literal 1303 zcmWIWW@h1H00GaQG7B&RN^ml;F!;KLIO=-(x#|Bq#lR2%Rm#EO0aUu9Ei0@CsB|F^ zivTfPsjs7-r<-eVh@P*T?-@hxLk0q@4{Rs=FDMBz@LYUFG5YP200H)J%U7PkSyDwS zAMD?LSLXhAx%EdM#2<;gtGRK06Z2|s%~v1POOLEmkI2#N-!*BGXUoiaufD{7pQn1V898}Z(mUA<;|J`%+l4kt zM)1#AGT{+B!u24J{&~7cCX+A_uVR5~2Gb*zDit}L4+Q!ZP8Q5=ozh@Z#_}eq|F~U0bJK^dd9UJT zHk^Joi{+s8>eWFnw0C(QuLqbl1w0yyq|auAP$IC9u&?Ao`DzhyJoW_FWf4 zWux}p*ezJtp)7dZ;^9QW!Y*UE=SpUR$^xt2?Y$+J(a&7G?vwNGE-cT}pWdN3X!N9okav52Uy5(f@gVO2G6TOzJ;{T|UJ)e){|- zY=(l>+HQH&XsH$6(3S#>76V|kaD$@-cZ>*ngJa|c7n9+{mX;kGotjmb=H5zbs(;GX zajdREK6Q?u&lAJ$>a=&ZJHMaV8Grx1T?6+V&Irdj?oG$r82CPNOyV(*^x*VJ_C8=% zR`KT34P}n_m&@Kw<*?Aat-x_FD!13k|Eh1(lrI5qSLv@xT9M|yvbry?tm|eQhu~_K zjX#APtL#cIU+>-a?83L!cUwDZWjZX52=@1MB+vO^A-b_o!g0l;d*9E_TvqNMyY^{d z=c?T7wAl+3bOSd}nAN8v4L4oaBcY#n@ciAmE)eZ{(*#w< zomu*P+U3BiYpe4lRvog)JAE-0*oy~{1`t@%s0}3H zT9FD1gykIIvIsqkg0+K9cnKuYGc3Ap^pu3q-2hBmUd8Zq72wUv29jg}!Y@FYmj%QF E0CH&O8UO$Q literal 0 HcmV?d00001 diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/jsrun.sh b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/jsrun.sh new file mode 100644 index 0000000..74ca79c --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/jsrun.sh @@ -0,0 +1,52 @@ +#!/bin/ksh + +# launcher script for jsdoc +# Author: Avi Deitcher +# +# This program is released under the MIT License as follows: + +# Copyright (c) 2008-2009 Atomic Inc +# +#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. +# + + +if [[ -n "$JSDOCDIR" ]]; then + _DOCDIR="-Djsdoc.dir=$JSDOCDIR" + _APPDIR="$JSDOCDIR/app" + _BASEDIR="$JSDOCDIR" +else + _DOCDIR="" + _APPDIR="./app" + _BASEDIR="." +fi + +if [[ -n "$JSDOCTEMPLATEDIR" ]]; then + _TDIR="-Djsdoc.template.dir=$JSDOCTEMPLATEDIR" +else + _TDIR="" +fi + +CMD="java $_DOCDIR $_TDIR -jar $_BASEDIR/jsrun.jar $_APPDIR/run.js $@" +echo $CMD +$CMD + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/.npmignore b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/.npmignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/.npmignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/allclasses.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/allclasses.tmpl new file mode 100644 index 0000000..536b549 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/allclasses.tmpl @@ -0,0 +1,16 @@ +

Classes

+
    + +
  • {! + if (thisClass.alias == "_global_") { + output += ""+new Link().toClass(thisClass.alias)+""; + } + else { + output += new Link().toClass(thisClass.alias); + } + !}
  • +
    +
+ + + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/allfiles.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/allfiles.tmpl new file mode 100644 index 0000000..530c932 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/allfiles.tmpl @@ -0,0 +1,72 @@ + + + + + {! Link.base = ""; /* all generated links will be relative to this */ !} + + JsDoc Reference - File Index + + + + + + + +
+ + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/class.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/class.tmpl new file mode 100644 index 0000000..98d1f91 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/class.tmpl @@ -0,0 +1,675 @@ + + + + + {! Link.base = "../"; /* all generated links will be relative to this */ !} + + JsDoc Reference - {+data.alias+} + + + + + + +
+
+
+ +
+ + + +
+

+ {! + var classType = ""; + + if (data.isBuiltin()) { + classType += "Built-In "; + } + + if (data.isNamespace) { + if (data.is('FUNCTION')) { + classType += "Function "; + } + classType += "Namespace "; + } + else { + classType += "Class "; + } + !} + {+classType+}{+data.alias+} +

+
+ + +

+ Version + {+ data.version +}. +

+
+ +

Extends + {+ + data.augments + .sort() + .map( + function($) { return new Link().toSymbol($); } + ) + .join(", ") + +}. +

+
+ +

+ {+resolveLinks(data.classDesc)+} +

+ + {# isn't defined in any file #} +

+ Defined in: {+new Link().toSrc(data.srcFile)+}. +

+
+ + + + + + + + + + + + + + + + + +
{+classType+}Summary
Constructor AttributesConstructor Name and Description
{! + if (data.isPrivate) output += "<private> "; + if (data.isInner) output += "<inner> "; + !} +   + +
+ {+ new Link().toSymbol(data.alias).inner('constructor')+}{+ makeSignature(data.params) +} +
+

{+resolveLinks(summarize(data.desc))+}

+
+
+ + + + {! var ownProperties = data.properties.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + if (member.isConstant) output += "<constant> "; + !} +   + +
+ {+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name)+} +
+

{+resolveLinks(summarize(member.desc))+}

+
+
+ + +
+ {! + var borrowedMembers = data.properties.filter(function($) {return $.memberOf != data.alias}); + var contributers = []; + borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); + for (var i = 0, l = contributers.length; i < l; i++) { + output += + "
Fields borrowed from class "+new Link().toSymbol(contributers[i])+":
" + + + "
" + + borrowedMembers + .filter( + function($) { return $.memberOf == contributers[i] } + ) + .sort(makeSortby("name")) + .map( + function($) { return new Link().toSymbol($.alias).withText($.name) } + ) + .join(", ") + + + "
"; + } + !} +
+
+
+ + + + {! var ownMethods = data.methods.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !} +   + +
{+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name.replace(/\^\d+$/, ''))+}{+makeSignature(member.params)+} +
+

{+resolveLinks(summarize(member.desc))+}

+
+
+ + +
+ {! + var borrowedMembers = data.methods.filter(function($) {return $.memberOf != data.alias}); + var contributers = []; + borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); + for (var i = 0, l = contributers.length; i < l; i++) { + output += + "
Methods borrowed from class "+new Link().toSymbol(contributers[i])+":
" + + + "
" + + borrowedMembers + .filter( + function($) { return $.memberOf == contributers[i] } + ) + .sort(makeSortby("name")) + .map( + function($) { return new Link().toSymbol($.alias).withText($.name) } + ) + .join(", ") + + + "
"; + } + + !} +
+
+
+ + + + {! var ownEvents = data.events.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} + + + + + + + + + + + + + + + + + +
Event Summary
Event AttributesEvent Name and Description
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !} +   + +
{+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name)+}{+makeSignature(member.params)+} +
+

{+resolveLinks(summarize(member.desc))+}

+
+
+ + +
+ {! + var borrowedMembers = data.events.filter(function($) {return $.memberOf != data.alias}); + var contributers = []; + borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); + for (var i = 0, l = contributers.length; i < l; i++) { + output += + "
Events borrowed from class "+new Link().toSymbol(contributers[i])+":
" + + + "
" + + borrowedMembers + .filter( + function($) { return $.memberOf == contributers[i] } + ) + .sort(makeSortby("name")) + .map( + function($) { return new Link().toSymbol($.alias).withText($.name) } + ) + .join(", ") + + + "
"; + } + !} +
+
+
+ + + + +
+
+ {+classType+}Detail +
+ +
+ +

{! + if (data.isPrivate) output += "<private> "; + if (data.isInner) output += "<inner> "; + !} + {+ data.alias +}{+ makeSignature(data.params) +} +

+ +

+ {+resolveLinks(data.desc)+} +
Author: {+data.author+}.
+

+ + + +
{+example+}
+
+
+ + + +
+
Parameters:
+ +
+ {+((item.type)?""+("{"+(new Link().toSymbol(item.type)+"} ")) : "")+} {+item.name+} + Optional, Default: {+item.defaultValue+} +
+
{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Deprecated:
+
+ {+resolveLinks(data.deprecated)+} +
+
+
+ +
+
Since:
+
{+ data.since +}
+
+
+ +
+
Throws:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} +
+
{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Returns:
+ +
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Requires:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+ +
+
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+ +
+
+
+ + + + + +
+ Field Detail +
+ +
+ +

{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + if (member.isConstant) output += "<constant> "; + !} + + {{+new Link().toSymbol(member.type)+}} + {+member.memberOf+}.{+member.name+} + +

+

+ {+resolveLinks(member.desc)+} +

+ +

+ Defined in: {+new Link().toSrc(member.srcFile)+}. +

+
+
Author: {+member.author+}.
+ + + +
{+example+}
+
+
+ + +
+
Deprecated:
+
+ {+ resolveLinks(member.deprecated) +} +
+
+
+ +
+
Since:
+
{+ member.since +}
+
+
+ +
+
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+ +
+
Default Value:
+
+ {+resolveLinks(member.defaultValue)+} +
+
+
+ +
+
+
+ + + +
+ Method Detail +
+ +
+ +

{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !} + + {{+new Link().toSymbol(member.type)+}} + {+member.memberOf+}.{+member.name.replace(/\^\d+$/, '')+}{+makeSignature(member.params)+} + +

+

+ {+resolveLinks(member.desc)+} +

+ +

+ Defined in: {+new Link().toSrc(member.srcFile)+}. +

+
+
Author: {+member.author+}.
+ + + +
{+example+}
+
+
+ + +
+
Parameters:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+item.name+} + Optional, Default: {+item.defaultValue+} +
+
{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Deprecated:
+
+ {+ resolveLinks(member.deprecated) +} +
+
+
+ +
+
Since:
+
{+ member.since +}
+
+ +
+ +
+
Throws:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} +
+
{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Returns:
+ +
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Requires:
+ +
{+ resolveLinks(item) +}
+
+
+
+ +
+
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+
+
+
+ + + +
+ Event Detail +
+ +
+ +

{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !} + + {{+new Link().toSymbol(member.type)+}} + {+member.memberOf+}.{+member.name+}{+makeSignature(member.params)+} + +

+

+ {+resolveLinks(member.desc)+} +

+ +

+ Defined in: {+new Link().toSrc(member.srcFile)+}. +

+
+
Author: {+member.author+}.
+ + + +
{+example+}
+
+
+ + +
+
Parameters:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+item.name+} + Optional, Default: {+item.defaultValue+} +
+
{+ resolveLinks(item.desc) +}
+
+
+
+ +
+
Deprecated:
+
+ {+ resolveLinks(member.deprecated) +} +
+
+
+ +
+
Since:
+
{+ member.since +}
+
+ +
+ +
+
Throws:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} +
+
{+ resolveLinks(item.desc) +}
+
+
+
+ +
+
Returns:
+ +
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Requires:
+ +
{+ resolveLinks(item) +}
+
+
+
+ +
+
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+
+
+
+ +
+
+ +
+ +
+
+ + + +
+
+ + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/index.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/index.tmpl new file mode 100644 index 0000000..9284e00 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/index.tmpl @@ -0,0 +1,50 @@ + + + + + + JsDoc Reference - Index + + + + + + +
+
+
+ +
+ + + +
+

Class Index

+
+ + +
+

{+(new Link().toSymbol(thisClass.alias))+}

+ {+resolveLinks(summarize(thisClass.classDesc))+} +
+
+
+
+ +
+ +
+
+ + + +
+
+ + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/publish.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/publish.js new file mode 100644 index 0000000..82091d0 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/publish.js @@ -0,0 +1,215 @@ +/** Called automatically by JsDoc Toolkit. */ +function publish(symbolSet) { + publish.conf = { // trailing slash expected for dirs + ext: ".html", + outDir: JSDOC.opt.d || SYS.pwd+"../out/jsdoc/", + templatesDir: JSDOC.opt.t || SYS.pwd+"../templates/jsdoc/", + stylesheetsDir: "stylesheets/", + symbolsDir: "symbols/", + srcDir: "symbols/src/" + }; + + // is source output is suppressed, just display the links to the source file + if (JSDOC.opt.s && defined(Link) && Link.prototype._makeSrcLink) { + Link.prototype._makeSrcLink = function(srcFilePath) { + return "<"+srcFilePath+">"; + } + } + + + // create the folders and subfolders to hold the output + IO.mkPath((publish.conf.outDir+"symbols/src").split("/")); + IO.mkPath((publish.conf.outDir+publish.conf.stylesheetsDir)); + + // copy all the assets + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.stylesheetsDir+"default.css", publish.conf.outDir+"/"+publish.conf.stylesheetsDir); + + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.stylesheetsDir+"blue_label.gif", publish.conf.outDir+"/"+publish.conf.stylesheetsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.stylesheetsDir+"body_noise.gif", publish.conf.outDir+"/"+publish.conf.stylesheetsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.stylesheetsDir+"body_wrapper_noise.gif", publish.conf.outDir+"/"+publish.conf.stylesheetsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.stylesheetsDir+"box_noise.gif", publish.conf.outDir+"/"+publish.conf.stylesheetsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.stylesheetsDir+"box_wrapper_noise.gif", publish.conf.outDir+"/"+publish.conf.stylesheetsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.stylesheetsDir+"title_bullet.gif", publish.conf.outDir+"/"+publish.conf.stylesheetsDir); + + + // used to allow Link to check the details of things being linked to + Link.symbolSet = symbolSet; + + // create the required templates + try { + var classTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"class.tmpl"); + var classesTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allclasses.tmpl"); + } + catch(e) { + print("Couldn't create the required templates: "+e); + quit(); + } + + // some ustility filters + function hasNoParent($) {return ($.memberOf == "")} + function isaFile($) {return ($.is("FILE"))} + function isaClass($) {return ($.is("CONSTRUCTOR") || $.isNamespace)} + + // get an array version of the symbolset, useful for filtering + var symbols = symbolSet.toArray(); + + // create the hilited source code files + var files = JSDOC.opt.srcFiles; + for (var i = 0, l = files.length; i < l; i++) { + var file = files[i]; + var srcDir = publish.conf.outDir + "symbols/src/"; + makeSrcFile(file, srcDir); + } + + // get a list of all the classes in the symbolset + var classes = symbols.filter(isaClass).sort(makeSortby("alias")); + + // create a filemap in which outfiles must be to be named uniquely, ignoring case + if (JSDOC.opt.u) { + var filemapCounts = {}; + Link.filemap = {}; + for (var i = 0, l = classes.length; i < l; i++) { + var lcAlias = classes[i].alias.toLowerCase(); + + if (!filemapCounts[lcAlias]) filemapCounts[lcAlias] = 1; + else filemapCounts[lcAlias]++; + + Link.filemap[classes[i].alias] = + (filemapCounts[lcAlias] > 1)? + lcAlias+"_"+filemapCounts[lcAlias] : lcAlias; + } + } + + // create a class index, displayed in the left-hand column of every class page + Link.base = "../"; + publish.classesIndex = classesTemplate.process(classes); // kept in memory + + // create each of the class pages + for (var i = 0, l = classes.length; i < l; i++) { + var symbol = classes[i]; + + symbol.events = symbol.getEvents(); // 1 order matters + symbol.methods = symbol.getMethods(); // 2 + + Link.currentSymbol= symbol; + var output = ""; + output = classTemplate.process(symbol); + + IO.saveFile(publish.conf.outDir+"symbols/", ((JSDOC.opt.u)? Link.filemap[symbol.alias] : symbol.alias) + publish.conf.ext, output); + } + + // regenerate the index with different relative links, used in the index pages + Link.base = ""; + publish.classesIndex = classesTemplate.process(classes); + + // create the class index page + try { + var classesindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"index.tmpl"); + } + catch(e) { print(e.message); quit(); } + + var classesIndex = classesindexTemplate.process(classes); + IO.saveFile(publish.conf.outDir, "index"+publish.conf.ext, classesIndex); + classesindexTemplate = classesIndex = classes = null; + + // create the file index page + try { + var fileindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allfiles.tmpl"); + } + catch(e) { print(e.message); quit(); } + + var documentedFiles = symbols.filter(isaFile); // files that have file-level docs + var allFiles = []; // not all files have file-level docs, but we need to list every one + + for (var i = 0; i < files.length; i++) { + allFiles.push(new JSDOC.Symbol(files[i], [], "FILE", new JSDOC.DocComment("/** */"))); + } + + for (var i = 0; i < documentedFiles.length; i++) { + var offset = files.indexOf(documentedFiles[i].alias); + allFiles[offset] = documentedFiles[i]; + } + + allFiles = allFiles.sort(makeSortby("name")); + + // output the file index page + var filesIndex = fileindexTemplate.process(allFiles); + IO.saveFile(publish.conf.outDir, "files"+publish.conf.ext, filesIndex); + fileindexTemplate = filesIndex = files = null; +} + + +/** Just the first sentence (up to a full stop). Should not break on dotted variable names. */ +function summarize(desc) { + if (typeof desc != "undefined") + return desc.match(/([\w\W]+?\.)[^a-z0-9_$]/i)? RegExp.$1 : desc; +} + +/** Make a symbol sorter by some attribute. */ +function makeSortby(attribute) { + return function(a, b) { + if (a[attribute] != undefined && b[attribute] != undefined) { + a = a[attribute].toLowerCase(); + b = b[attribute].toLowerCase(); + if (a < b) return -1; + if (a > b) return 1; + return 0; + } + } +} + +/** Pull in the contents of an external file at the given path. */ +function include(path) { + var path = publish.conf.templatesDir+path; + return IO.readFile(path); +} + +/** Turn a raw source file into a code-hilited page in the docs. */ +function makeSrcFile(path, srcDir, name) { + if (JSDOC.opt.s) return; + + if (!name) { + name = path.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_"); + name = name.replace(/\:/g, "_"); + } + + var src = {path: path, name:name, charset: IO.encoding, hilited: ""}; + + if (defined(JSDOC.PluginManager)) { + JSDOC.PluginManager.run("onPublishSrc", src); + } + + if (src.hilited) { + IO.saveFile(srcDir, name+publish.conf.ext, src.hilited); + } +} + +/** Build output for displaying function parameters. */ +function makeSignature(params) { + if (!params) return "()"; + var signature = "(" + + + params.filter( + function($) { + return $.name.indexOf(".") == -1; // don't show config params in signature + } + ).map( + function($) { + return $.name; + } + ).join(", ") + + + ")"; + return signature; +} + +/** Find symbol {@link ...} strings in text and turn into html links */ +function resolveLinks(str, from) { + str = str.replace(/\{@link ([^} ]+) ?\}/gi, + function(match, symbolName) { + return new Link().toSymbol(symbolName); + } + ); + + return str; +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/static/index.html b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/static/index.html new file mode 100644 index 0000000..661f6f6 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/static/index.html @@ -0,0 +1,19 @@ + + + + + Generated Javascript Documentation + + + + + + <body> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + </body> + + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/blue_label.gif b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/blue_label.gif new file mode 100644 index 0000000000000000000000000000000000000000..ba9268c26c69041f4a00874e6d9132011a798e3e GIT binary patch literal 730 zcmV<00ww)NNk%w1VGsac0M!5h-{Iii;NRWf-rU~Z+uhvS+}qjP+SuCJ*V)+D*x1(C z*Vfn9)z{Y5*45P3)zsD1)78||)YH<`)6vt?($mw?($dh<(a+J)(9zJ&(9g}!&d$%z z%+Afr&CJTo%gfBn$;-;h%gV{h$;isd$jQjZ$;ijZ$i~RW#>d9S$H&FT#>K|Q#Ky(L z#l*wJ!@|SE!o$MB!@|G8z`nr0y}!P^zP-J^zP!D>yuH1;yt})+yI-5WT$Z;0W|075 zi~s-tA^8LV2LS&7EC2ui01yCQ000L6K!I?$D;kYF0wKU89G^+0GVna|n1N{(Ip_ia z&h73hWs1i`qL}vubO&c%T2P29+lKf&zn)64Q{ zhysFZZ;XHiO@MR-2zF8jn~#wSc6g3eQA((a0Eh^smrbmOLXEFbowue0sHw1DmAH?L zT@HW-0|vW~QUnSRqM8iD1Pt4KO1I9Jhzb;O1wyyjxdsdqgGvh5ac}b%=#>f~5mcW8k_^sNgZR%Dj!;{eIn zvlruKkO8;o0uCmKXmP_e0t_Hr^wnJ;fdvm9BGYz9frE({qNPoku-Z6+3>iwKJ`j9@ z2hmErN#KwjCWH&{p=;1!0fK@FT~LwSZ@~gq2M0{xOHB$%U?2n16fglDqm(nxfCfM? M1cVTFp+FD-J5p|Cw*UYD literal 0 HcmV?d00001 diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/body_noise.gif b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/body_noise.gif new file mode 100644 index 0000000000000000000000000000000000000000..25070c22dd12a3519bc9a415ec6b5c7e120e255c GIT binary patch literal 869 zcmV-r1DgCtNk%w1VMYK(0HOc@-{Iii;NRWf-rU~Z+uhs%0000000000A^8LV2LS&7 zEC2ui07d{t000C37)qnTB_jvq_p?ElW(ZKMXsXkf%tWm2jIE8;#I@%+QOaWhYS(L%>Hc+=x>oL{dJy zfUP!+PA5R#J}Qclov{Gi(UaB1)r5ok|r?!<>Sc$uSjF-^4dH1M&1Via-%f19++p25eZHj4Q={ zyYgknS~jJ&e#PjE)dU%On6kT|Pscx?5s1>wclhU1ue~1D*<`{MGn!m*M9$Jz7`eL# zx4r;SwRCBBmNZ86l12@f)^CWN988P{TVonI_G_iart618Ff-i6a5S|znc^4;Yi%RO z-gUh8bE7&3IJ4KtGFP{E5bile99ei(w>QFf)@#4I*Y^9sdB-MmI)_m1SZ=2Cm-dJf zCV$fZNUed$GUvoW*F3_35d|;G#BdxMw4lb;f=l2rg?@QV_5&o3m4Mn_@5$j@KYTsn z6I>V3XAED4Ndn*@=a~~5EH3tEhHYcH(Gg7KRalyQEz$y_b(z6&Q%ar?=YUGI+2>hX zxdpV^RrtsR2x~KiV#<|8c4ZL}lFYSYH4!o9-)?j;l~RE?win@0`SbxMHbsirju6e~_Nnll^ zoCMW(S0EU6@M$*->f$6UOp>WZrJt<@l#c1VIUpGvoSB`TZ2CH@7!47#kY=i-3K9$| v%I5c6Gb32X+dgf&Fw!W^8l+GdN21wdILnNJ<{)*Y}Ln literal 0 HcmV?d00001 diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/body_wrapper_noise.gif b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/body_wrapper_noise.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4269c86b33dc7b5f7f220b0dd817cf5285e5746 GIT binary patch literal 1148 zcmV-?1cUoWNk%w1VK@Lr0K@GYsR+M=FrSe1rG33xY5|< z82GRd4igssL4E~jC3J2qacpN{fi^X7a0e^_ban#`f0=&~l1zvPj3p6FY*8c+50fin zXIB7YmZ&;m3ol11td44CB%`+oV^%)HK6!@?NQ7Y#+A6cOAYsa0zSssQz@ z8A!!zqNRq&$gNmlWz85ZVNekgb%aH*L*0V^V9Pe?Ua^1`)9m85$eW^-wpd`?!H}ac ziC1{OKqBNJ0w44Y*rCVB3co&!fDTlJZh?+A-p~jOL@a`(uLDpeJpoc+KmfAr>>O}{ zs!`a$Jt0y0o4>QjDXe5PZOzw;6=84 zGmIis{c{tEjrqk_KPmcE7l;h;6om>b!Ij=;0$u?gjT}X&mRS=SB!^8$5Hb=YpM|)X zb~oYU%n;%rpjm`eF|-^Ki=D%UkLE4NATboR=*5`5Vaei^CRXRqF0l9ApBpr|T*qzLF|gW`i}M1yJ- z$CChP0%U3c!c zaYz#bqMzZx<+EU!szs%@7#h?0OR5gxD|X-j5Q!p;nt59u;6*dsaigAf2yW+Q((RFQ zlro90_9-eZy8(TLrik@WXzqLXQ2SXX{$^W-i#Ilb=)w#)ysWj2dUD_ppbQD$!H1@F zp``SF2j8h-T=kZF=-xJqKlnST5zTfQrlQ? z!6~=MaiSVSN|B+I6>*~nFT>}t0jZ+}(T$~Rt^wTa+~PP}kf6%P*ADsFK}g!*q(7~i z0d0i0!u2ya1I9_VdN=n;^~ZZF8-pdOEiExtD!uC>)_oz)Taj1_p|~eh!T0v$mIRkx O;%unfc$#g500294S{9c8 literal 0 HcmV?d00001 diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/box_noise.gif b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/box_noise.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c70057ddcb61651d6e67538a34648856a308d4b GIT binary patch literal 297 zcmV+^0oMLUNk%w1VMYK(0FeLy_4W1j_VxAl_Vo4jA^8LV2LS&7EC2ui07d{t0008| zoR0>}?GK}z6o`vO-7fj8aSI5F6=J69%C^=O1@cVS?k$n}&i6Zx^LT*7qVb6A2$#&J zbD4}vH$s)~ip}zB+^#Hgof1jnvU#P&BE4)HtKD_M=k&n&K1%CDH+7NehvT(Zf+s@g zWAwDhh+_B%xnUzwCj*s}7O80kv+2oD87f*Q(Wvk_>h`(H+N#MFVLE_^=xU3E$Rm}@ zdke(-W1CtDGHfhrc1)TF9Cp~;oD`=CJxLwxo2?C@441;V9WKt0Kv6iscCaeT4qiq! v(SCW;T|YDKkQ>Sbp~Ir}t_Qvc&t> vPI<20>-FO7?*9oZ5|;$ec@eqpjnJMC+ULGp-;}xTb@}`M2Og*}GFSruN98cp literal 0 HcmV?d00001 diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/default.css b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/default.css new file mode 100644 index 0000000..a3b0e28 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/default.css @@ -0,0 +1,237 @@ +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + font-size: 100%; + vertical-align: baseline; + border: 0; + outline: 0; + background: transparent; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +body { + font-family: Arial, Helvetica, sans-serif; + font-size: x-small; + background: #DFE1E0 url("body_noise.gif"); + color: #2D3438; + text-align: center; +} + +a { + color: #006691; +} + +hr { + display: block; + clear: both; + visibility: hidden; +} + +h1 { + font-size: 2.5em; + font-weight: normal; + letter-spacing: -1px; + text-shadow: 0 1px 0 hsla(0, 0%, 0%, .1); + color: #262626; + border-bottom: 1px solid #D6D9D8; + padding: 0 0 10px 0; +} + +dt { + display: block; + padding: 7px 0 3px 0; + font-weight: bold; +} + +dd { + display: block; + padding: 0 0 0 15px; +} + +#body_wrapper { + background: url("body_wrapper_noise.gif") repeat-x top; +} + +#wrapper { + width: 950px; + margin: 0 auto; + padding: 25px 0; + text-align: left; +} + +#box { + background: #F5F5F5 url("box_noise.gif"); + border-top: 1px solid #DCDEDD; + border-left: 1px solid #D5D7D6; + border-right: 1px solid #D3D5D4; + border-bottom: 1px solid #CDCFCE; + font-size: 1.2em; +} + +#box_wrapper { + padding: 35px 25px; + background-image: url("box_wrapper_noise.gif") repeat-x top; +} + +#blue_label { + position: absolute; + display: block; + width: 16px; + height: 95px; + margin: 34px 0 0 -16px; + background: url("blue_label.gif") no-repeat left top; +} + +#nav { + float: left; + width: 190px; +} + +#nav h2 { + padding: 5px 10px; + font-size: 1.3em; + font-weight: normal; + text-shadow: 0 1px 0 hsla(0, 0%, 0%, .1); + background: #E1E3E3; +} + +#nav ul { + padding-bottom: 20px; +} + +#nav ul li { + padding: 4px 10px; + border-top: 1px solid #E1E3E3; +} + +.index_link a { + color: #999999; +} + +.index_link span { + color: #000000; +} + +#content { + float: right; + width: 680px; +} + +#content p { + padding-bottom: 10px; +} + +#content p.defined { + color: #666; + padding-bottom: 10px; +} + +#content_wrapper { + display: block; + border-top: 1px solid #FFFFFF; + padding: 15px 0; +} + +#footer { + text-align: right; + color: #5D5D5D; + padding: 10px 0; + font-size: 1.1em; +} + +#footer a { + color: #424242; +} + +.module { + border-bottom: 1px solid #D5D6D7; + padding: 10px 0; +} + +.module h2 { + font-size: 1.2em; + color: #006691; + font-family: "Consolas", monospace; + padding: 4px 20px; + margin-left: -20px; + background: url("title_bullet.gif") no-repeat left top; +} + +#class_detail .module h2 { + color: #2D3438; +} + +#class_detail .module h2 span, +dt span, +dd .fixedFont { + color: #95999B; + font-weight: normal; +} + +.module h2 strong { + color: #006691; +} + +.summaryTable { + width: 100%; + margin-top: 15px; +} + +.summaryTable caption { + padding: 5px 10px; + font-size: 1.5em; + font-weight: normal; + text-shadow: 0 1px 0 hsla(0, 0%, 0%, .1); + background: #E1E3E3; + text-align: left; +} + +.summaryTable thead, +.summaryTable th { + display: none; +} + +.summaryTable td { + padding: 10px 15px; + background: #FFFFFF; + border-bottom: 10px solid #F5F6F5; +} + +.summaryTable td.attributes { + width: 50px; + font-family: "Consolas", monospace; + color: #95999B; +} + +.sectionTitle { + margin-top: 15px; + padding: 5px 10px; + font-size: 1.5em; + font-weight: normal; + text-shadow: 0 1px 0 hsla(0, 0%, 0%, .1); + background: #E1E3E3; + text-align: left; +} + +pre { + padding: 10px; + background: #FFFFFF; + font-family: "Consolas", monospace; + color: #95999B; +} + +.fixedFont { + font-family: "Consolas", monospace; +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/title_bullet.gif b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/stylesheets/title_bullet.gif new file mode 100644 index 0000000000000000000000000000000000000000..e06c32202fce4ac4f1a8d5435a429da5244264ec GIT binary patch literal 353 zcmZ?wbhEHbZ;q0YdWn=>zvdlf9g88A>s<3yV~MD7b{s))@H$#szM5? zS;A7v$}KW#npvXq@>*GWDm|&9qRLYfgruc4dPNl!viSMuX658%adS6hac;=iw3%(| X*0LRC?7Mdt?ki+v-FA4JBZD;nA%m@; literal 0 HcmV?d00001 diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/symbol.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/symbol.tmpl new file mode 100644 index 0000000..f8f4bd1 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/bluelabel/symbol.tmpl @@ -0,0 +1,35 @@ + + {+data.name+} + {+data.memberOf+} + {+data.isStatic+} + {+data.isa+} + {+data.desc+} + {+data.classDesc+} + + + + {+method.name+} + {+method.memberOf+} + {+method.isStatic+} + {+method.desc+} + + + {+param.type+} + {+param.name+} + {+param.desc+} + {+param.defaultValue+} + + + + + + + + {+property.name+} + {+property.memberOf+} + {+property.isStatic+} + {+property.desc+} + {+property.type+} + + + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/allclasses.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/allclasses.tmpl new file mode 100644 index 0000000..6974a8f --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/allclasses.tmpl @@ -0,0 +1,15 @@ + + +

Classes

+ +
    + +
  • {! + var classLink = new Link().toClass(thisClass.alias) + ""; + output += wordwrapNamespace(classLink); + !}
  • +
    +
diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/allfiles.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/allfiles.tmpl new file mode 100644 index 0000000..57bfcba --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/allfiles.tmpl @@ -0,0 +1,76 @@ + + + + + {! Link.base = ""; /* all generated links will be relative to this */ !} + JsDoc Reference - File Index + + + + + + + + + + + + + + + {+include("static/header.html")+} + +
+ + +
+ ©{+JSDOC.opt.D.copyright+}
+ Generated by JsDoc Toolkit {+JSDOC.VERSION+} on {+new Date()+}
+ HTML template: Codeview 1.1.1 +
+
+
+ +
+
+

File Index

+ +
    + +
  • +

    {+new Link().toSrc(item.alias).withText(item.name)+}

    + + {+resolveLinks(item.desc)+} + +
    + +
    Author:
    +
    {+item.author+}
    +
    + + +
    Version:
    +
    {+item.version+}
    +
    + + {! var locations = item.comment.getTag('location').map(function($){return $.toString().replace(/(^\$ ?| ?\$$)/g, '').replace(/^HeadURL: https:/g, 'http:');}) !} + +
    Location:
    + +
    {+location+}
    +
    +
    +
    +
  • +
    +
+
+
+ + + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/class.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/class.tmpl new file mode 100644 index 0000000..c3b2925 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/class.tmpl @@ -0,0 +1,713 @@ + + + + + + {! Link.base = "../"; /* all generated links will be relative to this */ !} + JsDoc Reference - {+data.alias+} + + + + + + + + + + + + + + {+include("static/header.html")+} + +
+ + +
+ ©{+JSDOC.opt.D.copyright+}
+ Generated by JsDoc Toolkit {+JSDOC.VERSION+} on {+new Date()+}
+ HTML template: Codeview 1.1.1 +
+
+
+ +
+
+

+ {! + var classType = ""; + + if (data.isBuiltin()) { + classType += "Built-In "; + } + + if (data.isNamespace) { + if (data.is('FUNCTION')) { + classType += "Function "; + } + classType += "Namespace "; + } else { + classType += "Class "; + } + !} + {+classType+}{! + var dataAlias = data.alias + ""; + dataAlias = dataAlias.replace(/\./g, " ."); + output += dataAlias; + !} +

+ +

+ {+resolveLinks(data.classDesc)+} +

+ + + +
    + +
  • Version {+ data.version +}
  • +
    + + {# isn't defined in any file #} +
  • Defined in: {+new Link().toSrc(data.srcFile)+}
  • +
    + +
  • Extends + {+ + data.augments + .sort() + .map( + function($) { return new Link().toSymbol($); } + ) + .join(", ") + +}
  • +
    +
+
+ + +
+ + + + + + + + + + + + + + +
{+classType+}Summary
Constructor AttributesConstructor Name and Description
{! + if (data.isPrivate) output += "<private> "; + if (data.isInner) output += "<inner> "; + !}  +
+ {+ new Link().toSymbol(data.alias).inner('constructor')+}{+ makeSignature(data.params) +} +
+
{+resolveLinks(summarize(data.desc))+}
+
+
+
+ + + {! var ownProperties = data.properties.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} + +
+ + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + if (member.isConstant) output += "<constant> "; + !}  +
+ {+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name)+} +
+
{+resolveLinks(summarize(member.desc))+}
+
+
+
+ + +
+ {! + var borrowedMembers = data.properties.filter(function($) {return $.memberOf != data.alias}); + + var contributers = []; + borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); + for (var i = 0, l = contributers.length; i < l; i++) { + output += + "
Fields borrowed from class "+new Link().toSymbol(contributers[i])+":
" + + + "
" + + borrowedMembers + .filter( + function($) { return $.memberOf == contributers[i] } + ) + .sort(makeSortby("name")) + .map( + function($) { return new Link().toSymbol($.alias).withText($.name) } + ) + .join(", ") + + + "
"; + } + !} +
+
+
+ + + + {! var ownMethods = data.methods.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} + +
+ + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !}  +
{+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name.replace(/\^\d+$/, ''))+}{+makeSignature(member.params)+} +
+
{+resolveLinks(summarize(member.desc))+}
+
+
+
+ + +
+ {! + var borrowedMembers = data.methods.filter(function($) {return $.memberOf != data.alias}); + var contributers = []; + borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); + for (var i = 0, l = contributers.length; i < l; i++) { + output += + "
Methods borrowed from class "+new Link().toSymbol(contributers[i])+":
" + + + "
" + + borrowedMembers + .filter( + function($) { return $.memberOf == contributers[i] } + ) + .sort(makeSortby("name")) + .map( + function($) { return new Link().toSymbol($.alias).withText($.name) } + ) + .join(", ") + + + "
"; + } + !} +
+
+
+ + + + {! var ownEvents = data.events.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} + +
+ + + + + + + + + + + + + + + + + + +
Event Summary
Event AttributesEvent Name and Description
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !}  +
{+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name)+}{+makeSignature(member.params)+} +
+
{+resolveLinks(summarize(member.desc))+}
+
+
+
+ + +
+ {! + var borrowedMembers = data.events.filter(function($) {return $.memberOf != data.alias}); + var contributers = []; + borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); + for (var i = 0, l = contributers.length; i < l; i++) { + output += + "
Events borrowed from class "+new Link().toSymbol(contributers[i])+":
" + + + "
" + + borrowedMembers + .filter( + function($) { return $.memberOf == contributers[i] } + ) + .sort(makeSortby("name")) + .map( + function($) { return new Link().toSymbol($.alias).withText($.name) } + ) + .join(", ") + + + "
"; + } + + !} +
+
+
+ + + +
+
+ + +
+ {+classType+}Detail +
+ +
{! + if (data.isPrivate) output += "<private> "; + if (data.isInner) output += "<inner> "; + !} + {+ data.alias +}{+ makeSignature(data.params) +} +
+ +
+ {+resolveLinks(data.desc)+} +
Author: {+data.author+}.
+
+ + + +
{+example+}
+
+
+ + +
+
Parameters:
+ +
+ {+((item.type)?""+("{"+(new Link().toSymbol(item.type)+"} ")) : "")+} {+item.name+} + Optional, Default: {+item.defaultValue+} +
+
{+resolveLinks(item.desc)+}
+
+
+
+ + +
+ +
+ {+resolveLinks(data.deprecated)+} +
+
+ + +
Since:
+
{+ data.since +}
+
+ + +
Throws:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} +
+
{+resolveLinks(item.desc)+}
+
+
+ + +
Returns:
+ +
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
+
+
+ + +
Requires:
+ +
{+ resolveLinks(item) +}
+
+
+ + +
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+
+
+
+
+ + + +
+
+ +
+ Field Detail +
+ + + + +
+ + {! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + if (member.isConstant) output += "<constant> "; + !} + + + {{+new Link().toSymbol(member.type)+}} + + {+member.memberOf+}.{+member.name+} +
+ +
+ {+resolveLinks(member.desc)+} + +
+ Defined in: {+new Link().toSrc(member.srcFile)+}. +
+ +
Author: {+member.author+}.
+
+ + + +
{+example+}
+
+
+ + +
+ + +
Deprecated:
+
+ {+ resolveLinks(member.deprecated) +} +
+
+ +
Since:
+
{+ member.since +}
+
+ +
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+ +
Default Value:
+
+ {+resolveLinks(member.defaultValue)+} +
+
+
+
+ +
+
+
+
+
+ + + +
+
+
+ Method Detail +
+ + + + +
+ + {! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !} + + + {{+new Link().toSymbol(member.type)+}} + + {+member.memberOf+}.{+member.name.replace(/\^\d+$/, '')+}{+makeSignature(member.params)+} +
+ +
+ {+resolveLinks(member.desc)+} + + +
+ Defined in: {+new Link().toSrc(member.srcFile)+}. +
+ +
Author: {+member.author+}.
+
+ + + +
{+example+}
+
+
+ + +
+
Parameters:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+item.name+} + Optional, Default: {+item.defaultValue+} +
+
{+resolveLinks(item.desc)+}
+
+
+
+ + +
+ + +
Deprecated:
+
+ {+ resolveLinks(member.deprecated) +} +
+
+ + +
Since:
+
{+ member.since +}
+
+ + +
Throws:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} +
+
{+resolveLinks(item.desc)+}
+
+
+ + +
Returns:
+ +
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
+
+
+ + +
Requires:
+ +
{+ resolveLinks(item) +}
+
+
+ + +
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+ Event Detail +
+ + + + +
+ + {! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !} + + + {{+new Link().toSymbol(member.type)+}} + + {+member.memberOf+}.{+member.name+}{+makeSignature(member.params)+} +
+ +
+ {+resolveLinks(member.desc)+} + + +
+ Defined in: {+new Link().toSrc(member.srcFile)+}. +
+ +
Author: {+member.author+}.
+
+ + + +
{+example+}
+
+
+ + +
+
Parameters:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+item.name+} + Optional, Default: {+item.defaultValue+} +
+
{+ resolveLinks(item.desc) +}
+
+
+
+ + +
+ +
Deprecated:
+
{+ resolveLinks(member.deprecated) +}
+
+ + +
Since:
+
{+ member.since +}
+
+ + +
Throws:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} +
+
{+ resolveLinks(item.desc) +}
+
+
+ + +
Returns:
+ +
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
+
+
+ + +
Requires:
+ +
{+ resolveLinks(item) +}
+
+
+ + +
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+
+ +
+
+
+
+
+
+
+ + + + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/all.css b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/all.css new file mode 100644 index 0000000..bc6cb79 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/all.css @@ -0,0 +1,340 @@ +/* + * TABLE OF CONTENTS: + * - Browser reset + * - HTML elements + * - JsDoc styling + */ + + + + + + +/* + * BEGIN BROWSER RESET + */ + +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,p,pre,form,fieldset,input,textarea,p,blockquote,th,td { + margin:0; + padding:0 +} +html { + height:100%; + overflow:-moz-scrollbars-vertical; + overflow-x:auto +} +table { + border:0; + border-collapse:collapse; + border-spacing:0 +} +fieldset,img { + border:0 +} +address,caption,cite,code,dfn,em,strong,th,var { + font-style:normal; + font-weight:normal +} +em,cite { + font-style:italic +} +strong { + font-weight:bold +} +ol,ul { + list-style:none +} +caption,th { + text-align:left +} +h1,h2,h3,h4,h5,h6 { + font-size:100%; + font-weight:normal; + margin:0; + padding:0 +} +q:before,q:after { + content:'' +} +abbr,acronym { + border:0 +} + +/* + * END BROWSER RESET + */ + + + + + + +/* + * HTML ELEMENTS + */ + +@font-face { + font-family: 'M1m'; + src: url('fonts/mplus-1m-regular-webfont.eot'); + src: local('☺'), url('fonts/mplus-1m-regular-webfont.woff') format('woff'), url('fonts/mplus-1m-regular-webfont.ttf') format('truetype'), url('fonts/mplus-1m-regular-webfont.svg#webfontVd14f4NN') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'M1m'; + src: url('fonts/mplus-1m-bold-webfont.eot'); + src: local('☺'), url('fonts/mplus-1m-bold-webfont.woff') format('woff'), url('fonts/mplus-1m-bold-webfont.ttf') format('truetype'), url('fonts/mplus-1m-bold-webfont.svg#webfontIjI5mZqE') format('svg'); + font-weight: bold; + font-style: normal; +} + + + +* { + line-height: 1.4em; +} + +html { + font-size: 100%; +} + +body { + font-size: 0.75em; + padding: 15px 0; + background: #eee; + background-image: -moz-linear-gradient(left, #dddddd, #f9f9f9) fixed; + background-image: -webkit-gradient(linear,left bottom,right bottom,color-stop(0, #dddddd),color-stop(1, #f9f9f9)) fixed; + } + +body, +input, +select, +textarea { + color: #000; + font-family: Arial, Geneva, sans-serif; +} + +a:link, +a:hover, +a:active, +a:visited { + color: #19199e; +} +a:hover, +a:focus { + color: #00f; + text-decoration: none; +} + +p { + margin: 0 0 1.5em 0; +} + +/* + * END HTML ELEMENTS + */ + + + +/* + * BEGIN HACK + */ + +div.containerMain:after, +div.safeBox:after { + content:""; + display:block; + height:0; + clear:both; +} + +/* + * END HACK + */ + + + +/* + * BEGIN JSDOC + */ + +/* Start menu */ +div.index *.heading1 { + margin-bottom: 0.5em; + border-bottom: 1px solid #999999; + font-family: M1m, Arial, sans-serif; + font-size: 1.6em; + letter-spacing: 1px; + line-height: 1.3em; +} + +div.index div.menu { + background-color: #FFFFFF; +} +*+html div.index div.menu { + background-color: #FFFFFF; +} +* html div.index div.menu { + background-color: #FFFFFF; +} + +div.index div.menu div { + text-align: left; +} + +div.index div.menu a { + text-decoration: none; +} +div.index div.menu a:hover { + text-decoration: underline; +} + +div.index ul.classList a { + display: block; + padding: 4px 0 2px 20px; + text-indent: -20px; +} + +div.index div.fineprint { + color: #777; + font-size: 0.9em; +} +div.index div.fineprint a { + color: #777; +} +/* End menu */ + + + +/* Start content */ +div.content *.classTitle { + font-family: M1m, sans-serif; + font-size: 2.5em; + letter-spacing: 2px; + text-shadow: 1px 1px 1px #999999; +} + +div.content *.classTitle span { + font-weight: bold; +} + +div.content p.summary { + font-size: 1.25em; +} + +div.content ul *.classname a, +div.content ul *.filename a { + font-family: Consolas, "Courier New", Courier, monospace; + text-decoration: none; + font-weight: bold; +} +div.content ul *.classname a:hover, +div.content ul *.filename a:hover { + text-decoration: underline; +} + +div.content div.props { + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + background: #fff; + background: -moz-linear-gradient(top, rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0.2)); /* FF3.6 */ + background: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255, 255, 255, 0.7)),color-stop(1, rgba(255, 255, 255, 0.2))); + -moz-box-shadow: 0px 0px 10px #ccc; + -webkit-box-shadow: 0px 0px 5px #bbb; + box-shadow: 0px 0px 5px #bbb; +} + +div.content div.props div.sectionTitle { + font-family: M1m, sans-serif; + font-size: 1.6em; + letter-spacing: 1px; +} + + + +table.summaryTable caption { + font-family: M1m, sans-serif; + font-size: 1.6em; + letter-spacing: 1px; +} + +table.summaryTable td, +table.summaryTable th { + vertical-align: top; +} +table.summaryTable tr:last-child td { + padding-bottom: 0; +} + +table.summaryTable th { + font-weight: bold; +} + +table.summaryTable td.attributes { + font-family: Consolas, "Courier New", Courier, monospace; + color: #666; +} + +table.summaryTable td.nameDescription div.fixedFont { + font-weight: bold; +} + +table.summaryTable div.description { + color: #333; +} + + + +dl.detailList dt { + font-weight: bold; +} + + + +.fixedFont { + font-family: Consolas, "Courier New", Courier, monospace; +} + +.fixedFont.heading { + font-size: 1.25em; + line-height: 1.1em +} + +.fixedFont.heading + .description { + font-size: 1.2em; +} + +.fixedFont.heading .light, +.fixedFont.heading .lighter { + font-weight: bold; +} + +pre.code { + overflow: auto; + font-family: Consolas, "Courier New", Courier, monospace; + background: #eee; +} +/* Start content */ + + + +/* Start general styles */ +.light { + color: #666; +} + +.lighter { + color: #999; +} + +span.break { + font-size: 1px; + line-height: 1px; +} +/* End general styles */ + +/* + * END JSDOC + */ \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.eot b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..6c64f8d71d2dc6a375c4305c90921ec5359d72cd GIT binary patch literal 18590 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 literal 0 HcmV?d00001 diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.svg b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.svg new file mode 100644 index 0000000..5129512 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.svg @@ -0,0 +1,134 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Foundry URL : http://mplus-fonts.sourceforge.jp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.ttf b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0cf54cbbef86edd4a4ed0f9749baa373503e6854 GIT binary patch literal 18428 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%0AC(?{gh&L` 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.{ zVmBk|B^IAJF{~8BLODUdfvJbn3D3ctPSqn^qeZHSb#c@ot^xZ7t>3<-GrFLCU+;>h zmd3`GrWL*W+80DSd9xHc>th9T3vd2?f{9|x8>Jw8_FutgcQTk~T6qo5Xwqhq?HK}&IN=nM z!P8)UIOQIkB8x@&EH3<9pq*#{#MdH(ZKzLUEn??_C2i@p*~VU)y)T`s%hQh-i!$dN z!I!QgD^v&rcw=H0eX=Jk784hJx@4WXVjw84ne!AS5MO5nj*U{9SXBVcVV#kTc8j#V zn{>~TD|p-_aY`K%p@d~cnw!!?Is+S~Ws27sSbYsc`9lUc51o&FU~qhV`~#M$G5hs7#zAB9HY|+9E8Ps=oQ~t*h{-Ke zZq_^2>rWF2})o%N3w22_G0^k=f;Oh@8gGxrS*-XoNAm+ z-zeu}zW*%q)FMxUuREJi#A$3dzV4(pF6UkozBiH^m~!oF+)I1*0robgNXxjF(KGN{ zrXNTbaj%vC68}hol~yxjo?$aTbu3u(<88jVzhX6}w{hj8|5kwIT7~Hc_%e~h|44Kf ze|XQd~FSZJ7 zIc#ItwqknDxOp*z`^BrtdHq}Y8r*>@Re~59*;=H_v#bf^! z8xdi&?Zoypwr24TwVAeZTd-aR^Fgnt8Y914Jd5{n4E;jvssFc&J<0d;A4w0HHkl5Y z9y1k9|6op-=bH!2T^BmdfT0HZ+5@ve&5sN+2eV|^Kk0}@Yl7E)} zPX8JIMgOk@!N7^YTfzF^c<@J|nV~O-ejKh39}J%fzY$pynTUKRS`i(KJ|9cO4#vJ2 zyI9d(@#%^eD?X^)Q~6NkFRNPc->Ir|zvsVKt9}}n;uZ1P@kQ}n@rn4C#D8B!&uJbV zVJ%n%6NOcxe@{cg+6V0Ly|w=DTi6kK;>hg4lS{Da$26yCeK=j0aJ>jM%-ph6)NwxW@4a|89n}hY=^N__{z`B957hwdJU>thT zi{)$u#$**VVhu)W9Y$$A#%Uu)=vKCwZDD<^AKd>Z*Z{i?k?b~h2O9+4bDEnFGg!El z+qj)OxRblMn|rvI`?!qk-6Z=a`xYy*Z?He(3iq=Uwoi`iZEaoHYV4QLKG)hR&arPZ z&U3~-Z|r9o`*vgBVeC7N{cL03W$YK~`!=K8Hly5JkAA%!t3aRU*B(^)=h-UN-rJ{f sezITdp??!ZmGKXX1UKN|GyQS=10Dl?$dM+Ns;0~mu3Geiel?i+S6FInOaK4? literal 0 HcmV?d00001 diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.woff b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-bold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..f90475d890f59f3dc11bd651aac3859e148d3499 GIT binary patch literal 11772 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%0A{fAkNLr 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 + + + +This is a custom SVG webfont generated by Font Squirrel. +Foundry URL : http://mplus-fonts.sourceforge.jp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-regular-webfont.ttf b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/mplus-1m-regular-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..684abfd19f9d3fb00e02c8accb576edd2798383d GIT binary patch literal 19344 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 literal 0 HcmV?d00001 diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/stylesheet.css b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/stylesheet.css new file mode 100644 index 0000000..188d847 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/fonts/stylesheet.css @@ -0,0 +1,44 @@ +/* Generated by Font Squirrel (http://www.fontsquirrel.com) on September 11, 2010 04:44:41 PM America/New_York */ + + + +@font-face { + font-family: 'M1mthin'; + src: url('mplus-1m-thin-webfont.eot'); + src: local('☺'), url('mplus-1m-thin-webfont.woff') format('woff'), url('mplus-1m-thin-webfont.ttf') format('truetype'), url('mplus-1m-thin-webfont.svg#webfont8E89OCqX') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'M1mlight'; + src: url('mplus-1m-light-webfont.eot'); + src: local('☺'), url('mplus-1m-light-webfont.woff') format('woff'), url('mplus-1m-light-webfont.ttf') format('truetype'), url('mplus-1m-light-webfont.svg#webfontupkFZh1U') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'M1mregular'; + src: url('mplus-1m-regular-webfont.eot'); + src: local('☺'), url('mplus-1m-regular-webfont.woff') format('woff'), url('mplus-1m-regular-webfont.ttf') format('truetype'), url('mplus-1m-regular-webfont.svg#webfontVd14f4NN') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'M1mmedium'; + src: url('mplus-1m-medium-webfont.eot'); + src: local('☺'), url('mplus-1m-medium-webfont.woff') format('woff'), url('mplus-1m-medium-webfont.ttf') format('truetype'), url('mplus-1m-medium-webfont.svg#webfontdB2YMuVi') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'M1mbold'; + src: url('mplus-1m-bold-webfont.eot'); + src: local('☺'), url('mplus-1m-bold-webfont.woff') format('woff'), url('mplus-1m-bold-webfont.ttf') format('truetype'), url('mplus-1m-bold-webfont.svg#webfontIjI5mZqE') format('svg'); + font-weight: normal; + font-style: normal; +} + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/handheld.css b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/handheld.css new file mode 100644 index 0000000..529bebb --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/handheld.css @@ -0,0 +1,207 @@ +/* + * TABLE OF CONTENTS: + * - Browser reset + * - HTML elements + * - JsDoc styling + * - Media query check + */ + + + + + + +/* + * HTML ELEMENTS + */ + +body { + padding: 1% 4% 1% 4%; +} + +/* + * HTML ELEMENTS + */ + + + + + +/* + * BEGIN JSDOC + */ + +/* Start menu */ +div.index div.menu { + position: fixed; + top: 0; + right: 0; + -moz-border-radius-bottomleft: 15px; + -webkit-border-bottom-left-radius: 15px; + -border-bottom-left-radius: 15px; + padding: 4px 5px 8px 10px; + -moz-box-shadow: 0px 0px 10px #c4c4c4; + -webkit-box-shadow: 0px 0px 10px #c4c4c4; + box-shadow: 0px 0px 10px #c4c4c4; + background-color: rgba(255, 255, 255, 0.9); +} + +div.index div.indexLinks a { + float: right; + clear: both; + font-size: 1.1em; +} + +div.index *.heading1 { + display:none; +} + +div.index ul.classList { + display:none; +} + +div.index div.fineprint { + display:none; +} + +div.indexStatic { + display: none; +} +/* End menu */ + + + +/* Start content */ +div.content *.classTitle { + margin-right: 60px; + margin-bottom: 0.8em; + font-size: 2em +} + +div.content p.description.summary { + margin-bottom: 0.2em; +} + +div.content div.props { + margin: 1.5em -2% 0 -2%; + padding: 2%; +} + +table.summaryTable { + position: relative; + left: -10px; + width: 100%; + border-collapse: collapse; + box-sizing: content-box; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + -ms-box-sizing: content-box; + -o-box-sizing: content-box; + -icab-box-sizing: content-box; + -khtml-box-sizing: content-box; +} + +table.summaryTable caption { + padding: 0 10px 10px 10px; +} + +table.summaryTable td, +table.summaryTable th { + padding: 0px 10px 10px 10px; +} +table.summaryTable tr:last-child td { + padding-bottom: 0; +} + +table.summaryTable td.attributes { + width: 35%; +} + +table.summaryTable td.nameDescription { + width: 65% +} + + + +dl.detailList { + margin-top: 0.5em; +} + +dl.detailList.nomargin + dl.detailList.nomargin { + margin-top: 0; +} + +dl.detailList dt { + display: inline; + margin-right: 5px; +} + +dl.detailList dt:before { + display: block; + content: ""; +} + +dl.detailList dd { + display: inline; +} + +dl.detailList.params dt { + display: block; +} +dl.detailList.params dd { + display: block; + padding-left: 2em; + padding-bottom: 0.4em; +} + + + + +ul.fileList li { + margin-bottom: 1.5em; +} + + + +.fixedFont.heading { + margin-bottom: 0.5em; +} + +pre.code { + margin: 10px 0 10px 0; + padding: 10px; + border: 1px solid #ccc; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; +} +/* End content */ + +/* + * END JSDOC + */ + + + + + + + +/* + * START MEDIA QUERY CHECK + */ + +.cssLoadCheck { + position: absolute; + top: -99999px; + left: -99999px; + border: 0; + width: 100px; + padding: 0; + overflow: hidden; +} + +/* + * END MEDIA QUERY CHECK + */ + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/screen.css b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/screen.css new file mode 100644 index 0000000..786765a --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/css/screen.css @@ -0,0 +1,280 @@ +/* + * TABLE OF CONTENTS: + * - JsDoc styling + * - Media query check + */ + + + + + + +/* + * BEGIN JSDOC + */ + +/* Start menu */ +div.index { + position: fixed; + top: 0; + bottom: 0; + float: left; + width: 30%; + min-width: 100px; + max-width: 300px; + padding: 0 0 10px 0; + overflow: auto; +} + +div.index *.heading1 { + padding: 8px 0 0.4em 0; +} + +div.index div.menu { + margin: 0 15px 0 -15px; + -moz-border-radius-bottomright: 15px; + -webkit-border-bottom-right-radius: 15px; + -border-bottom-right-radius: 15px; + padding: 15px 15px 15px 30px; + -moz-box-shadow: 0px 0px 10px #c4c4c4; + -webkit-box-shadow: 0px 0px 10px #c4c4c4; + box-shadow: 0px 0px 10px #c4c4c4; + background-color: rgba(255, 255, 255, 0.5); +} + +div.index div.indexLinks { + margin-top: 13px; + position: absolute; + right: 30px; +} + +div.index div.indexLinks a { + color: #999999; + text-transform: lowercase; +} + +div.index div.indexLinks a:first-child { + margin-right: 3px; + border-right: 1px solid #999999; + padding-right: 5px; +} + +div.index ul.classList a { + line-height: 1.1em; + font-family: Consolas, "Courier New", Courier, monospace; +} + +div.index ul.classList a + a { + margin-left: 0.5em; +} + +div.index div.fineprint { + margin: 1em 0 0 15px; + color: #777; + font-size: 0.9em; +} + +div.index div.fineprint a { + color: #777; +} + +div.indexStatic { + position: static; + min-height: 1em; +} +/* End menu */ + + +/* Start content */ +div.content { + float: left; + width: 70%; + min-width: 300px; + max-width: 600px; +} +div.innerContent { + padding: 0 0 0 2.5em; +} + +div.content ul, +div.content ol { + margin-bottom: 3em; +} + +div.content *.classTitle { + position: relative; + left: -10px; + margin: -30px 0 0.5em 0; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; + border-radius: 15px; + padding: 25px 15px 15px 15px; + background-color: #FFFFFF; + background-color: rgba(255, 255, 255, 0.5); + -moz-box-shadow: 0px 0px 10px #c4c4c4; + -webkit-box-shadow: 0px 0px 10px #c4c4c4; + box-shadow: 0px 0px 10px #c4c4c4; +} + +div.content p.summary { + margin-bottom: 0.5em; +} + +div.content ul.summary { + margin-bottom: 1.5em; +} + +div.content ul *.classname a, +div.content ul *.filename a { + font-family: Consolas, "Courier New", Courier, monospace; + text-decoration: none; + font-weight: bold; +} +div.content ul *.classname a:hover, +div.content ul *.filename a:hover { + text-decoration: underline; +} + +div.content div.props { + position: relative; + left: -10px; + margin-bottom: 2.5em; + padding: 10px 15px 15px 15px; + overflow: hidden; +} + +div.content div.props div.sectionTitle { + padding-bottom: 10px; +} + +div.content div.hr { + margin: 0 10px 0 0; + height: 4em; +} + + + +table.summaryTable { + position: relative; + left: -10px; + width: 100%; + border-collapse: collapse; + box-sizing: content-box; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + -ms-box-sizing: content-box; + -o-box-sizing: content-box; + -icab-box-sizing: content-box; + -khtml-box-sizing: content-box; +} + +table.summaryTable caption { + padding: 0 10px 10px 10px; +} + +table.summaryTable td, +table.summaryTable th { + padding: 0px 10px 10px 10px; +} +table.summaryTable tr:last-child td { + padding-bottom: 0; +} + +table.summaryTable td.attributes { + width: 35%; +} + +table.summaryTable td.nameDescription { + width: 65% +} + + + +dl.detailList { + margin-top: 0.5em; +} + +dl.detailList.nomargin + dl.detailList.nomargin { + margin-top: 0; +} + +dl.detailList dt { + display: inline; + margin-right: 5px; +} + +dl.detailList dt:before { + display: block; + content: ""; +} + +dl.detailList dd { + display: inline; +} + +dl.detailList.params dt { + display: block; +} +dl.detailList.params dd { + display: block; + padding-left: 2em; + padding-bottom: 0.4em; +} + + + + +ul.fileList li { + margin-bottom: 1.5em; +} + + + +.fixedFont.heading { + margin-bottom: 0.5em; +} + +pre.code { + margin: 10px 0 10px 0; + padding: 10px; + border: 1px solid #ccc; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; +} +/* End content */ + +.clear { + clear: both; + width: 100%; + min-height: 0; +} + +/* + * END JSDOC + */ + + + + + + + +/* + * START MEDIA QUERY CHECK + */ + +.cssLoadCheck { + position: absolute; + top: -99999px; + left: -99999px; + border: 0; + width: 100px; + padding: 0; + overflow: hidden; +} + +/* + * END MEDIA QUERY CHECK + */ + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/index.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/index.tmpl new file mode 100644 index 0000000..d0caa2a --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/index.tmpl @@ -0,0 +1,54 @@ + + + + + JsDoc Reference - Index + + + + + + + + + + + + + + + {+include("static/header.html")+} + + +
+ +
+
+

Class Index

+ +
    + +
  • +

    {+(new Link().toSymbol(thisClass.alias))+}

    +

    {+resolveLinks(summarize(thisClass.classDesc))+}

    +
  • +
    +
+
+
+ + + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/javascript/wbos.csstools.mediaqueryfallback.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/javascript/wbos.csstools.mediaqueryfallback.js new file mode 100644 index 0000000..6caf5bf --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/javascript/wbos.csstools.mediaqueryfallback.js @@ -0,0 +1,185 @@ +/** + * @fileOverview Media Query FallBack + * @author Wouter Bos (www.thebrightlines.com) + * @since 1.0 - 2010-09-10 + * @version 1.0 - 2010-09-10 + */ + + + + + + +if (typeof(wbos) == "undefined") { + /** + * @namespace wbos = Wouter Bos (www.thebrightlines.com) + */ + wbos = {} +} +if (typeof(wbos.CssTools) == "undefined") { + /** + * @namespace Namespace for CSS-related functionality + */ + wbos.CssTools = {} +} + + + + +/** + * @namespace Fallback for CSS advanced media query + * @class + * @since 1.0 - 2010-09-10 + * @version 1.0 - 2010-09-10 + */ +wbos.CssTools.MediaQueryFallBack = ( function() { + var config = { + cssScreen: "/css/screen.css", + cssHandheld: "/css/handheld.css", + mobileMaxWidth: 660, + testDivClass: "cssLoadCheck", + dynamicCssLinkId: "DynCssLink", + resizeDelay: 30 + } + var noMediaQuery = false; + var delay; + var currentCssMediaType; + + // Adding events to elements in the DOM without overwriting it + function addEvent(element, newFunction, eventType) { + var oldEvent = eval("element." + eventType); + var eventContentType = eval("typeof element." + eventType) + + if ( eventContentType != 'function' ) { + eval("element." + eventType + " = newFunction") + } else { + eval("element." + eventType + " = function(e) { oldEvent(e); newFunction(e); }") + } + } + + // Get the the inner width of the browser window + function getWindowWidth() { + if (window.innerWidth) { + return window.innerWidth; + } else if (document.documentElement.clientWidth) { + return document.documentElement.clientWidth; + } else if (document.body.clientWidth) { + return document.body.clientWidth; + } else{ + return 0; + } + } + + function addCssLink(cssHref) { + var cssNode = document.createElement('link'); + var windowWidth; + cssNode.type = 'text/css'; + cssNode.rel = 'stylesheet'; + cssNode.media = 'screen, handheld, fallback'; + //cssNode.id = config.dynamicCssLinkId; + cssNode.href = cssHref; + document.getElementsByTagName("head")[0].appendChild(cssNode); + } + + + + /* Start public */ + return { + /** + * Adds link to CSS in the head if no CSS is loaded + * + * @since 1.0 - 2010-08-21 + * @version 1.0 - 2010-08-21 + * @param {String|Object} cssScreen URL to CSS file for larger screens + * @param {String|Object} cssHandheld URL to CSS file for smaller screens + * @param {Number} mobileMaxWidth Maximum width for handheld devices + * @example + * wbos.CssTools.MediaQueryFallBack.LoadCss(['screen.css', 'screen2.css'], 'mobile.css', 480) + */ + LoadCss: function(cssScreen, cssHandheld, mobileMaxWidth) { + // Set config values + if (typeof(cssScreen) != "undefined") { + config.cssScreen = cssScreen; + } + if (typeof(cssHandheld) != "undefined") { + config.cssHandheld = cssHandheld; + } + if (typeof(mobileMaxWidth) != "undefined") { + config.mobileMaxWidth = mobileMaxWidth; + } + + // Check if CSS is loaded + var cssloadCheckNode = document.createElement('div'); + cssloadCheckNode.className = config.testDivClass; + document.getElementsByTagName("body")[0].appendChild(cssloadCheckNode); + if (cssloadCheckNode.offsetWidth != 100 && noMediaQuery == false) { + noMediaQuery = true; + } + cssloadCheckNode.parentNode.removeChild(cssloadCheckNode) + + if (noMediaQuery == true) { + // Browser does not support Media Queries, so JavaScript will supply a fallback + var cssHref = ""; + + // Determines what CSS file to load + if (getWindowWidth() <= config.mobileMaxWidth) { + cssHref = config.cssHandheld; + newCssMediaType = "handheld"; + } else { + cssHref = config.cssScreen; + newCssMediaType = "screen"; + } + + // Add CSS link to of page + if (cssHref != "" && currentCssMediaType != newCssMediaType) { + var currentCssLinks = document.styleSheets + for (var i = 0; i < currentCssLinks.length; i++) { + for (var ii = 0; ii < currentCssLinks[i].media.length; ii++) { + if (typeof(currentCssLinks[i].media) == "object") { + if (currentCssLinks[i].media.item(ii) == "fallback") { + currentCssLinks[i].ownerNode.parentNode.removeChild(currentCssLinks[i].ownerNode) + i-- + break; + } + } else { + if (currentCssLinks[i].media.indexOf("fallback") >= 0) { + currentCssLinks[i].owningElement.parentNode.removeChild(currentCssLinks[i].owningElement) + i-- + break; + } + } + } + } + if (typeof(cssHref) == "object") { + for (var i = 0; i < cssHref.length; i++) { + addCssLink(cssHref[i]) + } + } else { + addCssLink(cssHref) + } + + currentCssMediaType = newCssMediaType; + } + + + // Check screen size again if user resizes window + addEvent(window, wbos.CssTools.MediaQueryFallBack.LoadCssDelayed, 'onresize') + } + }, + + /** + * Runs LoadCSS after a short delay + * + * @since 1.0 - 2010-08-21 + * @version 1.0 - 2010-08-21 + * @example + * wbos.CssTools.MediaQueryFallBack.LoadCssDelayed() + */ + LoadCssDelayed: function() { + clearTimeout(delay); + delay = setTimeout( "wbos.CssTools.MediaQueryFallBack.LoadCss()", config.resizeDelay) + } + + } + /* End public */ +})(); diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/publish.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/publish.js new file mode 100644 index 0000000..02bfbae --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/publish.js @@ -0,0 +1,228 @@ +/** Called automatically by JsDoc Toolkit. */ +function publish(symbolSet) { + publish.conf = { // trailing slash expected for dirs + ext: ".html", + outDir: JSDOC.opt.d || SYS.pwd+"../out/jsdoc/", + templatesDir: JSDOC.opt.t || SYS.pwd+"../templates/jsdoc/", + cssDir: "css/", + jsDir: "javascript/", + fontsDir: "css/fonts/", + symbolsDir: "symbols/", + srcDir: "symbols/src/" + }; + + // is source output is suppressed, just display the links to the source file + if (JSDOC.opt.s && defined(Link) && Link.prototype._makeSrcLink) { + Link.prototype._makeSrcLink = function(srcFilePath) { + return "<"+srcFilePath+">"; + } + } + + // create the folders and subfolders to hold the output + IO.mkPath((publish.conf.outDir+publish.conf.cssDir)); + IO.mkPath((publish.conf.outDir+publish.conf.fontsDir)); + IO.mkPath((publish.conf.outDir+publish.conf.jsDir)); + IO.mkPath((publish.conf.outDir+"symbols/src").split("/")); + + // used to allow Link to check the details of things being linked to + Link.symbolSet = symbolSet; + + // create the required templates + try { + //var styleTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+publish.conf.cssDir+"all.css"); + var classTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"class.tmpl"); + var classesTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allclasses.tmpl"); + } + catch(e) { + print("Couldn't create the required templates: "+e); + quit(); + } + + // some utility filters + function hasNoParent($) {return ($.memberOf == "")} + function isaFile($) {return ($.is("FILE"))} + function isaClass($) {return ($.is("CONSTRUCTOR") || $.isNamespace)} + + // get an array version of the symbolset, useful for filtering + var symbols = symbolSet.toArray(); + + // create the hilited source code files + var files = JSDOC.opt.srcFiles; + for (var i = 0, l = files.length; i < l; i++) { + var file = files[i]; + var srcDir = publish.conf.outDir + "symbols/src/"; + makeSrcFile(file, srcDir); + } + + // get a list of all the classes in the symbolset + var classes = symbols.filter(isaClass).sort(makeSortby("alias")); + + // create a filemap in which outfiles must be to be named uniquely, ignoring case + if (JSDOC.opt.u) { + var filemapCounts = {}; + Link.filemap = {}; + for (var i = 0, l = classes.length; i < l; i++) { + var lcAlias = classes[i].alias.toLowerCase(); + + if (!filemapCounts[lcAlias]) filemapCounts[lcAlias] = 1; + else filemapCounts[lcAlias]++; + + Link.filemap[classes[i].alias] = + (filemapCounts[lcAlias] > 1)? + lcAlias+"_"+filemapCounts[lcAlias] : lcAlias; + } + } + + // create a class index, displayed in the left-hand column of every class page + Link.base = "../"; + publish.classesIndex = classesTemplate.process(classes); // kept in memory + + // create each of the class pages + for (var i = 0, l = classes.length; i < l; i++) { + var symbol = classes[i]; + + symbol.events = symbol.getEvents(); // 1 order matters + symbol.methods = symbol.getMethods(); // 2 + + var output = ""; + output = classTemplate.process(symbol); + + IO.saveFile(publish.conf.outDir+"symbols/", ((JSDOC.opt.u)? Link.filemap[symbol.alias] : symbol.alias) + publish.conf.ext, output); + } + + // regenerate the index with different relative links, used in the index pages + Link.base = ""; + publish.classesIndex = classesTemplate.process(classes); + + // create the class index page + try { + var classesindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"index.tmpl"); + } + catch(e) { print(e.message); quit(); } + + var classesIndex = classesindexTemplate.process(classes); + IO.saveFile(publish.conf.outDir, "index"+publish.conf.ext, classesIndex); + classesindexTemplate = classesIndex = classes = null; + + // create the file index page + try { + var fileindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allfiles.tmpl"); + } + catch(e) { print(e.message); quit(); } + + var documentedFiles = symbols.filter(isaFile); // files that have file-level docs + var allFiles = []; // not all files have file-level docs, but we need to list every one + + for (var i = 0; i < files.length; i++) { + allFiles.push(new JSDOC.Symbol(files[i], [], "FILE", new JSDOC.DocComment("/** */"))); + } + + for (var i = 0; i < documentedFiles.length; i++) { + var offset = files.indexOf(documentedFiles[i].alias); + allFiles[offset] = documentedFiles[i]; + } + + allFiles = allFiles.sort(makeSortby("name")); + + // output the file index page + var filesIndex = fileindexTemplate.process(allFiles); + IO.saveFile(publish.conf.outDir, "files"+publish.conf.ext, filesIndex); + fileindexTemplate = filesIndex = files = null; + + // copy files + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.cssDir+"all.css", publish.conf.outDir+"/"+publish.conf.cssDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.cssDir+"screen.css", publish.conf.outDir+"/"+publish.conf.cssDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.cssDir+"handheld.css", publish.conf.outDir+"/"+publish.conf.cssDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.jsDir+"wbos.csstools.mediaqueryfallback.js", publish.conf.outDir+"/"+publish.conf.jsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.fontsDir+"mplus-1m-regular-webfont.eot", publish.conf.outDir+"/"+publish.conf.fontsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.fontsDir+"mplus-1m-regular-webfont.svg", publish.conf.outDir+"/"+publish.conf.fontsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.fontsDir+"mplus-1m-regular-webfont.ttf", publish.conf.outDir+"/"+publish.conf.fontsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.fontsDir+"mplus-1m-regular-webfont.woff", publish.conf.outDir+"/"+publish.conf.fontsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.fontsDir+"mplus-1m-bold-webfont.eot", publish.conf.outDir+"/"+publish.conf.fontsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.fontsDir+"mplus-1m-bold-webfont.svg", publish.conf.outDir+"/"+publish.conf.fontsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.fontsDir+"mplus-1m-bold-webfont.ttf", publish.conf.outDir+"/"+publish.conf.fontsDir); + IO.copyFile(publish.conf.templatesDir+"/"+publish.conf.fontsDir+"mplus-1m-bold-webfont.woff", publish.conf.outDir+"/"+publish.conf.fontsDir); +} + + +/** Just the first sentence (up to a full stop). Should not break on dotted variable names. */ +function summarize(desc) { + if (typeof desc != "undefined") + return desc.match(/([\w\W]+?\.)[^a-z0-9_$]/i)? RegExp.$1 : desc; +} + +/** Make a symbol sorter by some attribute. */ +function makeSortby(attribute) { + return function(a, b) { + if (a[attribute] != undefined && b[attribute] != undefined) { + a = a[attribute].toLowerCase(); + b = b[attribute].toLowerCase(); + if (a < b) return -1; + if (a > b) return 1; + return 0; + } + } +} + +function wordwrapNamespace(classLink) { + var classText = classLink.match(/[^<>]+(?=[<])/) + ""; + var classTextNew = classText.replace(/\./g, " . ") + ""; + classLink = classLink.replace(/[^<>]+(?=[<])/, classTextNew); + return classLink; +} + +/** Pull in the contents of an external file at the given path. */ +function include(path) { + var path = publish.conf.templatesDir+path; + return IO.readFile(path); +} + +/** Turn a raw source file into a code-hilited page in the docs. */ +function makeSrcFile(path, srcDir, name) { + if (JSDOC.opt.s) return; + + if (!name) { + name = path.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_"); + name = name.replace(/\:/g, "_"); + } + + var src = {path: path, name:name, charset: IO.encoding, hilited: ""}; + + if (defined(JSDOC.PluginManager)) { + JSDOC.PluginManager.run("onPublishSrc", src); + } + + if (src.hilited) { + IO.saveFile(srcDir, name+publish.conf.ext, src.hilited); + } +} + +/** Build output for displaying function parameters. */ +function makeSignature(params) { + if (!params) return "()"; + var signature = "(" + + + params.filter( + function($) { + return $.name.indexOf(".") == -1; // don't show config params in signature + } + ).map( + function($) { + return $.name; + } + ).join(", ") + + + ")"; + return signature; +} + +/** Find symbol {@link ...} strings in text and turn into html links */ +function resolveLinks(str, from) { + str = str.replace(/\{@link ([^} ]+) ?\}/gi, + function(match, symbolName) { + return new Link().toSymbol(symbolName); + } + ); + + return str; +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/static/header.html b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/static/header.html new file mode 100644 index 0000000..353b735 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/static/header.html @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/static/index.html b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/static/index.html new file mode 100644 index 0000000..661f6f6 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/static/index.html @@ -0,0 +1,19 @@ + + + + + Generated Javascript Documentation + + + + + + <body> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + </body> + + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/symbol.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/symbol.tmpl new file mode 100644 index 0000000..f8f4bd1 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/codeview/symbol.tmpl @@ -0,0 +1,35 @@ + + {+data.name+} + {+data.memberOf+} + {+data.isStatic+} + {+data.isa+} + {+data.desc+} + {+data.classDesc+} + + + + {+method.name+} + {+method.memberOf+} + {+method.isStatic+} + {+method.desc+} + + + {+param.type+} + {+param.name+} + {+param.desc+} + {+param.defaultValue+} + + + + + + + + {+property.name+} + {+property.memberOf+} + {+property.isStatic+} + {+property.desc+} + {+property.type+} + + + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl new file mode 100644 index 0000000..ace06f3 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl @@ -0,0 +1,17 @@ +
{+new Link().toFile("index.html").withText("Class Index")+} +| {+new Link().toFile("files.html").withText("File Index")+}
+
+

Classes

+
    + +
  • {! + if (thisClass.alias == "_global_") { + output += ""+new Link().toClass(thisClass.alias)+""; + } + else { + output += new Link().toClass(thisClass.alias); + } + !}
  • +
    +
+
\ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl new file mode 100644 index 0000000..4c7de1c --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl @@ -0,0 +1,56 @@ + + + + + {! Link.base = ""; /* all generated links will be relative to this */ !} + JsDoc Reference - File Index + + + + + + + {+include("static/header.html")+} + +
+ {+publish.classesIndex+} +
+ +
+

File Index

+ + +
+

{+new Link().toSrc(item.alias).withText(item.name)+}

+ {+resolveLinks(item.desc)+} +
+ +
Author:
+
{+item.author+}
+
+ +
Version:
+
{+item.version+}
+
+ {! var locations = item.comment.getTag('location').map(function($){return $.toString().replace(/(^\$ ?| ?\$$)/g, '').replace(/^HeadURL: https:/g, 'http:');}) !} + +
Location:
+ +
{+location+}
+
+
+
+
+
+
+ +
+
+ ©{+JSDOC.opt.D.copyright+}
+ Documentation generated by JsDoc Toolkit {+JSDOC.VERSION+} on {+new Date()+} +
+ + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/class.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/class.tmpl new file mode 100644 index 0000000..b42eaa1 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/class.tmpl @@ -0,0 +1,649 @@ + + + + + + {! Link.base = "../"; /* all generated links will be relative to this */ !} + JsDoc Reference - {+data.alias+} + + + + + + + + {+include("static/header.html")+} + + + +
+ + {+publish.classesIndex+} + +
+ +
+ +

+ {! + var classType = ""; + + if (data.isBuiltin()) { + classType += "Built-In "; + } + + if (data.isNamespace) { + if (data.is('FUNCTION')) { + classType += "Function "; + } + classType += "Namespace "; + } + else { + classType += "Class "; + } + !} + {+classType+}{+data.alias+} +

+ + +

+
Version + {+ data.version +}.
+
+
Extends + {+ + data.augments + .sort() + .map( + function($) { return new Link().toSymbol($); } + ) + .join(", ") + +}.
+
+ + {+resolveLinks(data.classDesc)+} + + {# isn't defined in any file #} +
Defined in: {+new Link().toSrc(data.srcFile)+}. +
+

+ + + + + + + + + + + + + + + + + +
{+classType+}Summary
Constructor AttributesConstructor Name and Description
{! + if (data.isPrivate) output += "<private> "; + if (data.isInner) output += "<inner> "; + !}  +
+ {+ new Link().toSymbol(data.alias).inner('constructor')+}{+ makeSignature(data.params) +} +
+
{+resolveLinks(summarize(data.desc))+}
+
+
+ + + + {! var ownProperties = data.properties.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} + + + + + + + + + + + + + + + + + +
Field Summary
Field AttributesField Name and Description
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + if (member.isConstant) output += "<constant> "; + !}  +
+ {+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name)+} +
+
{+resolveLinks(summarize(member.desc))+}
+
+
+ + +
+ {! + var borrowedMembers = data.properties.filter(function($) {return $.memberOf != data.alias}); + + var contributers = []; + borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); + for (var i = 0, l = contributers.length; i < l; i++) { + output += + "
Fields borrowed from class "+new Link().toSymbol(contributers[i])+":
" + + + "
" + + borrowedMembers + .filter( + function($) { return $.memberOf == contributers[i] } + ) + .sort(makeSortby("name")) + .map( + function($) { return new Link().toSymbol($.alias).withText($.name) } + ) + .join(", ") + + + "
"; + } + !} +
+
+
+ + + + {! var ownMethods = data.methods.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} + + + + + + + + + + + + + + + + + +
Method Summary
Method AttributesMethod Name and Description
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !}  +
{+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name.replace(/\^\d+$/, ''))+}{+makeSignature(member.params)+} +
+
{+resolveLinks(summarize(member.desc))+}
+
+
+ + +
+ {! + var borrowedMembers = data.methods.filter(function($) {return $.memberOf != data.alias}); + var contributers = []; + borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); + for (var i = 0, l = contributers.length; i < l; i++) { + output += + "
Methods borrowed from class "+new Link().toSymbol(contributers[i])+":
" + + + "
" + + borrowedMembers + .filter( + function($) { return $.memberOf == contributers[i] } + ) + .sort(makeSortby("name")) + .map( + function($) { return new Link().toSymbol($.alias).withText($.name) } + ) + .join(", ") + + + "
"; + } + + !} +
+
+
+ + + {! var ownEvents = data.events.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !} + + + + + + + + + + + + + + + + + +
Utility Method Summary
Utility Method AttributesUtility Method Name and Description
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !}  +
{+member.memberOf+}.{+new Link().toSymbol(member.alias).withText(member.name)+}{+makeSignature(member.params)+} +
+
{+resolveLinks(summarize(member.desc))+}
+
+
+ + +
+ {! + var borrowedMembers = data.events.filter(function($) {return $.memberOf != data.alias}); + var contributers = []; + borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)}); + for (var i = 0, l = contributers.length; i < l; i++) { + output += + "
Events borrowed from class "+new Link().toSymbol(contributers[i])+":
" + + + "
" + + borrowedMembers + .filter( + function($) { return $.memberOf == contributers[i] } + ) + .sort(makeSortby("name")) + .map( + function($) { return new Link().toSymbol($.alias).withText($.name) } + ) + .join(", ") + + + "
"; + } + + !} +
+
+
+ + + +
+
+ {+classType+}Detail +
+ +
{! + if (data.isPrivate) output += "<private> "; + if (data.isInner) output += "<inner> "; + !} + {+ data.alias +}{+ makeSignature(data.params) +} +
+ +
+ {+resolveLinks(data.desc)+} +
Author: {+data.author+}.
+
+ + + +
{+example+}
+
+
+ + + +
+
Parameters:
+ +
+ {+((item.type)?""+("{"+(new Link().toSymbol(item.type)+"} ")) : "")+} {+item.name+} + Optional, Default: {+item.defaultValue+} +
+
{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Deprecated:
+
+ {+resolveLinks(data.deprecated)+} +
+
+
+ +
+
Since:
+
{+ data.since +}
+
+
+ +
+
Throws:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} +
+
{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Returns:
+ +
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Requires:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+ +
+
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+ +
+
+ + + +
+ Field Detail +
+ + +
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + if (member.isConstant) output += "<constant> "; + !} + + {{+new Link().toSymbol(member.type)+}} + {+member.memberOf+}.{+member.name+} + +
+
+ {+resolveLinks(member.desc)+} + +
+ Defined in: {+new Link().toSrc(member.srcFile)+}. +
+
Author: {+member.author+}.
+
+ + + +
{+example+}
+
+
+ + +
+
Deprecated:
+
+ {+ resolveLinks(member.deprecated) +} +
+
+
+ +
+
Since:
+
{+ member.since +}
+
+
+ +
+
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+ +
+
Default Value:
+
+ {+resolveLinks(member.defaultValue)+} +
+
+
+ +
+
+
+ + + +
+ Method Detail +
+ + +
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !} + + {{+new Link().toSymbol(member.type)+}} + {+member.memberOf+}.{+member.name.replace(/\^\d+$/, '')+}{+makeSignature(member.params)+} + +
+
+ {+resolveLinks(member.desc)+} + +
+ Defined in: {+new Link().toSrc(member.srcFile)+}. +
+
Author: {+member.author+}.
+
+ + + +
{+example+}
+
+
+ + +
+
Parameters:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+item.name+} + Optional, Default: {+item.defaultValue+} +
+
{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Deprecated:
+
+ {+ resolveLinks(member.deprecated) +} +
+
+
+ +
+
Since:
+
{+ member.since +}
+
+ +
+ +
+
Throws:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} +
+
{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Returns:
+ +
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Requires:
+ +
{+ resolveLinks(item) +}
+
+
+
+ +
+
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+ +
+
+
+ + + +
+ Utility Method Detail +
+ + +
{! + if (member.isPrivate) output += "<private> "; + if (member.isInner) output += "<inner> "; + if (member.isStatic) output += "<static> "; + !} + + {{+new Link().toSymbol(member.type)+}} + {+member.memberOf+}.{+member.name+}{+makeSignature(member.params)+} + +
+
+ {+resolveLinks(member.desc)+} + +
+ Defined in: {+new Link().toSrc(member.srcFile)+}. +
+
Author: {+member.author+}.
+
+ + + +
{+example+}
+
+
+ + +
+
Parameters:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+item.name+} + Optional, Default: {+item.defaultValue+} +
+
{+ resolveLinks(item.desc) +}
+
+
+
+ +
+
Deprecated:
+
+ {+ resolveLinks(member.deprecated) +} +
+
+
+ +
+
Since:
+
{+ member.since +}
+
+ +
+ +
+
Throws:
+ +
+ {+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+} {+item.name+} +
+
{+ resolveLinks(item.desc) +}
+
+
+
+ +
+
Returns:
+ +
{+((item.type)?"{"+(new Link().toSymbol(item.type))+"} " : "")+}{+resolveLinks(item.desc)+}
+
+
+
+ +
+
Requires:
+ +
{+ resolveLinks(item) +}
+
+
+
+ +
+
See:
+ +
{+ new Link().toSymbol(item) +}
+
+
+
+ +
+
+
+ +
+
+ + + +
+ ©{+JSDOC.opt.D.copyright+}
+ Documentation generated by JsDoc Toolkit {+JSDOC.VERSION+} on {+new Date()+} +
+ + diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/index.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/index.tmpl new file mode 100644 index 0000000..f25370e --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/index.tmpl @@ -0,0 +1,39 @@ + + + + + + JsDoc Reference - Index + + + + + + + {+include("static/header.html")+} + +
+ {+publish.classesIndex+} +
+ +
+

Class Index

+ + +
+

{+(new Link().toSymbol(thisClass.alias))+}

+ {+resolveLinks(summarize(thisClass.classDesc))+} +
+
+
+ +
+
+ ©{+JSDOC.opt.D.copyright+}
+ Documentation generated by JsDoc Toolkit {+JSDOC.VERSION+} on {+new Date()+} +
+ + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/publish.js b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/publish.js new file mode 100644 index 0000000..42300f4 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/publish.js @@ -0,0 +1,201 @@ +/** Called automatically by JsDoc Toolkit. */ +function publish(symbolSet) { + publish.conf = { // trailing slash expected for dirs + ext: ".html", + outDir: JSDOC.opt.d || SYS.pwd+"../out/jsdoc/", + templatesDir: JSDOC.opt.t || SYS.pwd+"../templates/jsdoc/", + symbolsDir: "symbols/", + srcDir: "symbols/src/" + }; + + // is source output is suppressed, just display the links to the source file + if (JSDOC.opt.s && defined(Link) && Link.prototype._makeSrcLink) { + Link.prototype._makeSrcLink = function(srcFilePath) { + return "<"+srcFilePath+">"; + } + } + + // create the folders and subfolders to hold the output + IO.mkPath((publish.conf.outDir+"symbols/src").split("/")); + + // used to allow Link to check the details of things being linked to + Link.symbolSet = symbolSet; + + // create the required templates + try { + var classTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"class.tmpl"); + var classesTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allclasses.tmpl"); + } + catch(e) { + print("Couldn't create the required templates: "+e); + quit(); + } + + // some ustility filters + function hasNoParent($) {return ($.memberOf == "")} + function isaFile($) {return ($.is("FILE"))} + function isaClass($) {return ($.is("CONSTRUCTOR") || $.isNamespace)} + + // get an array version of the symbolset, useful for filtering + var symbols = symbolSet.toArray(); + + // create the hilited source code files + var files = JSDOC.opt.srcFiles; + for (var i = 0, l = files.length; i < l; i++) { + var file = files[i]; + var srcDir = publish.conf.outDir + "symbols/src/"; + makeSrcFile(file, srcDir); + } + + // get a list of all the classes in the symbolset + var classes = symbols.filter(isaClass).sort(makeSortby("alias")); + + // create a filemap in which outfiles must be to be named uniquely, ignoring case + if (JSDOC.opt.u) { + var filemapCounts = {}; + Link.filemap = {}; + for (var i = 0, l = classes.length; i < l; i++) { + var lcAlias = classes[i].alias.toLowerCase(); + + if (!filemapCounts[lcAlias]) filemapCounts[lcAlias] = 1; + else filemapCounts[lcAlias]++; + + Link.filemap[classes[i].alias] = + (filemapCounts[lcAlias] > 1)? + lcAlias+"_"+filemapCounts[lcAlias] : lcAlias; + } + } + + // create a class index, displayed in the left-hand column of every class page + Link.base = "../"; + publish.classesIndex = classesTemplate.process(classes); // kept in memory + + // create each of the class pages + for (var i = 0, l = classes.length; i < l; i++) { + var symbol = classes[i]; + + symbol.events = symbol.getEvents(); // 1 order matters + symbol.methods = symbol.getMethods(); // 2 + + Link.currentSymbol= symbol; + var output = ""; + output = classTemplate.process(symbol); + + IO.saveFile(publish.conf.outDir+"symbols/", ((JSDOC.opt.u)? Link.filemap[symbol.alias] : symbol.alias) + publish.conf.ext, output); + } + + // regenerate the index with different relative links, used in the index pages + Link.base = ""; + publish.classesIndex = classesTemplate.process(classes); + + // create the class index page + try { + var classesindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"index.tmpl"); + } + catch(e) { print(e.message); quit(); } + + var classesIndex = classesindexTemplate.process(classes); + IO.saveFile(publish.conf.outDir, "index"+publish.conf.ext, classesIndex); + classesindexTemplate = classesIndex = classes = null; + + // create the file index page + try { + var fileindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allfiles.tmpl"); + } + catch(e) { print(e.message); quit(); } + + var documentedFiles = symbols.filter(isaFile); // files that have file-level docs + var allFiles = []; // not all files have file-level docs, but we need to list every one + + for (var i = 0; i < files.length; i++) { + allFiles.push(new JSDOC.Symbol(files[i], [], "FILE", new JSDOC.DocComment("/** */"))); + } + + for (var i = 0; i < documentedFiles.length; i++) { + var offset = files.indexOf(documentedFiles[i].alias); + allFiles[offset] = documentedFiles[i]; + } + + allFiles = allFiles.sort(makeSortby("name")); + + // output the file index page + var filesIndex = fileindexTemplate.process(allFiles); + IO.saveFile(publish.conf.outDir, "files"+publish.conf.ext, filesIndex); + fileindexTemplate = filesIndex = files = null; +} + + +/** Just the first sentence (up to a full stop). Should not break on dotted variable names. */ +function summarize(desc) { + if (typeof desc != "undefined") + return desc.match(/([\w\W]+?\.)[^a-z0-9_$]/i)? RegExp.$1 : desc; +} + +/** Make a symbol sorter by some attribute. */ +function makeSortby(attribute) { + return function(a, b) { + if (a[attribute] != undefined && b[attribute] != undefined) { + a = a[attribute].toLowerCase(); + b = b[attribute].toLowerCase(); + if (a < b) return -1; + if (a > b) return 1; + return 0; + } + } +} + +/** Pull in the contents of an external file at the given path. */ +function include(path) { + var path = publish.conf.templatesDir+path; + return IO.readFile(path); +} + +/** Turn a raw source file into a code-hilited page in the docs. */ +function makeSrcFile(path, srcDir, name) { + if (JSDOC.opt.s) return; + + if (!name) { + name = path.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_"); + name = name.replace(/\:/g, "_"); + } + + var src = {path: path, name:name, charset: IO.encoding, hilited: ""}; + + if (defined(JSDOC.PluginManager)) { + JSDOC.PluginManager.run("onPublishSrc", src); + } + + if (src.hilited) { + IO.saveFile(srcDir, name+publish.conf.ext, src.hilited); + } +} + +/** Build output for displaying function parameters. */ +function makeSignature(params) { + if (!params) return "()"; + var signature = "(" + + + params.filter( + function($) { + return $.name.indexOf(".") == -1; // don't show config params in signature + } + ).map( + function($) { + return $.name; + } + ).join(", ") + + + ")"; + return signature; +} + +/** Find symbol {@link ...} strings in text and turn into html links */ +function resolveLinks(str, from) { + str = str.replace(/\{@link ([^} ]+) ?\}/gi, + function(match, symbolName) { + return new Link().toSymbol(symbolName); + } + ); + + return str; +} diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/default.css b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/default.css new file mode 100644 index 0000000..97e021e --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/default.css @@ -0,0 +1,162 @@ +/* default.css */ +body +{ + font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif; + width: 800px; +} + +.header +{ + clear: both; + background-color: #ccc; + padding: 8px; +} + +h1 +{ + font-size: 150%; + font-weight: bold; + padding: 0; + margin: 1em 0 0 .3em; +} + +hr +{ + border: none 0; + border-top: 1px solid #7F8FB1; + height: 1px; +} + +pre.code +{ + display: block; + padding: 8px; + border: 1px dashed #ccc; +} + +#index +{ + margin-top: 24px; + float: left; + width: 160px; + position: absolute; + left: 8px; + background-color: #F3F3F3; + padding: 8px; +} + +#content +{ + margin-left: 190px; + width: 600px; +} + +.classList +{ + list-style-type: none; + padding: 0; + margin: 0 0 0 8px; + font-family: arial, sans-serif; + font-size: 1em; + overflow: auto; +} + +.classList li +{ + padding: 0; + margin: 0 0 8px 0; +} + +.summaryTable { width: 100%; } + +h1.classTitle +{ + font-size:170%; + line-height:130%; +} + +h2 { font-size: 110%; } +caption, div.sectionTitle +{ + background-color: #7F8FB1; + color: #fff; + font-size:130%; + text-align: left; + padding: 2px 6px 2px 6px; + border: 1px #7F8FB1 solid; +} + +div.sectionTitle { margin-bottom: 8px; } +.summaryTable thead { display: none; } + +.summaryTable td +{ + vertical-align: top; + padding: 4px; + border-bottom: 1px #7F8FB1 solid; + border-right: 1px #7F8FB1 solid; +} + +/*col#summaryAttributes {}*/ +.summaryTable td.attributes +{ + border-left: 1px #7F8FB1 solid; + width: 140px; + text-align: right; +} + +td.attributes, .fixedFont +{ + line-height: 15px; + color: #002EBE; + font-family: "Courier New",Courier,monospace; + font-size: 13px; +} + +.summaryTable td.nameDescription +{ + text-align: left; + font-size: 13px; + line-height: 15px; +} + +.summaryTable td.nameDescription, .description +{ + line-height: 15px; + padding: 4px; + padding-left: 4px; +} + +.summaryTable { margin-bottom: 8px; } + +ul.inheritsList +{ + list-style: square; + margin-left: 20px; + padding-left: 0; +} + +.detailList { + margin-left: 20px; + line-height: 15px; +} +.detailList dt { margin-left: 20px; } + +.detailList .heading +{ + font-weight: bold; + padding-bottom: 6px; + margin-left: 0; +} + +.light, td.attributes, .light a:link, .light a:visited +{ + color: #777; + font-style: italic; +} + +.fineprint +{ + text-align: right; + font-size: 10px; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/header.html b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/header.html new file mode 100644 index 0000000..353b735 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/header.html @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/index.html b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/index.html new file mode 100644 index 0000000..661f6f6 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/static/index.html @@ -0,0 +1,19 @@ + + + + + Generated Javascript Documentation + + + + + + <body> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + </body> + + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/symbol.tmpl b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/symbol.tmpl new file mode 100644 index 0000000..f8f4bd1 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/jsdoc-toolkit/templates/jsdoc/symbol.tmpl @@ -0,0 +1,35 @@ + + {+data.name+} + {+data.memberOf+} + {+data.isStatic+} + {+data.isa+} + {+data.desc+} + {+data.classDesc+} + + + + {+method.name+} + {+method.memberOf+} + {+method.isStatic+} + {+method.desc+} + + + {+param.type+} + {+param.name+} + {+param.desc+} + {+param.defaultValue+} + + + + + + + + {+property.name+} + {+property.memberOf+} + {+property.isStatic+} + {+property.desc+} + {+property.type+} + + + diff --git a/html/RentForCamp/node_modules/JSV/lib/environments.js b/html/RentForCamp/node_modules/JSV/lib/environments.js new file mode 100644 index 0000000..762f5e8 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/lib/environments.js @@ -0,0 +1,3 @@ +require("./json-schema-draft-01"); +require("./json-schema-draft-02"); +require("./json-schema-draft-03"); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/lib/json-schema-draft-01.js b/html/RentForCamp/node_modules/JSV/lib/json-schema-draft-01.js new file mode 100644 index 0000000..7f9f0c4 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/lib/json-schema-draft-01.js @@ -0,0 +1,953 @@ +/** + * json-schema-draft-01 Environment + * + * @fileOverview Implementation of the first revision of the JSON Schema specification draft. + * @author Gary Court + * @version 1.7.1 + * @see http://github.com/garycourt/JSV + */ + +/* + * Copyright 2010 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 or the JSON Schema specification. + */ + +/*jslint white: true, sub: true, onevar: true, undef: true, eqeqeq: true, newcap: true, immed: true, indent: 4 */ +/*global require */ + +(function () { + var O = {}, + JSV = require('./jsv').JSV, + ENVIRONMENT, + TYPE_VALIDATORS, + SCHEMA, + HYPERSCHEMA, + LINKS; + + TYPE_VALIDATORS = { + "string" : function (instance, report) { + return instance.getType() === "string"; + }, + + "number" : function (instance, report) { + return instance.getType() === "number"; + }, + + "integer" : function (instance, report) { + return instance.getType() === "number" && instance.getValue() % 1 === 0; + }, + + "boolean" : function (instance, report) { + return instance.getType() === "boolean"; + }, + + "object" : function (instance, report) { + return instance.getType() === "object"; + }, + + "array" : function (instance, report) { + return instance.getType() === "array"; + }, + + "null" : function (instance, report) { + return instance.getType() === "null"; + }, + + "any" : function (instance, report) { + return true; + } + }; + + ENVIRONMENT = new JSV.Environment(); + ENVIRONMENT.setOption("defaultFragmentDelimiter", "."); + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/schema#"); //updated later + + SCHEMA = ENVIRONMENT.createSchema({ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/schema#", + "type" : "object", + + "properties" : { + "type" : { + "type" : ["string", "array"], + "items" : { + "type" : ["string", {"$ref" : "#"}] + }, + "optional" : true, + "uniqueItems" : true, + "default" : "any", + + "parser" : function (instance, self) { + var parser; + + if (instance.getType() === "string") { + return instance.getValue(); + } else if (instance.getType() === "object") { + return instance.getEnvironment().createSchema( + instance, + self.getEnvironment().findSchema(self.resolveURI("#")) + ); + } else if (instance.getType() === "array") { + parser = self.getValueOfProperty("parser"); + return JSV.mapArray(instance.getProperties(), function (prop) { + return parser(prop, self); + }); + } + //else + return "any"; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var requiredTypes = JSV.toArray(schema.getAttribute("type")), + x, xl, type, subreport, typeValidators; + + //for instances that are required to be a certain type + if (instance.getType() !== "undefined" && requiredTypes && requiredTypes.length) { + typeValidators = self.getValueOfProperty("typeValidators") || {}; + + //ensure that type matches for at least one of the required types + for (x = 0, xl = requiredTypes.length; x < xl; ++x) { + type = requiredTypes[x]; + if (JSV.isJSONSchema(type)) { + subreport = JSV.createObject(report); + subreport.errors = []; + subreport.validated = JSV.clone(report.validated); + if (type.validate(instance, subreport, parent, parentSchema, name).errors.length === 0) { + return true; //instance matches this schema + } + } else { + if (typeValidators[type] !== O[type] && typeof typeValidators[type] === "function") { + if (typeValidators[type](instance, report)) { + return true; //type is valid + } + } else { + return true; //unknown types are assumed valid + } + } + } + + //if we get to this point, type is invalid + report.addError(instance, schema, "type", "Instance is not a required type", requiredTypes); + return false; + } + //else, anything is allowed if no type is specified + return true; + }, + + "typeValidators" : TYPE_VALIDATORS + }, + + "properties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "#"}, + "optional" : true, + "default" : {}, + + "parser" : function (instance, self, arg) { + var env = instance.getEnvironment(), + selfEnv = self.getEnvironment(); + if (instance.getType() === "object") { + if (arg) { + return env.createSchema(instance.getProperty(arg), selfEnv.findSchema(self.resolveURI("#"))); + } else { + return JSV.mapObject(instance.getProperties(), function (instance) { + return env.createSchema(instance, selfEnv.findSchema(self.resolveURI("#"))); + }); + } + } + //else + return {}; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var propertySchemas, key; + //this attribute is for object type instances only + if (instance.getType() === "object") { + //for each property defined in the schema + propertySchemas = schema.getAttribute("properties"); + for (key in propertySchemas) { + if (propertySchemas[key] !== O[key] && propertySchemas[key]) { + //ensure that instance property is valid + propertySchemas[key].validate(instance.getProperty(key), report, instance, schema, key); + } + } + } + } + }, + + "items" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "optional" : true, + "default" : {}, + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } else if (instance.getType() === "array") { + return JSV.mapArray(instance.getProperties(), function (instance) { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + }); + } + //else + return instance.getEnvironment().createEmptySchema(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var properties, items, x, xl, itemSchema, additionalProperties; + + if (instance.getType() === "array") { + properties = instance.getProperties(); + items = schema.getAttribute("items"); + additionalProperties = schema.getAttribute("additionalProperties"); + + if (JSV.typeOf(items) === "array") { + for (x = 0, xl = properties.length; x < xl; ++x) { + itemSchema = items[x] || additionalProperties; + if (itemSchema !== false) { + itemSchema.validate(properties[x], report, instance, schema, x); + } else { + report.addError(instance, schema, "additionalProperties", "Additional items are not allowed", itemSchema); + } + } + } else { + itemSchema = items || additionalProperties; + for (x = 0, xl = properties.length; x < xl; ++x) { + itemSchema.validate(properties[x], report, instance, schema, x); + } + } + } + } + }, + + "optional" : { + "type" : "boolean", + "optional" : true, + "default" : false, + + "parser" : function (instance, self) { + return !!instance.getValue(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + if (instance.getType() === "undefined" && !schema.getAttribute("optional")) { + report.addError(instance, schema, "optional", "Property is required", false); + } + }, + + "validationRequired" : true + }, + + "additionalProperties" : { + "type" : [{"$ref" : "#"}, "boolean"], + "optional" : true, + "default" : {}, + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } else if (instance.getType() === "boolean" && instance.getValue() === false) { + return false; + } + //else + return instance.getEnvironment().createEmptySchema(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var additionalProperties, propertySchemas, properties, key; + //we only need to check against object types as arrays do their own checking on this property + if (instance.getType() === "object") { + additionalProperties = schema.getAttribute("additionalProperties"); + propertySchemas = schema.getAttribute("properties") || {}; + properties = instance.getProperties(); + for (key in properties) { + if (properties[key] !== O[key] && properties[key] && !propertySchemas[key]) { + if (JSV.isJSONSchema(additionalProperties)) { + additionalProperties.validate(properties[key], report, instance, schema, key); + } else if (additionalProperties === false) { + report.addError(instance, schema, "additionalProperties", "Additional properties are not allowed", additionalProperties); + } + } + } + } + } + }, + + "requires" : { + "type" : ["string", {"$ref" : "#"}], + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "string") { + return instance.getValue(); + } else if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var requires; + if (instance.getType() !== "undefined" && parent && parent.getType() !== "undefined") { + requires = schema.getAttribute("requires"); + if (typeof requires === "string") { + if (parent.getProperty(requires).getType() === "undefined") { + report.addError(instance, schema, "requires", 'Property requires sibling property "' + requires + '"', requires); + } + } else if (JSV.isJSONSchema(requires)) { + requires.validate(parent, report); //WATCH: A "requires" schema does not support the "requires" attribute + } + } + } + }, + + "minimum" : { + "type" : "number", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var minimum, minimumCanEqual; + if (instance.getType() === "number") { + minimum = schema.getAttribute("minimum"); + minimumCanEqual = schema.getAttribute("minimumCanEqual"); + if (typeof minimum === "number" && (instance.getValue() < minimum || (minimumCanEqual === false && instance.getValue() === minimum))) { + report.addError(instance, schema, "minimum", "Number is less than the required minimum value", minimum); + } + } + } + }, + + "maximum" : { + "type" : "number", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maximum, maximumCanEqual; + if (instance.getType() === "number") { + maximum = schema.getAttribute("maximum"); + maximumCanEqual = schema.getAttribute("maximumCanEqual"); + if (typeof maximum === "number" && (instance.getValue() > maximum || (maximumCanEqual === false && instance.getValue() === maximum))) { + report.addError(instance, schema, "maximum", "Number is greater than the required maximum value", maximum); + } + } + } + }, + + "minimumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "minimum", + "default" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "boolean") { + return instance.getValue(); + } + //else + return true; + } + }, + + "maximumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "maximum", + "default" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "boolean") { + return instance.getValue(); + } + //else + return true; + } + }, + + "minItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + //else + return 0; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var minItems; + if (instance.getType() === "array") { + minItems = schema.getAttribute("minItems"); + if (typeof minItems === "number" && instance.getProperties().length < minItems) { + report.addError(instance, schema, "minItems", "The number of items is less than the required minimum", minItems); + } + } + } + }, + + "maxItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maxItems; + if (instance.getType() === "array") { + maxItems = schema.getAttribute("maxItems"); + if (typeof maxItems === "number" && instance.getProperties().length > maxItems) { + report.addError(instance, schema, "maxItems", "The number of items is greater than the required maximum", maxItems); + } + } + } + }, + + "pattern" : { + "type" : "string", + "optional" : true, + "format" : "regex", + + "parser" : function (instance, self) { + if (instance.getType() === "string") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var pattern; + try { + pattern = new RegExp(schema.getAttribute("pattern")); + if (instance.getType() === "string" && pattern && !pattern.test(instance.getValue())) { + report.addError(instance, schema, "pattern", "String does not match pattern", pattern.toString()); + } + } catch (e) { + report.addError(instance, schema, "pattern", "Invalid pattern", e); + } + } + }, + + "minLength" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + //else + return 0; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var minLength; + if (instance.getType() === "string") { + minLength = schema.getAttribute("minLength"); + if (typeof minLength === "number" && instance.getValue().length < minLength) { + report.addError(instance, schema, "minLength", "String is less than the required minimum length", minLength); + } + } + } + }, + + "maxLength" : { + "type" : "integer", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maxLength; + if (instance.getType() === "string") { + maxLength = schema.getAttribute("maxLength"); + if (typeof maxLength === "number" && instance.getValue().length > maxLength) { + report.addError(instance, schema, "maxLength", "String is greater than the required maximum length", maxLength); + } + } + } + }, + + "enum" : { + "type" : "array", + "optional" : true, + "minItems" : 1, + "uniqueItems" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "array") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var enums, x, xl; + if (instance.getType() !== "undefined") { + enums = schema.getAttribute("enum"); + if (enums) { + for (x = 0, xl = enums.length; x < xl; ++x) { + if (instance.equals(enums[x])) { + return true; + } + } + report.addError(instance, schema, "enum", "Instance is not one of the possible values", enums); + } + } + } + }, + + "title" : { + "type" : "string", + "optional" : true + }, + + "description" : { + "type" : "string", + "optional" : true + }, + + "format" : { + "type" : "string", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "string") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var format, formatValidators; + if (instance.getType() === "string") { + format = schema.getAttribute("format"); + formatValidators = self.getValueOfProperty("formatValidators"); + if (typeof format === "string" && formatValidators[format] !== O[format] && typeof formatValidators[format] === "function" && !formatValidators[format].call(this, instance, report)) { + report.addError(instance, schema, "format", "String is not in the required format", format); + } + } + }, + + "formatValidators" : {} + }, + + "contentEncoding" : { + "type" : "string", + "optional" : true + }, + + "default" : { + "type" : "any", + "optional" : true + }, + + "maxDecimal" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maxDecimal, decimals; + if (instance.getType() === "number") { + maxDecimal = schema.getAttribute("maxDecimal"); + if (typeof maxDecimal === "number") { + decimals = instance.getValue().toString(10).split('.')[1]; + if (decimals && decimals.length > maxDecimal) { + report.addError(instance, schema, "maxDecimal", "The number of decimal places is greater than the allowed maximum", maxDecimal); + } + } + } + } + }, + + "disallow" : { + "type" : ["string", "array"], + "items" : {"type" : "string"}, + "optional" : true, + "uniqueItems" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "string" || instance.getType() === "array") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var disallowedTypes = JSV.toArray(schema.getAttribute("disallow")), + x, xl, key, typeValidators; + + //for instances that are required to be a certain type + if (instance.getType() !== "undefined" && disallowedTypes && disallowedTypes.length) { + typeValidators = self.getValueOfProperty("typeValidators") || {}; + + //ensure that type matches for at least one of the required types + for (x = 0, xl = disallowedTypes.length; x < xl; ++x) { + key = disallowedTypes[x]; + if (typeValidators[key] !== O[key] && typeof typeValidators[key] === "function") { + if (typeValidators[key](instance, report)) { + report.addError(instance, schema, "disallow", "Instance is a disallowed type", disallowedTypes); + return false; + } + } + /* + else { + report.addError(instance, schema, "disallow", "Instance may be a disallowed type", disallowedTypes); + return false; + } + */ + } + + //if we get to this point, type is valid + return true; + } + //else, everything is allowed if no disallowed types are specified + return true; + }, + + "typeValidators" : TYPE_VALIDATORS + }, + + "extends" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "optional" : true, + "default" : {}, + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } else if (instance.getType() === "array") { + return JSV.mapArray(instance.getProperties(), function (instance) { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + }); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var extensions = schema.getAttribute("extends"), x, xl; + if (extensions) { + if (JSV.isJSONSchema(extensions)) { + extensions.validate(instance, report, parent, parentSchema, name); + } else if (JSV.typeOf(extensions) === "array") { + for (x = 0, xl = extensions.length; x < xl; ++x) { + extensions[x].validate(instance, report, parent, parentSchema, name); + } + } + } + } + } + }, + + "optional" : true, + "default" : {}, + "fragmentResolution" : "dot-delimited", + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var propNames = schema.getPropertyNames(), + x, xl, + attributeSchemas = self.getAttribute("properties"), + validator; + + for (x in attributeSchemas) { + if (attributeSchemas[x] !== O[x] && attributeSchemas[x].getValueOfProperty("validationRequired")) { + JSV.pushUnique(propNames, x); + } + } + + for (x = 0, xl = propNames.length; x < xl; ++x) { + if (attributeSchemas[propNames[x]] !== O[propNames[x]]) { + validator = attributeSchemas[propNames[x]].getValueOfProperty("validator"); + if (typeof validator === "function") { + validator(instance, schema, attributeSchemas[propNames[x]], report, parent, parentSchema, name); + } + } + } + }, + + "initializer" : function (instance) { + var link, extension, extended; + + //if there is a link to a different schema, set reference + link = instance._schema.getLink("describedby", instance); + if (link && instance._schema._uri !== link) { + instance.setReference("describedby", link); + } + + //if instance has a URI link to itself, update it's own URI + link = instance._schema.getLink("self", instance); + if (JSV.typeOf(link) === "string") { + instance._uri = JSV.formatURI(link); + } + + //if there is a link to the full representation, set reference + link = instance._schema.getLink("full", instance); + if (link && instance._uri !== link) { + instance.setReference("full", link); + } + + //extend schema + extension = instance.getAttribute("extends"); + if (JSV.isJSONSchema(extension)) { + extended = JSV.inherits(extension, instance, true); + instance = instance._env.createSchema(extended, instance._schema, instance._uri); + } + + return instance; + } + }, true, "http://json-schema.org/schema#"); + + HYPERSCHEMA = ENVIRONMENT.createSchema(JSV.inherits(SCHEMA, ENVIRONMENT.createSchema({ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/hyper-schema#", + + "properties" : { + "links" : { + "type" : "array", + "items" : {"$ref" : "links#"}, + "optional" : true, + + "parser" : function (instance, self, arg) { + var links, + linkSchemaURI = self.getValueOfProperty("items")["$ref"], + linkSchema = self.getEnvironment().findSchema(linkSchemaURI), + linkParser = linkSchema && linkSchema.getValueOfProperty("parser"); + arg = JSV.toArray(arg); + + if (typeof linkParser === "function") { + links = JSV.mapArray(instance.getProperties(), function (link) { + return linkParser(link, linkSchema); + }); + } else { + links = JSV.toArray(instance.getValue()); + } + + if (arg[0]) { + links = JSV.filterArray(links, function (link) { + return link["rel"] === arg[0]; + }); + } + + if (arg[1]) { + links = JSV.mapArray(links, function (link) { + var instance = arg[1], + href = link["href"]; + href = href.replace(/\{(.+)\}/g, function (str, p1, offset, s) { + var value; + if (p1 === "-this") { + value = instance.getValue(); + } else { + value = instance.getValueOfProperty(p1); + } + return value !== undefined ? String(value) : ""; + }); + return href ? JSV.formatURI(instance.resolveURI(href)) : href; + }); + } + + return links; + } + }, + + "fragmentResolution" : { + "type" : "string", + "optional" : true, + "default" : "dot-delimited" + }, + + "root" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "readonly" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "pathStart" : { + "type" : "string", + "optional" : true, + "format" : "uri", + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var pathStart; + if (instance.getType() !== "undefined") { + pathStart = schema.getAttribute("pathStart"); + if (typeof pathStart === "string") { + //TODO: Find out what pathStart is relative to + if (instance.getURI().indexOf(pathStart) !== 0) { + report.addError(instance, schema, "pathStart", "Instance's URI does not start with " + pathStart, pathStart); + } + } + } + } + }, + + "mediaType" : { + "type" : "string", + "optional" : true, + "format" : "media-type" + }, + + "alternate" : { + "type" : "array", + "items" : {"$ref" : "#"}, + "optional" : true + } + }, + + "links" : [ + { + "href" : "{$ref}", + "rel" : "full" + }, + + { + "href" : "{$schema}", + "rel" : "describedby" + }, + + { + "href" : "{id}", + "rel" : "self" + } + ]//, + + //not needed as JSV.inherits does the job for us + //"extends" : {"$ref" : "http://json-schema.org/schema#"} + }, SCHEMA), true), true, "http://json-schema.org/hyper-schema#"); + + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/hyper-schema#"); + + LINKS = ENVIRONMENT.createSchema({ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/links#", + "type" : "object", + + "properties" : { + "href" : { + "type" : "string" + }, + + "rel" : { + "type" : "string" + }, + + "method" : { + "type" : "string", + "default" : "GET", + "optional" : true + }, + + "enctype" : { + "type" : "string", + "requires" : "method", + "optional" : true + }, + + "properties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "hyper-schema#"}, + "optional" : true, + + "parser" : function (instance, self, arg) { + var env = instance.getEnvironment(), + selfEnv = self.getEnvironment(), + additionalPropertiesSchemaURI = self.getValueOfProperty("additionalProperties")["$ref"]; + if (instance.getType() === "object") { + if (arg) { + return env.createSchema(instance.getProperty(arg), selfEnv.findSchema(self.resolveURI(additionalPropertiesSchemaURI))); + } else { + return JSV.mapObject(instance.getProperties(), function (instance) { + return env.createSchema(instance, selfEnv.findSchema(self.resolveURI(additionalPropertiesSchemaURI))); + }); + } + } + } + } + }, + + "parser" : function (instance, self) { + var selfProperties = self.getProperty("properties"); + if (instance.getType() === "object") { + return JSV.mapObject(instance.getProperties(), function (property, key) { + var propertySchema = selfProperties.getProperty(key), + parser = propertySchema && propertySchema.getValueOfProperty("parser"); + if (typeof parser === "function") { + return parser(property, propertySchema); + } + //else + return property.getValue(); + }); + } + return instance.getValue(); + } + }, HYPERSCHEMA, "http://json-schema.org/links#"); + + JSV.registerEnvironment("json-schema-draft-00", ENVIRONMENT); + JSV.registerEnvironment("json-schema-draft-01", JSV.createEnvironment("json-schema-draft-00")); + + if (!JSV.getDefaultEnvironmentID()) { + JSV.setDefaultEnvironmentID("json-schema-draft-01"); + } + +}()); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/lib/json-schema-draft-02.js b/html/RentForCamp/node_modules/JSV/lib/json-schema-draft-02.js new file mode 100644 index 0000000..5e55718 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/lib/json-schema-draft-02.js @@ -0,0 +1,982 @@ +/** + * json-schema-draft-02 Environment + * + * @fileOverview Implementation of the second revision of the JSON Schema specification draft. + * @author Gary Court + * @version 1.7.1 + * @see http://github.com/garycourt/JSV + */ + +/* + * Copyright 2010 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 or the JSON Schema specification. + */ + +/*jslint white: true, sub: true, onevar: true, undef: true, eqeqeq: true, newcap: true, immed: true, indent: 4 */ +/*global require */ + +(function () { + var O = {}, + JSV = require('./jsv').JSV, + ENVIRONMENT, + TYPE_VALIDATORS, + SCHEMA, + HYPERSCHEMA, + LINKS; + + TYPE_VALIDATORS = { + "string" : function (instance, report) { + return instance.getType() === "string"; + }, + + "number" : function (instance, report) { + return instance.getType() === "number"; + }, + + "integer" : function (instance, report) { + return instance.getType() === "number" && instance.getValue() % 1 === 0; + }, + + "boolean" : function (instance, report) { + return instance.getType() === "boolean"; + }, + + "object" : function (instance, report) { + return instance.getType() === "object"; + }, + + "array" : function (instance, report) { + return instance.getType() === "array"; + }, + + "null" : function (instance, report) { + return instance.getType() === "null"; + }, + + "any" : function (instance, report) { + return true; + } + }; + + ENVIRONMENT = new JSV.Environment(); + ENVIRONMENT.setOption("defaultFragmentDelimiter", "/"); + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/schema#"); //updated later + + SCHEMA = ENVIRONMENT.createSchema({ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/schema#", + "type" : "object", + + "properties" : { + "type" : { + "type" : ["string", "array"], + "items" : { + "type" : ["string", {"$ref" : "#"}] + }, + "optional" : true, + "uniqueItems" : true, + "default" : "any", + + "parser" : function (instance, self) { + var parser; + + if (instance.getType() === "string") { + return instance.getValue(); + } else if (instance.getType() === "object") { + return instance.getEnvironment().createSchema( + instance, + self.getEnvironment().findSchema(self.resolveURI("#")) + ); + } else if (instance.getType() === "array") { + parser = self.getValueOfProperty("parser"); + return JSV.mapArray(instance.getProperties(), function (prop) { + return parser(prop, self); + }); + } + //else + return "any"; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var requiredTypes = JSV.toArray(schema.getAttribute("type")), + x, xl, type, subreport, typeValidators; + + //for instances that are required to be a certain type + if (instance.getType() !== "undefined" && requiredTypes && requiredTypes.length) { + typeValidators = self.getValueOfProperty("typeValidators") || {}; + + //ensure that type matches for at least one of the required types + for (x = 0, xl = requiredTypes.length; x < xl; ++x) { + type = requiredTypes[x]; + if (JSV.isJSONSchema(type)) { + subreport = JSV.createObject(report); + subreport.errors = []; + subreport.validated = JSV.clone(report.validated); + if (type.validate(instance, subreport, parent, parentSchema, name).errors.length === 0) { + return true; //instance matches this schema + } + } else { + if (typeValidators[type] !== O[type] && typeof typeValidators[type] === "function") { + if (typeValidators[type](instance, report)) { + return true; //type is valid + } + } else { + return true; //unknown types are assumed valid + } + } + } + + //if we get to this point, type is invalid + report.addError(instance, schema, "type", "Instance is not a required type", requiredTypes); + return false; + } + //else, anything is allowed if no type is specified + return true; + }, + + "typeValidators" : TYPE_VALIDATORS + }, + + "properties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "#"}, + "optional" : true, + "default" : {}, + + "parser" : function (instance, self, arg) { + var env = instance.getEnvironment(), + selfEnv = self.getEnvironment(); + if (instance.getType() === "object") { + if (arg) { + return env.createSchema(instance.getProperty(arg), selfEnv.findSchema(self.resolveURI("#"))); + } else { + return JSV.mapObject(instance.getProperties(), function (instance) { + return env.createSchema(instance, selfEnv.findSchema(self.resolveURI("#"))); + }); + } + } + //else + return {}; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var propertySchemas, key; + //this attribute is for object type instances only + if (instance.getType() === "object") { + //for each property defined in the schema + propertySchemas = schema.getAttribute("properties"); + for (key in propertySchemas) { + if (propertySchemas[key] !== O[key] && propertySchemas[key]) { + //ensure that instance property is valid + propertySchemas[key].validate(instance.getProperty(key), report, instance, schema, key); + } + } + } + } + }, + + "items" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "optional" : true, + "default" : {}, + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } else if (instance.getType() === "array") { + return JSV.mapArray(instance.getProperties(), function (instance) { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + }); + } + //else + return instance.getEnvironment().createEmptySchema(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var properties, items, x, xl, itemSchema, additionalProperties; + + if (instance.getType() === "array") { + properties = instance.getProperties(); + items = schema.getAttribute("items"); + additionalProperties = schema.getAttribute("additionalProperties"); + + if (JSV.typeOf(items) === "array") { + for (x = 0, xl = properties.length; x < xl; ++x) { + itemSchema = items[x] || additionalProperties; + if (itemSchema !== false) { + itemSchema.validate(properties[x], report, instance, schema, x); + } else { + report.addError(instance, schema, "additionalProperties", "Additional items are not allowed", itemSchema); + } + } + } else { + itemSchema = items || additionalProperties; + for (x = 0, xl = properties.length; x < xl; ++x) { + itemSchema.validate(properties[x], report, instance, schema, x); + } + } + } + } + }, + + "optional" : { + "type" : "boolean", + "optional" : true, + "default" : false, + + "parser" : function (instance, self) { + return !!instance.getValue(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + if (instance.getType() === "undefined" && !schema.getAttribute("optional")) { + report.addError(instance, schema, "optional", "Property is required", false); + } + }, + + "validationRequired" : true + }, + + "additionalProperties" : { + "type" : [{"$ref" : "#"}, "boolean"], + "optional" : true, + "default" : {}, + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } else if (instance.getType() === "boolean" && instance.getValue() === false) { + return false; + } + //else + return instance.getEnvironment().createEmptySchema(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var additionalProperties, propertySchemas, properties, key; + //we only need to check against object types as arrays do their own checking on this property + if (instance.getType() === "object") { + additionalProperties = schema.getAttribute("additionalProperties"); + propertySchemas = schema.getAttribute("properties") || {}; + properties = instance.getProperties(); + for (key in properties) { + if (properties[key] !== O[key] && properties[key] && !propertySchemas[key]) { + if (JSV.isJSONSchema(additionalProperties)) { + additionalProperties.validate(properties[key], report, instance, schema, key); + } else if (additionalProperties === false) { + report.addError(instance, schema, "additionalProperties", "Additional properties are not allowed", additionalProperties); + } + } + } + } + } + }, + + "requires" : { + "type" : ["string", {"$ref" : "#"}], + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "string") { + return instance.getValue(); + } else if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var requires; + if (instance.getType() !== "undefined" && parent && parent.getType() !== "undefined") { + requires = schema.getAttribute("requires"); + if (typeof requires === "string") { + if (parent.getProperty(requires).getType() === "undefined") { + report.addError(instance, schema, "requires", 'Property requires sibling property "' + requires + '"', requires); + } + } else if (JSV.isJSONSchema(requires)) { + requires.validate(parent, report); //WATCH: A "requires" schema does not support the "requires" attribute + } + } + } + }, + + "minimum" : { + "type" : "number", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var minimum, minimumCanEqual; + if (instance.getType() === "number") { + minimum = schema.getAttribute("minimum"); + minimumCanEqual = schema.getAttribute("minimumCanEqual"); + if (typeof minimum === "number" && (instance.getValue() < minimum || (minimumCanEqual === false && instance.getValue() === minimum))) { + report.addError(instance, schema, "minimum", "Number is less than the required minimum value", minimum); + } + } + } + }, + + "maximum" : { + "type" : "number", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maximum, maximumCanEqual; + if (instance.getType() === "number") { + maximum = schema.getAttribute("maximum"); + maximumCanEqual = schema.getAttribute("maximumCanEqual"); + if (typeof maximum === "number" && (instance.getValue() > maximum || (maximumCanEqual === false && instance.getValue() === maximum))) { + report.addError(instance, schema, "maximum", "Number is greater than the required maximum value", maximum); + } + } + } + }, + + "minimumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "minimum", + "default" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "boolean") { + return instance.getValue(); + } + //else + return true; + } + }, + + "maximumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "maximum", + "default" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "boolean") { + return instance.getValue(); + } + //else + return true; + } + }, + + "minItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + //else + return 0; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var minItems; + if (instance.getType() === "array") { + minItems = schema.getAttribute("minItems"); + if (typeof minItems === "number" && instance.getProperties().length < minItems) { + report.addError(instance, schema, "minItems", "The number of items is less than the required minimum", minItems); + } + } + } + }, + + "maxItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maxItems; + if (instance.getType() === "array") { + maxItems = schema.getAttribute("maxItems"); + if (typeof maxItems === "number" && instance.getProperties().length > maxItems) { + report.addError(instance, schema, "maxItems", "The number of items is greater than the required maximum", maxItems); + } + } + } + }, + + "uniqueItems" : { + "type" : "boolean", + "optional" : true, + "default" : false, + + "parser" : function (instance, self) { + return !!instance.getValue(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var value, x, xl, y, yl; + if (instance.getType() === "array" && schema.getAttribute("uniqueItems")) { + value = instance.getProperties(); + for (x = 0, xl = value.length - 1; x < xl; ++x) { + for (y = x + 1, yl = value.length; y < yl; ++y) { + if (value[x].equals(value[y])) { + report.addError(instance, schema, "uniqueItems", "Array can only contain unique items", { x : x, y : y }); + } + } + } + } + } + }, + + "pattern" : { + "type" : "string", + "optional" : true, + "format" : "regex", + + "parser" : function (instance, self) { + if (instance.getType() === "string") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var pattern; + try { + pattern = new RegExp(schema.getAttribute("pattern")); + if (instance.getType() === "string" && pattern && !pattern.test(instance.getValue())) { + report.addError(instance, schema, "pattern", "String does not match pattern", pattern.toString()); + } + } catch (e) { + report.addError(instance, schema, "pattern", "Invalid pattern", e); + } + } + }, + + "minLength" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + //else + return 0; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var minLength; + if (instance.getType() === "string") { + minLength = schema.getAttribute("minLength"); + if (typeof minLength === "number" && instance.getValue().length < minLength) { + report.addError(instance, schema, "minLength", "String is less than the required minimum length", minLength); + } + } + } + }, + + "maxLength" : { + "type" : "integer", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maxLength; + if (instance.getType() === "string") { + maxLength = schema.getAttribute("maxLength"); + if (typeof maxLength === "number" && instance.getValue().length > maxLength) { + report.addError(instance, schema, "maxLength", "String is greater than the required maximum length", maxLength); + } + } + } + }, + + "enum" : { + "type" : "array", + "optional" : true, + "minItems" : 1, + "uniqueItems" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "array") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var enums, x, xl; + if (instance.getType() !== "undefined") { + enums = schema.getAttribute("enum"); + if (enums) { + for (x = 0, xl = enums.length; x < xl; ++x) { + if (instance.equals(enums[x])) { + return true; + } + } + report.addError(instance, schema, "enum", "Instance is not one of the possible values", enums); + } + } + } + }, + + "title" : { + "type" : "string", + "optional" : true + }, + + "description" : { + "type" : "string", + "optional" : true + }, + + "format" : { + "type" : "string", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "string") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var format, formatValidators; + if (instance.getType() === "string") { + format = schema.getAttribute("format"); + formatValidators = self.getValueOfProperty("formatValidators"); + if (typeof format === "string" && formatValidators[format] !== O[format] && typeof formatValidators[format] === "function" && !formatValidators[format].call(this, instance, report)) { + report.addError(instance, schema, "format", "String is not in the required format", format); + } + } + }, + + "formatValidators" : {} + }, + + "contentEncoding" : { + "type" : "string", + "optional" : true + }, + + "default" : { + "type" : "any", + "optional" : true + }, + + "divisibleBy" : { + "type" : "number", + "minimum" : 0, + "minimumCanEqual" : false, + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var divisor; + if (instance.getType() === "number") { + divisor = schema.getAttribute("divisibleBy"); + if (divisor === 0) { + report.addError(instance, schema, "divisibleBy", "Nothing is divisible by 0", divisor); + } else if (divisor !== 1 && ((instance.getValue() / divisor) % 1) !== 0) { + report.addError(instance, schema, "divisibleBy", "Number is not divisible by " + divisor, divisor); + } + } + } + }, + + "disallow" : { + "type" : ["string", "array"], + "items" : {"type" : "string"}, + "optional" : true, + "uniqueItems" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "string" || instance.getType() === "array") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var disallowedTypes = JSV.toArray(schema.getAttribute("disallow")), + x, xl, key, typeValidators; + + //for instances that are required to be a certain type + if (instance.getType() !== "undefined" && disallowedTypes && disallowedTypes.length) { + typeValidators = self.getValueOfProperty("typeValidators") || {}; + + //ensure that type matches for at least one of the required types + for (x = 0, xl = disallowedTypes.length; x < xl; ++x) { + key = disallowedTypes[x]; + if (typeValidators[key] !== O[key] && typeof typeValidators[key] === "function") { + if (typeValidators[key](instance, report)) { + report.addError(instance, schema, "disallow", "Instance is a disallowed type", disallowedTypes); + return false; + } + } + /* + else { + report.addError(instance, schema, "disallow", "Instance may be a disallowed type", disallowedTypes); + return false; + } + */ + } + + //if we get to this point, type is valid + return true; + } + //else, everything is allowed if no disallowed types are specified + return true; + }, + + "typeValidators" : TYPE_VALIDATORS + }, + + "extends" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "optional" : true, + "default" : {}, + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } else if (instance.getType() === "array") { + return JSV.mapArray(instance.getProperties(), function (instance) { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + }); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var extensions = schema.getAttribute("extends"), x, xl; + if (extensions) { + if (JSV.isJSONSchema(extensions)) { + extensions.validate(instance, report, parent, parentSchema, name); + } else if (JSV.typeOf(extensions) === "array") { + for (x = 0, xl = extensions.length; x < xl; ++x) { + extensions[x].validate(instance, report, parent, parentSchema, name); + } + } + } + } + } + }, + + "optional" : true, + "default" : {}, + "fragmentResolution" : "slash-delimited", + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var propNames = schema.getPropertyNames(), + x, xl, + attributeSchemas = self.getAttribute("properties"), + validator; + + for (x in attributeSchemas) { + if (attributeSchemas[x] !== O[x] && attributeSchemas[x].getValueOfProperty("validationRequired")) { + JSV.pushUnique(propNames, x); + } + } + + for (x = 0, xl = propNames.length; x < xl; ++x) { + if (attributeSchemas[propNames[x]] !== O[propNames[x]]) { + validator = attributeSchemas[propNames[x]].getValueOfProperty("validator"); + if (typeof validator === "function") { + validator(instance, schema, attributeSchemas[propNames[x]], report, parent, parentSchema, name); + } + } + } + }, + + "initializer" : function (instance) { + var link, extension, extended; + + //if there is a link to a different schema, set reference + link = instance._schema.getLink("describedby", instance); + if (link && instance._schema._uri !== link) { + instance.setReference("describedby", link); + } + + //if instance has a URI link to itself, update it's own URI + link = instance._schema.getLink("self", instance); + if (JSV.typeOf(link) === "string") { + instance._uri = JSV.formatURI(link); + } + + //if there is a link to the full representation, set reference + link = instance._schema.getLink("full", instance); + if (link && instance._uri !== link) { + instance.setReference("full", link); + } + + //extend schema + extension = instance.getAttribute("extends"); + if (JSV.isJSONSchema(extension)) { + extended = JSV.inherits(extension, instance, true); + instance = instance._env.createSchema(extended, instance._schema, instance._uri); + } + + return instance; + } + }, true, "http://json-schema.org/schema#"); + + HYPERSCHEMA = ENVIRONMENT.createSchema(JSV.inherits(SCHEMA, ENVIRONMENT.createSchema({ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/hyper-schema#", + + "properties" : { + "links" : { + "type" : "array", + "items" : {"$ref" : "links#"}, + "optional" : true, + + "parser" : function (instance, self, arg) { + var links, + linkSchemaURI = self.getValueOfProperty("items")["$ref"], + linkSchema = self.getEnvironment().findSchema(linkSchemaURI), + linkParser = linkSchema && linkSchema.getValueOfProperty("parser"); + arg = JSV.toArray(arg); + + if (typeof linkParser === "function") { + links = JSV.mapArray(instance.getProperties(), function (link) { + return linkParser(link, linkSchema); + }); + } else { + links = JSV.toArray(instance.getValue()); + } + + if (arg[0]) { + links = JSV.filterArray(links, function (link) { + return link["rel"] === arg[0]; + }); + } + + if (arg[1]) { + links = JSV.mapArray(links, function (link) { + var instance = arg[1], + href = link["href"]; + href = href.replace(/\{(.+)\}/g, function (str, p1, offset, s) { + var value; + if (p1 === "-this") { + value = instance.getValue(); + } else { + value = instance.getValueOfProperty(p1); + } + return value !== undefined ? String(value) : ""; + }); + return href ? JSV.formatURI(instance.resolveURI(href)) : href; + }); + } + + return links; + } + }, + + "fragmentResolution" : { + "type" : "string", + "optional" : true, + "default" : "slash-delimited" + }, + + "root" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "readonly" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "pathStart" : { + "type" : "string", + "optional" : true, + "format" : "uri", + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var pathStart; + if (instance.getType() !== "undefined") { + pathStart = schema.getAttribute("pathStart"); + if (typeof pathStart === "string") { + //TODO: Find out what pathStart is relative to + if (instance.getURI().indexOf(pathStart) !== 0) { + report.addError(instance, schema, "pathStart", "Instance's URI does not start with " + pathStart, pathStart); + } + } + } + } + }, + + "mediaType" : { + "type" : "string", + "optional" : true, + "format" : "media-type" + }, + + "alternate" : { + "type" : "array", + "items" : {"$ref" : "#"}, + "optional" : true + } + }, + + "links" : [ + { + "href" : "{$ref}", + "rel" : "full" + }, + + { + "href" : "{$schema}", + "rel" : "describedby" + }, + + { + "href" : "{id}", + "rel" : "self" + } + ]//, + + //not needed as JSV.inherits does the job for us + //"extends" : {"$ref" : "http://json-schema.org/schema#"} + }, SCHEMA), true), true, "http://json-schema.org/hyper-schema#"); + + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/hyper-schema#"); + + LINKS = ENVIRONMENT.createSchema({ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/links#", + "type" : "object", + + "properties" : { + "href" : { + "type" : "string" + }, + + "rel" : { + "type" : "string" + }, + + "targetSchema" : { + "$ref" : "hyper-schema#", + + //need this here because parsers are run before links are resolved + "parser" : HYPERSCHEMA.getAttribute("parser") + }, + + "method" : { + "type" : "string", + "default" : "GET", + "optional" : true + }, + + "enctype" : { + "type" : "string", + "requires" : "method", + "optional" : true + }, + + "properties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "hyper-schema#"}, + "optional" : true, + + "parser" : function (instance, self, arg) { + var env = instance.getEnvironment(), + selfEnv = self.getEnvironment(), + additionalPropertiesSchemaURI = self.getValueOfProperty("additionalProperties")["$ref"]; + if (instance.getType() === "object") { + if (arg) { + return env.createSchema(instance.getProperty(arg), selfEnv.findSchema(self.resolveURI(additionalPropertiesSchemaURI))); + } else { + return JSV.mapObject(instance.getProperties(), function (instance) { + return env.createSchema(instance, selfEnv.findSchema(self.resolveURI(additionalPropertiesSchemaURI))); + }); + } + } + } + } + }, + + "parser" : function (instance, self) { + var selfProperties = self.getProperty("properties"); + if (instance.getType() === "object") { + return JSV.mapObject(instance.getProperties(), function (property, key) { + var propertySchema = selfProperties.getProperty(key), + parser = propertySchema && propertySchema.getValueOfProperty("parser"); + if (typeof parser === "function") { + return parser(property, propertySchema); + } + //else + return property.getValue(); + }); + } + return instance.getValue(); + } + }, HYPERSCHEMA, "http://json-schema.org/links#"); + + JSV.registerEnvironment("json-schema-draft-02", ENVIRONMENT); + if (!JSV.getDefaultEnvironmentID() || JSV.getDefaultEnvironmentID() === "json-schema-draft-01") { + JSV.setDefaultEnvironmentID("json-schema-draft-02"); + } + +}()); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/lib/json-schema-draft-03.js b/html/RentForCamp/node_modules/JSV/lib/json-schema-draft-03.js new file mode 100644 index 0000000..87bb9ff --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/lib/json-schema-draft-03.js @@ -0,0 +1,1552 @@ +/** + * json-schema-draft-03 Environment + * + * @fileOverview Implementation of the third revision of the JSON Schema specification draft. + * @author Gary Court + * @version 1.5.1 + * @see http://github.com/garycourt/JSV + */ + +/* + * Copyright 2010 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 or the JSON Schema specification. + */ + +/*jslint white: true, sub: true, onevar: true, undef: true, eqeqeq: true, newcap: true, immed: true, indent: 4 */ +/*global require */ + +(function () { + var O = {}, + JSV = require('./jsv').JSV, + TYPE_VALIDATORS, + ENVIRONMENT, + SCHEMA_00_JSON, + HYPERSCHEMA_00_JSON, + LINKS_00_JSON, + SCHEMA_00, + HYPERSCHEMA_00, + LINKS_00, + SCHEMA_01_JSON, + HYPERSCHEMA_01_JSON, + LINKS_01_JSON, + SCHEMA_01, + HYPERSCHEMA_01, + LINKS_01, + SCHEMA_02_JSON, + HYPERSCHEMA_02_JSON, + LINKS_02_JSON, + SCHEMA_02, + HYPERSCHEMA_02, + LINKS_02, + SCHEMA_03_JSON, + HYPERSCHEMA_03_JSON, + LINKS_03_JSON, + SCHEMA_03, + HYPERSCHEMA_03, + LINKS_03; + + TYPE_VALIDATORS = { + "string" : function (instance, report) { + return instance.getType() === "string"; + }, + + "number" : function (instance, report) { + return instance.getType() === "number"; + }, + + "integer" : function (instance, report) { + return instance.getType() === "number" && instance.getValue() % 1 === 0; + }, + + "boolean" : function (instance, report) { + return instance.getType() === "boolean"; + }, + + "object" : function (instance, report) { + return instance.getType() === "object"; + }, + + "array" : function (instance, report) { + return instance.getType() === "array"; + }, + + "null" : function (instance, report) { + return instance.getType() === "null"; + }, + + "any" : function (instance, report) { + return true; + } + }; + + ENVIRONMENT = new JSV.Environment(); + ENVIRONMENT.setOption("validateReferences", true); + ENVIRONMENT.setOption("enforceReferences", false); + ENVIRONMENT.setOption("strict", false); + + // + // draft-00 + // + + SCHEMA_00_JSON = { + "$schema" : "http://json-schema.org/draft-00/hyper-schema#", + "id" : "http://json-schema.org/draft-00/schema#", + "type" : "object", + + "properties" : { + "type" : { + "type" : ["string", "array"], + "items" : { + "type" : ["string", {"$ref" : "#"}] + }, + "optional" : true, + "uniqueItems" : true, + "default" : "any", + + "parser" : function (instance, self) { + var parser; + + if (instance.getType() === "string") { + return instance.getValue(); + } else if (instance.getType() === "object") { + return instance.getEnvironment().createSchema( + instance, + self.getEnvironment().findSchema(self.resolveURI("#")) + ); + } else if (instance.getType() === "array") { + parser = self.getValueOfProperty("parser"); + return JSV.mapArray(instance.getProperties(), function (prop) { + return parser(prop, self); + }); + } + //else + return "any"; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var requiredTypes = JSV.toArray(schema.getAttribute("type")), + x, xl, type, subreport, typeValidators; + + //for instances that are required to be a certain type + if (instance.getType() !== "undefined" && requiredTypes && requiredTypes.length) { + typeValidators = self.getValueOfProperty("typeValidators") || {}; + + //ensure that type matches for at least one of the required types + for (x = 0, xl = requiredTypes.length; x < xl; ++x) { + type = requiredTypes[x]; + if (JSV.isJSONSchema(type)) { + subreport = JSV.createObject(report); + subreport.errors = []; + subreport.validated = JSV.clone(report.validated); + if (type.validate(instance, subreport, parent, parentSchema, name).errors.length === 0) { + return true; //instance matches this schema + } + } else { + if (typeValidators[type] !== O[type] && typeof typeValidators[type] === "function") { + if (typeValidators[type](instance, report)) { + return true; //type is valid + } + } else { + return true; //unknown types are assumed valid + } + } + } + + //if we get to this point, type is invalid + report.addError(instance, schema, "type", "Instance is not a required type", requiredTypes); + return false; + } + //else, anything is allowed if no type is specified + return true; + }, + + "typeValidators" : TYPE_VALIDATORS + }, + + "properties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "#"}, + "optional" : true, + "default" : {}, + + "parser" : function (instance, self, arg) { + var env = instance.getEnvironment(), + selfEnv = self.getEnvironment(); + if (instance.getType() === "object") { + if (arg) { + return env.createSchema(instance.getProperty(arg), selfEnv.findSchema(self.resolveURI("#"))); + } else { + return JSV.mapObject(instance.getProperties(), function (instance) { + return env.createSchema(instance, selfEnv.findSchema(self.resolveURI("#"))); + }); + } + } + //else + return {}; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var propertySchemas, key; + //this attribute is for object type instances only + if (instance.getType() === "object") { + //for each property defined in the schema + propertySchemas = schema.getAttribute("properties"); + for (key in propertySchemas) { + if (propertySchemas[key] !== O[key] && propertySchemas[key]) { + //ensure that instance property is valid + propertySchemas[key].validate(instance.getProperty(key), report, instance, schema, key); + } + } + } + } + }, + + "items" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "optional" : true, + "default" : {}, + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } else if (instance.getType() === "array") { + return JSV.mapArray(instance.getProperties(), function (instance) { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + }); + } + //else + return instance.getEnvironment().createEmptySchema(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var properties, items, x, xl, itemSchema, additionalProperties; + + if (instance.getType() === "array") { + properties = instance.getProperties(); + items = schema.getAttribute("items"); + additionalProperties = schema.getAttribute("additionalProperties"); + + if (JSV.typeOf(items) === "array") { + for (x = 0, xl = properties.length; x < xl; ++x) { + itemSchema = items[x] || additionalProperties; + if (itemSchema !== false) { + itemSchema.validate(properties[x], report, instance, schema, x); + } else { + report.addError(instance, schema, "additionalProperties", "Additional items are not allowed", itemSchema); + } + } + } else { + itemSchema = items || additionalProperties; + for (x = 0, xl = properties.length; x < xl; ++x) { + itemSchema.validate(properties[x], report, instance, schema, x); + } + } + } + } + }, + + "optional" : { + "type" : "boolean", + "optional" : true, + "default" : false, + + "parser" : function (instance, self) { + return !!instance.getValue(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + if (instance.getType() === "undefined" && !schema.getAttribute("optional")) { + report.addError(instance, schema, "optional", "Property is required", false); + } + }, + + "validationRequired" : true + }, + + "additionalProperties" : { + "type" : [{"$ref" : "#"}, "boolean"], + "optional" : true, + "default" : {}, + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } else if (instance.getType() === "boolean" && instance.getValue() === false) { + return false; + } + //else + return instance.getEnvironment().createEmptySchema(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var additionalProperties, propertySchemas, properties, key; + //we only need to check against object types as arrays do their own checking on this property + if (instance.getType() === "object") { + additionalProperties = schema.getAttribute("additionalProperties"); + propertySchemas = schema.getAttribute("properties") || {}; + properties = instance.getProperties(); + for (key in properties) { + if (properties[key] !== O[key] && properties[key] && propertySchemas[key] === O[key]) { + if (JSV.isJSONSchema(additionalProperties)) { + additionalProperties.validate(properties[key], report, instance, schema, key); + } else if (additionalProperties === false) { + report.addError(instance, schema, "additionalProperties", "Additional properties are not allowed", additionalProperties); + } + } + } + } + } + }, + + "requires" : { + "type" : ["string", {"$ref" : "#"}], + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "string") { + return instance.getValue(); + } else if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var requires; + if (instance.getType() !== "undefined" && parent && parent.getType() !== "undefined") { + requires = schema.getAttribute("requires"); + if (typeof requires === "string") { + if (parent.getProperty(requires).getType() === "undefined") { + report.addError(instance, schema, "requires", 'Property requires sibling property "' + requires + '"', requires); + } + } else if (JSV.isJSONSchema(requires)) { + requires.validate(parent, report); //WATCH: A "requires" schema does not support the "requires" attribute + } + } + } + }, + + "minimum" : { + "type" : "number", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var minimum, minimumCanEqual; + if (instance.getType() === "number") { + minimum = schema.getAttribute("minimum"); + minimumCanEqual = schema.getAttribute("minimumCanEqual"); + if (typeof minimum === "number" && (instance.getValue() < minimum || (minimumCanEqual === false && instance.getValue() === minimum))) { + report.addError(instance, schema, "minimum", "Number is less than the required minimum value", minimum); + } + } + } + }, + + "maximum" : { + "type" : "number", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maximum, maximumCanEqual; + if (instance.getType() === "number") { + maximum = schema.getAttribute("maximum"); + maximumCanEqual = schema.getAttribute("maximumCanEqual"); + if (typeof maximum === "number" && (instance.getValue() > maximum || (maximumCanEqual === false && instance.getValue() === maximum))) { + report.addError(instance, schema, "maximum", "Number is greater than the required maximum value", maximum); + } + } + } + }, + + "minimumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "minimum", + "default" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "boolean") { + return instance.getValue(); + } + //else + return true; + } + }, + + "maximumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "maximum", + "default" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "boolean") { + return instance.getValue(); + } + //else + return true; + } + }, + + "minItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + //else + return 0; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var minItems; + if (instance.getType() === "array") { + minItems = schema.getAttribute("minItems"); + if (typeof minItems === "number" && instance.getProperties().length < minItems) { + report.addError(instance, schema, "minItems", "The number of items is less than the required minimum", minItems); + } + } + } + }, + + "maxItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maxItems; + if (instance.getType() === "array") { + maxItems = schema.getAttribute("maxItems"); + if (typeof maxItems === "number" && instance.getProperties().length > maxItems) { + report.addError(instance, schema, "maxItems", "The number of items is greater than the required maximum", maxItems); + } + } + } + }, + + "pattern" : { + "type" : "string", + "optional" : true, + "format" : "regex", + + "parser" : function (instance, self) { + if (instance.getType() === "string") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var pattern; + try { + pattern = new RegExp(schema.getAttribute("pattern")); + if (instance.getType() === "string" && pattern && !pattern.test(instance.getValue())) { + report.addError(instance, schema, "pattern", "String does not match pattern", pattern.toString()); + } + } catch (e) { + report.addError(schema, self, "pattern", "Invalid pattern", schema.getValueOfProperty("pattern")); + } + } + }, + + "minLength" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + //else + return 0; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var minLength; + if (instance.getType() === "string") { + minLength = schema.getAttribute("minLength"); + if (typeof minLength === "number" && instance.getValue().length < minLength) { + report.addError(instance, schema, "minLength", "String is less than the required minimum length", minLength); + } + } + } + }, + + "maxLength" : { + "type" : "integer", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maxLength; + if (instance.getType() === "string") { + maxLength = schema.getAttribute("maxLength"); + if (typeof maxLength === "number" && instance.getValue().length > maxLength) { + report.addError(instance, schema, "maxLength", "String is greater than the required maximum length", maxLength); + } + } + } + }, + + "enum" : { + "type" : "array", + "optional" : true, + "minItems" : 1, + "uniqueItems" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "array") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var enums, x, xl; + if (instance.getType() !== "undefined") { + enums = schema.getAttribute("enum"); + if (enums) { + for (x = 0, xl = enums.length; x < xl; ++x) { + if (instance.equals(enums[x])) { + return true; + } + } + report.addError(instance, schema, "enum", "Instance is not one of the possible values", enums); + } + } + } + }, + + "title" : { + "type" : "string", + "optional" : true + }, + + "description" : { + "type" : "string", + "optional" : true + }, + + "format" : { + "type" : "string", + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "string") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var format, formatValidators; + if (instance.getType() === "string") { + format = schema.getAttribute("format"); + formatValidators = self.getValueOfProperty("formatValidators"); + if (typeof format === "string" && formatValidators[format] !== O[format] && typeof formatValidators[format] === "function" && !formatValidators[format].call(this, instance, report)) { + report.addError(instance, schema, "format", "String is not in the required format", format); + } + } + }, + + "formatValidators" : {} + }, + + "contentEncoding" : { + "type" : "string", + "optional" : true + }, + + "default" : { + "type" : "any", + "optional" : true + }, + + "maxDecimal" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maxDecimal, decimals; + if (instance.getType() === "number") { + maxDecimal = schema.getAttribute("maxDecimal"); + if (typeof maxDecimal === "number") { + decimals = instance.getValue().toString(10).split('.')[1]; + if (decimals && decimals.length > maxDecimal) { + report.addError(instance, schema, "maxDecimal", "The number of decimal places is greater than the allowed maximum", maxDecimal); + } + } + } + } + }, + + "disallow" : { + "type" : ["string", "array"], + "items" : {"type" : "string"}, + "optional" : true, + "uniqueItems" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "string" || instance.getType() === "array") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var disallowedTypes = JSV.toArray(schema.getAttribute("disallow")), + x, xl, key, typeValidators, subreport; + + //for instances that are required to be a certain type + if (instance.getType() !== "undefined" && disallowedTypes && disallowedTypes.length) { + typeValidators = self.getValueOfProperty("typeValidators") || {}; + + //ensure that type matches for at least one of the required types + for (x = 0, xl = disallowedTypes.length; x < xl; ++x) { + key = disallowedTypes[x]; + if (JSV.isJSONSchema(key)) { //this is supported draft-03 and on + subreport = JSV.createObject(report); + subreport.errors = []; + subreport.validated = JSV.clone(report.validated); + if (key.validate(instance, subreport, parent, parentSchema, name).errors.length === 0) { + //instance matches this schema + report.addError(instance, schema, "disallow", "Instance is a disallowed type", disallowedTypes); + return false; + } + } else if (typeValidators[key] !== O[key] && typeof typeValidators[key] === "function") { + if (typeValidators[key](instance, report)) { + report.addError(instance, schema, "disallow", "Instance is a disallowed type", disallowedTypes); + return false; + } + } + /* + else { + report.addError(instance, schema, "disallow", "Instance may be a disallowed type", disallowedTypes); + return false; + } + */ + } + + //if we get to this point, type is valid + return true; + } + //else, everything is allowed if no disallowed types are specified + return true; + }, + + "typeValidators" : TYPE_VALIDATORS + }, + + "extends" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "optional" : true, + "default" : {}, + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + } else if (instance.getType() === "array") { + return JSV.mapArray(instance.getProperties(), function (instance) { + return instance.getEnvironment().createSchema(instance, self.getEnvironment().findSchema(self.resolveURI("#"))); + }); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var extensions = schema.getAttribute("extends"), x, xl; + if (extensions) { + if (JSV.isJSONSchema(extensions)) { + extensions.validate(instance, report, parent, parentSchema, name); + } else if (JSV.typeOf(extensions) === "array") { + for (x = 0, xl = extensions.length; x < xl; ++x) { + extensions[x].validate(instance, report, parent, parentSchema, name); + } + } + } + } + } + }, + + "optional" : true, + "default" : {}, + "fragmentResolution" : "dot-delimited", + + "parser" : function (instance, self) { + if (instance.getType() === "object") { + return instance.getEnvironment().createSchema(instance, self); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var propNames = schema.getPropertyNames(), + x, xl, + attributeSchemas = self.getAttribute("properties"), + strict = instance.getEnvironment().getOption("strict"), + validator; + + for (x in attributeSchemas) { + if (attributeSchemas[x] !== O[x]) { + if (attributeSchemas[x].getValueOfProperty("validationRequired")) { + JSV.pushUnique(propNames, x); + } + if (strict && attributeSchemas[x].getValueOfProperty("deprecated")) { + JSV.popFirst(propNames, x); + } + } + } + + for (x = 0, xl = propNames.length; x < xl; ++x) { + if (attributeSchemas[propNames[x]] !== O[propNames[x]]) { + validator = attributeSchemas[propNames[x]].getValueOfProperty("validator"); + if (typeof validator === "function") { + validator(instance, schema, attributeSchemas[propNames[x]], report, parent, parentSchema, name); + } + } + } + } + }; + + HYPERSCHEMA_00_JSON = { + "$schema" : "http://json-schema.org/draft-00/hyper-schema#", + "id" : "http://json-schema.org/draft-00/hyper-schema#", + + "properties" : { + "links" : { + "type" : "array", + "items" : {"$ref" : "links#"}, + "optional" : true, + + "parser" : function (instance, self, arg) { + var links, + linkSchemaURI = self.getValueOfProperty("items")["$ref"], + linkSchema = self.getEnvironment().findSchema(linkSchemaURI), + linkParser = linkSchema && linkSchema.getValueOfProperty("parser"), + selfReferenceVariable; + arg = JSV.toArray(arg); + + if (typeof linkParser === "function") { + links = JSV.mapArray(instance.getProperties(), function (link) { + return linkParser(link, linkSchema); + }); + } else { + links = JSV.toArray(instance.getValue()); + } + + if (arg[0]) { + links = JSV.filterArray(links, function (link) { + return link["rel"] === arg[0]; + }); + } + + if (arg[1]) { + selfReferenceVariable = self.getValueOfProperty("selfReferenceVariable"); + links = JSV.mapArray(links, function (link) { + var instance = arg[1], + href = link["href"]; + href = href.replace(/\{(.+)\}/g, function (str, p1, offset, s) { + var value; + if (p1 === selfReferenceVariable) { + value = instance.getValue(); + } else { + value = instance.getValueOfProperty(p1); + } + return value !== undefined ? String(value) : ""; + }); + return href ? JSV.formatURI(instance.resolveURI(href)) : href; + }); + } + + return links; + }, + + "selfReferenceVariable" : "-this" + }, + + "fragmentResolution" : { + "type" : "string", + "optional" : true, + "default" : "dot-delimited" + }, + + "root" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "readonly" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "pathStart" : { + "type" : "string", + "optional" : true, + "format" : "uri", + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var pathStart; + if (instance.getType() !== "undefined") { + pathStart = schema.getAttribute("pathStart"); + if (typeof pathStart === "string") { + //TODO: Find out what pathStart is relative to + if (instance.getURI().indexOf(pathStart) !== 0) { + report.addError(instance, schema, "pathStart", "Instance's URI does not start with " + pathStart, pathStart); + } + } + } + } + }, + + "mediaType" : { + "type" : "string", + "optional" : true, + "format" : "media-type" + }, + + "alternate" : { + "type" : "array", + "items" : {"$ref" : "#"}, + "optional" : true + } + }, + + "links" : [ + { + "href" : "{$ref}", + "rel" : "full" + }, + + { + "href" : "{$schema}", + "rel" : "describedby" + }, + + { + "href" : "{id}", + "rel" : "self" + } + ], + + "initializer" : function (instance) { + var link, extension, extended; + + //if there is a link to a different schema, set reference + link = instance._schema.getLink("describedby", instance); + if (link && instance._schema._uri !== link) { + instance.setReference("describedby", link); + } + + //if instance has a URI link to itself, update it's own URI + link = instance._schema.getLink("self", instance); + if (JSV.typeOf(link) === "string") { + instance._uri = JSV.formatURI(link); + } + + //if there is a link to the full representation, set reference + link = instance._schema.getLink("full", instance); + if (link && instance._uri !== link) { + instance.setReference("full", link); + } + + //extend schema + extension = instance.getAttribute("extends"); + if (JSV.isJSONSchema(extension)) { + extended = JSV.inherits(extension, instance, true); + instance = instance._env.createSchema(extended, instance._schema, instance._uri); + } + + return instance; + } + + //not needed as JSV.inherits does the job for us + //"extends" : {"$ref" : "http://json-schema.org/schema#"} + }; + + LINKS_00_JSON = { + "$schema" : "http://json-schema.org/draft-00/hyper-schema#", + "id" : "http://json-schema.org/draft-00/links#", + "type" : "object", + + "properties" : { + "href" : { + "type" : "string" + }, + + "rel" : { + "type" : "string" + }, + + "method" : { + "type" : "string", + "default" : "GET", + "optional" : true + }, + + "enctype" : { + "type" : "string", + "requires" : "method", + "optional" : true + }, + + "properties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "hyper-schema#"}, + "optional" : true, + + "parser" : function (instance, self, arg) { + var env = instance.getEnvironment(), + selfEnv = self.getEnvironment(), + additionalPropertiesSchemaURI = self.getValueOfProperty("additionalProperties")["$ref"]; + if (instance.getType() === "object") { + if (arg) { + return env.createSchema(instance.getProperty(arg), selfEnv.findSchema(self.resolveURI(additionalPropertiesSchemaURI))); + } else { + return JSV.mapObject(instance.getProperties(), function (instance) { + return env.createSchema(instance, selfEnv.findSchema(self.resolveURI(additionalPropertiesSchemaURI))); + }); + } + } + } + } + }, + + "parser" : function (instance, self) { + var selfProperties = self.getProperty("properties"); + if (instance.getType() === "object") { + return JSV.mapObject(instance.getProperties(), function (property, key) { + var propertySchema = selfProperties.getProperty(key), + parser = propertySchema && propertySchema.getValueOfProperty("parser"); + if (typeof parser === "function") { + return parser(property, propertySchema); + } + //else + return property.getValue(); + }); + } + return instance.getValue(); + } + }; + + ENVIRONMENT.setOption("defaultFragmentDelimiter", "."); + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/draft-00/schema#"); //updated later + + SCHEMA_00 = ENVIRONMENT.createSchema(SCHEMA_00_JSON, true, "http://json-schema.org/draft-00/schema#"); + HYPERSCHEMA_00 = ENVIRONMENT.createSchema(JSV.inherits(SCHEMA_00, ENVIRONMENT.createSchema(HYPERSCHEMA_00_JSON, true, "http://json-schema.org/draft-00/hyper-schema#"), true), true, "http://json-schema.org/draft-00/hyper-schema#"); + + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/draft-00/hyper-schema#"); + + LINKS_00 = ENVIRONMENT.createSchema(LINKS_00_JSON, HYPERSCHEMA_00, "http://json-schema.org/draft-00/links#"); + + // + // draft-01 + // + + SCHEMA_01_JSON = JSV.inherits(SCHEMA_00_JSON, { + "$schema" : "http://json-schema.org/draft-01/hyper-schema#", + "id" : "http://json-schema.org/draft-01/schema#" + }); + + HYPERSCHEMA_01_JSON = JSV.inherits(HYPERSCHEMA_00_JSON, { + "$schema" : "http://json-schema.org/draft-01/hyper-schema#", + "id" : "http://json-schema.org/draft-01/hyper-schema#" + }); + + LINKS_01_JSON = JSV.inherits(LINKS_00_JSON, { + "$schema" : "http://json-schema.org/draft-01/hyper-schema#", + "id" : "http://json-schema.org/draft-01/links#" + }); + + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/draft-01/schema#"); //update later + + SCHEMA_01 = ENVIRONMENT.createSchema(SCHEMA_01_JSON, true, "http://json-schema.org/draft-01/schema#"); + HYPERSCHEMA_01 = ENVIRONMENT.createSchema(JSV.inherits(SCHEMA_01, ENVIRONMENT.createSchema(HYPERSCHEMA_01_JSON, true, "http://json-schema.org/draft-01/hyper-schema#"), true), true, "http://json-schema.org/draft-01/hyper-schema#"); + + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/draft-01/hyper-schema#"); + + LINKS_01 = ENVIRONMENT.createSchema(LINKS_01_JSON, HYPERSCHEMA_01, "http://json-schema.org/draft-01/links#"); + + // + // draft-02 + // + + SCHEMA_02_JSON = JSV.inherits(SCHEMA_01_JSON, { + "$schema" : "http://json-schema.org/draft-02/hyper-schema#", + "id" : "http://json-schema.org/draft-02/schema#", + + "properties" : { + "uniqueItems" : { + "type" : "boolean", + "optional" : true, + "default" : false, + + "parser" : function (instance, self) { + return !!instance.getValue(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var value, x, xl, y, yl; + if (instance.getType() === "array" && schema.getAttribute("uniqueItems")) { + value = instance.getProperties(); + for (x = 0, xl = value.length - 1; x < xl; ++x) { + for (y = x + 1, yl = value.length; y < yl; ++y) { + if (value[x].equals(value[y])) { + report.addError(instance, schema, "uniqueItems", "Array can only contain unique items", { x : x, y : y }); + } + } + } + } + } + }, + + "maxDecimal" : { + "deprecated" : true + }, + + "divisibleBy" : { + "type" : "number", + "minimum" : 0, + "minimumCanEqual" : false, + "optional" : true, + + "parser" : function (instance, self) { + if (instance.getType() === "number") { + return instance.getValue(); + } + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var divisor, value, digits; + if (instance.getType() === "number") { + divisor = schema.getAttribute("divisibleBy"); + if (divisor === 0) { + report.addError(instance, schema, "divisibleBy", "Nothing is divisible by 0", divisor); + } else if (divisor !== 1) { + value = instance.getValue(); + digits = Math.max((value.toString().split(".")[1] || " ").length, (divisor.toString().split(".")[1] || " ").length); + digits = parseFloat(((value / divisor) % 1).toFixed(digits)); //cut out floating point errors + if (0 < digits && digits < 1) { + report.addError(instance, schema, "divisibleBy", "Number is not divisible by " + divisor, divisor); + } + } + } + } + } + }, + + "fragmentResolution" : "slash-delimited" + }); + + HYPERSCHEMA_02_JSON = JSV.inherits(HYPERSCHEMA_01_JSON, { + "id" : "http://json-schema.org/draft-02/hyper-schema#", + + "properties" : { + "fragmentResolution" : { + "default" : "slash-delimited" + } + } + }); + + LINKS_02_JSON = JSV.inherits(LINKS_01_JSON, { + "$schema" : "http://json-schema.org/draft-02/hyper-schema#", + "id" : "http://json-schema.org/draft-02/links#", + + "properties" : { + "targetSchema" : { + "$ref" : "hyper-schema#", + + //need this here because parsers are run before links are resolved + "parser" : HYPERSCHEMA_01.getAttribute("parser") + } + } + }); + + ENVIRONMENT.setOption("defaultFragmentDelimiter", "/"); + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/draft-02/schema#"); //update later + + SCHEMA_02 = ENVIRONMENT.createSchema(SCHEMA_02_JSON, true, "http://json-schema.org/draft-02/schema#"); + HYPERSCHEMA_02 = ENVIRONMENT.createSchema(JSV.inherits(SCHEMA_02, ENVIRONMENT.createSchema(HYPERSCHEMA_02_JSON, true, "http://json-schema.org/draft-02/hyper-schema#"), true), true, "http://json-schema.org/draft-02/hyper-schema#"); + + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/draft-02/hyper-schema#"); + + LINKS_02 = ENVIRONMENT.createSchema(LINKS_02_JSON, HYPERSCHEMA_02, "http://json-schema.org/draft-02/links#"); + + // + // draft-03 + // + + function getMatchedPatternProperties(instance, schema, report, self) { + var matchedProperties = {}, patternProperties, pattern, regexp, properties, key; + + if (instance.getType() === "object") { + patternProperties = schema.getAttribute("patternProperties"); + properties = instance.getProperties(); + for (pattern in patternProperties) { + if (patternProperties[pattern] !== O[pattern]) { + regexp = null; + try { + regexp = new RegExp(pattern); + } catch (e) { + if (report) { + report.addError(schema, self, "patternProperties", "Invalid pattern", pattern); + } + } + + if (regexp) { + for (key in properties) { + if (properties[key] !== O[key] && regexp.test(key)) { + matchedProperties[key] = matchedProperties[key] ? JSV.pushUnique(matchedProperties[key], patternProperties[pattern]) : [ patternProperties[pattern] ]; + } + } + } + } + } + } + + return matchedProperties; + } + + SCHEMA_03_JSON = JSV.inherits(SCHEMA_02_JSON, { + "$schema" : "http://json-schema.org/draft-03/schema#", + "id" : "http://json-schema.org/draft-03/schema#", + + "properties" : { + "patternProperties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "#"}, + "default" : {}, + + "parser" : SCHEMA_02.getValueOfProperty("properties")["properties"]["parser"], + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var matchedProperties, key, x; + if (instance.getType() === "object") { + matchedProperties = getMatchedPatternProperties(instance, schema, report, self); + for (key in matchedProperties) { + if (matchedProperties[key] !== O[key]) { + x = matchedProperties[key].length; + while (x--) { + matchedProperties[key][x].validate(instance.getProperty(key), report, instance, schema, key); + } + } + } + } + } + }, + + "additionalProperties" : { + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var additionalProperties, propertySchemas, properties, matchedProperties, key; + if (instance.getType() === "object") { + additionalProperties = schema.getAttribute("additionalProperties"); + propertySchemas = schema.getAttribute("properties") || {}; + properties = instance.getProperties(); + matchedProperties = getMatchedPatternProperties(instance, schema); + for (key in properties) { + if (properties[key] !== O[key] && properties[key] && propertySchemas[key] === O[key] && matchedProperties[key] === O[key]) { + if (JSV.isJSONSchema(additionalProperties)) { + additionalProperties.validate(properties[key], report, instance, schema, key); + } else if (additionalProperties === false) { + report.addError(instance, schema, "additionalProperties", "Additional properties are not allowed", additionalProperties); + } + } + } + } + } + }, + + "items" : { + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var properties, items, x, xl, itemSchema, additionalItems; + + if (instance.getType() === "array") { + properties = instance.getProperties(); + items = schema.getAttribute("items"); + additionalItems = schema.getAttribute("additionalItems"); + + if (JSV.typeOf(items) === "array") { + for (x = 0, xl = properties.length; x < xl; ++x) { + itemSchema = items[x] || additionalItems; + if (itemSchema !== false) { + itemSchema.validate(properties[x], report, instance, schema, x); + } else { + report.addError(instance, schema, "additionalItems", "Additional items are not allowed", itemSchema); + } + } + } else { + itemSchema = items || additionalItems; + for (x = 0, xl = properties.length; x < xl; ++x) { + itemSchema.validate(properties[x], report, instance, schema, x); + } + } + } + } + }, + + "additionalItems" : { + "type" : [{"$ref" : "#"}, "boolean"], + "default" : {}, + + "parser" : SCHEMA_02.getValueOfProperty("properties")["additionalProperties"]["parser"], + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var additionalItems, properties, x, xl; + //only validate if the "items" attribute is undefined + if (instance.getType() === "array" && schema.getProperty("items").getType() === "undefined") { + additionalItems = schema.getAttribute("additionalItems"); + properties = instance.getProperties(); + + if (additionalItems !== false) { + for (x = 0, xl = properties.length; x < xl; ++x) { + additionalItems.validate(properties[x], report, instance, schema, x); + } + } else if (properties.length) { + report.addError(instance, schema, "additionalItems", "Additional items are not allowed", additionalItems); + } + } + } + }, + + "optional" : { + "validationRequired" : false, + "deprecated" : true + }, + + "required" : { + "type" : "boolean", + "default" : false, + + "parser" : function (instance, self) { + return !!instance.getValue(); + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + if (instance.getType() === "undefined" && schema.getAttribute("required")) { + report.addError(instance, schema, "required", "Property is required", true); + } + } + }, + + "requires" : { + "deprecated" : true + }, + + "dependencies" : { + "type" : "object", + "additionalProperties" : { + "type" : ["string", "array", {"$ref" : "#"}], + "items" : { + "type" : "string" + } + }, + "default" : {}, + + "parser" : function (instance, self, arg) { + function parseProperty(property) { + var type = property.getType(); + if (type === "string" || type === "array") { + return property.getValue(); + } else if (type === "object") { + return property.getEnvironment().createSchema(property, self.getEnvironment().findSchema(self.resolveURI("#"))); + } + } + + if (instance.getType() === "object") { + if (arg) { + return parseProperty(instance.getProperty(arg)); + } else { + return JSV.mapObject(instance.getProperties(), parseProperty); + } + } + //else + return {}; + }, + + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var dependencies, key, dependency, type, x, xl; + if (instance.getType() === "object") { + dependencies = schema.getAttribute("dependencies"); + for (key in dependencies) { + if (dependencies[key] !== O[key] && instance.getProperty(key).getType() !== "undefined") { + dependency = dependencies[key]; + type = JSV.typeOf(dependency); + if (type === "string") { + if (instance.getProperty(dependency).getType() === "undefined") { + report.addError(instance, schema, "dependencies", 'Property "' + key + '" requires sibling property "' + dependency + '"', dependencies); + } + } else if (type === "array") { + for (x = 0, xl = dependency.length; x < xl; ++x) { + if (instance.getProperty(dependency[x]).getType() === "undefined") { + report.addError(instance, schema, "dependencies", 'Property "' + key + '" requires sibling property "' + dependency[x] + '"', dependencies); + } + } + } else if (JSV.isJSONSchema(dependency)) { + dependency.validate(instance, report); + } + } + } + } + } + }, + + "minimumCanEqual" : { + "deprecated" : true + }, + + "maximumCanEqual" : { + "deprecated" : true + }, + + "exclusiveMinimum" : { + "type" : "boolean", + "default" : false, + + "parser" : function (instance, self) { + return !!instance.getValue(); + } + }, + + "exclusiveMaximum" : { + "type" : "boolean", + "default" : false, + + "parser" : function (instance, self) { + return !!instance.getValue(); + } + }, + + "minimum" : { + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var minimum, exclusiveMinimum; + if (instance.getType() === "number") { + minimum = schema.getAttribute("minimum"); + exclusiveMinimum = schema.getAttribute("exclusiveMinimum") || (!instance.getEnvironment().getOption("strict") && !schema.getAttribute("minimumCanEqual")); + if (typeof minimum === "number" && (instance.getValue() < minimum || (exclusiveMinimum === true && instance.getValue() === minimum))) { + report.addError(instance, schema, "minimum", "Number is less than the required minimum value", minimum); + } + } + } + }, + + "maximum" : { + "validator" : function (instance, schema, self, report, parent, parentSchema, name) { + var maximum, exclusiveMaximum; + if (instance.getType() === "number") { + maximum = schema.getAttribute("maximum"); + exclusiveMaximum = schema.getAttribute("exclusiveMaximum") || (!instance.getEnvironment().getOption("strict") && !schema.getAttribute("maximumCanEqual")); + if (typeof maximum === "number" && (instance.getValue() > maximum || (exclusiveMaximum === true && instance.getValue() === maximum))) { + report.addError(instance, schema, "maximum", "Number is greater than the required maximum value", maximum); + } + } + } + }, + + "contentEncoding" : { + "deprecated" : true + }, + + "divisibleBy" : { + "exclusiveMinimum" : true + }, + + "disallow" : { + "items" : { + "type" : ["string", {"$ref" : "#"}] + }, + + "parser" : SCHEMA_02_JSON["properties"]["type"]["parser"] + }, + + "id" : { + "type" : "string", + "format" : "uri" + }, + + "$ref" : { + "type" : "string", + "format" : "uri" + }, + + "$schema" : { + "type" : "string", + "format" : "uri" + } + }, + + "dependencies" : { + "exclusiveMinimum" : "minimum", + "exclusiveMaximum" : "maximum" + }, + + "initializer" : function (instance) { + var link, extension, extended, + schemaLink = instance.getValueOfProperty("$schema"), + refLink = instance.getValueOfProperty("$ref"), + idLink = instance.getValueOfProperty("id"); + + //if there is a link to a different schema, set reference + if (schemaLink) { + link = instance.resolveURI(schemaLink); + instance.setReference("describedby", link); + } + + //if instance has a URI link to itself, update it's own URI + if (idLink) { + link = instance.resolveURI(idLink); + if (JSV.typeOf(link) === "string") { + instance._uri = JSV.formatURI(link); + } + } + + //if there is a link to the full representation, set reference + if (refLink) { + link = instance.resolveURI(refLink); + instance.setReference("full", link); + } + + //extend schema + extension = instance.getAttribute("extends"); + if (JSV.isJSONSchema(extension)) { + extended = JSV.inherits(extension, instance, true); + instance = instance._env.createSchema(extended, instance._schema, instance._uri); + } + + return instance; + } + }); + + HYPERSCHEMA_03_JSON = JSV.inherits(HYPERSCHEMA_02_JSON, { + "$schema" : "http://json-schema.org/draft-03/hyper-schema#", + "id" : "http://json-schema.org/draft-03/hyper-schema#", + + "properties" : { + "links" : { + "selfReferenceVariable" : "@" + }, + + "root" : { + "deprecated" : true + }, + + "contentEncoding" : { + "deprecated" : false //moved from core to hyper + }, + + "alternate" : { + "deprecated" : true + } + } + }); + + LINKS_03_JSON = JSV.inherits(LINKS_02_JSON, { + "$schema" : "http://json-schema.org/draft-03/hyper-schema#", + "id" : "http://json-schema.org/draft-03/links#", + + "properties" : { + "href" : { + "required" : true, + "format" : "link-description-object-template" + }, + + "rel" : { + "required" : true + }, + + "properties" : { + "deprecated" : true + }, + + "schema" : {"$ref" : "http://json-schema.org/draft-03/hyper-schema#"} + } + }); + + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/draft-03/schema#"); //update later + + SCHEMA_03 = ENVIRONMENT.createSchema(SCHEMA_03_JSON, true, "http://json-schema.org/draft-03/schema#"); + HYPERSCHEMA_03 = ENVIRONMENT.createSchema(JSV.inherits(SCHEMA_03, ENVIRONMENT.createSchema(HYPERSCHEMA_03_JSON, true, "http://json-schema.org/draft-03/hyper-schema#"), true), true, "http://json-schema.org/draft-03/hyper-schema#"); + + ENVIRONMENT.setOption("defaultSchemaURI", "http://json-schema.org/draft-03/hyper-schema#"); + + LINKS_03 = ENVIRONMENT.createSchema(LINKS_03_JSON, true, "http://json-schema.org/draft-03/links#"); + + ENVIRONMENT.setOption("latestJSONSchemaSchemaURI", "http://json-schema.org/draft-03/schema#"); + ENVIRONMENT.setOption("latestJSONSchemaHyperSchemaURI", "http://json-schema.org/draft-03/hyper-schema#"); + ENVIRONMENT.setOption("latestJSONSchemaLinksURI", "http://json-schema.org/draft-03/links#"); + + // + //Latest JSON Schema + // + + //Hack, but WAY faster than instantiating a new schema + ENVIRONMENT._schemas["http://json-schema.org/schema#"] = SCHEMA_03; + ENVIRONMENT._schemas["http://json-schema.org/hyper-schema#"] = HYPERSCHEMA_03; + ENVIRONMENT._schemas["http://json-schema.org/links#"] = LINKS_03; + + // + //register environment + // + + JSV.registerEnvironment("json-schema-draft-03", ENVIRONMENT); + if (!JSV.getDefaultEnvironmentID() || JSV.getDefaultEnvironmentID() === "json-schema-draft-01" || JSV.getDefaultEnvironmentID() === "json-schema-draft-02") { + JSV.setDefaultEnvironmentID("json-schema-draft-03"); + } + +}()); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/lib/jsv.js b/html/RentForCamp/node_modules/JSV/lib/jsv.js new file mode 100644 index 0000000..fdc385a --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/lib/jsv.js @@ -0,0 +1,1497 @@ +/** + * JSV: JSON Schema Validator + * + * @fileOverview A JavaScript implementation of a extendable, fully compliant JSON Schema validator. + * @author Gary Court + * @version 4.0.2 + * @see http://github.com/garycourt/JSV + */ + +/* + * Copyright 2010 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 or the JSON Schema specification. + */ + +/*jslint white: true, sub: true, onevar: true, undef: true, eqeqeq: true, newcap: true, immed: true, indent: 4 */ + +var exports = exports || this, + require = require || function () { + return exports; + }; + +(function () { + + var URI = require("./uri/uri").URI, + O = {}, + I2H = "0123456789abcdef".split(""), + mapArray, filterArray, searchArray, + + JSV; + + // + // Utility functions + // + + function typeOf(o) { + return o === undefined ? "undefined" : (o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase()); + } + + /** @inner */ + function F() {} + + function createObject(proto) { + F.prototype = proto || {}; + return new F(); + } + + function mapObject(obj, func, scope) { + var newObj = {}, key; + for (key in obj) { + if (obj[key] !== O[key]) { + newObj[key] = func.call(scope, obj[key], key, obj); + } + } + return newObj; + } + + /** @ignore */ + mapArray = function (arr, func, scope) { + var x = 0, xl = arr.length, newArr = new Array(xl); + for (; x < xl; ++x) { + newArr[x] = func.call(scope, arr[x], x, arr); + } + return newArr; + }; + + if (Array.prototype.map) { + /** @ignore */ + mapArray = function (arr, func, scope) { + return Array.prototype.map.call(arr, func, scope); + }; + } + + /** @ignore */ + filterArray = function (arr, func, scope) { + var x = 0, xl = arr.length, newArr = []; + for (; x < xl; ++x) { + if (func.call(scope, arr[x], x, arr)) { + newArr[newArr.length] = arr[x]; + } + } + return newArr; + }; + + if (Array.prototype.filter) { + /** @ignore */ + filterArray = function (arr, func, scope) { + return Array.prototype.filter.call(arr, func, scope); + }; + } + + /** @ignore */ + searchArray = function (arr, o) { + var x = 0, xl = arr.length; + for (; x < xl; ++x) { + if (arr[x] === o) { + return x; + } + } + return -1; + }; + + if (Array.prototype.indexOf) { + /** @ignore */ + searchArray = function (arr, o) { + return Array.prototype.indexOf.call(arr, o); + }; + } + + function toArray(o) { + return o !== undefined && o !== null ? (o instanceof Array && !o.callee ? o : (typeof o.length !== "number" || o.split || o.setInterval || o.call ? [ o ] : Array.prototype.slice.call(o))) : []; + } + + function keys(o) { + var result = [], key; + + switch (typeOf(o)) { + case "object": + for (key in o) { + if (o[key] !== O[key]) { + result[result.length] = key; + } + } + break; + case "array": + for (key = o.length - 1; key >= 0; --key) { + result[key] = key; + } + break; + } + + return result; + } + + function pushUnique(arr, o) { + if (searchArray(arr, o) === -1) { + arr.push(o); + } + return arr; + } + + function popFirst(arr, o) { + var index = searchArray(arr, o); + if (index > -1) { + arr.splice(index, 1); + } + return arr; + } + + function randomUUID() { + return [ + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + "-", + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + "-4", //set 4 high bits of time_high field to version + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + "-", + I2H[(Math.floor(Math.random() * 0x10) & 0x3) | 0x8], //specify 2 high bits of clock sequence + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + "-", + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)], + I2H[Math.floor(Math.random() * 0x10)] + ].join(""); + } + + function escapeURIComponent(str) { + return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A'); + } + + function formatURI(uri) { + if (typeof uri === "string" && uri.indexOf("#") === -1) { + uri += "#"; + } + return uri; + } + + function stripInstances(o) { + if (o instanceof JSONInstance) { + return o.getURI(); + } + + switch (typeOf(o)) { + case "undefined": + case "null": + case "boolean": + case "number": + case "string": + return o; //do nothing + + case "object": + return mapObject(o, stripInstances); + + case "array": + return mapArray(o, stripInstances); + + default: + return o.toString(); + } + } + + /** + * The exception that is thrown when a schema fails to be created. + * + * @name InitializationError + * @class + * @param {JSONInstance|String} instance The instance (or instance URI) that is invalid + * @param {JSONSchema|String} schema The schema (or schema URI) that was validating the instance + * @param {String} attr The attribute that failed to validated + * @param {String} message A user-friendly message on why the schema attribute failed to validate the instance + * @param {Any} details The value of the schema attribute + */ + + function InitializationError(instance, schema, attr, message, details) { + Error.call(this, message); + + this.uri = instance instanceof JSONInstance ? instance.getURI() : instance; + this.schemaUri = schema instanceof JSONInstance ? schema.getURI() : schema; + this.attribute = attr; + this.message = message; + this.description = message; //IE + this.details = details; + } + + InitializationError.prototype = new Error(); + InitializationError.prototype.constructor = InitializationError; + InitializationError.prototype.name = "InitializationError"; + + /** + * Defines an error, found by a schema, with an instance. + * This class can only be instantiated by {@link Report#addError}. + * + * @name ValidationError + * @class + * @see Report#addError + */ + + /** + * The URI of the instance that has the error. + * + * @name ValidationError.prototype.uri + * @type String + */ + + /** + * The URI of the schema that generated the error. + * + * @name ValidationError.prototype.schemaUri + * @type String + */ + + /** + * The name of the schema attribute that generated the error. + * + * @name ValidationError.prototype.attribute + * @type String + */ + + /** + * An user-friendly (English) message about what failed to validate. + * + * @name ValidationError.prototype.message + * @type String + */ + + /** + * The value of the schema attribute that generated the error. + * + * @name ValidationError.prototype.details + * @type Any + */ + + /** + * Reports are returned from validation methods to describe the result of a validation. + * + * @name Report + * @class + * @see JSONSchema#validate + * @see Environment#validate + */ + + function Report() { + /** + * An array of {@link ValidationError} objects that define all the errors generated by the schema against the instance. + * + * @name Report.prototype.errors + * @type Array + * @see Report#addError + */ + this.errors = []; + + /** + * A hash table of every instance and what schemas were validated against it. + *

+ * The key of each item in the table is the URI of the instance that was validated. + * The value of this key is an array of strings of URIs of the schema that validated it. + *

+ * + * @name Report.prototype.validated + * @type Object + * @see Report#registerValidation + * @see Report#isValidatedBy + */ + this.validated = {}; + + /** + * If the report is generated by {@link Environment#validate}, this field is the generated instance. + * + * @name Report.prototype.instance + * @type JSONInstance + * @see Environment#validate + */ + + /** + * If the report is generated by {@link Environment#validate}, this field is the generated schema. + * + * @name Report.prototype.schema + * @type JSONSchema + * @see Environment#validate + */ + + /** + * If the report is generated by {@link Environment#validate}, this field is the schema's schema. + * This value is the same as calling schema.getSchema(). + * + * @name Report.prototype.schemaSchema + * @type JSONSchema + * @see Environment#validate + * @see JSONSchema#getSchema + */ + } + + /** + * Adds a {@link ValidationError} object to the errors field. + * + * @param {JSONInstance|String} instance The instance (or instance URI) that is invalid + * @param {JSONSchema|String} schema The schema (or schema URI) that was validating the instance + * @param {String} attr The attribute that failed to validated + * @param {String} message A user-friendly message on why the schema attribute failed to validate the instance + * @param {Any} details The value of the schema attribute + */ + + Report.prototype.addError = function (instance, schema, attr, message, details) { + this.errors.push({ + uri : instance instanceof JSONInstance ? instance.getURI() : instance, + schemaUri : schema instanceof JSONInstance ? schema.getURI() : schema, + attribute : attr, + message : message, + details : stripInstances(details) + }); + }; + + /** + * Registers that the provided instance URI has been validated by the provided schema URI. + * This is recorded in the validated field. + * + * @param {String} uri The URI of the instance that was validated + * @param {String} schemaUri The URI of the schema that validated the instance + */ + + Report.prototype.registerValidation = function (uri, schemaUri) { + if (!this.validated[uri]) { + this.validated[uri] = [ schemaUri ]; + } else { + this.validated[uri].push(schemaUri); + } + }; + + /** + * Returns if an instance with the provided URI has been validated by the schema with the provided URI. + * + * @param {String} uri The URI of the instance + * @param {String} schemaUri The URI of a schema + * @returns {Boolean} If the instance has been validated by the schema. + */ + + Report.prototype.isValidatedBy = function (uri, schemaUri) { + return !!this.validated[uri] && searchArray(this.validated[uri], schemaUri) !== -1; + }; + + /** + * A wrapper class for binding an Environment, URI and helper methods to an instance. + * This class is most commonly instantiated with {@link Environment#createInstance}. + * + * @name JSONInstance + * @class + * @param {Environment} env The environment this instance belongs to + * @param {JSONInstance|Any} json The value of the instance + * @param {String} [uri] The URI of the instance. If undefined, the URI will be a randomly generated UUID. + * @param {String} [fd] The fragment delimiter for properties. If undefined, uses the environment default. + */ + + function JSONInstance(env, json, uri, fd) { + if (json instanceof JSONInstance) { + if (typeof fd !== "string") { + fd = json._fd; + } + if (typeof uri !== "string") { + uri = json._uri; + } + json = json._value; + } + + if (typeof uri !== "string") { + uri = "urn:uuid:" + randomUUID() + "#"; + } else if (uri.indexOf(":") === -1) { + uri = formatURI(URI.resolve("urn:uuid:" + randomUUID() + "#", uri)); + } + + this._env = env; + this._value = json; + this._uri = uri; + this._fd = fd || this._env._options["defaultFragmentDelimiter"]; + } + + /** + * Returns the environment the instance is bound to. + * + * @returns {Environment} The environment of the instance + */ + + JSONInstance.prototype.getEnvironment = function () { + return this._env; + }; + + /** + * Returns the name of the type of the instance. + * + * @returns {String} The name of the type of the instance + */ + + JSONInstance.prototype.getType = function () { + return typeOf(this._value); + }; + + /** + * Returns the JSON value of the instance. + * + * @returns {Any} The actual JavaScript value of the instance + */ + + JSONInstance.prototype.getValue = function () { + return this._value; + }; + + /** + * Returns the URI of the instance. + * + * @returns {String} The URI of the instance + */ + + JSONInstance.prototype.getURI = function () { + return this._uri; + }; + + /** + * Returns a resolved URI of a provided relative URI against the URI of the instance. + * + * @param {String} uri The relative URI to resolve + * @returns {String} The resolved URI + */ + + JSONInstance.prototype.resolveURI = function (uri) { + return formatURI(URI.resolve(this._uri, uri)); + }; + + /** + * Returns an array of the names of all the properties. + * + * @returns {Array} An array of strings which are the names of all the properties + */ + + JSONInstance.prototype.getPropertyNames = function () { + return keys(this._value); + }; + + /** + * Returns a {@link JSONInstance} of the value of the provided property name. + * + * @param {String} key The name of the property to fetch + * @returns {JSONInstance} The instance of the property value + */ + + JSONInstance.prototype.getProperty = function (key) { + var value = this._value ? this._value[key] : undefined; + if (value instanceof JSONInstance) { + return value; + } + //else + return new JSONInstance(this._env, value, this._uri + this._fd + escapeURIComponent(key), this._fd); + }; + + /** + * Returns all the property instances of the target instance. + *

+ * If the target instance is an Object, then the method will return a hash table of {@link JSONInstance}s of all the properties. + * If the target instance is an Array, then the method will return an array of {@link JSONInstance}s of all the items. + *

+ * + * @returns {Object|Array|undefined} The list of instances for all the properties + */ + + JSONInstance.prototype.getProperties = function () { + var type = typeOf(this._value), + self = this; + + if (type === "object") { + return mapObject(this._value, function (value, key) { + if (value instanceof JSONInstance) { + return value; + } + return new JSONInstance(self._env, value, self._uri + self._fd + escapeURIComponent(key), self._fd); + }); + } else if (type === "array") { + return mapArray(this._value, function (value, key) { + if (value instanceof JSONInstance) { + return value; + } + return new JSONInstance(self._env, value, self._uri + self._fd + escapeURIComponent(key), self._fd); + }); + } + }; + + /** + * Returns the JSON value of the provided property name. + * This method is a faster version of calling instance.getProperty(key).getValue(). + * + * @param {String} key The name of the property + * @returns {Any} The JavaScript value of the instance + * @see JSONInstance#getProperty + * @see JSONInstance#getValue + */ + + JSONInstance.prototype.getValueOfProperty = function (key) { + if (this._value) { + if (this._value[key] instanceof JSONInstance) { + return this._value[key]._value; + } + return this._value[key]; + } + }; + + /** + * Return if the provided value is the same as the value of the instance. + * + * @param {JSONInstance|Any} instance The value to compare + * @returns {Boolean} If both the instance and the value match + */ + + JSONInstance.prototype.equals = function (instance) { + if (instance instanceof JSONInstance) { + return this._value === instance._value; + } + //else + return this._value === instance; + }; + + /** + * Warning: Not a generic clone function + * Produces a JSV acceptable clone + */ + + function clone(obj, deep) { + var newObj, x; + + if (obj instanceof JSONInstance) { + obj = obj.getValue(); + } + + switch (typeOf(obj)) { + case "object": + if (deep) { + newObj = {}; + for (x in obj) { + if (obj[x] !== O[x]) { + newObj[x] = clone(obj[x], deep); + } + } + return newObj; + } else { + return createObject(obj); + } + break; + case "array": + if (deep) { + newObj = new Array(obj.length); + x = obj.length; + while (--x >= 0) { + newObj[x] = clone(obj[x], deep); + } + return newObj; + } else { + return Array.prototype.slice.call(obj); + } + break; + default: + return obj; + } + } + + /** + * This class binds a {@link JSONInstance} with a {@link JSONSchema} to provided context aware methods. + * + * @name JSONSchema + * @class + * @param {Environment} env The environment this schema belongs to + * @param {JSONInstance|Any} json The value of the schema + * @param {String} [uri] The URI of the schema. If undefined, the URI will be a randomly generated UUID. + * @param {JSONSchema|Boolean} [schema] The schema to bind to the instance. If undefined, the environment's default schema will be used. If true, the instance's schema will be itself. + * @extends JSONInstance + */ + + function JSONSchema(env, json, uri, schema) { + var fr; + JSONInstance.call(this, env, json, uri); + + if (schema === true) { + this._schema = this; + } else if (json instanceof JSONSchema && !(schema instanceof JSONSchema)) { + this._schema = json._schema; //TODO: Make sure cross environments don't mess everything up + } else { + this._schema = schema instanceof JSONSchema ? schema : this._env.getDefaultSchema() || this._env.createEmptySchema(); + } + + //determine fragment delimiter from schema + fr = this._schema.getValueOfProperty("fragmentResolution"); + if (fr === "dot-delimited") { + this._fd = "."; + } else if (fr === "slash-delimited") { + this._fd = "/"; + } + + return this.rebuild(); //this works even when called with "new" + } + + JSONSchema.prototype = createObject(JSONInstance.prototype); + + /** + * Returns the schema of the schema. + * + * @returns {JSONSchema} The schema of the schema + */ + + JSONSchema.prototype.getSchema = function () { + var uri = this._refs && this._refs["describedby"], + newSchema; + + if (uri) { + newSchema = uri && this._env.findSchema(uri); + + if (newSchema) { + if (!newSchema.equals(this._schema)) { + this._schema = newSchema; + this.rebuild(); //if the schema has changed, the context has changed - so everything must be rebuilt + } + } else if (this._env._options["enforceReferences"]) { + throw new InitializationError(this, this._schema, "{describedby}", "Unknown schema reference", uri); + } + } + + return this._schema; + }; + + /** + * Returns the value of the provided attribute name. + *

+ * This method is different from {@link JSONInstance#getProperty} as the named property + * is converted using a parser defined by the schema's schema before being returned. This + * makes the return value of this method attribute dependent. + *

+ * + * @param {String} key The name of the attribute + * @param {Any} [arg] Some attribute parsers accept special arguments for returning resolved values. This is attribute dependent. + * @returns {JSONSchema|Any} The value of the attribute + */ + + JSONSchema.prototype.getAttribute = function (key, arg) { + var schemaProperty, parser, property, result, + schema = this.getSchema(); //we do this here to make sure the "describedby" reference has not changed, and that the attribute cache is up-to-date + + if (!arg && this._attributes && this._attributes.hasOwnProperty(key)) { + return this._attributes[key]; + } + + schemaProperty = schema.getProperty("properties").getProperty(key); + parser = schemaProperty.getValueOfProperty("parser"); + property = this.getProperty(key); + if (typeof parser === "function") { + result = parser(property, schemaProperty, arg); + if (!arg && this._attributes) { + this._attributes[key] = result; + } + return result; + } + //else + return property.getValue(); + }; + + /** + * Returns all the attributes of the schema. + * + * @returns {Object} A map of all parsed attribute values + */ + + JSONSchema.prototype.getAttributes = function () { + var properties, schemaProperties, key, schemaProperty, parser, + schema = this.getSchema(); //we do this here to make sure the "describedby" reference has not changed, and that the attribute cache is up-to-date + + if (!this._attributes && this.getType() === "object") { + properties = this.getProperties(); + schemaProperties = schema.getProperty("properties"); + this._attributes = {}; + for (key in properties) { + if (properties[key] !== O[key]) { + schemaProperty = schemaProperties && schemaProperties.getProperty(key); + parser = schemaProperty && schemaProperty.getValueOfProperty("parser"); + if (typeof parser === "function") { + this._attributes[key] = parser(properties[key], schemaProperty); + } else { + this._attributes[key] = properties[key].getValue(); + } + } + } + } + + return clone(this._attributes, false); + }; + + /** + * Convenience method for retrieving a link or link object from a schema. + * This method is the same as calling schema.getAttribute("links", [rel, instance])[0];. + * + * @param {String} rel The link relationship + * @param {JSONInstance} [instance] The instance to resolve any URIs from + * @returns {String|Object|undefined} If instance is provided, a string containing the resolve URI of the link is returned. + * If instance is not provided, a link object is returned with details of the link. + * If no link with the provided relationship exists, undefined is returned. + * @see JSONSchema#getAttribute + */ + + JSONSchema.prototype.getLink = function (rel, instance) { + var schemaLinks = this.getAttribute("links", [rel, instance]); + if (schemaLinks && schemaLinks.length && schemaLinks[schemaLinks.length - 1]) { + return schemaLinks[schemaLinks.length - 1]; + } + }; + + /** + * Validates the provided instance against the target schema and returns a {@link Report}. + * + * @param {JSONInstance|Any} instance The instance to validate; may be a {@link JSONInstance} or any JavaScript value + * @param {Report} [report] A {@link Report} to concatenate the result of the validation to. If undefined, a new {@link Report} is created. + * @param {JSONInstance} [parent] The parent/containing instance of the provided instance + * @param {JSONSchema} [parentSchema] The schema of the parent/containing instance + * @param {String} [name] The name of the parent object's property that references the instance + * @returns {Report} The result of the validation + */ + + JSONSchema.prototype.validate = function (instance, report, parent, parentSchema, name) { + var schemaSchema = this.getSchema(), + validator = schemaSchema.getValueOfProperty("validator"); + + if (!(instance instanceof JSONInstance)) { + instance = this.getEnvironment().createInstance(instance); + } + + if (!(report instanceof Report)) { + report = new Report(); + } + + if (this._env._options["validateReferences"] && this._refs) { + if (this._refs["describedby"] && !this._env.findSchema(this._refs["describedby"])) { + report.addError(this, this._schema, "{describedby}", "Unknown schema reference", this._refs["describedby"]); + } + if (this._refs["full"] && !this._env.findSchema(this._refs["full"])) { + report.addError(this, this._schema, "{full}", "Unknown schema reference", this._refs["full"]); + } + } + + if (typeof validator === "function" && !report.isValidatedBy(instance.getURI(), this.getURI())) { + report.registerValidation(instance.getURI(), this.getURI()); + validator(instance, this, schemaSchema, report, parent, parentSchema, name); + } + + return report; + }; + + /** @inner */ + function createFullLookupWrapper(func) { + return /** @inner */ function fullLookupWrapper() { + var scope = this, + stack = [], + uri = scope._refs && scope._refs["full"], + schema; + + while (uri) { + schema = scope._env.findSchema(uri); + if (schema) { + if (schema._value === scope._value) { + break; + } + scope = schema; + stack.push(uri); + uri = scope._refs && scope._refs["full"]; + if (stack.indexOf(uri) > -1) { + break; //stop infinite loop + } + } else if (scope._env._options["enforceReferences"]) { + throw new InitializationError(scope, scope._schema, "{full}", "Unknown schema reference", uri); + } else { + uri = null; + } + } + return func.apply(scope, arguments); + }; + } + + /** + * Wraps all JSONInstance methods with a function that resolves the "full" reference. + * + * @inner + */ + + (function () { + var key; + for (key in JSONSchema.prototype) { + if (JSONSchema.prototype[key] !== O[key] && typeOf(JSONSchema.prototype[key]) === "function") { + JSONSchema.prototype[key] = createFullLookupWrapper(JSONSchema.prototype[key]); + } + } + }()); + + /** + * Reinitializes/re-registers/rebuilds the schema. + *
+ * This is used internally, and should only be called when a schema's private variables are modified directly. + * + * @private + * @return {JSONSchema} The newly rebuilt schema + */ + + JSONSchema.prototype.rebuild = function () { + var instance = this, + initializer = instance.getSchema().getValueOfProperty("initializer"); + + //clear previous built values + instance._refs = null; + instance._attributes = null; + + if (typeof initializer === "function") { + instance = initializer(instance); + } + + //register schema + instance._env._schemas[instance._uri] = instance; + + //build & cache the rest of the schema + instance.getAttributes(); + + return instance; + }; + + /** + * Set the provided reference to the given value. + *
+ * References are used for establishing soft-links to other {@link JSONSchema}s. + * Currently, the following references are natively supported: + *
+ *
full
+ *
The value is the URI to the full instance of this instance.
+ *
describedby
+ *
The value is the URI to the schema of this instance.
+ *
+ * + * @param {String} name The name of the reference + * @param {String} uri The URI of the schema to refer to + */ + + JSONSchema.prototype.setReference = function (name, uri) { + if (!this._refs) { + this._refs = {}; + } + this._refs[name] = this.resolveURI(uri); + }; + + /** + * Returns the value of the provided reference name. + * + * @param {String} name The name of the reference + * @return {String} The value of the provided reference name + */ + + JSONSchema.prototype.getReference = function (name) { + return this._refs && this._refs[name]; + }; + + /** + * Merges two schemas/instances together. + */ + + function inherits(base, extra, extension) { + var baseType = typeOf(base), + extraType = typeOf(extra), + child, x; + + if (extraType === "undefined") { + return clone(base, true); + } else if (baseType === "undefined" || extraType !== baseType) { + return clone(extra, true); + } else if (extraType === "object") { + if (base instanceof JSONSchema) { + base = base.getAttributes(); + } + if (extra instanceof JSONSchema) { + extra = extra.getAttributes(); + if (extra["extends"] && extension && extra["extends"] instanceof JSONSchema) { + extra["extends"] = [ extra["extends"] ]; + } + } + child = clone(base, true); //this could be optimized as some properties get overwritten + for (x in extra) { + if (extra[x] !== O[x]) { + child[x] = inherits(base[x], extra[x], extension); + } + } + return child; + } else { + return clone(extra, true); + } + } + + /** + * An Environment is a sandbox of schemas thats behavior is different from other environments. + * + * @name Environment + * @class + */ + + function Environment() { + this._id = randomUUID(); + this._schemas = {}; + this._options = {}; + + this.createSchema({}, true, "urn:jsv:empty-schema#"); + } + + /** + * Returns a clone of the target environment. + * + * @returns {Environment} A new {@link Environment} that is a exact copy of the target environment + */ + + Environment.prototype.clone = function () { + var env = new Environment(); + env._schemas = createObject(this._schemas); + env._options = createObject(this._options); + + return env; + }; + + /** + * Returns a new {@link JSONInstance} of the provided data. + * + * @param {JSONInstance|Any} data The value of the instance + * @param {String} [uri] The URI of the instance. If undefined, the URI will be a randomly generated UUID. + * @returns {JSONInstance} A new {@link JSONInstance} from the provided data + */ + + Environment.prototype.createInstance = function (data, uri) { + uri = formatURI(uri); + + if (data instanceof JSONInstance && (!uri || data.getURI() === uri)) { + return data; + } + + return new JSONInstance(this, data, uri); + }; + + /** + * Creates a new {@link JSONSchema} from the provided data, and registers it with the environment. + * + * @param {JSONInstance|Any} data The value of the schema + * @param {JSONSchema|Boolean} [schema] The schema to bind to the instance. If undefined, the environment's default schema will be used. If true, the instance's schema will be itself. + * @param {String} [uri] The URI of the schema. If undefined, the URI will be a randomly generated UUID. + * @returns {JSONSchema} A new {@link JSONSchema} from the provided data + * @throws {InitializationError} If a schema that is not registered with the environment is referenced + */ + + Environment.prototype.createSchema = function (data, schema, uri) { + uri = formatURI(uri); + + if (data instanceof JSONSchema && (!uri || data._uri === uri) && (!schema || data.getSchema().equals(schema))) { + return data; + } + + return new JSONSchema(this, data, uri, schema); + }; + + /** + * Creates an empty schema. + * + * @returns {JSONSchema} The empty schema, who's schema is itself. + */ + + Environment.prototype.createEmptySchema = function () { + return this._schemas["urn:jsv:empty-schema#"]; + }; + + /** + * Returns the schema registered with the provided URI. + * + * @param {String} uri The absolute URI of the required schema + * @returns {JSONSchema|undefined} The request schema, or undefined if not found + */ + + Environment.prototype.findSchema = function (uri) { + return this._schemas[formatURI(uri)]; + }; + + /** + * Sets the specified environment option to the specified value. + * + * @param {String} name The name of the environment option to set + * @param {Any} value The new value of the environment option + */ + + Environment.prototype.setOption = function (name, value) { + this._options[name] = value; + }; + + /** + * Returns the specified environment option. + * + * @param {String} name The name of the environment option to set + * @returns {Any} The value of the environment option + */ + + Environment.prototype.getOption = function (name) { + return this._options[name]; + }; + + /** + * Sets the default fragment delimiter of the environment. + * + * @deprecated Use {@link Environment#setOption} with option "defaultFragmentDelimiter" + * @param {String} fd The fragment delimiter character + */ + + Environment.prototype.setDefaultFragmentDelimiter = function (fd) { + if (typeof fd === "string" && fd.length > 0) { + this._options["defaultFragmentDelimiter"] = fd; + } + }; + + /** + * Returns the default fragment delimiter of the environment. + * + * @deprecated Use {@link Environment#getOption} with option "defaultFragmentDelimiter" + * @returns {String} The fragment delimiter character + */ + + Environment.prototype.getDefaultFragmentDelimiter = function () { + return this._options["defaultFragmentDelimiter"]; + }; + + /** + * Sets the URI of the default schema for the environment. + * + * @deprecated Use {@link Environment#setOption} with option "defaultSchemaURI" + * @param {String} uri The default schema URI + */ + + Environment.prototype.setDefaultSchemaURI = function (uri) { + if (typeof uri === "string") { + this._options["defaultSchemaURI"] = formatURI(uri); + } + }; + + /** + * Returns the default schema of the environment. + * + * @returns {JSONSchema} The default schema + */ + + Environment.prototype.getDefaultSchema = function () { + return this.findSchema(this._options["defaultSchemaURI"]); + }; + + /** + * Validates both the provided schema and the provided instance, and returns a {@link Report}. + * If the schema fails to validate, the instance will not be validated. + * + * @param {JSONInstance|Any} instanceJSON The {@link JSONInstance} or JavaScript value to validate. + * @param {JSONSchema|Any} schemaJSON The {@link JSONSchema} or JavaScript value to use in the validation. This will also be validated againt the schema's schema. + * @returns {Report} The result of the validation + */ + + Environment.prototype.validate = function (instanceJSON, schemaJSON) { + var instance, + schema, + schemaSchema, + report = new Report(); + + try { + instance = this.createInstance(instanceJSON); + report.instance = instance; + } catch (e) { + report.addError(e.uri, e.schemaUri, e.attribute, e.message, e.details); + } + + try { + schema = this.createSchema(schemaJSON); + report.schema = schema; + + schemaSchema = schema.getSchema(); + report.schemaSchema = schemaSchema; + } catch (f) { + report.addError(f.uri, f.schemaUri, f.attribute, f.message, f.details); + } + + if (schemaSchema) { + schemaSchema.validate(schema, report); + } + + if (report.errors.length) { + return report; + } + + return schema.validate(instance, report); + }; + + /** + * @private + */ + + Environment.prototype._checkForInvalidInstances = function (stackSize, schemaURI) { + var result = [], + stack = [ + [schemaURI, this._schemas[schemaURI]] + ], + counter = 0, + item, uri, instance, properties, key; + + while (counter++ < stackSize && stack.length) { + item = stack.shift(); + uri = item[0]; + instance = item[1]; + + if (instance instanceof JSONSchema) { + if (this._schemas[instance._uri] !== instance) { + result.push("Instance " + uri + " does not match " + instance._uri); + } else { + //schema = instance.getSchema(); + //stack.push([uri + "/{schema}", schema]); + + properties = instance.getAttributes(); + for (key in properties) { + if (properties[key] !== O[key]) { + stack.push([uri + "/" + escapeURIComponent(key), properties[key]]); + } + } + } + } else if (typeOf(instance) === "object") { + properties = instance; + for (key in properties) { + if (properties.hasOwnProperty(key)) { + stack.push([uri + "/" + escapeURIComponent(key), properties[key]]); + } + } + } else if (typeOf(instance) === "array") { + properties = instance; + for (key = 0; key < properties.length; ++key) { + stack.push([uri + "/" + escapeURIComponent(key), properties[key]]); + } + } + } + + return result.length ? result : counter; + }; + + /** + * A globaly accessible object that provides the ability to create and manage {@link Environments}, + * as well as providing utility methods. + * + * @namespace + */ + + JSV = { + _environments : {}, + _defaultEnvironmentID : "", + + /** + * Returns if the provide value is an instance of {@link JSONInstance}. + * + * @param o The value to test + * @returns {Boolean} If the provide value is an instance of {@link JSONInstance} + */ + + isJSONInstance : function (o) { + return o instanceof JSONInstance; + }, + + /** + * Returns if the provide value is an instance of {@link JSONSchema}. + * + * @param o The value to test + * @returns {Boolean} If the provide value is an instance of {@link JSONSchema} + */ + + isJSONSchema : function (o) { + return o instanceof JSONSchema; + }, + + /** + * Creates and returns a new {@link Environment} that is a clone of the environment registered with the provided ID. + * If no environment ID is provided, the default environment is cloned. + * + * @param {String} [id] The ID of the environment to clone. If undefined, the default environment ID is used. + * @returns {Environment} A newly cloned {@link Environment} + * @throws {Error} If there is no environment registered with the provided ID + */ + + createEnvironment : function (id) { + id = id || this._defaultEnvironmentID; + + if (!this._environments[id]) { + throw new Error("Unknown Environment ID"); + } + //else + return this._environments[id].clone(); + }, + + Environment : Environment, + + /** + * Registers the provided {@link Environment} with the provided ID. + * + * @param {String} id The ID of the environment + * @param {Environment} env The environment to register + */ + + registerEnvironment : function (id, env) { + id = id || (env || 0)._id; + if (id && !this._environments[id] && env instanceof Environment) { + env._id = id; + this._environments[id] = env; + } + }, + + /** + * Sets which registered ID is the default environment. + * + * @param {String} id The ID of the registered environment that is default + * @throws {Error} If there is no registered environment with the provided ID + */ + + setDefaultEnvironmentID : function (id) { + if (typeof id === "string") { + if (!this._environments[id]) { + throw new Error("Unknown Environment ID"); + } + + this._defaultEnvironmentID = id; + } + }, + + /** + * Returns the ID of the default environment. + * + * @returns {String} The ID of the default environment + */ + + getDefaultEnvironmentID : function () { + return this._defaultEnvironmentID; + }, + + // + // Utility Functions + // + + /** + * Returns the name of the type of the provided value. + * + * @event //utility + * @param {Any} o The value to determine the type of + * @returns {String} The name of the type of the value + */ + typeOf : typeOf, + + /** + * Return a new object that inherits all of the properties of the provided object. + * + * @event //utility + * @param {Object} proto The prototype of the new object + * @returns {Object} A new object that inherits all of the properties of the provided object + */ + createObject : createObject, + + /** + * Returns a new object with each property transformed by the iterator. + * + * @event //utility + * @param {Object} obj The object to transform + * @param {Function} iterator A function that returns the new value of the provided property + * @param {Object} [scope] The value of this in the iterator + * @returns {Object} A new object with each property transformed + */ + mapObject : mapObject, + + /** + * Returns a new array with each item transformed by the iterator. + * + * @event //utility + * @param {Array} arr The array to transform + * @param {Function} iterator A function that returns the new value of the provided item + * @param {Object} scope The value of this in the iterator + * @returns {Array} A new array with each item transformed + */ + mapArray : mapArray, + + /** + * Returns a new array that only contains the items allowed by the iterator. + * + * @event //utility + * @param {Array} arr The array to filter + * @param {Function} iterator The function that returns true if the provided property should be added to the array + * @param {Object} scope The value of this within the iterator + * @returns {Array} A new array that contains the items allowed by the iterator + */ + filterArray : filterArray, + + /** + * Returns the first index in the array that the provided item is located at. + * + * @event //utility + * @param {Array} arr The array to search + * @param {Any} o The item being searched for + * @returns {Number} The index of the item in the array, or -1 if not found + */ + searchArray : searchArray, + + /** + * Returns an array representation of a value. + *
    + *
  • For array-like objects, the value will be casted as an Array type.
  • + *
  • If an array is provided, the function will simply return the same array.
  • + *
  • For a null or undefined value, the result will be an empty Array.
  • + *
  • For all other values, the value will be the first element in a new Array.
  • + *
+ * + * @event //utility + * @param {Any} o The value to convert into an array + * @returns {Array} The value as an array + */ + toArray : toArray, + + /** + * Returns an array of the names of all properties of an object. + * + * @event //utility + * @param {Object|Array} o The object in question + * @returns {Array} The names of all properties + */ + keys : keys, + + /** + * Mutates the array by pushing the provided value onto the array only if it is not already there. + * + * @event //utility + * @param {Array} arr The array to modify + * @param {Any} o The object to add to the array if it is not already there + * @returns {Array} The provided array for chaining + */ + pushUnique : pushUnique, + + /** + * Mutates the array by removing the first item that matches the provided value in the array. + * + * @event //utility + * @param {Array} arr The array to modify + * @param {Any} o The object to remove from the array + * @returns {Array} The provided array for chaining + */ + popFirst : popFirst, + + /** + * Creates a copy of the target object. + *

+ * This method will create a new instance of the target, and then mixin the properties of the target. + * If deep is true, then each property will be cloned before mixin. + *

+ *

Warning: This is not a generic clone function, as it will only properly clone objects and arrays.

+ * + * @event //utility + * @param {Any} o The value to clone + * @param {Boolean} [deep=false] If each property should be recursively cloned + * @returns A cloned copy of the provided value + */ + clone : clone, + + /** + * Generates a pseudo-random UUID. + * + * @event //utility + * @returns {String} A new universally unique ID + */ + randomUUID : randomUUID, + + /** + * Properly escapes a URI component for embedding into a URI string. + * + * @event //utility + * @param {String} str The URI component to escape + * @returns {String} The escaped URI component + */ + escapeURIComponent : escapeURIComponent, + + /** + * Returns a URI that is formated for JSV. Currently, this only ensures that the URI ends with a hash tag (#). + * + * @event //utility + * @param {String} uri The URI to format + * @returns {String} The URI formatted for JSV + */ + formatURI : formatURI, + + /** + * Merges two schemas/instance together. + * + * @event //utility + * @param {JSONSchema|Any} base The old value to merge + * @param {JSONSchema|Any} extra The new value to merge + * @param {Boolean} extension If the merge is a JSON Schema extension + * @return {Any} The modified base value + */ + + inherits : inherits, + + /** + * @private + * @event //utility + */ + + InitializationError : InitializationError + }; + + this.JSV = JSV; //set global object + exports.JSV = JSV; //export to CommonJS + + require("./environments"); //load default environments + +}()); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/lib/uri/schemes/urn.js b/html/RentForCamp/node_modules/JSV/lib/uri/schemes/urn.js new file mode 100644 index 0000000..98ab88a --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/lib/uri/schemes/urn.js @@ -0,0 +1,86 @@ +(function () { + var URI_NS = require("../uri"), + URI = URI_NS.URI, + pctEncChar = URI_NS.pctEncChar, + NID$ = "(?:[0-9A-Za-z][0-9A-Za-z\\-]{1,31})", + PCT_ENCODED$ = "(?:\\%[0-9A-Fa-f]{2})", + TRANS$$ = "[0-9A-Za-z\\(\\)\\+\\,\\-\\.\\:\\=\\@\\;\\$\\_\\!\\*\\'\\/\\?\\#]", + NSS$ = "(?:(?:" + PCT_ENCODED$ + "|" + TRANS$$ + ")+)", + URN_SCHEME = new RegExp("^urn\\:(" + NID$ + ")$"), + URN_PATH = new RegExp("^(" + NID$ + ")\\:(" + NSS$ + ")$"), + URN_PARSE = /^([^\:]+)\:(.*)/, + URN_EXCLUDED = /[\x00-\x20\\\"\&\<\>\[\]\^\`\{\|\}\~\x7F-\xFF]/g, + UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; + + //RFC 2141 + URI.SCHEMES["urn"] = { + parse : function (components, options) { + var matches = components.path.match(URN_PATH), + scheme, schemeHandler; + + if (!matches) { + if (!options.tolerant) { + components.errors.push("URN is not strictly valid."); + } + + matches = components.path.match(URN_PARSE); + } + + if (matches) { + scheme = "urn:" + matches[1].toLowerCase(); + schemeHandler = URI.SCHEMES[scheme]; + + //in order to serialize properly, + //every URN must have a serializer that calls the URN serializer + if (!schemeHandler) { + schemeHandler = URI.SCHEMES[scheme] = {}; + } + if (!schemeHandler.serialize) { + schemeHandler.serialize = URI.SCHEMES["urn"].serialize; + } + + components.scheme = scheme; + components.path = matches[2]; + + if (schemeHandler.parse) { + schemeHandler.parse(components, options); + } + } else { + components.errors.push("URN can not be parsed."); + } + + return components; + }, + + serialize : function (components, options) { + var scheme = components.scheme || options.scheme, + matches; + + if (scheme && scheme !== "urn") { + var matches = scheme.match(URN_SCHEME); + + if (!matches) { + matches = ["urn:" + scheme, scheme]; + } + + components.scheme = "urn"; + components.path = matches[1] + ":" + (components.path ? components.path.replace(URN_EXCLUDED, pctEncChar) : ""); + } + + return components; + } + }; + + //RFC 4122 + URI.SCHEMES["urn:uuid"] = { + serialize : function (components, options) { + //ensure UUID is valid + if (!options.tolerant && (!components.path || !components.path.match(UUID))) { + //invalid UUIDs can not have this scheme + components.scheme = undefined; + } + + return URI.SCHEMES["urn"].serialize(components, options); + } + }; +}()); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/lib/uri/uri.js b/html/RentForCamp/node_modules/JSV/lib/uri/uri.js new file mode 100644 index 0000000..37ea1f3 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/lib/uri/uri.js @@ -0,0 +1,710 @@ +/** + * URI.js + * + * @fileoverview An RFC 3986 compliant, scheme extendable URI parsing/validating/resolving library for JavaScript. + * @author Gary Court + * @version 1.3 + * @see http://github.com/garycourt/uri-js + * @license URI.js v1.3 (c) 2010 Gary Court. License: http://github.com/garycourt/uri-js + */ + +/** + * Copyright 2010 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. + */ + +/*jslint white: true, sub: true, onevar: true, undef: true, eqeqeq: true, newcap: true, immed: true, indent: 4 */ +/*global exports:true, require:true */ + +if (typeof exports === "undefined") { + exports = {}; +} +if (typeof require !== "function") { + require = function (id) { + return exports; + }; +} +(function () { + var + /** + * @param {...string} sets + * @return {string} + */ + mergeSet = function (sets) { + var set = arguments[0], + x = 1, + nextSet = arguments[x]; + + while (nextSet) { + set = set.slice(0, -1) + nextSet.slice(1); + nextSet = arguments[++x]; + } + + return set; + }, + + /** + * @param {string} str + * @return {string} + */ + subexp = function (str) { + return "(?:" + str + ")"; + }, + + ALPHA$$ = "[A-Za-z]", + CR$ = "[\\x0D]", + DIGIT$$ = "[0-9]", + DQUOTE$$ = "[\\x22]", + HEXDIG$$ = mergeSet(DIGIT$$, "[A-Fa-f]"), //case-insensitive + LF$$ = "[\\x0A]", + SP$$ = "[\\x20]", + PCT_ENCODED$ = subexp("%" + HEXDIG$$ + HEXDIG$$), + GEN_DELIMS$$ = "[\\:\\/\\?\\#\\[\\]\\@]", + SUB_DELIMS$$ = "[\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=]", + RESERVED$$ = mergeSet(GEN_DELIMS$$, SUB_DELIMS$$), + UNRESERVED$$ = mergeSet(ALPHA$$, DIGIT$$, "[\\-\\.\\_\\~]"), + SCHEME$ = subexp(ALPHA$$ + mergeSet(ALPHA$$, DIGIT$$, "[\\+\\-\\.]") + "*"), + USERINFO$ = subexp(subexp(PCT_ENCODED$ + "|" + mergeSet(UNRESERVED$$, SUB_DELIMS$$, "[\\:]")) + "*"), + DEC_OCTET$ = subexp(subexp("25[0-5]") + "|" + subexp("2[0-4]" + DIGIT$$) + "|" + subexp("1" + DIGIT$$ + DIGIT$$) + "|" + subexp("[1-9]" + DIGIT$$) + "|" + DIGIT$$), + IPV4ADDRESS$ = subexp(DEC_OCTET$ + "\\." + DEC_OCTET$ + "\\." + DEC_OCTET$ + "\\." + DEC_OCTET$), + H16$ = subexp(HEXDIG$$ + "{1,4}"), + LS32$ = subexp(subexp(H16$ + "\\:" + H16$) + "|" + IPV4ADDRESS$), + IPV6ADDRESS$ = subexp(mergeSet(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), //FIXME + IPVFUTURE$ = subexp("v" + HEXDIG$$ + "+\\." + mergeSet(UNRESERVED$$, SUB_DELIMS$$, "[\\:]") + "+"), + IP_LITERAL$ = subexp("\\[" + subexp(IPV6ADDRESS$ + "|" + IPVFUTURE$) + "\\]"), + REG_NAME$ = subexp(subexp(PCT_ENCODED$ + "|" + mergeSet(UNRESERVED$$, SUB_DELIMS$$)) + "*"), + HOST$ = subexp(IP_LITERAL$ + "|" + IPV4ADDRESS$ + "|" + REG_NAME$), + PORT$ = subexp(DIGIT$$ + "*"), + AUTHORITY$ = subexp(subexp(USERINFO$ + "@") + "?" + HOST$ + subexp("\\:" + PORT$) + "?"), + PCHAR$ = subexp(PCT_ENCODED$ + "|" + mergeSet(UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@]")), + SEGMENT$ = subexp(PCHAR$ + "*"), + SEGMENT_NZ$ = subexp(PCHAR$ + "+"), + SEGMENT_NZ_NC$ = subexp(subexp(PCT_ENCODED$ + "|" + mergeSet(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$ = subexp(""), //simplified + PATH$ = subexp(PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$), + QUERY$ = subexp(subexp(PCHAR$ + "|[\\/\\?]") + "*"), + 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_REF$ = subexp(RELATIVE_PART$ + subexp("\\?" + QUERY$) + "?" + subexp("\\#" + FRAGMENT$) + "?"), + URI_REFERENCE$ = subexp(URI$ + "|" + RELATIVE_REF$), + ABSOLUTE_URI$ = subexp(SCHEME$ + "\\:" + HIER_PART$ + subexp("\\?" + QUERY$) + "?"), + + URI_REF = new RegExp("^" + subexp("(" + URI$ + ")|(" + RELATIVE_REF$ + ")") + "$"), + GENERIC_REF = new RegExp("^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$"), + RELATIVE_REF = new RegExp("^(){0}" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_NOSCHEME$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?" + subexp("\\#(" + FRAGMENT$ + ")") + "?$"), + ABSOLUTE_REF = new RegExp("^(" + SCHEME$ + ")\\:" + subexp(subexp("\\/\\/(" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?)") + "?(" + PATH_ABEMPTY$ + "|" + PATH_ABSOLUTE$ + "|" + PATH_ROOTLESS$ + "|" + PATH_EMPTY$ + ")") + subexp("\\?(" + QUERY$ + ")") + "?$"), + SAMEDOC_REF = new RegExp("^" + subexp("\\#(" + FRAGMENT$ + ")") + "?$"), + AUTHORITY = new RegExp("^" + subexp("(" + USERINFO$ + ")@") + "?(" + HOST$ + ")" + subexp("\\:(" + PORT$ + ")") + "?$"), + + NOT_SCHEME = new RegExp(mergeSet("[^]", ALPHA$$, DIGIT$$, "[\\+\\-\\.]"), "g"), + NOT_USERINFO = new RegExp(mergeSet("[^\\%\\:]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_HOST = new RegExp(mergeSet("[^\\%]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH = new RegExp(mergeSet("[^\\%\\/\\:\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_PATH_NOSCHEME = new RegExp(mergeSet("[^\\%\\/\\@]", UNRESERVED$$, SUB_DELIMS$$), "g"), + NOT_QUERY = new RegExp(mergeSet("[^\\%]", UNRESERVED$$, SUB_DELIMS$$, "[\\:\\@\\/\\?]"), "g"), + NOT_FRAGMENT = NOT_QUERY, + ESCAPE = new RegExp(mergeSet("[^]", UNRESERVED$$, SUB_DELIMS$$), "g"), + UNRESERVED = new RegExp(UNRESERVED$$, "g"), + OTHER_CHARS = new RegExp(mergeSet("[^\\%]", UNRESERVED$$, RESERVED$$), "g"), + PCT_ENCODEDS = new RegExp(PCT_ENCODED$ + "+", "g"), + URI_PARSE = /^(?:([^:\/?#]+):)?(?:\/\/((?:([^\/?#@]*)@)?([^\/?#:]*)(?:\:(\d*))?))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?/i, + RDS1 = /^\.\.?\//, + RDS2 = /^\/\.(\/|$)/, + RDS3 = /^\/\.\.(\/|$)/, + RDS4 = /^\.\.?$/, + RDS5 = /^\/?.*?(?=\/|$)/, + NO_MATCH_IS_UNDEFINED = ("").match(/(){0}/)[1] === undefined, + + /** + * @param {string} chr + * @return {string} + */ + pctEncChar = function (chr) { + var c = chr.charCodeAt(0); + + if (c < 128) { + return "%" + c.toString(16).toUpperCase(); + } + else if ((c > 127) && (c < 2048)) { + return "%" + ((c >> 6) | 192).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + } + else { + return "%" + ((c >> 12) | 224).toString(16).toUpperCase() + "%" + (((c >> 6) & 63) | 128).toString(16).toUpperCase() + "%" + ((c & 63) | 128).toString(16).toUpperCase(); + } + }, + + /** + * @param {string} str + * @return {string} + */ + pctDecUnreserved = function (str) { + var newStr = "", + i = 0, + c, s; + + while (i < str.length) { + c = parseInt(str.substr(i + 1, 2), 16); + + if (c < 128) { + s = String.fromCharCode(c); + if (s.match(UNRESERVED)) { + newStr += s; + } else { + newStr += str.substr(i, 3); + } + i += 3; + } + else if ((c > 191) && (c < 224)) { + newStr += str.substr(i, 6); + i += 6; + } + else { + newStr += str.substr(i, 9); + i += 9; + } + } + + return newStr; + }, + + /** + * @param {string} str + * @return {string} + */ + pctDecChars = function (str) { + var newStr = "", + i = 0, + c, c2, c3; + + while (i < str.length) { + c = parseInt(str.substr(i + 1, 2), 16); + + if (c < 128) { + newStr += String.fromCharCode(c); + i += 3; + } + else if ((c > 191) && (c < 224)) { + c2 = parseInt(str.substr(i + 4, 2), 16); + newStr += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 6; + } + else { + c2 = parseInt(str.substr(i + 4, 2), 16); + c3 = parseInt(str.substr(i + 7, 2), 16); + newStr += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 9; + } + } + + return newStr; + }, + + /** + * @return {string} + */ + typeOf = function (o) { + return o === undefined ? "undefined" : (o === null ? "null" : Object.prototype.toString.call(o).split(" ").pop().split("]").shift().toLowerCase()); + }, + + /** + * @constructor + * @implements URIComponents + */ + Components = function () { + this.errors = []; + }, + + /** @namespace */ + URI = exports; + + /** + * Components + */ + + Components.prototype = { + /** + * @type String + */ + + scheme : undefined, + + /** + * @type String + */ + + authority : undefined, + + /** + * @type String + */ + + userinfo : undefined, + + /** + * @type String + */ + + host : undefined, + + /** + * @type number + */ + + port : undefined, + + /** + * @type string + */ + + path : undefined, + + /** + * @type string + */ + + query : undefined, + + /** + * @type string + */ + + fragment : undefined, + + /** + * @type string + * @values "uri", "absolute", "relative", "same-document" + */ + + reference : undefined, + + /** + * @type Array + */ + + errors : undefined + }; + + /** + * URI + */ + + /** + * @namespace + */ + + URI.SCHEMES = {}; + + /** + * @param {string} uriString + * @param {Options} [options] + * @returns {URIComponents} + */ + + URI.parse = function (uriString, options) { + var matches, + components = new Components(), + schemeHandler; + + uriString = uriString ? uriString.toString() : ""; + options = options || {}; + + if (options.reference === "suffix") { + uriString = (options.scheme ? options.scheme + ":" : "") + "//" + uriString; + } + + matches = uriString.match(URI_REF); + + if (matches) { + if (matches[1]) { + //generic URI + matches = uriString.match(GENERIC_REF); + } else { + //relative URI + matches = uriString.match(RELATIVE_REF); + } + } + + if (!matches) { + if (!options.tolerant) { + components.errors.push("URI is not strictly valid."); + } + matches = uriString.match(URI_PARSE); + } + + if (matches) { + if (NO_MATCH_IS_UNDEFINED) { + //store each component + components.scheme = matches[1]; + components.authority = matches[2]; + 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.authority = (uriString.indexOf("//") !== -1 ? matches[2] : 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(/\/\/.*\:(?:\/|\?|\#|$)/) ? matches[4] : undefined); + } + } + + //determine reference type + if (!components.scheme && !components.authority && !components.path && !components.query) { + components.reference = "same-document"; + } else if (!components.scheme) { + components.reference = "relative"; + } else if (!components.fragment) { + components.reference = "absolute"; + } else { + components.reference = "uri"; + } + + //check for reference errors + if (options.reference && options.reference !== "suffix" && options.reference !== components.reference) { + components.errors.push("URI is not a " + options.reference + " reference."); + } + + //check if a handler for the scheme exists + schemeHandler = URI.SCHEMES[(components.scheme || options.scheme || "").toLowerCase()]; + if (schemeHandler && schemeHandler.parse) { + //perform extra parsing + schemeHandler.parse(components, options); + } + } else { + components.errors.push("URI can not be parsed."); + } + + return components; + }; + + /** + * @private + * @param {URIComponents} components + * @returns {string|undefined} + */ + + URI._recomposeAuthority = function (components) { + var uriTokens = []; + + if (components.userinfo !== undefined || components.host !== undefined || typeof components.port === "number") { + if (components.userinfo !== undefined) { + uriTokens.push(components.userinfo.toString().replace(NOT_USERINFO, pctEncChar)); + uriTokens.push("@"); + } + if (components.host !== undefined) { + uriTokens.push(components.host.toString().toLowerCase().replace(NOT_HOST, pctEncChar)); + } + if (typeof components.port === "number") { + uriTokens.push(":"); + uriTokens.push(components.port.toString(10)); + } + } + + return uriTokens.length ? uriTokens.join("") : undefined; + }; + + /** + * @param {string} input + * @returns {string} + */ + + URI.removeDotSegments = function (input) { + var output = [], s; + + 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 { + s = input.match(RDS5)[0]; + input = input.slice(s.length); + output.push(s); + } + } + + return output.join(""); + }; + + /** + * @param {URIComponents} components + * @param {Options} [options] + * @returns {string} + */ + + URI.serialize = function (components, options) { + var uriTokens = [], + schemeHandler, + s; + options = options || {}; + + //check if a handler for the scheme exists + schemeHandler = URI.SCHEMES[components.scheme || options.scheme]; + if (schemeHandler && schemeHandler.serialize) { + //perform extra serialization + schemeHandler.serialize(components, options); + } + + if (options.reference !== "suffix" && components.scheme) { + uriTokens.push(components.scheme.toString().toLowerCase().replace(NOT_SCHEME, "")); + uriTokens.push(":"); + } + + components.authority = URI._recomposeAuthority(components); + if (components.authority !== undefined) { + if (options.reference !== "suffix") { + uriTokens.push("//"); + } + + uriTokens.push(components.authority); + + if (components.path && components.path.charAt(0) !== "/") { + uriTokens.push("/"); + } + } + + if (components.path) { + s = URI.removeDotSegments(components.path.toString().replace(/%2E/ig, ".")); + + if (components.scheme) { + s = s.replace(NOT_PATH, pctEncChar); + } else { + s = s.replace(NOT_PATH_NOSCHEME, pctEncChar); + } + + if (components.authority === undefined) { + s = s.replace(/^\/\//, "/%2F"); //don't allow the path to start with "//" + } + uriTokens.push(s); + } + + if (components.query) { + uriTokens.push("?"); + uriTokens.push(components.query.toString().replace(NOT_QUERY, pctEncChar)); + } + + if (components.fragment) { + uriTokens.push("#"); + uriTokens.push(components.fragment.toString().replace(NOT_FRAGMENT, pctEncChar)); + } + + return uriTokens + .join('') //merge tokens into a string + .replace(PCT_ENCODEDS, pctDecUnreserved) //undecode unreserved characters + //.replace(OTHER_CHARS, pctEncChar) //replace non-URI characters + .replace(/%[0-9A-Fa-f]{2}/g, function (str) { //uppercase percent encoded characters + return str.toUpperCase(); + }) + ; + }; + + /** + * @param {URIComponents} base + * @param {URIComponents} relative + * @param {Options} [options] + * @param {boolean} [skipNormalization] + * @returns {URIComponents} + */ + + URI.resolveComponents = function (base, relative, options, skipNormalization) { + var target = new Components(); + + if (!skipNormalization) { + base = URI.parse(URI.serialize(base, options), options); //normalize base components + relative = URI.parse(URI.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 = URI.removeDotSegments(relative.path); + target.query = relative.query; + } else { + if (relative.authority !== undefined) { + target.authority = relative.authority; + target.userinfo = relative.userinfo; + target.host = relative.host; + target.port = relative.port; + target.path = URI.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 = URI.removeDotSegments(relative.path); + } else { + if (base.authority !== 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 = URI.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; + }; + + /** + * @param {string} baseURI + * @param {string} relativeURI + * @param {Options} [options] + * @returns {string} + */ + + URI.resolve = function (baseURI, relativeURI, options) { + return URI.serialize(URI.resolveComponents(URI.parse(baseURI, options), URI.parse(relativeURI, options), options, true), options); + }; + + /** + * @param {string|URIComponents} uri + * @param {Options} options + * @returns {string|URIComponents} + */ + + URI.normalize = function (uri, options) { + if (typeof uri === "string") { + return URI.serialize(URI.parse(uri, options), options); + } else if (typeOf(uri) === "object") { + return URI.parse(URI.serialize(uri, options), options); + } + + return uri; + }; + + /** + * @param {string|URIComponents} uriA + * @param {string|URIComponents} uriB + * @param {Options} options + */ + + URI.equal = function (uriA, uriB, options) { + if (typeof uriA === "string") { + uriA = URI.serialize(URI.parse(uriA, options), options); + } else if (typeOf(uriA) === "object") { + uriA = URI.serialize(uriA, options); + } + + if (typeof uriB === "string") { + uriB = URI.serialize(URI.parse(uriB, options), options); + } else if (typeOf(uriB) === "object") { + uriB = URI.serialize(uriB, options); + } + + return uriA === uriB; + }; + + /** + * @param {string} str + * @returns {string} + */ + + URI.escapeComponent = function (str) { + return str && str.toString().replace(ESCAPE, pctEncChar); + }; + + /** + * @param {string} str + * @returns {string} + */ + + URI.unescapeComponent = function (str) { + return str && str.toString().replace(PCT_ENCODEDS, pctDecChars); + }; + + //export API + exports.pctEncChar = pctEncChar; + exports.pctDecChars = pctDecChars; + exports.Components = Components; + exports.URI = URI; + + //name-safe export API + exports["pctEncChar"] = pctEncChar; + exports["pctDecChars"] = pctDecChars; + exports["Components"] = Components; + exports["URI"] = { + "SCHEMES" : URI.SCHEMES, + "parse" : URI.parse, + "removeDotSegments" : URI.removeDotSegments, + "serialize" : URI.serialize, + "resolveComponents" : URI.resolveComponents, + "resolve" : URI.resolve, + "normalize" : URI.normalize, + "equal" : URI.equal, + "escapeComponent" : URI.escapeComponent, + "unescapeComponent" : URI.unescapeComponent + }; + +}()); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/package.json b/html/RentForCamp/node_modules/JSV/package.json new file mode 100644 index 0000000..841abf6 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/package.json @@ -0,0 +1,98 @@ +{ + "_args": [ + [ + { + "raw": "JSV@^4.0.x", + "scope": null, + "escapedName": "JSV", + "name": "JSV", + "rawSpec": "^4.0.x", + "spec": ">=4.0.0 <5.0.0", + "type": "range" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/jsonlint" + ] + ], + "_defaultsLoaded": true, + "_engineSupported": true, + "_from": "JSV@>=4.0.0 <5.0.0", + "_id": "JSV@4.0.2", + "_inCache": true, + "_location": "/JSV", + "_nodeVersion": "v0.6.6", + "_npmUser": { + "name": "garycourt", + "email": "gary.court@gmail.com" + }, + "_npmVersion": "1.1.0-beta-4", + "_phantomChildren": {}, + "_requested": { + "raw": "JSV@^4.0.x", + "scope": null, + "escapedName": "JSV", + "name": "JSV", + "rawSpec": "^4.0.x", + "spec": ">=4.0.0 <5.0.0", + "type": "range" + }, + "_requiredBy": [ + "/jsonlint" + ], + "_resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", + "_shasum": "d077f6825571f82132f9dffaed587b4029feff57", + "_shrinkwrap": null, + "_spec": "JSV@^4.0.x", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/jsonlint", + "author": { + "name": "Gary Court", + "email": "gary.court@gmail.com" + }, + "bugs": { + "url": "http://github.com/garycourt/JSV/issues", + "email": "gary.court@gmail.com" + }, + "dependencies": {}, + "description": "A JavaScript implementation of a extendable, fully compliant JSON Schema validator.", + "devDependencies": {}, + "directories": {}, + "dist": { + "shasum": "d077f6825571f82132f9dffaed587b4029feff57", + "tarball": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz" + }, + "engines": { + "node": "*" + }, + "homepage": "http://github.com/garycourt/JSV", + "keywords": [ + "json", + "schema", + "validator" + ], + "licenses": [ + { + "type": "FreeBSD", + "url": "http://github.com/garycourt/JSV/raw/master/jsv.js" + } + ], + "main": "lib/jsv.js", + "maintainers": [ + { + "name": "garycourt", + "email": "gary.court@gmail.com" + } + ], + "name": "JSV", + "optionalDependencies": {}, + "readme": "JSV: JSON Schema Validator\r\n==========================\r\n\r\nJSV is a JavaScript implementation of a extendable, fully compliant JSON Schema validator with the following features:\r\n\r\n*\tThe fastest extendable JSON validator available!\r\n*\tComplete implementation of all current JSON Schema draft revisions.\r\n*\tSupports creating individual environments (sandboxes) that validate using a particular schema specification.\r\n*\tProvides an intuitive API for creating new validating schema attributes, or whole new custom schema schemas.\r\n*\tSupports `self`, `full` and `describedby` hyper links.\r\n*\tValidates itself, and is bootstrapped from the JSON Schema schemas.\r\n*\tIncludes over 1100 unit tests for testing all parts of the specifications.\r\n*\tWorks in all ECMAScript 3 environments, including all web browsers and Node.js.\r\n*\tLicensed under the FreeBSD License, a very open license.\r\n\r\n## It's a what?\r\n\r\n**JSON** (an acronym for **JavaScript Object Notation**) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of JavaScript/ECMA-262 3rd Edition. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages. (C, C++, C#, Java, JavaScript, Perl, Python, ...) These properties make JSON an ideal data-interchange language. \\[[json.org](http://json.org)\\]\r\n\r\n**JSON Schema** is a JSON media type for defining the structure of JSON data. JSON Schema provides a contract for what JSON data is required for a given application and how to interact with it. JSON Schema is intended to define validation, documentation, hyperlink navigation, and interaction control of JSON data. \\[[draft-zyp-json-schema-02](http://tools.ietf.org/html/draft-zyp-json-schema-02)\\]\r\n\r\nA **JSON validator** is a program that takes JSON data and, with a provided schema, will ensure that the provided JSON is structured in the way defined by the schema. This ensures that if validation has passed, the JSON instance is guaranteed to be in the expected format. It will also provide an explanation on why a particular instance failed validation.\r\n\r\n## Example\r\n\r\nHere's an example on how to validate some JSON with JSV:\r\n\r\n\tvar JSV = require(\"./jsv\").JSV;\r\n\tvar json = {};\r\n\tvar schema = {\"type\" : \"object\"};\r\n\tvar env = JSV.createEnvironment();\r\n\tvar report = env.validate(json, schema);\r\n\t\r\n\tif (report.errors.length === 0) {\r\n\t\t//JSON is valid against the schema\r\n\t}\r\n\r\nAnother example; for the following test:\r\n\r\n\tenv.validate({ a : 1 }, { type : 'object', properties : { a : { type : 'string' }} });\r\n\r\nThe generated report would look like:\r\n\r\n\t{\r\n\t\terrors : [\r\n\t\t\t{\r\n\t\t\t\tmessage : \"Instance is not a required type\",\r\n\t\t\t\turi : \"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#/a\",\r\n\t\t\t\tschemaUri : \"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#/properties/a\",\r\n\t\t\t\tattribute : \"type\",\r\n\t\t\t\tdetails : [\"string\"]\r\n\t\t\t}\r\n\t\t],\r\n\t\tvalidated : {\r\n\t\t\t\"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#\" : [\"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#\"],\r\n\t\t\t\"urn:uuid:74b843b5-3aa4-44e9-b7bc-f555936fa823#/a\" : [\"urn:uuid:837fdefe-3bd4-4993-9a20-38a6a0624d5a#/properties/a\"],\r\n\t\t\t//...\r\n\t\t},\r\n\t\tinstance : [JSONInstance object],\r\n\t\tschema : [JSONSchema object],\r\n\t\tschemaSchema : [JSONSchema object]\r\n\t}\r\n\r\n## Environments & JSON Schema support\r\n\r\nThere is no one way to validate JSON, just like there is no one way to validate XML. Even the JSON Schema specification has gone through several revisions which are not 100% backwards compatible with each other. To solve the issue of using numerous schemas already written to older specifications, JSV provides customizable environments to validate your JSON within. \r\n\r\nWhen creating an environment, you can optionally specify how you want that environment to behave. For example, this allows you to specify which version of the JSON Schema you would like the environment to behave like. JSV already provides the following environments:\r\n\r\n*\t`json-schema-draft-03`\r\n\r\n\tA complete implementation of the [third revision](http://tools.ietf.org/html/draft-zyp-json-schema-03) of the JSON Schema specification. This is the same as the second revision, except:\r\n\t\r\n\t*\t\"optional\" has been replaced by \"required\"\r\n\t*\t\"requires\" has been replaced by \"dependencies\"\r\n\t*\t\"minimumCanEqual\"/\"maximumCanEqual\" has been replaced by \"exclusiveMinimum\"/\"exclusiveMaximum\"\r\n\t*\t\"self\"/\"full\"/\"describedby\" links have been moved to the core schema, and are provided by \"id\"/\"$ref\"/\"$schema\"\r\n\t*\tAdds the attributes \"patternSchema\" and \"additionalItems\"\r\n\t*\tDeprecates the attributes \"root\" and \"alternate\"\r\n\t*\tSchemas are now versioned under the URIs \"http://json-schema.org/draft-XX/\", where XX is the draft number\r\n\t\r\n\tIn addition to this, all schemas from the previous versions of the JSON Schema draft are included in this environment, and are backwards compatible (where possible) with it's previous version.\r\n\tThis backwards compatibility can be disabled with the environment option `strict` is set to `true`.\r\n\t\r\n\tThis is currently the default environment.\r\n\r\n*\t`json-schema-draft-02`\r\n\r\n\tA complete implementation of the [second revision](http://tools.ietf.org/html/draft-zyp-json-schema-02) of the JSON Schema specification. This is the same as the first revision, except adds:\r\n\t\r\n\t*\t\"targetSchema\" attribute\r\n\t*\tslash-delimited fragment identifiers, which is now the default behavior\r\n\t\r\n*\t`json-schema-draft-01`\r\n\r\n\tA complete implementation of the [first revision](http://tools.ietf.org/html/draft-zyp-json-schema-01) of the JSON Schema specification, which is exactly the same as the [original draft](http://tools.ietf.org/html/draft-zyp-json-schema-00).\r\n\t\r\n\tUsers with JSON Schemas written for JSV < v2.1 should use this environment for it's dot-delimited fragment identifiers.\r\n\r\nEnvironments can also be customized and registered for multiple reuse. (See the section on *Extending Environments* below)\r\n\r\n## Validation API\r\n\r\nThe following methods are used to validate JSON data:\r\n\r\n### JSV.createEnvironment(*environmentID?*) *->* *<Environment>*\r\n\r\n*\t*environmentID* *<String>* *(optional)* The ID of the environment to clone a new Environment from\r\n\r\nCreates an new environment that is a copy of the Environment registered with the provided `environmentID`. If no ID is provided, the latest registered JSON Schema is used as the template.\r\n\r\nSee the above section on *Environments* for the default available Environment IDs.\r\n\r\n### *<Environment>*.validate(*json*, *schema*) *->* *<Report>*\r\n\r\n*\t*json* *<Any|JSONInstance>* The JSON data to validate\r\n*\t*schema* *<Object|JSONInstance|JSONSchema>* The schema to validate the JSON with\r\n\r\nValidates both the schema and the JSON, and returns a report of the validation.\r\n\r\n### *<Report>*.errors *<Array>*\r\n\r\nAn array of error objects from the validation process; each object represents a restriction check that failed. If the array is empty, the validation passed.\r\n\r\nThe error objects have the following schema:\r\n\r\n\t{\r\n\t\t\"type\" : \"object\",\r\n\t\t\"properties\" : {\r\n\t\t\t\"message\" : {\r\n\t\t\t\t\"description\" : \"A user-friendly error message about what failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\"\r\n\t\t\t},\r\n\t\t\t\"uri\" : {\r\n\t\t\t\t\"description\" : \"URI of the instance that failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\",\r\n\t\t\t\t\"format\" : \"uri\"\r\n\t\t\t},\r\n\t\t\t\"schemaUri\" : {\r\n\t\t\t\t\"description\" : \"URI of the schema instance that reported the error.\",\r\n\t\t\t\t\"type\" : \"string\",\r\n\t\t\t\t\"format\" : \"uri\"\r\n\t\t\t},\r\n\t\t\t\"attribute\" : {\r\n\t\t\t\t\"description\" : \"The attribute of the schema instance that failed to validate.\",\r\n\t\t\t\t\"type\" : \"string\"\r\n\t\t\t},\r\n\t\t\t\"details\" : {\r\n\t\t\t\t\"description\" : \"The value of the schema attribute that failed to validate.\",\r\n\t\t\t\t\"type\" : \"any\"\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n## API Documentation\r\n\r\nThere are many more APIs available for JSV, too many to detail here. The complete API and documentation can be found in the `docs` directory.\r\n\r\n## Extending Environments\r\n\r\nJSV provides an API for extending available schemas, adding new attributes and validation to currently existing schemas, and creating whole new Environments with unique behaviors. \r\nIn fact, in the [eat-your-own-dog-food](http://en.wikipedia.org/wiki/Eating_your_own_dog_food) approach, all the default JSON Schema environments available are implemented using this API. \r\nDetails and instruction on this feature will be provided at a later date.\r\n\r\n## Installation\r\n\r\nThe preferred method of installation is to download the latest copy from GitHub:\r\n\r\n\tgit clone git://github.com/garycourt/JSV.git\r\n\r\nIf you are using JSV within Node.js, you can quickly install it using:\r\n\r\n\tnpm install JSV\r\n\r\nThen you can reference it within your application using:\r\n\r\n\tvar JSV = require(\"JSV\").JSV;\r\n\r\n## Unit Tests\r\n\r\nOpen `tests/index.html` and `tests/index3.html` in your web browser to run the unit tests.\r\n\r\nCurrently, the unit tests can not be run in Node.js.\r\n\r\n## License\r\n\r\n\tCopyright 2010 Gary Court. All rights reserved.\r\n\t\r\n\tRedistribution and use in source and binary forms, with or without modification, are\r\n\tpermitted provided that the following conditions are met:\r\n\t\r\n\t 1. Redistributions of source code must retain the above copyright notice, this list of\r\n\t conditions and the following disclaimer.\r\n\t\r\n\t 2. Redistributions in binary form must reproduce the above copyright notice, this list\r\n\t of conditions and the following disclaimer in the documentation and/or other materials\r\n\t provided with the distribution.\r\n\t\r\n\tTHIS SOFTWARE IS PROVIDED BY GARY COURT ``AS IS'' AND ANY EXPRESS OR IMPLIED\r\n\tWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\r\n\tFITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR\r\n\tCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n\tCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n\tSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r\n\tANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r\n\tNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\r\n\tADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n\t\r\n\tThe views and conclusions contained in the software and documentation are those of the\r\n\tauthors and should not be interpreted as representing official policies, either expressed\r\n\tor implied, of Gary Court or the JSON Schema specification.", + "repositories": [ + { + "type": "git", + "url": "git://github.com/garycourt/JSV.git" + } + ], + "repository": { + "type": "git", + "url": "git://github.com/garycourt/JSV.git" + }, + "version": "4.0.2" +} diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/empty-schema.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/empty-schema.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/empty-schema.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/hyper-schema.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/hyper-schema.json new file mode 100644 index 0000000..b34e60d --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/hyper-schema.json @@ -0,0 +1,68 @@ +{ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/hyper-schema#", + + "properties" : { + "links" : { + "type" : "array", + "items" : {"$ref" : "http://json-schema.org/links#"}, + "optional" : true + }, + + "fragmentResolution" : { + "type" : "string", + "optional" : true, + "default" : "dot-delimited" + }, + + "root" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "readonly" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "pathStart" : { + "type" : "string", + "optional" : true, + "format" : "uri" + }, + + "mediaType" : { + "type" : "string", + "optional" : true, + "format" : "media-type" + }, + + "alternate" : { + "type" : "array", + "items" : {"$ref" : "#"}, + "optional" : true + } + }, + + "links" : [ + { + "href" : "{$ref}", + "rel" : "full" + }, + + { + "href" : "{$schema}", + "rel" : "describedby" + }, + + { + "href" : "{id}", + "rel" : "self" + } + ], + + "fragmentResolution" : "dot-delimited", + "extends" : {"$ref" : "http://json-schema.org/schema#"} +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/json-ref.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/json-ref.json new file mode 100644 index 0000000..35e16a8 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/json-ref.json @@ -0,0 +1,26 @@ +{ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/json-ref#", + + "items" : {"$ref" : "#"}, + "additionalProperties" : {"$ref" : "#"}, + + "links" : [ + { + "href" : "{$ref}", + "rel" : "full" + }, + + { + "href" : "{$schema}", + "rel" : "describedby" + }, + + { + "href" : "{id}", + "rel" : "self" + } + ], + + "fragmentResolution" : "dot-delimited" +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/links.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/links.json new file mode 100644 index 0000000..f27bd77 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/links.json @@ -0,0 +1,33 @@ +{ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/links#", + "type" : "object", + + "properties" : { + "href" : { + "type" : "string" + }, + + "rel" : { + "type" : "string" + }, + + "method" : { + "type" : "string", + "default" : "GET", + "optional" : true + }, + + "enctype" : { + "type" : "string", + "requires" : "method", + "optional" : true + }, + + "properties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "http://json-schema.org/hyper-schema#"}, + "optional" : true + } + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/schema.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/schema.json new file mode 100644 index 0000000..30375b4 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-01/schema.json @@ -0,0 +1,155 @@ +{ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/schema#", + "type" : "object", + + "properties" : { + "type" : { + "type" : ["string", "array"], + "items" : { + "type" : ["string", {"$ref" : "#"}] + }, + "optional" : true, + "default" : "any" + }, + + "properties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "#"}, + "optional" : true, + "default" : {} + }, + + "items" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "optional" : true, + "default" : {} + }, + + "optional" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "additionalProperties" : { + "type" : [{"$ref" : "#"}, "boolean"], + "optional" : true, + "default" : {} + }, + + "requires" : { + "type" : ["string", {"$ref" : "#"}], + "optional" : true + }, + + "minimum" : { + "type" : "number", + "optional" : true + }, + + "maximum" : { + "type" : "number", + "optional" : true + }, + + "minimumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "minimum", + "default" : true + }, + + "maximumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "maximum", + "default" : true + }, + + "minItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0 + }, + + "maxItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0 + }, + + "pattern" : { + "type" : "string", + "optional" : true, + "format" : "regex" + }, + + "minLength" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0 + }, + + "maxLength" : { + "type" : "integer", + "optional" : true + }, + + "enum" : { + "type" : "array", + "optional" : true, + "minItems" : 1 + }, + + "title" : { + "type" : "string", + "optional" : true + }, + + "description" : { + "type" : "string", + "optional" : true + }, + + "format" : { + "type" : "string", + "optional" : true + }, + + "contentEncoding" : { + "type" : "string", + "optional" : true + }, + + "default" : { + "type" : "any", + "optional" : true + }, + + "maxDecimal" : { + "type" : "integer", + "optional" : true, + "minimum" : 0 + }, + + "disallow" : { + "type" : ["string", "array"], + "items" : {"type" : "string"}, + "optional" : true + }, + + "extends" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "optional" : true, + "default" : {} + } + }, + + "optional" : true, + "default" : {} +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/empty-schema.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/empty-schema.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/empty-schema.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/hyper-schema.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/hyper-schema.json new file mode 100644 index 0000000..3806247 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/hyper-schema.json @@ -0,0 +1,68 @@ +{ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/hyper-schema#", + + "properties" : { + "links" : { + "type" : "array", + "items" : {"$ref" : "http://json-schema.org/links#"}, + "optional" : true + }, + + "fragmentResolution" : { + "type" : "string", + "optional" : true, + "default" : "slash-delimited" + }, + + "root" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "readonly" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "pathStart" : { + "type" : "string", + "optional" : true, + "format" : "uri" + }, + + "mediaType" : { + "type" : "string", + "optional" : true, + "format" : "media-type" + }, + + "alternate" : { + "type" : "array", + "items" : {"$ref" : "#"}, + "optional" : true + } + }, + + "links" : [ + { + "href" : "{$ref}", + "rel" : "full" + }, + + { + "href" : "{$schema}", + "rel" : "describedby" + }, + + { + "href" : "{id}", + "rel" : "self" + } + ], + + "fragmentResolution" : "slash-delimited", + "extends" : {"$ref" : "http://json-schema.org/schema#"} +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/json-ref.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/json-ref.json new file mode 100644 index 0000000..35e16a8 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/json-ref.json @@ -0,0 +1,26 @@ +{ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/json-ref#", + + "items" : {"$ref" : "#"}, + "additionalProperties" : {"$ref" : "#"}, + + "links" : [ + { + "href" : "{$ref}", + "rel" : "full" + }, + + { + "href" : "{$schema}", + "rel" : "describedby" + }, + + { + "href" : "{id}", + "rel" : "self" + } + ], + + "fragmentResolution" : "dot-delimited" +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/links.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/links.json new file mode 100644 index 0000000..1111280 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/links.json @@ -0,0 +1,35 @@ +{ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/links#", + "type" : "object", + + "properties" : { + "href" : { + "type" : "string" + }, + + "rel" : { + "type" : "string" + }, + + "targetSchema" : {"$ref" : "http://json-schema.org/hyper-schema#"}, + + "method" : { + "type" : "string", + "default" : "GET", + "optional" : true + }, + + "enctype" : { + "type" : "string", + "requires" : "method", + "optional" : true + }, + + "properties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "http://json-schema.org/hyper-schema#"}, + "optional" : true + } + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/schema.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/schema.json new file mode 100644 index 0000000..1562493 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-02/schema.json @@ -0,0 +1,165 @@ +{ + "$schema" : "http://json-schema.org/hyper-schema#", + "id" : "http://json-schema.org/schema#", + "type" : "object", + + "properties" : { + "type" : { + "type" : ["string", "array"], + "items" : { + "type" : ["string", {"$ref" : "#"}] + }, + "optional" : true, + "uniqueItems" : true, + "default" : "any" + }, + + "properties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "#"}, + "optional" : true, + "default" : {} + }, + + "items" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "optional" : true, + "default" : {} + }, + + "optional" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "additionalProperties" : { + "type" : [{"$ref" : "#"}, "boolean"], + "optional" : true, + "default" : {} + }, + + "requires" : { + "type" : ["string", {"$ref" : "#"}], + "optional" : true + }, + + "minimum" : { + "type" : "number", + "optional" : true + }, + + "maximum" : { + "type" : "number", + "optional" : true + }, + + "minimumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "minimum", + "default" : true + }, + + "maximumCanEqual" : { + "type" : "boolean", + "optional" : true, + "requires" : "maximum", + "default" : true + }, + + "minItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0 + }, + + "maxItems" : { + "type" : "integer", + "optional" : true, + "minimum" : 0 + }, + + "uniqueItems" : { + "type" : "boolean", + "optional" : true, + "default" : false + }, + + "pattern" : { + "type" : "string", + "optional" : true, + "format" : "regex" + }, + + "minLength" : { + "type" : "integer", + "optional" : true, + "minimum" : 0, + "default" : 0 + }, + + "maxLength" : { + "type" : "integer", + "optional" : true + }, + + "enum" : { + "type" : "array", + "optional" : true, + "minItems" : 1, + "uniqueItems" : true + }, + + "title" : { + "type" : "string", + "optional" : true + }, + + "description" : { + "type" : "string", + "optional" : true + }, + + "format" : { + "type" : "string", + "optional" : true + }, + + "contentEncoding" : { + "type" : "string", + "optional" : true + }, + + "default" : { + "type" : "any", + "optional" : true + }, + + "divisibleBy" : { + "type" : "number", + "minimum" : 0, + "minimumCanEqual" : false, + "optional" : true + }, + + "disallow" : { + "type" : ["string", "array"], + "items" : {"type" : "string"}, + "optional" : true, + "uniqueItems" : true + }, + + "extends" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "optional" : true, + "default" : {} + } + }, + + "optional" : true, + "default" : {} +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/hyper-schema.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/hyper-schema.json new file mode 100644 index 0000000..140963a --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/hyper-schema.json @@ -0,0 +1,60 @@ +{ + "$schema" : "http://json-schema.org/draft-03/hyper-schema#", + "extends" : {"$ref" : "http://json-schema.org/draft-03/schema#"}, + "id" : "http://json-schema.org/draft-03/hyper-schema#", + + "properties" : { + "links" : { + "type" : "array", + "items" : {"$ref" : "http://json-schema.org/draft-03/links#"} + }, + + "fragmentResolution" : { + "type" : "string", + "default" : "slash-delimited" + }, + + "root" : { + "type" : "boolean", + "default" : false + }, + + "readonly" : { + "type" : "boolean", + "default" : false + }, + + "contentEncoding" : { + "type" : "string" + }, + + "pathStart" : { + "type" : "string", + "format" : "uri" + }, + + "mediaType" : { + "type" : "string", + "format" : "media-type" + } + }, + + "links" : [ + { + "href" : "{id}", + "rel" : "self" + }, + + { + "href" : "{$ref}", + "rel" : "full" + }, + + { + "href" : "{$schema}", + "rel" : "describedby" + } + ], + + "fragmentResolution" : "slash-delimited" +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/json-ref.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/json-ref.json new file mode 100644 index 0000000..66e08f2 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/json-ref.json @@ -0,0 +1,26 @@ +{ + "$schema" : "http://json-schema.org/draft-03/hyper-schema#", + "id" : "http://json-schema.org/draft-03/json-ref#", + + "additionalItems" : {"$ref" : "#"}, + "additionalProperties" : {"$ref" : "#"}, + + "links" : [ + { + "href" : "{id}", + "rel" : "self" + }, + + { + "href" : "{$ref}", + "rel" : "full" + }, + + { + "href" : "{$schema}", + "rel" : "describedby" + } + ], + + "fragmentResolution" : "dot-delimited" +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/links.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/links.json new file mode 100644 index 0000000..704cc88 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/links.json @@ -0,0 +1,32 @@ +{ + "$schema" : "http://json-schema.org/draft-03/hyper-schema#", + "id" : "http://json-schema.org/draft-03/links#", + "type" : "object", + + "properties" : { + "href" : { + "type" : "string", + "required" : true, + "format" : "link-description-object-template" + }, + + "rel" : { + "type" : "string", + "required" : true + }, + + "targetSchema" : {"$ref" : "http://json-schema.org/draft-03/hyper-schema#"}, + + "method" : { + "type" : "string", + "default" : "GET" + }, + + "enctype" : { + "type" : "string", + "requires" : "method" + }, + + "schema" : {"$ref" : "http://json-schema.org/draft-03/hyper-schema#"} + } +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/schema.json b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/schema.json new file mode 100644 index 0000000..e451d56 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/schemas/json-schema-draft-03/schema.json @@ -0,0 +1,173 @@ +{ + "$schema" : "http://json-schema.org/draft-03/schema#", + "id" : "http://json-schema.org/draft-03/schema#", + "type" : "object", + + "properties" : { + "type" : { + "type" : ["string", "array"], + "items" : { + "type" : ["string", {"$ref" : "#"}] + }, + "uniqueItems" : true, + "default" : "any" + }, + + "properties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "#"}, + "default" : {} + }, + + "patternProperties" : { + "type" : "object", + "additionalProperties" : {"$ref" : "#"}, + "default" : {} + }, + + "additionalProperties" : { + "type" : [{"$ref" : "#"}, "boolean"], + "default" : {} + }, + + "items" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "default" : {} + }, + + "additionalItems" : { + "type" : [{"$ref" : "#"}, "boolean"], + "default" : {} + }, + + "required" : { + "type" : "boolean", + "default" : false + }, + + "dependencies" : { + "type" : "object", + "additionalProperties" : { + "type" : ["string", "array", {"$ref" : "#"}], + "items" : { + "type" : "string" + } + }, + "default" : {} + }, + + "minimum" : { + "type" : "number" + }, + + "maximum" : { + "type" : "number" + }, + + "exclusiveMinimum" : { + "type" : "boolean", + "default" : false + }, + + "exclusiveMaximum" : { + "type" : "boolean", + "default" : false + }, + + "minItems" : { + "type" : "integer", + "minimum" : 0, + "default" : 0 + }, + + "maxItems" : { + "type" : "integer", + "minimum" : 0 + }, + + "uniqueItems" : { + "type" : "boolean", + "default" : false + }, + + "pattern" : { + "type" : "string", + "format" : "regex" + }, + + "minLength" : { + "type" : "integer", + "minimum" : 0, + "default" : 0 + }, + + "maxLength" : { + "type" : "integer" + }, + + "enum" : { + "type" : "array", + "minItems" : 1, + "uniqueItems" : true + }, + + "default" : { + "type" : "any" + }, + + "title" : { + "type" : "string" + }, + + "description" : { + "type" : "string" + }, + + "format" : { + "type" : "string" + }, + + "divisibleBy" : { + "type" : "number", + "minimum" : 0, + "exclusiveMinimum" : true + }, + + "disallow" : { + "type" : ["string", "array"], + "items" : { + "type" : ["string", {"$ref" : "#"}] + }, + "uniqueItems" : true + }, + + "extends" : { + "type" : [{"$ref" : "#"}, "array"], + "items" : {"$ref" : "#"}, + "default" : {} + }, + + "id" : { + "type" : "string", + "format" : "uri" + }, + + "$ref" : { + "type" : "string", + "format" : "uri" + }, + + "$schema" : { + "type" : "string", + "format" : "uri" + } + }, + + "dependencies" : { + "exclusiveMinimum" : "minimum", + "exclusiveMaximum" : "maximum" + }, + + "default" : {} +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/tests/index.html b/html/RentForCamp/node_modules/JSV/tests/index.html new file mode 100644 index 0000000..d216473 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/tests/index.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + +

JSON Schema Validator Test Suite

+

+
+

+
    + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/tests/index3.html b/html/RentForCamp/node_modules/JSV/tests/index3.html new file mode 100644 index 0000000..793eb20 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/tests/index3.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +

    JSON Schema Validator Test Suite

    +

    +
    +

    +
      + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/tests/index3b.html b/html/RentForCamp/node_modules/JSV/tests/index3b.html new file mode 100644 index 0000000..90d8908 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/tests/index3b.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + +

      JSON Schema Validator Tests by dougtreder

      +

      +
      +

      +
        + + \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/tests/qunit.css b/html/RentForCamp/node_modules/JSV/tests/qunit.css new file mode 100644 index 0000000..a2e183d --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/tests/qunit.css @@ -0,0 +1,118 @@ +ol#qunit-tests { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + margin:0; + padding:0; + list-style-position:inside; + + font-size: smaller; +} +ol#qunit-tests li{ + padding:0.4em 0.5em 0.4em 2.5em; + border-bottom:1px solid #fff; + font-size:small; + list-style-position:inside; +} +ol#qunit-tests li ol{ + box-shadow: inset 0px 2px 13px #999; + -moz-box-shadow: inset 0px 2px 13px #999; + -webkit-box-shadow: inset 0px 2px 13px #999; + margin-top:0.5em; + margin-left:0; + padding:0.5em; + background-color:#fff; + border-radius:15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; +} +ol#qunit-tests li li{ + border-bottom:none; + margin:0.5em; + background-color:#fff; + list-style-position: inside; + padding:0.4em 0.5em 0.4em 0.5em; +} + +ol#qunit-tests li li.pass{ + border-left:26px solid #C6E746; + background-color:#fff; + color:#5E740B; + } +ol#qunit-tests li li.fail{ + border-left:26px solid #EE5757; + background-color:#fff; + color:#710909; +} +ol#qunit-tests li.pass{ + background-color:#D2E0E6; + color:#528CE0; +} +ol#qunit-tests li.fail{ + background-color:#EE5757; + color:#000; +} +ol#qunit-tests li strong { + cursor:pointer; +} +h1#qunit-header{ + background-color:#0d3349; + margin:0; + padding:0.5em 0 0.5em 1em; + color:#fff; + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + border-top-right-radius:15px; + border-top-left-radius:15px; + -moz-border-radius-topright:15px; + -moz-border-radius-topleft:15px; + -webkit-border-top-right-radius:15px; + -webkit-border-top-left-radius:15px; + text-shadow: rgba(0, 0, 0, 0.5) 4px 4px 1px; +} +h2#qunit-banner{ + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + height:5px; + margin:0; + padding:0; +} +h2#qunit-banner.qunit-pass{ + background-color:#C6E746; +} +h2#qunit-banner.qunit-fail, #qunit-testrunner-toolbar { + background-color:#EE5757; +} +#qunit-testrunner-toolbar { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + padding:0; + /*width:80%;*/ + padding:0em 0 0.5em 2em; + font-size: small; +} +h2#qunit-userAgent { + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + background-color:#2b81af; + margin:0; + padding:0; + color:#fff; + font-size: small; + padding:0.5em 0 0.5em 2.5em; + text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; +} +p#qunit-testresult{ + font-family:"Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial; + margin:0; + font-size: small; + color:#2b81af; + border-bottom-right-radius:15px; + border-bottom-left-radius:15px; + -moz-border-radius-bottomright:15px; + -moz-border-radius-bottomleft:15px; + -webkit-border-bottom-right-radius:15px; + -webkit-border-bottom-left-radius:15px; + background-color:#D2E0E6; + padding:0.5em 0.5em 0.5em 2.5em; +} +strong b.fail{ + color:#710909; + } +strong b.pass{ + color:#5E740B; + } \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/tests/qunit.js b/html/RentForCamp/node_modules/JSV/tests/qunit.js new file mode 100644 index 0000000..1d064d9 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/tests/qunit.js @@ -0,0 +1,1042 @@ +/* + * QUnit - A JavaScript Unit Testing Framework + * + * http://docs.jquery.com/QUnit + * + * Copyright (c) 2009 John Resig, Jörn Zaefferer + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + */ + +(function(window) { + +var QUnit = { + + // Initialize the configuration options + init: function() { + config = { + stats: { all: 0, bad: 0 }, + moduleStats: { all: 0, bad: 0 }, + started: +new Date, + blocking: false, + autorun: false, + assertions: [], + filters: [], + queue: [] + }; + + var tests = id("qunit-tests"), + banner = id("qunit-banner"), + result = id("qunit-testresult"); + + if ( tests ) { + tests.innerHTML = ""; + } + + if ( banner ) { + banner.className = ""; + } + + if ( result ) { + result.parentNode.removeChild( result ); + } + }, + + // call on start of module test to prepend name to all tests + module: function(name, testEnvironment) { + config.currentModule = name; + + synchronize(function() { + if ( config.currentModule ) { + QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); + } + + config.currentModule = name; + config.moduleTestEnvironment = testEnvironment; + config.moduleStats = { all: 0, bad: 0 }; + + QUnit.moduleStart( name, testEnvironment ); + }); + }, + + asyncTest: function(testName, expected, callback) { + if ( arguments.length === 2 ) { + callback = expected; + expected = 0; + } + + QUnit.test(testName, expected, callback, true); + }, + + test: function(testName, expected, callback, async) { + var name = testName, testEnvironment, testEnvironmentArg; + + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + // is 2nd argument a testEnvironment? + if ( expected && typeof expected === 'object') { + testEnvironmentArg = expected; + expected = null; + } + + if ( config.currentModule ) { + name = config.currentModule + " module: " + name; + } + + if ( !validTest(name) ) { + return; + } + + synchronize(function() { + QUnit.testStart( testName ); + + testEnvironment = extend({ + setup: function() {}, + teardown: function() {} + }, config.moduleTestEnvironment); + if (testEnvironmentArg) { + extend(testEnvironment,testEnvironmentArg); + } + + // allow utility functions to access the current test environment + QUnit.current_testEnvironment = testEnvironment; + + config.assertions = []; + config.expected = expected; + + try { + if ( !config.pollution ) { + saveGlobal(); + } + + testEnvironment.setup.call(testEnvironment); + } catch(e) { + QUnit.ok( false, "Setup failed on " + name + ": " + e.message ); + } + + if ( async ) { + QUnit.stop(); + } + + try { + callback.call(testEnvironment); + } catch(e) { + fail("Test " + name + " died, exception and test follows", e, callback); + QUnit.ok( false, "Died on test #" + (config.assertions.length + 1) + ": " + e.message ); + // else next test will carry the responsibility + saveGlobal(); + + // Restart the tests if they're blocking + if ( config.blocking ) { + start(); + } + } + }); + + synchronize(function() { + try { + checkPollution(); + testEnvironment.teardown.call(testEnvironment); + } catch(e) { + QUnit.ok( false, "Teardown failed on " + name + ": " + e.message ); + } + + try { + QUnit.reset(); + } catch(e) { + fail("reset() failed, following Test " + name + ", exception and reset fn follows", e, reset); + } + + if ( config.expected && config.expected != config.assertions.length ) { + QUnit.ok( false, "Expected " + config.expected + " assertions, but " + config.assertions.length + " were run" ); + } + + var good = 0, bad = 0, + tests = id("qunit-tests"); + + config.stats.all += config.assertions.length; + config.moduleStats.all += config.assertions.length; + + if ( tests ) { + var ol = document.createElement("ol"); + ol.style.display = "none"; + + for ( var i = 0; i < config.assertions.length; i++ ) { + var assertion = config.assertions[i]; + + var li = document.createElement("li"); + li.className = assertion.result ? "pass" : "fail"; + li.appendChild(document.createTextNode(assertion.message || "(no message)")); + ol.appendChild( li ); + + if ( assertion.result ) { + good++; + } else { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + + var b = document.createElement("strong"); + b.innerHTML = name + " (" + bad + ", " + good + ", " + config.assertions.length + ")"; + + addEvent(b, "click", function() { + var next = b.nextSibling, display = next.style.display; + next.style.display = display === "none" ? "block" : "none"; + }); + + addEvent(b, "dblclick", function(e) { + var target = e && e.target ? e.target : window.event.srcElement; + if ( target.nodeName.toLowerCase() === "strong" ) { + var text = "", node = target.firstChild; + + while ( node.nodeType === 3 ) { + text += node.nodeValue; + node = node.nextSibling; + } + + text = text.replace(/(^\s*|\s*$)/g, ""); + + if ( window.location ) { + window.location.href = window.location.href.match(/^(.+?)(\?.*)?$/)[1] + "?" + encodeURIComponent(text); + } + } + }); + + var li = document.createElement("li"); + li.className = bad ? "fail" : "pass"; + li.appendChild( b ); + li.appendChild( ol ); + tests.appendChild( li ); + + if ( bad ) { + var toolbar = id("qunit-testrunner-toolbar"); + if ( toolbar ) { + toolbar.style.display = "block"; + id("qunit-filter-pass").disabled = null; + id("qunit-filter-missing").disabled = null; + } + } + + } else { + for ( var i = 0; i < config.assertions.length; i++ ) { + if ( !config.assertions[i].result ) { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + } + + QUnit.testDone( testName, bad, config.assertions.length ); + + if ( !window.setTimeout && !config.queue.length ) { + done(); + } + }); + + if ( window.setTimeout && !config.doneTimer ) { + config.doneTimer = window.setTimeout(function(){ + if ( !config.queue.length ) { + done(); + } else { + synchronize( done ); + } + }, 13); + } + }, + + /** + * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. + */ + expect: function(asserts) { + config.expected = asserts; + }, + + /** + * Asserts true. + * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); + */ + ok: function(a, msg) { + QUnit.log(a, msg); + + config.assertions.push({ + result: !!a, + message: msg + }); + }, + + /** + * Checks that the first two arguments are equal, with an optional message. + * Prints out both actual and expected values. + * + * Prefered to ok( actual == expected, message ) + * + * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." ); + * + * @param Object actual + * @param Object expected + * @param String message (optional) + */ + equal: function(actual, expected, message) { + push(expected == actual, actual, expected, message); + }, + + notEqual: function(actual, expected, message) { + push(expected != actual, actual, expected, message); + }, + + deepEqual: function(a, b, message) { + push(QUnit.equiv(a, b), a, b, message); + }, + + notDeepEqual: function(a, b, message) { + push(!QUnit.equiv(a, b), a, b, message); + }, + + strictEqual: function(actual, expected, message) { + push(expected === actual, actual, expected, message); + }, + + notStrictEqual: function(actual, expected, message) { + push(expected !== actual, actual, expected, message); + }, + + start: function() { + // A slight delay, to avoid any current callbacks + if ( window.setTimeout ) { + window.setTimeout(function() { + if ( config.timeout ) { + clearTimeout(config.timeout); + } + + config.blocking = false; + process(); + }, 13); + } else { + config.blocking = false; + process(); + } + }, + + stop: function(timeout) { + config.blocking = true; + + if ( timeout && window.setTimeout ) { + config.timeout = window.setTimeout(function() { + QUnit.ok( false, "Test timed out" ); + QUnit.start(); + }, timeout); + } + }, + + /** + * Resets the test setup. Useful for tests that modify the DOM. + */ + reset: function() { + if ( window.jQuery ) { + jQuery("#main").html( config.fixture ); + jQuery.event.global = {}; + jQuery.ajaxSettings = extend({}, config.ajaxSettings); + } + }, + + /** + * Trigger an event on an element. + * + * @example triggerEvent( document.body, "click" ); + * + * @param DOMElement elem + * @param String type + */ + triggerEvent: function( elem, type, event ) { + if ( document.createEvent ) { + event = document.createEvent("MouseEvents"); + event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, + 0, 0, 0, 0, 0, false, false, false, false, 0, null); + elem.dispatchEvent( event ); + + } else if ( elem.fireEvent ) { + elem.fireEvent("on"+type); + } + }, + + // Safe object type checking + is: function( type, obj ) { + return Object.prototype.toString.call( obj ) === "[object "+ type +"]"; + }, + + // Logging callbacks + done: function(failures, total) {}, + log: function(result, message) {}, + testStart: function(name) {}, + testDone: function(name, failures, total) {}, + moduleStart: function(name, testEnvironment) {}, + moduleDone: function(name, failures, total) {} +}; + +// Backwards compatibility, deprecated +QUnit.equals = QUnit.equal; +QUnit.same = QUnit.deepEqual; + +// Maintain internal state +var config = { + // The queue of tests to run + queue: [], + + // block until document ready + blocking: true +}; + +// Load paramaters +(function() { + var location = window.location || { search: "", protocol: "file:" }, + GETParams = location.search.slice(1).split('&'); + + for ( var i = 0; i < GETParams.length; i++ ) { + GETParams[i] = decodeURIComponent( GETParams[i] ); + if ( GETParams[i] === "noglobals" ) { + GETParams.splice( i, 1 ); + i--; + config.noglobals = true; + } else if ( GETParams[i].search('=') > -1 ) { + GETParams.splice( i, 1 ); + i--; + } + } + + // restrict modules/tests by get parameters + config.filters = GETParams; + + // Figure out if we're running the tests from a server or not + QUnit.isLocal = !!(location.protocol === 'file:'); +})(); + +// Expose the API as global variables, unless an 'exports' +// object exists, in that case we assume we're in CommonJS +if ( typeof exports === "undefined" || typeof require === "undefined" ) { + extend(window, QUnit); + window.QUnit = QUnit; +} else { + extend(exports, QUnit); + exports.QUnit = QUnit; +} + +if ( typeof document === "undefined" || document.readyState === "complete" ) { + config.autorun = true; +} + +addEvent(window, "load", function() { + // Initialize the config, saving the execution queue + var oldconfig = extend({}, config); + QUnit.init(); + extend(config, oldconfig); + + config.blocking = false; + + var userAgent = id("qunit-userAgent"); + if ( userAgent ) { + userAgent.innerHTML = navigator.userAgent; + } + + var toolbar = id("qunit-testrunner-toolbar"); + if ( toolbar ) { + toolbar.style.display = "none"; + + var filter = document.createElement("input"); + filter.type = "checkbox"; + filter.id = "qunit-filter-pass"; + filter.disabled = true; + addEvent( filter, "click", function() { + var li = document.getElementsByTagName("li"); + for ( var i = 0; i < li.length; i++ ) { + if ( li[i].className.indexOf("pass") > -1 ) { + li[i].style.display = filter.checked ? "none" : ""; + } + } + }); + toolbar.appendChild( filter ); + + var label = document.createElement("label"); + label.setAttribute("for", "qunit-filter-pass"); + label.innerHTML = "Hide passed tests"; + toolbar.appendChild( label ); + + var missing = document.createElement("input"); + missing.type = "checkbox"; + missing.id = "qunit-filter-missing"; + missing.disabled = true; + addEvent( missing, "click", function() { + var li = document.getElementsByTagName("li"); + for ( var i = 0; i < li.length; i++ ) { + if ( li[i].className.indexOf("fail") > -1 && li[i].innerHTML.indexOf('missing test - untested code is broken code') > - 1 ) { + li[i].parentNode.parentNode.style.display = missing.checked ? "none" : "block"; + } + } + }); + toolbar.appendChild( missing ); + + label = document.createElement("label"); + label.setAttribute("for", "qunit-filter-missing"); + label.innerHTML = "Hide missing tests (untested code is broken code)"; + toolbar.appendChild( label ); + } + + var main = id('main'); + if ( main ) { + config.fixture = main.innerHTML; + } + + if ( window.jQuery ) { + config.ajaxSettings = window.jQuery.ajaxSettings; + } + + QUnit.start(); +}); + +function done() { + if ( config.doneTimer && window.clearTimeout ) { + window.clearTimeout( config.doneTimer ); + config.doneTimer = null; + } + + if ( config.queue.length ) { + config.doneTimer = window.setTimeout(function(){ + if ( !config.queue.length ) { + done(); + } else { + synchronize( done ); + } + }, 13); + + return; + } + + config.autorun = true; + + // Log the last module results + if ( config.currentModule ) { + QUnit.moduleDone( config.currentModule, config.moduleStats.bad, config.moduleStats.all ); + } + + var banner = id("qunit-banner"), + tests = id("qunit-tests"), + html = ['Tests completed in ', + +new Date - config.started, ' milliseconds.
        ', + '', config.stats.all - config.stats.bad, ' tests of ', config.stats.all, ' passed, ', config.stats.bad,' failed.'].join(''); + + if ( banner ) { + banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass"); + } + + if ( tests ) { + var result = id("qunit-testresult"); + + if ( !result ) { + result = document.createElement("p"); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests.nextSibling ); + } + + result.innerHTML = html; + } + + QUnit.done( config.stats.bad, config.stats.all ); +} + +function validTest( name ) { + var i = config.filters.length, + run = false; + + if ( !i ) { + return true; + } + + while ( i-- ) { + var filter = config.filters[i], + not = filter.charAt(0) == '!'; + + if ( not ) { + filter = filter.slice(1); + } + + if ( name.indexOf(filter) !== -1 ) { + return !not; + } + + if ( not ) { + run = true; + } + } + + return run; +} + +function push(result, actual, expected, message) { + message = message || (result ? "okay" : "failed"); + QUnit.ok( result, result ? message + ": " + expected : message + ", expected: " + QUnit.jsDump.parse(expected) + " result: " + QUnit.jsDump.parse(actual) ); +} + +function synchronize( callback ) { + config.queue.push( callback ); + + if ( config.autorun && !config.blocking ) { + process(); + } +} + +function process() { + while ( config.queue.length && !config.blocking ) { + config.queue.shift()(); + } +} + +function saveGlobal() { + config.pollution = []; + + if ( config.noglobals ) { + for ( var key in window ) { + config.pollution.push( key ); + } + } +} + +function checkPollution( name ) { + var old = config.pollution; + saveGlobal(); + + var newGlobals = diff( old, config.pollution ); + if ( newGlobals.length > 0 ) { + ok( false, "Introduced global variable(s): " + newGlobals.join(", ") ); + config.expected++; + } + + var deletedGlobals = diff( config.pollution, old ); + if ( deletedGlobals.length > 0 ) { + ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") ); + config.expected++; + } +} + +// returns a new Array with the elements that are in a but not in b +function diff( a, b ) { + var result = a.slice(); + for ( var i = 0; i < result.length; i++ ) { + for ( var j = 0; j < b.length; j++ ) { + if ( result[i] === b[j] ) { + result.splice(i, 1); + i--; + break; + } + } + } + return result; +} + +function fail(message, exception, callback) { + if ( typeof console !== "undefined" && console.error && console.warn ) { + console.error(message); + console.error(exception); + console.warn(callback.toString()); + + } else if ( window.opera && opera.postError ) { + opera.postError(message, exception, callback.toString); + } +} + +function extend(a, b) { + for ( var prop in b ) { + a[prop] = b[prop]; + } + + return a; +} + +function addEvent(elem, type, fn) { + if ( elem.addEventListener ) { + elem.addEventListener( type, fn, false ); + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, fn ); + } else { + fn(); + } +} + +function id(name) { + return !!(typeof document !== "undefined" && document && document.getElementById) && + document.getElementById( name ); +} + +// Test for equality any JavaScript type. +// Discussions and reference: http://philrathe.com/articles/equiv +// Test suites: http://philrathe.com/tests/equiv +// Author: Philippe Rathé +QUnit.equiv = function () { + + var innerEquiv; // the real equiv function + var callers = []; // stack to decide between skip/abort functions + + + // Determine what is o. + function hoozit(o) { + if (QUnit.is("String", o)) { + return "string"; + + } else if (QUnit.is("Boolean", o)) { + return "boolean"; + + } else if (QUnit.is("Number", o)) { + + if (isNaN(o)) { + return "nan"; + } else { + return "number"; + } + + } else if (typeof o === "undefined") { + return "undefined"; + + // consider: typeof null === object + } else if (o === null) { + return "null"; + + // consider: typeof [] === object + } else if (QUnit.is( "Array", o)) { + return "array"; + + // consider: typeof new Date() === object + } else if (QUnit.is( "Date", o)) { + return "date"; + + // consider: /./ instanceof Object; + // /./ instanceof RegExp; + // typeof /./ === "function"; // => false in IE and Opera, + // true in FF and Safari + } else if (QUnit.is( "RegExp", o)) { + return "regexp"; + + } else if (typeof o === "object") { + return "object"; + + } else if (QUnit.is( "Function", o)) { + return "function"; + } else { + return undefined; + } + } + + // Call the o related callback with the given arguments. + function bindCallbacks(o, callbacks, args) { + var prop = hoozit(o); + if (prop) { + if (hoozit(callbacks[prop]) === "function") { + return callbacks[prop].apply(callbacks, args); + } else { + return callbacks[prop]; // or undefined + } + } + } + + var callbacks = function () { + + // for string, boolean, number and null + function useStrictEquality(b, a) { + if (b instanceof a.constructor || a instanceof b.constructor) { + // to catch short annotaion VS 'new' annotation of a declaration + // e.g. var i = 1; + // var j = new Number(1); + return a == b; + } else { + return a === b; + } + } + + return { + "string": useStrictEquality, + "boolean": useStrictEquality, + "number": useStrictEquality, + "null": useStrictEquality, + "undefined": useStrictEquality, + + "nan": function (b) { + return isNaN(b); + }, + + "date": function (b, a) { + return hoozit(b) === "date" && a.valueOf() === b.valueOf(); + }, + + "regexp": function (b, a) { + return hoozit(b) === "regexp" && + a.source === b.source && // the regex itself + a.global === b.global && // and its modifers (gmi) ... + a.ignoreCase === b.ignoreCase && + a.multiline === b.multiline; + }, + + // - skip when the property is a method of an instance (OOP) + // - abort otherwise, + // initial === would have catch identical references anyway + "function": function () { + var caller = callers[callers.length - 1]; + return caller !== Object && + typeof caller !== "undefined"; + }, + + "array": function (b, a) { + var i; + var len; + + // b could be an object literal here + if ( ! (hoozit(b) === "array")) { + return false; + } + + len = a.length; + if (len !== b.length) { // safe and faster + return false; + } + for (i = 0; i < len; i++) { + if ( ! innerEquiv(a[i], b[i])) { + return false; + } + } + return true; + }, + + "object": function (b, a) { + var i; + var eq = true; // unless we can proove it + var aProperties = [], bProperties = []; // collection of strings + + // comparing constructors is more strict than using instanceof + if ( a.constructor !== b.constructor) { + return false; + } + + // stack constructor before traversing properties + callers.push(a.constructor); + + for (i in a) { // be strict: don't ensures hasOwnProperty and go deep + + aProperties.push(i); // collect a's properties + + if ( ! innerEquiv(a[i], b[i])) { + eq = false; + } + } + + callers.pop(); // unstack, we are done + + for (i in b) { + bProperties.push(i); // collect b's properties + } + + // Ensures identical properties name + return eq && innerEquiv(aProperties.sort(), bProperties.sort()); + } + }; + }(); + + innerEquiv = function () { // can take multiple arguments + var args = Array.prototype.slice.apply(arguments); + if (args.length < 2) { + return true; // end transition + } + + return (function (a, b) { + if (a === b) { + return true; // catch the most you can + } else if (a === null || b === null || typeof a === "undefined" || typeof b === "undefined" || hoozit(a) !== hoozit(b)) { + return false; // don't lose time with error prone cases + } else { + return bindCallbacks(a, callbacks, [b, a]); + } + + // apply transition with (1..n) arguments + })(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length -1)); + }; + + return innerEquiv; + +}(); + +/** + * jsDump + * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com + * Licensed under BSD (http://www.opensource.org/licenses/bsd-license.php) + * Date: 5/15/2008 + * @projectDescription Advanced and extensible data dumping for Javascript. + * @version 1.0.0 + * @author Ariel Flesler + * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} + */ +QUnit.jsDump = (function() { + function quote( str ) { + return '"' + str.toString().replace(/"/g, '\\"') + '"'; + }; + function literal( o ) { + return o + ''; + }; + function join( pre, arr, post ) { + var s = jsDump.separator(), + base = jsDump.indent(), + inner = jsDump.indent(1); + if ( arr.join ) + arr = arr.join( ',' + s + inner ); + if ( !arr ) + return pre + post; + return [ pre, inner + arr, base + post ].join(s); + }; + function array( arr ) { + var i = arr.length, ret = Array(i); + this.up(); + while ( i-- ) + ret[i] = this.parse( arr[i] ); + this.down(); + return join( '[', ret, ']' ); + }; + + var reName = /^function (\w+)/; + + var jsDump = { + parse:function( obj, type ) { //type is used mostly internally, you can fix a (custom)type in advance + var parser = this.parsers[ type || this.typeOf(obj) ]; + type = typeof parser; + + return type == 'function' ? parser.call( this, obj ) : + type == 'string' ? parser : + this.parsers.error; + }, + typeOf:function( obj ) { + var type; + if ( obj === null ) { + type = "null"; + } else if (typeof obj === "undefined") { + type = "undefined"; + } else if (QUnit.is("RegExp", obj)) { + type = "regexp"; + } else if (QUnit.is("Date", obj)) { + type = "date"; + } else if (QUnit.is("Function", obj)) { + type = "function"; + } else if (QUnit.is("Array", obj)) { + type = "array"; + } else if (QUnit.is("Window", obj) || QUnit.is("global", obj)) { + type = "window"; + } else if (QUnit.is("HTMLDocument", obj)) { + type = "document"; + } else if (QUnit.is("HTMLCollection", obj) || QUnit.is("NodeList", obj)) { + type = "nodelist"; + } else if (/^\[object HTML/.test(Object.prototype.toString.call( obj ))) { + type = "node"; + } else { + type = typeof obj; + } + return type; + }, + separator:function() { + return this.multiline ? this.HTML ? '
        ' : '\n' : this.HTML ? ' ' : ' '; + }, + indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing + if ( !this.multiline ) + return ''; + var chr = this.indentChar; + if ( this.HTML ) + chr = chr.replace(/\t/g,' ').replace(/ /g,' '); + return Array( this._depth_ + (extra||0) ).join(chr); + }, + up:function( a ) { + this._depth_ += a || 1; + }, + down:function( a ) { + this._depth_ -= a || 1; + }, + setParser:function( name, parser ) { + this.parsers[name] = parser; + }, + // The next 3 are exposed so you can use them + quote:quote, + literal:literal, + join:join, + // + _depth_: 1, + // This is the list of parsers, to modify them, use jsDump.setParser + parsers:{ + window: '[Window]', + document: '[Document]', + error:'[ERROR]', //when no parser is found, shouldn't happen + unknown: '[Unknown]', + 'null':'null', + undefined:'undefined', + 'function':function( fn ) { + var ret = 'function', + name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE + if ( name ) + ret += ' ' + name; + ret += '('; + + ret = [ ret, this.parse( fn, 'functionArgs' ), '){'].join(''); + return join( ret, this.parse(fn,'functionCode'), '}' ); + }, + array: array, + nodelist: array, + arguments: array, + object:function( map ) { + var ret = [ ]; + this.up(); + for ( var key in map ) + ret.push( this.parse(key,'key') + ': ' + this.parse(map[key]) ); + this.down(); + return join( '{', ret, '}' ); + }, + node:function( node ) { + var open = this.HTML ? '<' : '<', + close = this.HTML ? '>' : '>'; + + var tag = node.nodeName.toLowerCase(), + ret = open + tag; + + for ( var a in this.DOMAttrs ) { + var val = node[this.DOMAttrs[a]]; + if ( val ) + ret += ' ' + a + '=' + this.parse( val, 'attribute' ); + } + return ret + close + open + '/' + tag + close; + }, + functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function + var l = fn.length; + if ( !l ) return ''; + + var args = Array(l); + while ( l-- ) + args[l] = String.fromCharCode(97+l);//97 is 'a' + return ' ' + args.join(', ') + ' '; + }, + key:quote, //object calls it internally, the key part of an item in a map + functionCode:'[code]', //function calls it internally, it's the content of the function + attribute:quote, //node calls it internally, it's an html attribute value + string:quote, + date:quote, + regexp:literal, //regex + number:literal, + 'boolean':literal + }, + DOMAttrs:{//attributes to dump from nodes, name=>realName + id:'id', + name:'name', + 'class':'className' + }, + HTML:true,//if true, entities are escaped ( <, >, \t, space and \n ) + indentChar:' ',//indentation unit + multiline:true //if true, items in a collection, are separated by a \n, else just a space. + }; + + return jsDump; +})(); + +})(this); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/tests/tests.js b/html/RentForCamp/node_modules/JSV/tests/tests.js new file mode 100644 index 0000000..9a17461 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/tests/tests.js @@ -0,0 +1,452 @@ +var env, + ENVIRONMENTS = [ + "json-schema-draft-01", + "json-schema-draft-02" + ], + curEnvId; + +//calls ok(true) if no error is thrown +function okNoError(func, msg) { + try { + func(); + ok(true, msg); + } catch (e) { + ok(false, msg + ': ' + e); + } +} + +//calls ok(true) if an error is thrown +function okError(func, msg) { + try { + func(); + ok(false, msg); + } catch (e) { + ok(true, msg + ': ' + e); + } +} + +// +// +// Tests +// +// + +for (curEnvId = 0; curEnvId < ENVIRONMENTS.length; ++curEnvId) { + +module(ENVIRONMENTS[curEnvId]); + +(function (id) { +test("Acquire Validator", function () { + JSV = require('../lib/jsv').JSV; + env = null; + + ok(JSV, "JSV is loaded"); + + env = JSV.createEnvironment(id); + + ok(env, id + " environment created"); +}); +}(ENVIRONMENTS[curEnvId])); + +test("Primitive Validation", function () { + equal(env.validate({}).errors.length, 0, "Object"); + equal(env.validate([]).errors.length, 0, "Array"); + equal(env.validate('').errors.length, 0, "String"); + equal(env.validate(00).errors.length, 0, "Number"); + equal(env.validate(false).errors.length, 0, "Boolean"); + equal(env.validate(null).errors.length, 0, "Null"); +}); + +test("Type Validation", function () { + //simple type + equal(env.validate({}, { type : 'object' }).errors.length, 0, "Object"); + equal(env.validate([], { type : 'array' }).errors.length, 0, "Array"); + equal(env.validate('', { type : 'string' }).errors.length, 0, "String"); + equal(env.validate(00, { type : 'number' }).errors.length, 0, "Number"); + equal(env.validate(00, { type : 'integer' }).errors.length, 0, "Integer"); + equal(env.validate(false, { type : 'boolean' }).errors.length, 0, "Boolean"); + equal(env.validate(null, { type : 'null' }).errors.length, 0, "Null"); + equal(env.validate(true, { type : 'any' }).errors.length, 0, "Any"); + + notEqual(env.validate(null, { type : 'object' }).errors.length, 0, "Object"); + notEqual(env.validate(null, { type : 'array' }).errors.length, 0, "Array"); + notEqual(env.validate(null, { type : 'string' }).errors.length, 0, "String"); + notEqual(env.validate(null, { type : 'number' }).errors.length, 0, "Number"); + notEqual(env.validate(0.1, { type : 'integer' }).errors.length, 0, "Integer"); + notEqual(env.validate(null, { type : 'boolean' }).errors.length, 0, "Boolean"); + notEqual(env.validate(false, { type : 'null' }).errors.length, 0, "Null"); + + //union type + equal(env.validate({}, { type : ['null', 'boolean', 'number', 'integer', 'string', 'array', 'object'] }).errors.length, 0, "Object"); + notEqual(env.validate({}, { type : ['null', 'boolean', 'number', 'integer', 'string', 'array'] }).errors.length, 0, "Object"); + + //schema union type + equal(env.validate({}, { type : [{ type : 'string' }, { type : 'object' }] }).errors.length, 0, "Object"); + equal(env.validate(55, { type : [{ type : 'string' }, { type : 'object' }, 'number'] }).errors.length, 0, "Object"); + notEqual(env.validate([], { type : ['string', { type : 'object' }] }).errors.length, 0, "Array"); +}); + +test("Properties Validation", function () { + equal(env.validate({}, { type : 'object', properties : {} }).errors.length, 0); + equal(env.validate({ a : 1 }, { type : 'object', properties : { a : {}} }).errors.length, 0); + equal(env.validate({ a : 1 }, { type : 'object', properties : { a : { type : 'number' }} }).errors.length, 0); + equal(env.validate({ a : { b : 'two' } }, { type : 'object', properties : { a : { type : 'object', properties : { b : { type : 'string' } } }} }).errors.length, 0); +}); + +test("Items Validation", function () { + equal(env.validate([], { type : 'array', items : { type : 'string' } }).errors.length, 0); + equal(env.validate(['foo'], { type : 'array', items : { type : 'string' } }).errors.length, 0); + equal(env.validate(['foo', 2], { type : 'array', items : [{ type : 'string' }, { type : 'number' }] }).errors.length, 0); + + notEqual(env.validate([1], { type : 'array', items : { type : 'string' } }).errors.length, 0); + notEqual(env.validate(['foo', 'two'], { type : 'array', items : [{ type : 'string' }, { type : 'number' }] }).errors.length, 0); +}); + +test("Optional Validation", function () { + equal(env.validate({}, { properties : { a : { optional : true } } }).errors.length, 0); + equal(env.validate({ a : false }, { properties : { a : { optional : true } } }).errors.length, 0); + equal(env.validate({ a : false }, { properties : { a : { optional : false } } }).errors.length, 0); + + notEqual(env.validate({}, { properties : { a : { optional : false } } }).errors.length, 0); + notEqual(env.validate({ b : true }, { properties : { a : { optional : false } } }).errors.length, 0); + notEqual(env.validate({ b : true }, { properties : { a : {} } }).errors.length, 0); +}); + +test("AdditionalProperties Validation", function () { + //object tests + equal(env.validate({ a : 1, b : 2, c : 3 }, {}).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { additionalProperties : true }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {} }, additionalProperties : true }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {}, c : {} }, additionalProperties : false }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { additionalProperties : { type : 'number' } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {} }, additionalProperties : { type : 'number' } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {}, c : {} }, additionalProperties : { type : 'string' } }).errors.length, 0); + + notEqual(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {} }, additionalProperties : false }).errors.length, 0); + notEqual(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {} }, additionalProperties : { type : 'string' } }).errors.length, 0); + + //array tests + equal(env.validate([1, 2, 3], {}).errors.length, 0); + equal(env.validate([1, 2, 3], { additionalProperties : true }).errors.length, 0); + equal(env.validate([1, 2, 3], { additionalProperties : false }).errors.length, 0); + equal(env.validate([1, 2, 3], { additionalProperties : { type : 'number' } }).errors.length, 0); + equal(env.validate([1, 2, 3], { additionalProperties : { type : 'string' } }).errors.length, 0); + equal(env.validate(['1', '2'], { items : { type : 'string' }, additionalProperties : false }).errors.length, 0); + equal(env.validate(['1', '2'], { items : [ { type : 'string' }, { type : 'string' } ], additionalProperties : false }).errors.length, 0); + equal(env.validate(['1', '2', 3], { items : [ { type : 'string' }, { type : 'string' } ], additionalProperties : { type : 'number' } }).errors.length, 0); + equal(env.validate(['1', '2', '3'], { items : [ { type : 'string' }, { type : 'string' }, { type : 'string' } ], additionalProperties : { type : 'number' } }).errors.length, 0); + + notEqual(env.validate(['1', '2', '3'], { items : [ { type : 'string' }, { type : 'string' } ], additionalProperties : false }).errors.length, 0); + notEqual(env.validate(['1', '2', '3'], { items : [ { type : 'string' }, { type : 'string' } ], additionalProperties : { type : 'number' } }).errors.length, 0); +}); + +test("Requires Validation", function () { + equal(env.validate({ a : 1 }, { properties : { a : { requires : 'a' } } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { properties : { a : {}, b : { requires : 'a' } } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { properties : { a : { requires : 'b' }, b : { requires : 'a' } } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { properties : { b : { requires : { properties : { a : { type : 'number' } } } } } }).errors.length, 0); + + notEqual(env.validate({ b : 2 }, { properties : { b : { requires : 'a' } } }).errors.length, 0); + notEqual(env.validate({ a : 1, b : 2 }, { properties : { a : { requires : 'b' }, b : { requires : 'c' } } }).errors.length, 0); + notEqual(env.validate({ b : 2 }, { properties : { b : { requires : { properties : { b : { type : 'string' } } } } } }).errors.length, 0); +}); + +test("Minimum/Maximum Validation", function () { + equal(env.validate(0, {}).errors.length, 0); + equal(env.validate(1, { minimum : 1, maximum : 10 }).errors.length, 0); + equal(env.validate(5, { minimum : 1, maximum : 10 }).errors.length, 0); + equal(env.validate(10, { minimum : 1, maximum : 10 }).errors.length, 0); + equal(env.validate(1, { minimum : 1, maximum : 1 }).errors.length, 0); + + notEqual(env.validate(0, { minimum : 1, maximum : 10 }).errors.length, 0); + notEqual(env.validate(11, { minimum : 1, maximum : 10 }).errors.length, 0); +}); + +test("MinimumCanEqual/MaximumCanEqual Validation", function () { + //true + notEqual(env.validate(0, { minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); //illegal + equal(env.validate(1, { minimum : 1, maximum : 10, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + equal(env.validate(5, { minimum : 1, maximum : 10, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + equal(env.validate(10, { minimum : 1, maximum : 10, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + equal(env.validate(1, { minimum : 1, maximum : 1, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + + notEqual(env.validate(0, { minimum : 1, maximum : 10, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + notEqual(env.validate(11, { minimum : 1, maximum : 10, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + + //false + notEqual(env.validate(0, { minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); //illegal + equal(env.validate(1.0001, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + equal(env.validate(5, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + equal(env.validate(9.9999, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + + notEqual(env.validate(1, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + notEqual(env.validate(10, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + notEqual(env.validate(1, { minimum : 1, maximum : 1, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + notEqual(env.validate(0, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + notEqual(env.validate(11, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); +}); + +test("MinItems/MaxItems Validation", function () { + equal(env.validate([], {}).errors.length, 0); + equal(env.validate([1], { minItems : 1, maxItems : 1 }).errors.length, 0); + equal(env.validate([1], { minItems : 1, maxItems : 3 }).errors.length, 0); + equal(env.validate([1, 2], { minItems : 1, maxItems : 3 }).errors.length, 0); + equal(env.validate([1, 2, 3], { minItems : 1, maxItems : 3 }).errors.length, 0); + + notEqual(env.validate([], { minItems : 1, maxItems : 0 }).errors.length, 0); + notEqual(env.validate([], { minItems : 1, maxItems : 3 }).errors.length, 0); + notEqual(env.validate([1, 2, 3, 4], { minItems : 1, maxItems : 3 }).errors.length, 0); +}); + +if (curEnvId >= 1) { +test("UniqueItems Validation", function () { + equal(env.validate([], {}).errors.length, 0); + equal(env.validate([], { uniqueItems : true }).errors.length, 0); + equal(env.validate([null], { uniqueItems : true }).errors.length, 0); + equal(env.validate([true, false], { uniqueItems : true }).errors.length, 0); + equal(env.validate([1, 2, 3], { uniqueItems : true }).errors.length, 0); + equal(env.validate(['a', 'b'], { uniqueItems : true }).errors.length, 0); + equal(env.validate([[], []], { uniqueItems : true }).errors.length, 0); + equal(env.validate([{}, {}], { uniqueItems : true }).errors.length, 0); + + notEqual(env.validate([null, null], { uniqueItems : true }).errors.length, 0); + notEqual(env.validate([false, false], { uniqueItems : true }).errors.length, 0); + notEqual(env.validate([1, 2, 1], { uniqueItems : true }).errors.length, 0); + notEqual(env.validate(['a', 'b', 'b'], { uniqueItems : true }).errors.length, 0); +}); +} + +test("Pattern Validation", function () { + equal(env.validate('', {}).errors.length, 0); + equal(env.validate('', { pattern : '^$' }).errors.length, 0); + equal(env.validate('today', { pattern : 'day' }).errors.length, 0); + + notEqual(env.validate('', { pattern : '^ $' }).errors.length, 0); + notEqual(env.validate('today', { pattern : 'dam' }).errors.length, 0); + notEqual(env.validate('aaaaa', { pattern : 'aa(a' }).errors.length, 0); +}); + +test("MinLength/MaxLength Validation", function () { + equal(env.validate('', {}).errors.length, 0); + equal(env.validate('1', { minLength : 1, maxLength : 1 }).errors.length, 0); + equal(env.validate('1', { minLength : 1, maxLength : 3 }).errors.length, 0); + equal(env.validate('12', { minLength : 1, maxLength : 3 }).errors.length, 0); + equal(env.validate('123', { minLength : 1, maxLength : 3 }).errors.length, 0); + + notEqual(env.validate('', { minLength : 1, maxLength : 0 }).errors.length, 0); + notEqual(env.validate('', { minLength : 1, maxLength : 3 }).errors.length, 0); + notEqual(env.validate('1234', { minLength : 1, maxLength : 3 }).errors.length, 0); +}); + +test("Enum Validation", function () { + equal(env.validate(null, {}).errors.length, 0); + equal(env.validate(true, { 'enum' : [false, true] }).errors.length, 0); + equal(env.validate(2, { 'enum' : [1, 2, 3] }).errors.length, 0); + equal(env.validate('a', { 'enum' : ['a'] }).errors.length, 0); + equal(env.validate({}, { 'properties' : { 'a' : { 'enum' : ['a'], 'optional' : true } } }).errors.length, 0); + + notEqual(env.validate(true, { 'enum' : ['false', 'true'] }).errors.length, 0); + notEqual(env.validate(4, { 'enum' : [1, 2, 3, '4'] }).errors.length, 0); + notEqual(env.validate('', { 'enum' : [] }).errors.length, 0); + notEqual(env.validate({}, { 'properties' : { 'a' : { 'enum' : ['a'] } } }).errors.length, 0); +}); + +test("Format Validation", function () { + //TODO +}); + +if (curEnvId === 0) { +test("MaxDecimal Validation", function () { + equal(env.validate(0, {}).errors.length, 0); + equal(env.validate(0, { maxDecimal : 0 }).errors.length, 0); + equal(env.validate(0, { maxDecimal : 1 }).errors.length, 0); + equal(env.validate(0.22, { maxDecimal : 2 }).errors.length, 0); + equal(env.validate(0.33, { maxDecimal : 3 }).errors.length, 0); + + notEqual(env.validate(0.1, { maxDecimal : 0 }).errors.length, 0); + notEqual(env.validate(0.111, { maxDecimal : 1 }).errors.length, 0); +}); +} + +if (curEnvId >= 1) { +test("DivisibleBy Validation", function () { + equal(env.validate(0, {}).errors.length, 0); + equal(env.validate(0, { divisibleBy : 1 }).errors.length, 0); + equal(env.validate(10, { divisibleBy : 5 }).errors.length, 0); + equal(env.validate(10, { divisibleBy : 10 }).errors.length, 0); + equal(env.validate(0, { divisibleBy : 2.5 }).errors.length, 0); + equal(env.validate(5, { divisibleBy : 2.5 }).errors.length, 0); + equal(env.validate(7.5, { divisibleBy : 2.5 }).errors.length, 0); + + notEqual(env.validate(0, { divisibleBy : 0 }).errors.length, 0); + notEqual(env.validate(7, { divisibleBy : 5 }).errors.length, 0); + notEqual(env.validate(4.5, { divisibleBy : 2 }).errors.length, 0); + notEqual(env.validate(7.5, { divisibleBy : 1.8 }).errors.length, 0); +}); +} + +test("Disallow Validation", function () { + equal(env.validate({}, { disallow : ['null', 'boolean', 'number', 'integer', 'string', 'array'] }).errors.length, 0, "Object"); + equal(env.validate([], { disallow : ['null', 'boolean', 'number', 'integer', 'string', 'object'] }).errors.length, 0, "Array"); + equal(env.validate('', { disallow : ['null', 'boolean', 'number', 'integer', 'array', 'object'] }).errors.length, 0, "String"); + equal(env.validate(0.1, { disallow : ['null', 'boolean', 'integer', 'string', 'array', 'object'] }).errors.length, 0, "Number"); + equal(env.validate(00, { disallow : ['null', 'boolean', 'string', 'array', 'object'] }).errors.length, 0, "Integer"); + equal(env.validate(false, { disallow : ['null', 'number', 'integer', 'string', 'array', 'object'] }).errors.length, 0, "Boolean"); + equal(env.validate(null, { disallow : ['boolean', 'number', 'integer', 'string', 'array', 'object'] }).errors.length, 0, "Null"); + + notEqual(env.validate({}, { disallow : 'object' }).errors.length, 0, "Object"); + notEqual(env.validate([], { disallow : 'array' }).errors.length, 0, "Array"); + notEqual(env.validate('', { disallow : 'string' }).errors.length, 0, "String"); + notEqual(env.validate(00, { disallow : 'integer' }).errors.length, 0, "Number"); + notEqual(env.validate(0.1, { disallow : 'number' }).errors.length, 0, "Integer"); + notEqual(env.validate(false, { disallow : 'boolean' }).errors.length, 0, "Boolean"); + notEqual(env.validate(null, { disallow : 'null' }).errors.length, 0, "Null"); + notEqual(env.validate(null, { disallow : 'any' }).errors.length, 0, "Any"); +}); + +test("Extends Validation", function () { + equal(env.validate({}, { 'extends' : {} }).errors.length, 0); + equal(env.validate({}, { 'extends' : { type : 'object' } }).errors.length, 0); + equal(env.validate(1, { type : 'integer', 'extends' : { type : 'number' } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { properties : { a : { type : 'number' } }, additionalProperties : false, 'extends' : { properties : { b : { type : 'number' } } } }).errors.length, 0); + + notEqual(env.validate(1, { type : 'number', 'extends' : { type : 'string' } }).errors.length, 0); + + //TODO: More tests +}); + +test("JSON Schema Validation", function () { + var schema = env.findSchema("http://json-schema.org/schema"); + var hyperSchema = env.findSchema("http://json-schema.org/hyper-schema"); + var links = env.findSchema("http://json-schema.org/links"); + + equal(schema.validate(schema).errors.length, 0, "schema.validate(schema)"); + equal(hyperSchema.validate(schema).errors.length, 0, "hyperSchema.validate(schema)"); + equal(hyperSchema.validate(hyperSchema).errors.length, 0, "hyperSchema.validate(hyperSchema)"); + equal(hyperSchema.validate(links).errors.length, 0, "hyperSchema.validate(links)"); +}); + +test("Links Validation", function () { + var schema; + //full + equal(env.validate({ 'a' : {} }, { 'type' : 'object', 'additionalProperties' : { '$ref' : '#' } }).errors.length, 0); + notEqual(env.validate({ 'a' : 1 }, { 'type' : 'object', 'additionalProperties' : { '$ref' : '#' } }).errors.length, 0); + + //describedby + schema = env.createSchema({ "id" : "http://test.example.com/3", "properties" : { "test" : { "type" : "object" } }, "extends" : { "$ref" : "http://json-schema.org/hyper-schema" } }, null, "http://test.example.com/3"); + equal(env.validate({}, { "$schema" : "http://test.example.com/3", "test" : {} }).errors.length, 0); + notEqual(env.validate({}, { "$schema" : "http://test.example.com/3", "test" : 0 }).errors.length, 0); + + //self + schema = env.createSchema({ "properties" : { "two" : { "id" : "http://test.example.com/2", "type" : "object" } } }, null, "http://not.example.com/2"); + equal(env.validate({}, { "$ref" : "http://test.example.com/2" }).errors.length, 0); + notEqual(env.validate(null, { "$ref" : "http://test.example.com/2" }).errors.length, 0); + + //links api + schema = env.createSchema({ "links" : [ { "rel" : "bar", "href" : "http:{-this}#" } ] }); + instance = env.createInstance("foo"); + equal(schema.getLink("bar", instance), "http:foo#", "'bar' link and self reference"); +}); + +test("PathStart Validation", function () { + var instance = env.createInstance({}, "http://test.example.com/4"), + schema = env.createSchema({"pathStart" : "http://test.example.com"}); + + equal(env.validate(instance, schema).errors.length, 0); + + instance = env.createInstance({}); //random URI + + notEqual(env.validate(instance, schema).errors.length, 0); +}); + +test("Register Schemas", function () { + var schema = env.createSchema({'type' : 'string'}, null, 'http://test.example.com/1'); + equal(env.findSchema('http://json-schema.org/hyper-schema').validate(schema).errors.length, 0); + equal(env.validate('', { '$ref' : 'http://test.example.com/1' }).errors.length, 0); + notEqual(env.validate({}, { '$ref' : 'http://test.example.com/1' }).errors.length, 0); +}); + +test("Complex Examples", function () { + //example 1 + var schema = env.createSchema({ + "id":"Common#", + "type":"object", + "properties":{ + "!":{"type":"string","enum":["Common"]} + }, + "additionalProperties":false + }, undefined, "Common#"); + + var report = env.validate({ + "!" : "List", + "list" : [ + { + "!" : "Text", + "common" : {"!":"NotCommon"} + } + ], + "common" : {"!":"Common"} + }, + + { + "properties":{ + "!":{"type":"string","enum":["List"]}, + "list":{ + "type":"array", + "items":{ + "type":[ + { + "type":"object", + "properties":{ + "!":{"type":"string","enum":["Music"]}, + "common":{"$ref":"Common#"} + } + }, + { + "type":"object", + "properties":{ + "!":{"type":"string","enum":["Text"]}, + "common":{"$ref":"Common#"} + } + } + ] + } + }, + + "common":{"$ref":"Common#"} + } + } + ); + + notEqual(report.errors.length, 0, "example 1"); + + //example 2 + schema = env.createSchema({ + "extends": { + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1, + "pattern": "^\\S.+\\S$" + } + } + }, + "properties": { + "role": { + "extends": { + "type": "string", + "minLength": 1, + "pattern": "^\\S.+\\S$" + }, + "description": "some description" + } + } + }); + + report = env.validate({ "id" : "some id", "role" : "yunowork?"}, schema); + + equal(report.errors.length, 0, "example 2"); +}); + +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/tests/tests3.js b/html/RentForCamp/node_modules/JSV/tests/tests3.js new file mode 100644 index 0000000..9353c47 --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/tests/tests3.js @@ -0,0 +1,567 @@ +var env, + DRAFTS = [ + "draft-00", + "draft-01", + "draft-02", + "draft-03" + ], + curDraftId; + +//calls ok(true) if no error is thrown +function okNoError(func, msg) { + try { + func(); + ok(true, msg); + } catch (e) { + ok(false, msg + ': ' + JSON.stringify(e)); + } +} + +//calls ok(true) if an error is thrown +function okError(func, msg) { + try { + func(); + ok(false, msg); + } catch (e) { + ok(true, msg + ': ' + JSON.stringify(e)); + } +} + +// +// +// Tests +// +// + +for (curDraftId = 0; curDraftId < DRAFTS.length; ++curDraftId) { + +module(DRAFTS[curDraftId]); + +(function (id) { +test("Acquire Validator", function () { + JSV = require('../lib/jsv').JSV; + env = null; + + ok(JSV, "JSV is loaded"); + + env = JSV.createEnvironment("json-schema-draft-03"); + + env.setOption("defaultSchemaURI", "http://json-schema.org/" + id + "/hyper-schema#"); + env.setOption("latestJSONSchemaSchemaURI", "http://json-schema.org/" + id + "/schema#"); + env.setOption("latestJSONSchemaHyperSchemaURI", "http://json-schema.org/" + id + "/hyper-schema#"); + env.setOption("latestJSONSchemaLinksURI", "http://json-schema.org/" + id + "/links#"); + + ok(env, "Environment created"); + +}); +}(DRAFTS[curDraftId])); + +test("Primitive Validation", function () { + equal(env.validate({}).errors.length, 0, "Object"); + equal(env.validate([]).errors.length, 0, "Array"); + equal(env.validate('').errors.length, 0, "String"); + equal(env.validate(00).errors.length, 0, "Number"); + equal(env.validate(false).errors.length, 0, "Boolean"); + equal(env.validate(null).errors.length, 0, "Null"); +}); + +test("Type Validation", function () { + //simple type + equal(env.validate({}, { type : 'object' }).errors.length, 0, "Object"); + equal(env.validate([], { type : 'array' }).errors.length, 0, "Array"); + equal(env.validate('', { type : 'string' }).errors.length, 0, "String"); + equal(env.validate(00, { type : 'number' }).errors.length, 0, "Number"); + equal(env.validate(00, { type : 'integer' }).errors.length, 0, "Integer"); + equal(env.validate(false, { type : 'boolean' }).errors.length, 0, "Boolean"); + equal(env.validate(null, { type : 'null' }).errors.length, 0, "Null"); + equal(env.validate(true, { type : 'any' }).errors.length, 0, "Any"); + + notEqual(env.validate(null, { type : 'object' }).errors.length, 0, "Object"); + notEqual(env.validate(null, { type : 'array' }).errors.length, 0, "Array"); + notEqual(env.validate(null, { type : 'string' }).errors.length, 0, "String"); + notEqual(env.validate(null, { type : 'number' }).errors.length, 0, "Number"); + notEqual(env.validate(0.1, { type : 'integer' }).errors.length, 0, "Integer"); + notEqual(env.validate(null, { type : 'boolean' }).errors.length, 0, "Boolean"); + notEqual(env.validate(false, { type : 'null' }).errors.length, 0, "Null"); + + //union type + equal(env.validate({}, { type : ['null', 'boolean', 'number', 'integer', 'string', 'array', 'object'] }).errors.length, 0, "Object"); + notEqual(env.validate({}, { type : ['null', 'boolean', 'number', 'integer', 'string', 'array'] }).errors.length, 0, "Object"); + + //schema union type + equal(env.validate({}, { type : [{ type : 'string' }, { type : 'object' }] }).errors.length, 0, "Object"); + equal(env.validate(55, { type : [{ type : 'string' }, { type : 'object' }, 'number'] }).errors.length, 0, "Object"); + notEqual(env.validate([], { type : ['string', { type : 'object' }] }).errors.length, 0, "Array"); +}); + +test("Properties Validation", function () { + equal(env.validate({}, { type : 'object', properties : {} }).errors.length, 0); + equal(env.validate({ a : 1 }, { type : 'object', properties : { a : {}} }).errors.length, 0); + equal(env.validate({ a : 1 }, { type : 'object', properties : { a : { type : 'number' }} }).errors.length, 0); + equal(env.validate({ a : { b : 'two' } }, { type : 'object', properties : { a : { type : 'object', properties : { b : { type : 'string' } } }} }).errors.length, 0); + + notEqual(env.validate({ a : 1 }, { type : 'object', properties : { a : { type : 'string' }} }).errors.length, 0); + notEqual(env.validate({ a : { b : 'two' } }, { type : 'object', properties : { a : { type : 'object', properties : { b : { type : 'number' } } }} }).errors.length, 0); +}); + +if (curDraftId > 2) { +test("PatternProperties Validation", function () { + equal(env.validate(null, { patternProperties : {} }).errors.length, 0); + equal(env.validate({}, { patternProperties : {} }).errors.length, 0); + equal(env.validate({ a : 1 }, { patternProperties : { '[a-z]' : {}} }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, cc : '3' }, { patternProperties : { '^[a-z]$' : { type : 'number' }} }).errors.length, 0); + equal(env.validate({ a : { b : 'two' } }, { patternProperties : { '[a-z]' : { patternProperties : { '[a-z]' : { type : 'string' } } }} }).errors.length, 0); + + notEqual(env.validate({ a : 1, b : 2, c : '3' }, { patternProperties : { '^[a-z]$' : { type : 'number' }} }).errors.length, 0); + notEqual(env.validate({ a : { b : 'two' } }, { patternProperties : { '[a-z]' : { patternProperties : { '[a-z]' : { type : 'number' } } }} }).errors.length, 0); +}); +} + +test("AdditionalProperties Validation", function () { + //object tests + equal(env.validate({ a : 1, b : 2, c : 3 }, {}).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { additionalProperties : true }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {} }, additionalProperties : true }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {}, c : {} }, additionalProperties : false }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { additionalProperties : { type : 'number' } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {} }, additionalProperties : { type : 'number' } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {}, c : {} }, additionalProperties : { type : 'string' } }).errors.length, 0); + + notEqual(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {} }, additionalProperties : false }).errors.length, 0); + notEqual(env.validate({ a : 1, b : 2, c : 3 }, { properties : { a : {}, b : {} }, additionalProperties : { type : 'string' } }).errors.length, 0); + + //array tests + equal(env.validate([1, 2, 3], {}).errors.length, 0); + equal(env.validate([1, 2, 3], { additionalProperties : true }).errors.length, 0); + equal(env.validate([1, 2, 3], { additionalProperties : false }).errors.length, 0); + equal(env.validate([1, 2, 3], { additionalProperties : { type : 'number' } }).errors.length, 0); + equal(env.validate([1, 2, 3], { additionalProperties : { type : 'string' } }).errors.length, 0); + equal(env.validate(['1', '2'], { items : { type : 'string' }, additionalProperties : false }).errors.length, 0); + equal(env.validate(['1', '2'], { items : [ { type : 'string' }, { type : 'string' } ], additionalProperties : false }).errors.length, 0); + equal(env.validate(['1', '2', 3], { items : [ { type : 'string' }, { type : 'string' } ], additionalProperties : { type : 'number' } }).errors.length, 0); + equal(env.validate(['1', '2', '3'], { items : [ { type : 'string' }, { type : 'string' }, { type : 'string' } ], additionalProperties : { type : 'number' } }).errors.length, 0); + + if (curDraftId < 3) { + notEqual(env.validate(['1', '2', '3'], { items : [ { type : 'string' }, { type : 'string' } ], additionalProperties : false }).errors.length, 0); + notEqual(env.validate(['1', '2', '3'], { items : [ { type : 'string' }, { type : 'string' } ], additionalProperties : { type : 'number' } }).errors.length, 0); + } +}); + +test("Items Validation", function () { + equal(env.validate([], { type : 'array', items : { type : 'string' } }).errors.length, 0); + equal(env.validate(['foo'], { type : 'array', items : { type : 'string' } }).errors.length, 0); + equal(env.validate(['foo', 2], { type : 'array', items : [{ type : 'string' }, { type : 'number' }] }).errors.length, 0); + + notEqual(env.validate([1], { type : 'array', items : { type : 'string' } }).errors.length, 0); + notEqual(env.validate(['foo', 'two'], { type : 'array', items : [{ type : 'string' }, { type : 'number' }] }).errors.length, 0); +}); + +if (curDraftId > 2) { +test("AdditionalItems Validation", function () { + //array tests + equal(env.validate([1, 2, 3], {}).errors.length, 0); + equal(env.validate([1, 2, 3], { additionalItems : true }).errors.length, 0); + equal(env.validate([1, 2, 3], { additionalItems : { type : 'number' } }).errors.length, 0); + equal(env.validate(['1', '2'], { items : { type : 'string' }, additionalItems : false }).errors.length, 0); + equal(env.validate(['1', '2'], { items : [ { type : 'string' }, { type : 'string' } ], additionalItems : false }).errors.length, 0); + equal(env.validate(['1', '2', 3], { items : [ { type : 'string' }, { type : 'string' } ], additionalItems : { type : 'number' } }).errors.length, 0); + equal(env.validate(['1', '2', '3'], { items : [ { type : 'string' }, { type : 'string' }, { type : 'string' } ], additionalItems : { type : 'number' } }).errors.length, 0); + + notEqual(env.validate([1, 2, 3], { additionalItems : false }).errors.length, 0); + notEqual(env.validate([1, 2, 3], { additionalItems : { type : 'string' } }).errors.length, 0); + notEqual(env.validate(['1', '2', '3'], { items : [ { type : 'string' }, { type : 'string' } ], additionalItems : false }).errors.length, 0); + notEqual(env.validate(['1', '2', '3'], { items : [ { type : 'string' }, { type : 'string' } ], additionalItems : { type : 'number' } }).errors.length, 0); +}); +} + +(function (curDraftId) { +test("Optional Validation", function () { + equal(env.validate({}, { properties : { a : { optional : true } } }).errors.length, 0); + equal(env.validate({ a : false }, { properties : { a : { optional : true } } }).errors.length, 0); + equal(env.validate({ a : false }, { properties : { a : { optional : false } } }).errors.length, 0); + + notEqual(env.validate({}, { properties : { a : { optional : false } } }).errors.length, 0); + notEqual(env.validate({ b : true }, { properties : { a : { optional : false } } }).errors.length, 0); + if (curDraftId < 3) { + notEqual(env.validate({ b : true }, { properties : { a : {} } }).errors.length, 0); + } else { + equal(env.validate({ b : true }, { properties : { a : {} } }).errors.length, 0); + } +}); +}(curDraftId)); + +if (curDraftId > 2) { +test("Required Validation", function () { + equal(env.validate({ b : true }, { properties : { a : {} } }).errors.length, 0); + equal(env.validate({}, { properties : { a : { required : false } } }).errors.length, 0); + equal(env.validate({ a : false }, { properties : { a : { required : false } } }).errors.length, 0); + equal(env.validate({ a : false }, { properties : { a : { required : true } } }).errors.length, 0); + + notEqual(env.validate({}, { properties : { a : { required : true } } }).errors.length, 0); + notEqual(env.validate({ b : true }, { properties : { a : { required : true } } }).errors.length, 0); +}); +} + +test("Requires Validation", function () { + equal(env.validate({ a : 1 }, { properties : { a : { requires : 'a' } } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { properties : { a : {}, b : { requires : 'a' } } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { properties : { a : { requires : 'b' }, b : { requires : 'a' } } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { properties : { b : { requires : { properties : { a : { type : 'number' } } } } } }).errors.length, 0); + + notEqual(env.validate({ b : 2 }, { properties : { b : { requires : 'a' } } }).errors.length, 0); + notEqual(env.validate({ a : 1, b : 2 }, { properties : { a : { requires : 'b' }, b : { requires : 'c' } } }).errors.length, 0); + notEqual(env.validate({ b : 2 }, { properties : { b : { requires : { properties : { b : { type : 'string' } } } } } }).errors.length, 0); +}); + +if (curDraftId > 2) { +test("Dependencies Validation", function () { + equal(env.validate(null, { dependencies : {} }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { dependencies : {} }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { dependencies : { a : 'b' } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { dependencies : { c : 'd' } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2, c : 3 }, { dependencies : { a : ['b'], b : ['a', 'c'] } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { dependencies : { a : { properties : { b : { type : 'number', required : true } } } } }).errors.length, 0); + + notEqual(env.validate({ a : 1, b : 2 }, { dependencies : { a : 'c' } }).errors.length, 0); + notEqual(env.validate({ a : 1, b : 2, c : 3 }, { dependencies : { a : ['b'], b : ['a', 'd'] } }).errors.length, 0); + notEqual(env.validate({ a : 1, b : 2 }, { dependencies : { a : { properties : { b : { type : 'string', required : true } } } } }).errors.length, 0); +}); +} + +test("Minimum/Maximum Validation", function () { + equal(env.validate(0, {}).errors.length, 0); + equal(env.validate(1, { minimum : 1, maximum : 10 }).errors.length, 0); + equal(env.validate(5, { minimum : 1, maximum : 10 }).errors.length, 0); + equal(env.validate(10, { minimum : 1, maximum : 10 }).errors.length, 0); + equal(env.validate(1, { minimum : 1, maximum : 1 }).errors.length, 0); + + notEqual(env.validate(0, { minimum : 1, maximum : 10 }).errors.length, 0); + notEqual(env.validate(11, { minimum : 1, maximum : 10 }).errors.length, 0); +}); + +test("MinimumCanEqual/MaximumCanEqual Validation", function () { + //true + notEqual(env.validate(0, { minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); //illegal + equal(env.validate(1, { minimum : 1, maximum : 10, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + equal(env.validate(5, { minimum : 1, maximum : 10, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + equal(env.validate(10, { minimum : 1, maximum : 10, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + equal(env.validate(1, { minimum : 1, maximum : 1, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + + notEqual(env.validate(0, { minimum : 1, maximum : 10, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + notEqual(env.validate(11, { minimum : 1, maximum : 10, minimumCanEqual : true, maximumCanEqual : true }).errors.length, 0); + + //false + notEqual(env.validate(0, { minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); //illegal + equal(env.validate(1.0001, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + equal(env.validate(5, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + equal(env.validate(9.9999, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + + notEqual(env.validate(1, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + notEqual(env.validate(10, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + notEqual(env.validate(1, { minimum : 1, maximum : 1, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + notEqual(env.validate(0, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); + notEqual(env.validate(11, { minimum : 1, maximum : 10, minimumCanEqual : false, maximumCanEqual : false }).errors.length, 0); +}); + +if (curDraftId > 2) { +test("ExclusiveMinimum/ExclusiveMaximum Validation", function () { + //true + notEqual(env.validate(0, { exclusiveMinimum : false, exclusiveMaximum : false }).errors.length, 0); //illegal + equal(env.validate(1, { minimum : 1, maximum : 10, exclusiveMinimum : false, exclusiveMaximum : false }).errors.length, 0); + equal(env.validate(5, { minimum : 1, maximum : 10, exclusiveMinimum : false, exclusiveMaximum : false }).errors.length, 0); + equal(env.validate(10, { minimum : 1, maximum : 10, exclusiveMinimum : false, exclusiveMaximum : false }).errors.length, 0); + equal(env.validate(1, { minimum : 1, maximum : 1, exclusiveMinimum : false, exclusiveMaximum : false }).errors.length, 0); + + notEqual(env.validate(0, { minimum : 1, maximum : 10, exclusiveMinimum : false, exclusiveMaximum : false }).errors.length, 0); + notEqual(env.validate(11, { minimum : 1, maximum : 10, exclusiveMinimum : false, exclusiveMaximum : false }).errors.length, 0); + + //false + notEqual(env.validate(0, { exclusiveMinimum : true, exclusiveMaximum : true }).errors.length, 0); //illegal + equal(env.validate(1.0001, { minimum : 1, maximum : 10, exclusiveMinimum : true, exclusiveMaximum : true }).errors.length, 0); + equal(env.validate(5, { minimum : 1, maximum : 10, exclusiveMinimum : true, exclusiveMaximum : true }).errors.length, 0); + equal(env.validate(9.9999, { minimum : 1, maximum : 10, exclusiveMinimum : true, exclusiveMaximum : true }).errors.length, 0); + + notEqual(env.validate(1, { minimum : 1, maximum : 10, exclusiveMinimum : true, exclusiveMaximum : true }).errors.length, 0); + notEqual(env.validate(10, { minimum : 1, maximum : 10, exclusiveMinimum : true, exclusiveMaximum : true }).errors.length, 0); + notEqual(env.validate(1, { minimum : 1, maximum : 1, exclusiveMinimum : true, exclusiveMaximum : true }).errors.length, 0); + notEqual(env.validate(0, { minimum : 1, maximum : 10, exclusiveMinimum : true, exclusiveMaximum : true }).errors.length, 0); + notEqual(env.validate(11, { minimum : 1, maximum : 10, exclusiveMinimum : true, exclusiveMaximum : true }).errors.length, 0); +}); +} + +test("MinItems/MaxItems Validation", function () { + equal(env.validate([], {}).errors.length, 0); + equal(env.validate([1], { minItems : 1, maxItems : 1 }).errors.length, 0); + equal(env.validate([1], { minItems : 1, maxItems : 3 }).errors.length, 0); + equal(env.validate([1, 2], { minItems : 1, maxItems : 3 }).errors.length, 0); + equal(env.validate([1, 2, 3], { minItems : 1, maxItems : 3 }).errors.length, 0); + + notEqual(env.validate([], { minItems : 1, maxItems : 0 }).errors.length, 0); + notEqual(env.validate([], { minItems : 1, maxItems : 3 }).errors.length, 0); + notEqual(env.validate([1, 2, 3, 4], { minItems : 1, maxItems : 3 }).errors.length, 0); +}); + +if (curDraftId > 1) { +test("UniqueItems Validation", function () { + equal(env.validate([], {}).errors.length, 0); + equal(env.validate([], { uniqueItems : true }).errors.length, 0); + equal(env.validate([null], { uniqueItems : true }).errors.length, 0); + equal(env.validate([true, false], { uniqueItems : true }).errors.length, 0); + equal(env.validate([1, 2, 3], { uniqueItems : true }).errors.length, 0); + equal(env.validate(['a', 'b'], { uniqueItems : true }).errors.length, 0); + equal(env.validate([[], []], { uniqueItems : true }).errors.length, 0); + equal(env.validate([{}, {}], { uniqueItems : true }).errors.length, 0); + + notEqual(env.validate([null, null], { uniqueItems : true }).errors.length, 0); + notEqual(env.validate([false, false], { uniqueItems : true }).errors.length, 0); + notEqual(env.validate([1, 2, 1], { uniqueItems : true }).errors.length, 0); + notEqual(env.validate(['a', 'b', 'b'], { uniqueItems : true }).errors.length, 0); +}); +} + +test("Pattern Validation", function () { + equal(env.validate('', {}).errors.length, 0); + equal(env.validate('', { pattern : '^$' }).errors.length, 0); + equal(env.validate('today', { pattern : 'day' }).errors.length, 0); + + notEqual(env.validate('', { pattern : '^ $' }).errors.length, 0); + notEqual(env.validate('today', { pattern : 'dam' }).errors.length, 0); + notEqual(env.validate('aaaaa', { pattern : 'aa(a' }).errors.length, 0); +}); + +test("MinLength/MaxLength Validation", function () { + equal(env.validate('', {}).errors.length, 0); + equal(env.validate('1', { minLength : 1, maxLength : 1 }).errors.length, 0); + equal(env.validate('1', { minLength : 1, maxLength : 3 }).errors.length, 0); + equal(env.validate('12', { minLength : 1, maxLength : 3 }).errors.length, 0); + equal(env.validate('123', { minLength : 1, maxLength : 3 }).errors.length, 0); + + notEqual(env.validate('', { minLength : 1, maxLength : 0 }).errors.length, 0); + notEqual(env.validate('', { minLength : 1, maxLength : 3 }).errors.length, 0); + notEqual(env.validate('1234', { minLength : 1, maxLength : 3 }).errors.length, 0); +}); + +test("Enum Validation", function () { + equal(env.validate(null, {}).errors.length, 0); + equal(env.validate(true, { 'enum' : [false, true] }).errors.length, 0); + equal(env.validate(2, { 'enum' : [1, 2, 3] }).errors.length, 0); + equal(env.validate('a', { 'enum' : ['a'] }).errors.length, 0); + equal(env.validate({}, { 'properties' : { 'a' : { 'enum' : ['a'], 'optional' : true, 'required' : false } } }).errors.length, 0); + + notEqual(env.validate(true, { 'enum' : ['false', 'true'] }).errors.length, 0); + notEqual(env.validate(4, { 'enum' : [1, 2, 3, '4'] }).errors.length, 0); + notEqual(env.validate('', { 'enum' : [] }).errors.length, 0); + notEqual(env.validate({}, { 'properties' : { 'a' : { 'enum' : ['a'], 'optional' : false, 'required' : true } } }).errors.length, 0); +}); + +test("Format Validation", function () { + //TODO +}); + +test("MaxDecimal Validation", function () { + equal(env.validate(0, {}).errors.length, 0); + equal(env.validate(0, { maxDecimal : 0 }).errors.length, 0); + equal(env.validate(0, { maxDecimal : 1 }).errors.length, 0); + equal(env.validate(0.22, { maxDecimal : 2 }).errors.length, 0); + equal(env.validate(0.33, { maxDecimal : 3 }).errors.length, 0); + + notEqual(env.validate(0.1, { maxDecimal : 0 }).errors.length, 0); + notEqual(env.validate(0.111, { maxDecimal : 1 }).errors.length, 0); +}); + +if (curDraftId > 1) { +test("DivisibleBy Validation", function () { + equal(env.validate(0, {}).errors.length, 0); + equal(env.validate(0, { divisibleBy : 1 }).errors.length, 0); + equal(env.validate(10, { divisibleBy : 5 }).errors.length, 0); + equal(env.validate(10, { divisibleBy : 10 }).errors.length, 0); + equal(env.validate(0, { divisibleBy : 2.5 }).errors.length, 0); + equal(env.validate(5, { divisibleBy : 2.5 }).errors.length, 0); + equal(env.validate(7.5, { divisibleBy : 2.5 }).errors.length, 0); + equal(env.validate(9.1, { divisibleBy : 1.3 }).errors.length, 0); + + notEqual(env.validate(0, { divisibleBy : 0 }).errors.length, 0); + notEqual(env.validate(7, { divisibleBy : 5 }).errors.length, 0); + notEqual(env.validate(4.5, { divisibleBy : 2 }).errors.length, 0); + notEqual(env.validate(7.5, { divisibleBy : 1.8 }).errors.length, 0); +}); +} + +test("Disallow Validation", function () { + equal(env.validate({}, { disallow : ['null', 'boolean', 'number', 'integer', 'string', 'array'] }).errors.length, 0, "Object"); + equal(env.validate([], { disallow : ['null', 'boolean', 'number', 'integer', 'string', 'object'] }).errors.length, 0, "Array"); + equal(env.validate('', { disallow : ['null', 'boolean', 'number', 'integer', 'array', 'object'] }).errors.length, 0, "String"); + equal(env.validate(0.1, { disallow : ['null', 'boolean', 'integer', 'string', 'array', 'object'] }).errors.length, 0, "Number"); + equal(env.validate(00, { disallow : ['null', 'boolean', 'string', 'array', 'object'] }).errors.length, 0, "Integer"); + equal(env.validate(false, { disallow : ['null', 'number', 'integer', 'string', 'array', 'object'] }).errors.length, 0, "Boolean"); + equal(env.validate(null, { disallow : ['boolean', 'number', 'integer', 'string', 'array', 'object'] }).errors.length, 0, "Null"); + + notEqual(env.validate({}, { disallow : 'object' }).errors.length, 0, "Object"); + notEqual(env.validate([], { disallow : 'array' }).errors.length, 0, "Array"); + notEqual(env.validate('', { disallow : 'string' }).errors.length, 0, "String"); + notEqual(env.validate(00, { disallow : 'integer' }).errors.length, 0, "Number"); + notEqual(env.validate(0.1, { disallow : 'number' }).errors.length, 0, "Integer"); + notEqual(env.validate(false, { disallow : 'boolean' }).errors.length, 0, "Boolean"); + notEqual(env.validate(null, { disallow : 'null' }).errors.length, 0, "Null"); + notEqual(env.validate(null, { disallow : 'any' }).errors.length, 0, "Any"); +}); + +test("Extends Validation", function () { + equal(env.validate({}, { 'extends' : {} }).errors.length, 0); + equal(env.validate({}, { 'extends' : { type : 'object' } }).errors.length, 0); + equal(env.validate(1, { type : 'integer', 'extends' : { type : 'number' } }).errors.length, 0); + equal(env.validate({ a : 1, b : 2 }, { properties : { a : { type : 'number' } }, additionalProperties : false, 'extends' : { properties : { b : { type : 'number' } } } }).errors.length, 0); + + notEqual(env.validate(1, { type : 'number', 'extends' : { type : 'string' } }).errors.length, 0); + + //TODO: More tests +}); + +test("JSON Schema Validation", function () { + var schema = env.findSchema(env.getOption("latestJSONSchemaSchemaURI")); + var hyperSchema = env.findSchema(env.getOption("latestJSONSchemaHyperSchemaURI")); + var links = env.findSchema(env.getOption("latestJSONSchemaLinksURI")); + + equal(schema.validate(schema).errors.length, 0, "schema.validate(schema)"); + equal(hyperSchema.validate(schema).errors.length, 0, "hyperSchema.validate(schema)"); + equal(hyperSchema.validate(hyperSchema).errors.length, 0, "hyperSchema.validate(hyperSchema)"); + equal(hyperSchema.validate(links).errors.length, 0, "hyperSchema.validate(links)"); +}); + +(function(curDraftId){ +test("Links Validation", function () { + var schema, instance; + //full + equal(env.validate({ 'a' : {} }, { 'type' : 'object', 'additionalProperties' : { '$ref' : '#' } }).errors.length, 0); + notEqual(env.validate({ 'a' : 1 }, { 'type' : 'object', 'additionalProperties' : { '$ref' : '#' } }).errors.length, 0); + + //describedby + okNoError(function () { + schema = env.createSchema({ "id" : "http://test.example.com/3", "properties" : { "test" : { "type" : "object" } }, "extends" : { "$ref" : "http://json-schema.org/draft-03/schema#" } }, null, "http://test.example.com/3"); + equal(env.validate({}, { "$schema" : "http://test.example.com/3", "test" : {} }).errors.length, 0); + notEqual(env.validate({}, { "$schema" : "http://test.example.com/3", "test" : 0 }).errors.length, 0); + }, "describedby schema"); + + //self + okNoError(function () { + schema = env.createSchema({ "properties" : { "two" : { "id" : "http://test.example.com/2", "type" : "object" } } }, null, "http://not.example.com/2"); + equal(env.validate({}, { "$ref" : "http://test.example.com/2" }).errors.length, 0); + notEqual(env.validate(null, { "$ref" : "http://test.example.com/2" }).errors.length, 0); + }, "self schema"); + + //links api + okNoError(function () { + schema = env.createSchema({ "links" : [ { "rel" : "bar", "href" : "http:" + (curDraftId < 3 ? "{-this}" : "{@}") + "#" } ] }); + instance = env.createInstance("foo"); + equal(schema.getLink("bar", instance), "http:foo#", "'bar' link and self reference"); + }, "links api schema"); + + //invalid reference + (env.getOption("enforceReferences") ? okError : okNoError)(function () { + schema = env.createSchema({ "$ref" : "asdf:qwerty" }); //should throw error + }, "invalid reference"); +}); +}(curDraftId)); + +test("PathStart Validation", function () { + var instance = env.createInstance({}, "http://test.example.com/4"), + schema = env.createSchema({"pathStart" : "http://test.example.com"}); + + equal(env.validate(instance, schema).errors.length, 0); + + instance = env.createInstance({}); //random URI + + notEqual(env.validate(instance, schema).errors.length, 0); +}); + +test("Register Schemas", function () { + var schema = env.createSchema({'type' : 'string'}, null, 'http://test.example.com/1'); + equal(env.findSchema(env.getOption("latestJSONSchemaHyperSchemaURI")).validate(schema).errors.length, 0); + equal(env.validate('', { '$ref' : 'http://test.example.com/1' }).errors.length, 0); + notEqual(env.validate({}, { '$ref' : 'http://test.example.com/1' }).errors.length, 0); +}); + +test("Complex Examples", function () { + //example 1 + var schema = env.createSchema({ + "id":"Common#", + "type":"object", + "properties":{ + "!":{"type":"string","enum":["Common"]} + }, + "additionalProperties":false + }, undefined, "Common#"); + + var report = env.validate({ + "!" : "List", + "list" : [ + { + "!" : "Text", + "common" : {"!":"NotCommon"} + } + ], + "common" : {"!":"Common"} + }, + + { + "properties":{ + "!":{"type":"string","enum":["List"]}, + "list":{ + "type":"array", + "items":{ + "type":[ + { + "type":"object", + "properties":{ + "!":{"type":"string","enum":["Music"]}, + "common":{"$ref":"Common#"} + } + }, + { + "type":"object", + "properties":{ + "!":{"type":"string","enum":["Text"]}, + "common":{"$ref":"Common#"} + } + } + ] + } + }, + + "common":{"$ref":"Common#"} + } + } + ); + + notEqual(report.errors.length, 0, "example 1"); + + //example 2 + schema = env.createSchema({ + "extends": { + "type": "object", + "properties": { + "id": { + "type": "string", + "minLength": 1, + "pattern": "^\\S.+\\S$" + } + } + }, + "properties": { + "role": { + "extends": { + "type": "string", + "minLength": 1, + "pattern": "^\\S.+\\S$" + }, + "description": "some description" + } + } + }); + + report = env.validate({ "id" : "some id", "role" : "yunowork?"}, schema); + + equal(report.errors.length, 0, "example 2"); +}); + +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/JSV/tests/tests3b.js b/html/RentForCamp/node_modules/JSV/tests/tests3b.js new file mode 100644 index 0000000..d500dee --- /dev/null +++ b/html/RentForCamp/node_modules/JSV/tests/tests3b.js @@ -0,0 +1,211 @@ +var env; + +//calls ok(true) if no error is thrown +function okNoError(func, msg) { + try { + func(); + ok(true, msg); + } catch (e) { + ok(false, msg + ': ' + e); + } +} + + +function setupEnv () { + env = env || require('../lib/jsv').JSV.createEnvironment("json-schema-draft-03"); + + // AddressBook example from http://relaxng.org/compact-tutorial-20030326.html + env.createSchema({ + "type": "object", + "id": "http://example.com/addressbook.json", + "description": "AddressBook example from http://relaxng.org/compact-tutorial-20030326.html", + "properties": { + "cards": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 2, + "maxItems": 2, + "$schema":"http://json-schema.org/draft-03/schema#" + }, + "required": true + } + }, + "$schema":"http://json-schema.org/draft-03/schema#" + }, + undefined, + "http://example.com/addressbook.json"); + + // The referral target schema, with a canonical id. + env.createSchema({ + "type": "array", + "id": "http://example.com/subdir/card.json", + "description": "Referral target", + "items": { + "type": "string" + }, + "minItems": 2, + "maxItems": 2, + "$schema":"http://json-schema.org/draft-03/schema#" + }, + undefined, + "http://example.com/subdir/card.json"); + + // Similar example, using $ref to factor part of the schema. + env.createSchema({ + "type": "object", + "id": "http://example.com/addressbook_ref.json", + "description": "Similar example, using $ref to factor part of the schema.", + "properties": { + "cards": { + "type": "array", + "items": { + "$ref": "./subdir/card.json" + }, + "required": true + } + }, + "$schema":"http://json-schema.org/draft-03/schema#" + }, + undefined, + "http://example.com/addressbook_ref.json"); + + + // Similar example, using extends to factor part of the schema. + env.createSchema({ + "type": "object", + "id": "http://example.com/addressbook_extends.json", + "description": "Similar example, using extends to factor part of the schema.", + "properties": { + "cards": { + "type": "array", + "items": { + "extends": { + "$ref": "./subdir/card.json" + } + }, + "required": true + } + }, + "$schema":"http://json-schema.org/draft-03/schema#" + }, + undefined, + "http://example.com/addressbook_extends.json"); +} + + +// +// +// Tests +// +// + +module("Reference Tests"); + +test("Self Identifying Schemas", function () { + + setupEnv(); + + // While createSchema takes a URI argument, for V3 schemas the validator should be able + // to use the canonical id field to find it, if it has been registered. + // http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.27 + + env.createSchema({ "id": "http://example.com/foo.json", + "$schema":"http://json-schema.org/draft-03/schema#" + }); + + ok(env.findSchema("http://example.com/foo.json"), "found schema by id"); + }); + +test("Forward Referral", function () { + + setupEnv(); + // A schema with a reference in it should be accepted, even if the destination schema + // hasn't been registered yet. + + okNoError(function () { + env.createSchema({ + "type": "object", + "id": "http://example.com/addressbook.json", + "properties": { + "cards": { + "type": "array", + "items": { + "$ref": "http://example.com/subdir/card.json" + }, + "required": true + } + }, + "$schema":"http://json-schema.org/draft-03/schema#" + }); + }, "Can make schema with forward reference"); + + }); + +test("Validate Schema", function () { + + setupEnv(); + + var jsonschema = env.findSchema(env.getOption("latestJSONSchemaSchemaURI")); + var explicit_schema = env.findSchema("http://example.com/addressbook.json"); + var referring_schema = env.findSchema("http://example.com/addressbook_ref.json"); + var card_schema = env.findSchema("http://example.com/subdir/card.json"); + + ok(explicit_schema, "explicit addressbook schema"); + ok(referring_schema, "referring addressbook schema"); + ok(card_schema, "card schema"); + + equal(jsonschema.validate(explicit_schema).errors.length, 0, 'valid explicit schema'); + equal(jsonschema.validate(referring_schema).errors.length, 0, 'valid referring schema'); + equal(jsonschema.validate(card_schema).errors.length, 0, 'valid referral target schema'); + + }); + +test("Simple Referral", function () { + + setupEnv(); + + var schema = { "$ref": "http://example.com/subdir/card.json" }; + notEqual(env.validate({}, schema).errors.length, 0, "card must be array"); + notEqual(env.validate([], schema).errors.length, 0, "card must have fields"); + notEqual(env.validate(["foo"], schema).errors.length, 0, "card must have two fields"); + notEqual(env.validate(["foo", {}], schema).errors.length, 0, "both fields must be string"); + notEqual(env.validate(["foo", "bar", "baz"], schema).errors.length, 0, "card maxItems 2"); + equal(env.validate(["foo", "bar"], schema).errors.length, 0, "card maxItems 2"); + }); + +function validateAddressbook (test_name, schema_uri) { + var schema = { "$ref": schema_uri }; + + test(test_name, function () { + + setupEnv(); + + notEqual(env.validate('', schema).errors.length, 0, "addressbook is object"); + notEqual(env.validate({}, schema).errors.length, 0, "cards required"); + notEqual(env.validate({ "cards": {}}, schema).errors.length, 0, "cards must be array"); + equal(env.validate({ "cards": []}, schema).errors.length, 0, "empty array ok"); + + notEqual(env.validate({ "cards": [ {} ] }, schema).errors.length, 0, + "cards schema is enforced on items"); + + notEqual(env.validate({ "cards": [['foo']]}, schema).errors.length, 0, + "each card must have length 2"); + + notEqual(env.validate({ "cards": [ ['foo', 'bar' ], ["foo" ] ] }, schema).errors.length, 0, + "second card is bad"); + + equal(env.validate({ "cards": [ ["foo", "bar" ] ] }, schema).errors.length, 0, + "good addressbook with one card"); + + equal(env.validate({ "cards": [ ["foo", "bar" ], ["bar", "foo" ] ] }, schema).errors.length, 0, + "good addressbook with two cards"); + }); +} + +validateAddressbook("Explicit Schema", "http://example.com/addressbook.json"); +validateAddressbook("Referring Schema", "http://example.com/addressbook_ref.json"); +validateAddressbook("Extends Schema", "http://example.com/addressbook_extends.json"); diff --git a/html/RentForCamp/node_modules/ansi-styles/ansi-styles.js b/html/RentForCamp/node_modules/ansi-styles/ansi-styles.js new file mode 100644 index 0000000..3da548c --- /dev/null +++ b/html/RentForCamp/node_modules/ansi-styles/ansi-styles.js @@ -0,0 +1,38 @@ +'use strict'; +var styles = module.exports; + +var codes = { + reset: [0, 0], + + bold: [1, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + strikethrough: [9, 29], + + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49] +}; + +Object.keys(codes).forEach(function (key) { + var val = codes[key]; + var style = styles[key] = {}; + style.open = '\x1b[' + val[0] + 'm'; + style.close = '\x1b[' + val[1] + 'm'; +}); diff --git a/html/RentForCamp/node_modules/ansi-styles/package.json b/html/RentForCamp/node_modules/ansi-styles/package.json new file mode 100644 index 0000000..606e3d2 --- /dev/null +++ b/html/RentForCamp/node_modules/ansi-styles/package.json @@ -0,0 +1,109 @@ +{ + "_args": [ + [ + { + "raw": "ansi-styles@~1.0.0", + "scope": null, + "escapedName": "ansi-styles", + "name": "ansi-styles", + "rawSpec": "~1.0.0", + "spec": ">=1.0.0 <1.1.0", + "type": "range" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/chalk" + ] + ], + "_from": "ansi-styles@>=1.0.0 <1.1.0", + "_id": "ansi-styles@1.0.0", + "_inCache": true, + "_location": "/ansi-styles", + "_npmUser": { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + }, + "_npmVersion": "1.3.15", + "_phantomChildren": {}, + "_requested": { + "raw": "ansi-styles@~1.0.0", + "scope": null, + "escapedName": "ansi-styles", + "name": "ansi-styles", + "rawSpec": "~1.0.0", + "spec": ">=1.0.0 <1.1.0", + "type": "range" + }, + "_requiredBy": [ + "/chalk" + ], + "_resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "_shasum": "cb102df1c56f5123eab8b67cd7b98027a0279178", + "_shrinkwrap": null, + "_spec": "ansi-styles@~1.0.0", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/chalk", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/ansi-styles/issues" + }, + "dependencies": {}, + "description": "ANSI escape codes for colorizing strings in the terminal", + "devDependencies": { + "mocha": "~1.12.0" + }, + "directories": {}, + "dist": { + "shasum": "cb102df1c56f5123eab8b67cd7b98027a0279178", + "tarball": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz" + }, + "engines": { + "node": ">=0.8.0" + }, + "files": [ + "ansi-styles.js" + ], + "homepage": "https://github.com/sindresorhus/ansi-styles", + "keywords": [ + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "main": "ansi-styles", + "maintainers": [ + { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + } + ], + "name": "ansi-styles", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/ansi-styles.git" + }, + "scripts": { + "test": "mocha" + }, + "version": "1.0.0" +} diff --git a/html/RentForCamp/node_modules/ansi-styles/readme.md b/html/RentForCamp/node_modules/ansi-styles/readme.md new file mode 100644 index 0000000..4ac8cbd --- /dev/null +++ b/html/RentForCamp/node_modules/ansi-styles/readme.md @@ -0,0 +1,65 @@ +# ansi-styles [![Build Status](https://secure.travis-ci.org/sindresorhus/ansi-styles.png?branch=master)](http://travis-ci.org/sindresorhus/ansi-styles) + +> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for colorizing strings in the terminal. + +You probably want the higher-level [chalk](https://github.com/sindresorhus/chalk) module for styling your strings. + +![screenshot](screenshot.png) + + +## Install + +Install with [npm](https://npmjs.org/package/ansi-styles): `npm install --save ansi-styles` + + +## Example + +```js +var ansi = require('ansi-styles'); + +console.log(ansi.green.open + 'Hello world!' + ansi.green.close); +``` + +## API + +Each style has an `open` and `close` property. + + +## Styles + +### General + +- reset +- bold +- italic +- underline +- inverse +- strikethrough + +### Text colors + +- black +- red +- green +- yellow +- blue +- magenta +- cyan +- white +- gray + +### Background colors + +- bgBlack +- bgRed +- bgGreen +- bgYellow +- bgBlue +- bgMagenta +- bgCyan +- bgWhite + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/html/RentForCamp/node_modules/bignumber.js/LICENCE b/html/RentForCamp/node_modules/bignumber.js/LICENCE new file mode 100644 index 0000000..d730ec5 --- /dev/null +++ b/html/RentForCamp/node_modules/bignumber.js/LICENCE @@ -0,0 +1,23 @@ +The MIT Licence. + +Copyright (c) 2017 Michael Mclaughlin + +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/html/RentForCamp/node_modules/bignumber.js/README.md b/html/RentForCamp/node_modules/bignumber.js/README.md new file mode 100644 index 0000000..8a8bb9e --- /dev/null +++ b/html/RentForCamp/node_modules/bignumber.js/README.md @@ -0,0 +1,415 @@ +![bignumber.js](https://raw.githubusercontent.com/MikeMcl/bignumber.js/gh-pages/bignumberjs.png) + +A JavaScript library for arbitrary-precision decimal and non-decimal arithmetic. + +[![Build Status](https://travis-ci.org/MikeMcl/bignumber.js.svg)](https://travis-ci.org/MikeMcl/bignumber.js) + +
        + +## Features + + - Faster, smaller, and perhaps easier to use than JavaScript versions of Java's BigDecimal + - 8 KB minified and gzipped + - Simple API but full-featured + - Works with numbers with or without fraction digits in bases from 2 to 64 inclusive + - Replicates the `toExponential`, `toFixed`, `toPrecision` and `toString` methods of JavaScript's Number type + - Includes a `toFraction` and a correctly-rounded `squareRoot` method + - Supports cryptographically-secure pseudo-random number generation + - No dependencies + - Wide platform compatibility: uses JavaScript 1.5 (ECMAScript 3) features only + - Comprehensive [documentation](http://mikemcl.github.io/bignumber.js/) and test set + +![API](https://raw.githubusercontent.com/MikeMcl/bignumber.js/gh-pages/API.png) + +If a smaller and simpler library is required see [big.js](https://github.com/MikeMcl/big.js/). +It's less than half the size but only works with decimal numbers and only has half the methods. +It also does not allow `NaN` or `Infinity`, or have the configuration options of this library. + +See also [decimal.js](https://github.com/MikeMcl/decimal.js/), which among other things adds support for non-integer powers, and performs all operations to a specified number of significant digits. + +## Load + +The library is the single JavaScript file *bignumber.js* (or minified, *bignumber.min.js*). + +```html + +``` + +For [Node.js](http://nodejs.org), the library is available from the [npm](https://npmjs.org/) registry + + $ npm install bignumber.js + +```javascript +var BigNumber = require('bignumber.js'); +``` + +To load with AMD loader libraries such as [requireJS](http://requirejs.org/): + +```javascript +require(['path/to/bignumber'], function(BigNumber) { + // Use BigNumber here in local scope. No global BigNumber. +}); +``` + +## Use + +*In all examples below, `var`, semicolons and `toString` calls are not shown. +If a commented-out value is in quotes it means `toString` has been called on the preceding expression.* + +The library exports a single function: `BigNumber`, the constructor of BigNumber instances. + +It accepts a value of type number *(up to 15 significant digits only)*, string or BigNumber object, + +```javascript +x = new BigNumber(123.4567) +y = new BigNumber('123456.7e-3') +z = new BigNumber(x) +x.equals(y) && y.equals(z) && x.equals(z) // true +``` + + +and a base from 2 to 64 inclusive can be specified. + +```javascript +x = new BigNumber(1011, 2) // "11" +y = new BigNumber('zz.9', 36) // "1295.25" +z = x.plus(y) // "1306.25" +``` + +A BigNumber is immutable in the sense that it is not changed by its methods. + +```javascript +0.3 - 0.1 // 0.19999999999999998 +x = new BigNumber(0.3) +x.minus(0.1) // "0.2" +x // "0.3" +``` + +The methods that return a BigNumber can be chained. + +```javascript +x.dividedBy(y).plus(z).times(9).floor() +x.times('1.23456780123456789e+9').plus(9876.5432321).dividedBy('4444562598.111772').ceil() +``` + +Many method names have a shorter alias. + +```javascript +x.squareRoot().dividedBy(y).toPower(3).equals(x.sqrt().div(y).pow(3)) // true +x.cmp(y.mod(z).neg()) == 1 && x.comparedTo(y.modulo(z).negated()) == 1 // true +``` + +Like JavaScript's number type, there are `toExponential`, `toFixed` and `toPrecision` methods + +```javascript +x = new BigNumber(255.5) +x.toExponential(5) // "2.55500e+2" +x.toFixed(5) // "255.50000" +x.toPrecision(5) // "255.50" +x.toNumber() // 255.5 +``` + + and a base can be specified for `toString`. + + ```javascript + x.toString(16) // "ff.8" + ``` + +There is also a `toFormat` method which may be useful for internationalisation + +```javascript +y = new BigNumber('1234567.898765') +y.toFormat(2) // "1,234,567.90" +``` + +The maximum number of decimal places of the result of an operation involving division (i.e. a division, square root, base conversion or negative power operation) is set using the `config` method of the `BigNumber` constructor. + +The other arithmetic operations always give the exact result. + +```javascript +BigNumber.config({ DECIMAL_PLACES: 10, ROUNDING_MODE: 4 }) + +x = new BigNumber(2); +y = new BigNumber(3); +z = x.div(y) // "0.6666666667" +z.sqrt() // "0.8164965809" +z.pow(-3) // "3.3749999995" +z.toString(2) // "0.1010101011" +z.times(z) // "0.44444444448888888889" +z.times(z).round(10) // "0.4444444445" +``` + +There is a `toFraction` method with an optional *maximum denominator* argument + +```javascript +y = new BigNumber(355) +pi = y.dividedBy(113) // "3.1415929204" +pi.toFraction() // [ "7853982301", "2500000000" ] +pi.toFraction(1000) // [ "355", "113" ] +``` + +and `isNaN` and `isFinite` methods, as `NaN` and `Infinity` are valid `BigNumber` values. + +```javascript +x = new BigNumber(NaN) // "NaN" +y = new BigNumber(Infinity) // "Infinity" +x.isNaN() && !y.isNaN() && !x.isFinite() && !y.isFinite() // true +``` + +The value of a BigNumber is stored in a decimal floating point format in terms of a coefficient, exponent and sign. + + +```javascript +x = new BigNumber(-123.456); +x.c // [ 123, 45600000000000 ] coefficient (i.e. significand) +x.e // 2 exponent +x.s // -1 sign +``` + + +Multiple BigNumber constructors can be created, each with their own independent configuration which applies to all BigNumber's created from it. + +```javascript +// Set DECIMAL_PLACES for the original BigNumber constructor +BigNumber.config({ DECIMAL_PLACES: 10 }) + +// Create another BigNumber constructor, optionally passing in a configuration object +BN = BigNumber.another({ DECIMAL_PLACES: 5 }) + +x = new BigNumber(1) +y = new BN(1) + +x.div(3) // '0.3333333333' +y.div(3) // '0.33333' +``` + +For futher information see the [API](http://mikemcl.github.io/bignumber.js/) reference in the *doc* directory. + +## Test + +The *test* directory contains the test scripts for each method. + +The tests can be run with Node or a browser. For Node use + + $ npm test + +or + + $ node test/every-test + +To test a single method, e.g. + + $ node test/toFraction + +For the browser, see *every-test.html* and *single-test.html* in the *test/browser* directory. + +*bignumber-vs-number.html* enables some of the methods of bignumber.js to be compared with those of JavaScript's number type. + +## Versions + +Version 1.x.x of this library is still supported on the 'original' branch. The advantages of later versions are that they are considerably faster for numbers with many digits and that there are some added methods (see Change Log below). The disadvantages are more lines of code and increased code complexity, and the loss of simplicity in no longer having the coefficient of a BigNumber stored in base 10. + +## Performance + +See the [README](https://github.com/MikeMcl/bignumber.js/tree/master/perf) in the *perf* directory. + +## Build + +For Node, if [uglify-js](https://github.com/mishoo/UglifyJS2) is installed + + npm install uglify-js -g + +then + + npm run build + +will create *bignumber.min.js*. + +A source map will also be created in the root directory. + +## Feedback + +Open an issue, or email + +Michael + +M8ch88l@gmail.com + +## Licence + +MIT. + +See [LICENCE](https://github.com/MikeMcl/bignumber.js/blob/master/LICENCE). + +## Change Log + + +#### 4.1.0 +* 26/09/2017 +* Remove node 0.6 from *.travis.yml*. +* Add *bignumber.mjs*. + +#### 4.0.4 +* 03/09/2017 +* Add missing aliases to *bignumber.d.ts*. + +#### 4.0.3 +* 30/08/2017 +* Add types: *bignumber.d.ts*. + +#### 4.0.2 +* 03/05/2017 +* #120 Workaround Safari/Webkit bug. + +#### 4.0.1 +* 05/04/2017 +* #121 BigNumber.default to BigNumber['default']. + +#### 4.0.0 +* 09/01/2017 +* Replace BigNumber.isBigNumber method with isBigNumber prototype property. + +#### 3.1.2 +* 08/01/2017 +* Minor documentation edit. + +#### 3.1.1 +* 08/01/2017 +* Uncomment `isBigNumber` tests. +* Ignore dot files. + +#### 3.1.0 +* 08/01/2017 +* Add `isBigNumber` method. + +#### 3.0.2 +* 08/01/2017 +* Bugfix: Possible incorrect value of `ERRORS` after a `BigNumber.another` call (due to `parseNumeric` declaration in outer scope). + +#### 3.0.1 +* 23/11/2016 +* Apply fix for old ipads with `%` issue, see #57 and #102. +* Correct error message. + +#### 3.0.0 +* 09/11/2016 +* Remove `require('crypto')` - leave it to the user. +* Add `BigNumber.set` as `BigNumber.config` alias. +* Default `POW_PRECISION` to `0`. + +#### 2.4.0 +* 14/07/2016 +* #97 Add exports to support ES6 imports. + +#### 2.3.0 +* 07/03/2016 +* #86 Add modulus parameter to `toPower`. + +#### 2.2.0 +* 03/03/2016 +* #91 Permit larger JS integers. + +#### 2.1.4 +* 15/12/2015 +* Correct UMD. + +#### 2.1.3 +* 13/12/2015 +* Refactor re global object and crypto availability when bundling. + +#### 2.1.2 +* 10/12/2015 +* Bugfix: `window.crypto` not assigned to `crypto`. + +#### 2.1.1 +* 09/12/2015 +* Prevent code bundler from adding `crypto` shim. + +#### 2.1.0 +* 26/10/2015 +* For `valueOf` and `toJSON`, include the minus sign with negative zero. + +#### 2.0.8 +* 2/10/2015 +* Internal round function bugfix. + +#### 2.0.6 +* 31/03/2015 +* Add bower.json. Tweak division after in-depth review. + +#### 2.0.5 +* 25/03/2015 +* Amend README. Remove bitcoin address. + +#### 2.0.4 +* 25/03/2015 +* Critical bugfix #58: division. + +#### 2.0.3 +* 18/02/2015 +* Amend README. Add source map. + +#### 2.0.2 +* 18/02/2015 +* Correct links. + +#### 2.0.1 +* 18/02/2015 +* Add `max`, `min`, `precision`, `random`, `shift`, `toDigits` and `truncated` methods. +* Add the short-forms: `add`, `mul`, `sd`, `sub` and `trunc`. +* Add an `another` method to enable multiple independent constructors to be created. +* Add support for the base 2, 8 and 16 prefixes `0b`, `0o` and `0x`. +* Enable a rounding mode to be specified as a second parameter to `toExponential`, `toFixed`, `toFormat` and `toPrecision`. +* Add a `CRYPTO` configuration property so cryptographically-secure pseudo-random number generation can be specified. +* Add a `MODULO_MODE` configuration property to enable the rounding mode used by the `modulo` operation to be specified. +* Add a `POW_PRECISION` configuration property to enable the number of significant digits calculated by the power operation to be limited. +* Improve code quality. +* Improve documentation. + +#### 2.0.0 +* 29/12/2014 +* Add `dividedToIntegerBy`, `isInteger` and `toFormat` methods. +* Remove the following short-forms: `isF`, `isZ`, `toE`, `toF`, `toFr`, `toN`, `toP`, `toS`. +* Store a BigNumber's coefficient in base 1e14, rather than base 10. +* Add fast path for integers to BigNumber constructor. +* Incorporate the library into the online documentation. + +#### 1.5.0 +* 13/11/2014 +* Add `toJSON` and `decimalPlaces` methods. + +#### 1.4.1 +* 08/06/2014 +* Amend README. + +#### 1.4.0 +* 08/05/2014 +* Add `toNumber`. + +#### 1.3.0 +* 08/11/2013 +* Ensure correct rounding of `sqrt` in all, rather than almost all, cases. +* Maximum radix to 64. + +#### 1.2.1 +* 17/10/2013 +* Sign of zero when x < 0 and x + (-x) = 0. + +#### 1.2.0 +* 19/9/2013 +* Throw Error objects for stack. + +#### 1.1.1 +* 22/8/2013 +* Show original value in constructor error message. + +#### 1.1.0 +* 1/8/2013 +* Allow numbers with trailing radix point. + +#### 1.0.1 +* Bugfix: error messages with incorrect method name + +#### 1.0.0 +* 8/11/2012 +* Initial release diff --git a/html/RentForCamp/node_modules/bignumber.js/bignumber.d.ts b/html/RentForCamp/node_modules/bignumber.js/bignumber.d.ts new file mode 100644 index 0000000..0d66319 --- /dev/null +++ b/html/RentForCamp/node_modules/bignumber.js/bignumber.d.ts @@ -0,0 +1,1295 @@ +// Type definitions for Bignumber.js +// Project: bignumber.js +// Definitions by: Felix Becker https://github.com/felixfbecker + +export interface Format { + /** the decimal separator */ + decimalSeparator?: string; + /** the grouping separator of the integer part */ + groupSeparator?: string; + /** the primary grouping size of the integer part */ + groupSize?: number; + /** the secondary grouping size of the integer part */ + secondaryGroupSize?: number; + /** the grouping separator of the fraction part */ + fractionGroupSeparator?: string; + /** the grouping size of the fraction part */ + fractionGroupSize?: number; +} + +export interface Configuration { + + /** + * integer, `0` to `1e+9` inclusive + * + * The maximum number of decimal places of the results of operations involving division, i.e. division, square root + * and base conversion operations, and power operations with negative exponents. + * + * ```ts + * BigNumber.config({ DECIMAL_PLACES: 5 }) + * BigNumber.config(5) // equivalent + * ``` + * @default 20 + */ + DECIMAL_PLACES?: number; + + /** + * The rounding mode used in the above operations and the default rounding mode of round, toExponential, toFixed, + * toFormat and toPrecision. The modes are available as enumerated properties of the BigNumber constructor. + * @default [[RoundingMode.ROUND_HALF_UP]] + */ + ROUNDING_MODE?: RoundingMode; + + /** + * - `number`: integer, magnitude `0` to `1e+9` inclusive + * - `number[]`: [ integer `-1e+9` to `0` inclusive, integer `0` to `1e+9` inclusive ] + * + * The exponent value(s) at which `toString` returns exponential notation. + * + * If a single number is assigned, the value + * is the exponent magnitude. + * + * If an array of two numbers is assigned then the first number is the negative exponent + * value at and beneath which exponential notation is used, and the second number is the positive exponent value at + * and above which the same. + * + * For example, to emulate JavaScript numbers in terms of the exponent values at which + * they begin to use exponential notation, use [-7, 20]. + * + * ```ts + * BigNumber.config({ EXPONENTIAL_AT: 2 }) + * new BigNumber(12.3) // '12.3' e is only 1 + * new BigNumber(123) // '1.23e+2' + * new BigNumber(0.123) // '0.123' e is only -1 + * new BigNumber(0.0123) // '1.23e-2' + * + * BigNumber.config({ EXPONENTIAL_AT: [-7, 20] }) + * new BigNumber(123456789) // '123456789' e is only 8 + * new BigNumber(0.000000123) // '1.23e-7' + * + * // Almost never return exponential notation: + * BigNumber.config({ EXPONENTIAL_AT: 1e+9 }) + * + * // Always return exponential notation: + * BigNumber.config({ EXPONENTIAL_AT: 0 }) + * ``` + * Regardless of the value of `EXPONENTIAL_AT`, the `toFixed` method will always return a value in normal notation + * and the `toExponential` method will always return a value in exponential form. + * + * Calling `toString` with a base argument, e.g. `toString(10)`, will also always return normal notation. + * + * @default `[-7, 20]` + */ + EXPONENTIAL_AT?: number | [number, number]; + + /** + * - number: integer, magnitude `1` to `1e+9` inclusive + * - number[]: [ integer `-1e+9` to `-1` inclusive, integer `1` to `1e+9` inclusive ] + * + * The exponent value(s) beyond which overflow to `Infinity` and underflow to zero occurs. + * + * If a single number is + * assigned, it is the maximum exponent magnitude: values wth a positive exponent of greater magnitude become + * Infinity and those with a negative exponent of greater magnitude become zero. + * + * If an array of two numbers is + * assigned then the first number is the negative exponent limit and the second number is the positive exponent + * limit. + * + * For example, to emulate JavaScript numbers in terms of the exponent values at which they become zero and + * Infinity, use [-324, 308]. + * + * ```ts + * BigNumber.config({ RANGE: 500 }) + * BigNumber.config().RANGE // [ -500, 500 ] + * new BigNumber('9.999e499') // '9.999e+499' + * new BigNumber('1e500') // 'Infinity' + * new BigNumber('1e-499') // '1e-499' + * new BigNumber('1e-500') // '0' + * BigNumber.config({ RANGE: [-3, 4] }) + * new BigNumber(99999) // '99999' e is only 4 + * new BigNumber(100000) // 'Infinity' e is 5 + * new BigNumber(0.001) // '0.01' e is only -3 + * new BigNumber(0.0001) // '0' e is -4 + * ``` + * + * The largest possible magnitude of a finite BigNumber is `9.999...e+1000000000`. + * + * The smallest possible magnitude of a non-zero BigNumber is `1e-1000000000`. + * + * @default `[-1e+9, 1e+9]` + */ + RANGE?: number | [number, number]; + + /** + * + * The value that determines whether BigNumber Errors are thrown. If ERRORS is false, no errors will be thrown. + * `true`, `false`, `0` or `1`. + * ```ts + * BigNumber.config({ ERRORS: false }) + * ``` + * + * @default `true` + */ + ERRORS?: boolean | number; + + /** + * `true`, `false`, `0` or `1`. + * + * The value that determines whether cryptographically-secure pseudo-random number generation is used. + * + * If `CRYPTO` is set to `true` then the random method will generate random digits using `crypto.getRandomValues` in + * browsers that support it, or `crypto.randomBytes` if using a version of Node.js that supports it. + * + * If neither function is supported by the host environment then attempting to set `CRYPTO` to `true` will fail, and + * if [[Configuration.ERRORS]] is `true` an exception will be thrown. + * + * If `CRYPTO` is `false` then the source of randomness used will be `Math.random` (which is assumed to generate at + * least 30 bits of randomness). + * + * See [[BigNumber.random]]. + * + * ```ts + * BigNumber.config({ CRYPTO: true }) + * BigNumber.config().CRYPTO // true + * BigNumber.random() // 0.54340758610486147524 + * ``` + * + * @default `false` + */ + CRYPTO?: boolean | number; + + /** + * The modulo mode used when calculating the modulus: `a mod n`. + * + * The quotient, `q = a / n`, is calculated according to + * the [[Configuration.ROUNDING_MODE]] that corresponds to the chosen MODULO_MODE. + * + * The remainder, r, is calculated as: `r = a - n * q`. + * + * The modes that are most commonly used for the modulus/remainder operation are shown in the following table. + * Although the other rounding modes can be used, they may not give useful results. + * + * Property | Value | Description + * -------------------|:-----:|--------------------------------------------------------------------------------------- + * `ROUND_UP` | 0 | The remainder is positive if the dividend is negative, otherwise it is negative. + * `ROUND_DOWN` | 1 | The remainder has the same sign as the dividend. This uses 'truncating division' and matches the behaviour of JavaScript's remainder operator `%`. + * `ROUND_FLOOR` | 3 | The remainder has the same sign as the divisor. + * | | This matches Python's % operator. + * `ROUND_HALF_EVEN` | 6 | The IEEE 754 remainder function. + * `EUCLID` | 9 | The remainder is always positive. Euclidian division: `q = sign(n) * floor(a / abs(n))` + * + * The rounding/modulo modes are available as enumerated properties of the BigNumber constructor. + * + * See [[BigNumber.modulo]] + * + * ```ts + * BigNumber.config({ MODULO_MODE: BigNumber.EUCLID }) + * BigNumber.config({ MODULO_MODE: 9 }) // equivalent + * ``` + * + * @default [[RoundingMode.ROUND_DOWN]] + */ + MODULO_MODE?: RoundingMode; + + /** + * integer, `0` to `1e+9` inclusive. + * + * The maximum number of significant digits of the result of the power operation (unless a modulus is specified). + * + * If set to 0, the number of signifcant digits will not be limited. + * + * See [[BigNumber.toPower]] + * + * ```ts + * BigNumber.config({ POW_PRECISION: 100 }) + * ``` + * + * @default 100 + */ + POW_PRECISION?: number; + + /** + * The FORMAT object configures the format of the string returned by the `toFormat` method. The example below shows + * the properties of the FORMAT object that are recognised, and their default values. Unlike the other configuration + * properties, the values of the properties of the FORMAT object will not be checked for validity. The existing + * FORMAT object will simply be replaced by the object that is passed in. Note that all the properties shown below + * do not have to be included. + * + * See `toFormat` for examples of usage. + * + * ```ts + * BigNumber.config({ + * FORMAT: { + * // the decimal separator + * decimalSeparator: '.', + * // the grouping separator of the integer part + * groupSeparator: ',', + * // the primary grouping size of the integer part + * groupSize: 3, + * // the secondary grouping size of the integer part + * secondaryGroupSize: 0, + * // the grouping separator of the fraction part + * fractionGroupSeparator: ' ', + * // the grouping size of the fraction part + * fractionGroupSize: 0 + * } + * }); + * ``` + */ + FORMAT?: Format; +} + +/** + * The library's enumerated rounding modes are stored as properties of the constructor. + * (They are not referenced internally by the library itself.) + * Rounding modes 0 to 6 (inclusive) are the same as those of Java's BigDecimal class. + */ +declare enum RoundingMode { + /** Rounds away from zero */ + ROUND_UP = 0, + /** Rounds towards zero */ + ROUND_DOWN = 1, + /** Rounds towards Infinity */ + ROUND_CEIL = 2, + /** Rounds towards -Infinity */ + ROUND_FLOOR = 3, + /** + * Rounds towards nearest neighbour. If equidistant, rounds away from zero + */ + ROUND_HALF_UP = 4, + /** + * Rounds towards nearest neighbour. If equidistant, rounds towards zero + */ + ROUND_HALF_DOWN = 5, + /** + * Rounds towards nearest neighbour. If equidistant, rounds towards even neighbour + */ + ROUND_HALF_EVEN = 6, + /** + * Rounds towards nearest neighbour. If equidistant, rounds towards `Infinity` + */ + ROUND_HALF_CEIL = 7, + /** + * Rounds towards nearest neighbour. If equidistant, rounds towards `-Infinity` + */ + ROUND_HALF_FLOOR = 8, + /** + * The remainder is always positive. Euclidian division: `q = sign(n) * floor(a / abs(n))` + */ + EUCLID = 9 +} + +export class BigNumber { + + /** Rounds away from zero */ + static ROUND_UP: RoundingMode; + + /** Rounds towards zero */ + static ROUND_DOWN: RoundingMode; + + /** Rounds towards Infinity */ + static ROUND_CEIL: RoundingMode; + + /** Rounds towards -Infinity */ + static ROUND_FLOOR: RoundingMode; + + /** + * Rounds towards nearest neighbour. If equidistant, rounds away from zero + */ + static ROUND_HALF_UP: RoundingMode; + + /** + * Rounds towards nearest neighbour. If equidistant, rounds towards zero + */ + static ROUND_HALF_DOWN: RoundingMode; + + /** + * Rounds towards nearest neighbour. If equidistant, rounds towards even neighbour + */ + static ROUND_HALF_EVEN: RoundingMode; + + /** + * Rounds towards nearest neighbour. If equidistant, rounds towards `Infinity` + */ + static ROUND_HALF_CEIL: RoundingMode; + + /** + * Rounds towards nearest neighbour. If equidistant, rounds towards `-Infinity` + */ + static ROUND_HALF_FLOOR: RoundingMode; + + /** + * The remainder is always positive. Euclidian division: `q = sign(n) * floor(a / abs(n))` + */ + static EUCLID: RoundingMode; + + /** + * Returns a new independent BigNumber constructor with configuration as described by `obj` (see `config`), or with + * the default configuration if `obj` is `null` or `undefined`. + * + * ```ts + * BigNumber.config({ DECIMAL_PLACES: 5 }) + * BN = BigNumber.another({ DECIMAL_PLACES: 9 }) + * + * x = new BigNumber(1) + * y = new BN(1) + * + * x.div(3) // 0.33333 + * y.div(3) // 0.333333333 + * + * // BN = BigNumber.another({ DECIMAL_PLACES: 9 }) is equivalent to: + * BN = BigNumber.another() + * BN.config({ DECIMAL_PLACES: 9 }) + * ``` + */ + static another(config?: Configuration): typeof BigNumber; + + /** + * Configures the 'global' settings for this particular BigNumber constructor. Returns an object with the above + * properties and their current values. If the value to be assigned to any of the above properties is `null` or + * `undefined` it is ignored. See Errors for the treatment of invalid values. + */ + static config(config?: Configuration): Configuration; + + /** + * Configures the 'global' settings for this particular BigNumber constructor. Returns an object with the above + * properties and their current values. If the value to be assigned to any of the above properties is `null` or + * `undefined` it is ignored. See Errors for the treatment of invalid values. + */ + static config( + decimalPlaces?: number, + roundingMode?: RoundingMode, + exponentialAt?: number | [number, number], + range?: number | [number, number], + errors?: boolean | number, + crypto?: boolean | number, + moduloMode?: RoundingMode, + powPrecision?: number, + format?: Format + ): Configuration; + + /** + * Returns a BigNumber whose value is the maximum of `arg1`, `arg2`,... . The argument to this method can also be an + * array of values. The return value is always exact and unrounded. + * + * ```ts + * x = new BigNumber('3257869345.0378653') + * BigNumber.max(4e9, x, '123456789.9') // '4000000000' + * + * arr = [12, '13', new BigNumber(14)] + * BigNumber.max(arr) // '14' + * ``` + */ + static max(...args: Array): BigNumber; + static max(args: Array): BigNumber; + + /** + * See BigNumber for further parameter details. Returns a BigNumber whose value is the minimum of arg1, arg2,... . + * The argument to this method can also be an array of values. The return value is always exact and unrounded. + * + * ```ts + * x = new BigNumber('3257869345.0378653') + * BigNumber.min(4e9, x, '123456789.9') // '123456789.9' + * + * arr = [2, new BigNumber(-14), '-15.9999', -12] + * BigNumber.min(arr) // '-15.9999' + * ``` + */ + static min(...args: Array): BigNumber; + static min(args: Array): BigNumber; + + /** + * Returns a new BigNumber with a pseudo-random value equal to or greater than 0 and less than 1. + * + * The return value + * will have dp decimal places (or less if trailing zeros are produced). If dp is omitted then the number of decimal + * places will default to the current `DECIMAL_PLACES` setting. + * + * Depending on the value of this BigNumber constructor's + * `CRYPTO` setting and the support for the crypto object in the host environment, the random digits of the return + * value are generated by either `Math.random` (fastest), `crypto.getRandomValues` (Web Cryptography API in recent + * browsers) or `crypto.randomBytes` (Node.js). + * + * If `CRYPTO` is true, i.e. one of the crypto methods is to be used, the + * value of a returned BigNumber should be cryptographically-secure and statistically indistinguishable from a + * random value. + * + * ```ts + * BigNumber.config({ DECIMAL_PLACES: 10 }) + * BigNumber.random() // '0.4117936847' + * BigNumber.random(20) // '0.78193327636914089009' + * ``` + * + * @param dp integer, `0` to `1e+9` inclusive + */ + static random(dp?: number): BigNumber; + + /** + * Coefficient: Array of base `1e14` numbers or `null` + * @readonly + */ + c: number[]; + + /** + * Exponent: Integer, `-1000000000` to `1000000000` inclusive or `null` + * @readonly + */ + e: number; + + /** + * Sign: `-1`, `1` or `null` + * @readonly + */ + s: number; + + /** + * Returns a new instance of a BigNumber object. If a base is specified, the value is rounded according to the + * current [[Configuration.DECIMAL_PLACES]] and [[Configuration.ROUNDING_MODE]] configuration. See Errors for the treatment of an invalid value or base. + * + * ```ts + * x = new BigNumber(9) // '9' + * y = new BigNumber(x) // '9' + * + * // 'new' is optional if ERRORS is false + * BigNumber(435.345) // '435.345' + * + * new BigNumber('5032485723458348569331745.33434346346912144534543') + * new BigNumber('4.321e+4') // '43210' + * new BigNumber('-735.0918e-430') // '-7.350918e-428' + * new BigNumber(Infinity) // 'Infinity' + * new BigNumber(NaN) // 'NaN' + * new BigNumber('.5') // '0.5' + * new BigNumber('+2') // '2' + * new BigNumber(-10110100.1, 2) // '-180.5' + * new BigNumber(-0b10110100.1) // '-180.5' + * new BigNumber('123412421.234324', 5) // '607236.557696' + * new BigNumber('ff.8', 16) // '255.5' + * new BigNumber('0xff.8') // '255.5' + * ``` + * + * The following throws `not a base 2 number` if [[Configuration.ERRORS]] is true, otherwise it returns a BigNumber with value `NaN`. + * + * ```ts + * new BigNumber(9, 2) + * ``` + * + * The following throws `number type has more than 15 significant digits` if [[Configuration.ERRORS]] is true, otherwise it returns a BigNumber with value `96517860459076820`. + * + * ```ts + * new BigNumber(96517860459076817.4395) + * ``` + * + * The following throws `not a number` if [[Configuration.ERRORS]] is true, otherwise it returns a BigNumber with value `NaN`. + * + * ```ts + * new BigNumber('blurgh') + * ``` + * + * A value is only rounded by the constructor if a base is specified. + * + * ```ts + * BigNumber.config({ DECIMAL_PLACES: 5 }) + * new BigNumber(1.23456789) // '1.23456789' + * new BigNumber(1.23456789, 10) // '1.23457' + * ``` + * + * @param value A numeric value. + * + * Legitimate values include `±0`, `±Infinity` and `NaN`. + * + * Values of type `number` with more than 15 significant digits are considered invalid (if [[Configuration.ERRORS]] + * is `true`) as calling `toString` or `valueOf` on such numbers may not result in the intended value. + * + * There is no limit to the number of digits of a value of type `string` (other than that of JavaScript's maximum + * array size). + * + * Decimal string values may be in exponential, as well as normal (fixed-point) notation. Non-decimal values must be + * in normal notation. String values in hexadecimal literal form, e.g. `'0xff'`, are valid, as are string values + * with the octal and binary prefixs `'0o'` and `'0b'`. + * + * String values in octal literal form without the prefix will be interpreted as decimals, e.g. `'011'` is + * interpreted as 11, not 9. + * + * Values in any base may have fraction digits. + * + * For bases from 10 to 36, lower and/or upper case letters can be used to represent values from 10 to 35. + * + * For bases above 36, a-z represents values from 10 to 35, A-Z from 36 to 61, and $ and _ represent 62 and 63 + * respectively (this can be changed by editing the ALPHABET variable near the top of the source file). + * + * @param base integer, 2 to 64 inclusive + * + * The base of value. If base is omitted, or is `null` or `undefined`, base 10 is assumed. + */ + constructor(value: number | string | BigNumber, base?: number); + + /** + * Returns a BigNumber whose value is the absolute value, i.e. the magnitude, of the value of this BigNumber. The + * return value is always exact and unrounded. + * ```ts + * x = new BigNumber(-0.8) + * y = x.absoluteValue() // '0.8' + * z = y.abs() // '0.8' + * ``` + * @alias [[BigNumber.abs]] + */ + absoluteValue(): BigNumber; + + /** + * See [[BigNumber.absoluteValue]] + */ + abs(): BigNumber; + + /** + * See [[plus]] + */ + add(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber rounded to a whole number in the direction of + * positive `Infinity`. + * + * ```ts + * x = new BigNumber(1.3) + * x.ceil() // '2' + * y = new BigNumber(-1.8) + * y.ceil() // '-1' + * ``` + */ + ceil(): BigNumber; + + /** + * Returns | | + * :-------:|---------------------------------------------------------------| + * 1 | If the value of this BigNumber is greater than the value of n + * -1 | If the value of this BigNumber is less than the value of n + * 0 | If this BigNumber and n have the same value + * null | If the value of either this BigNumber or n is NaN + * + * ```ts + * x = new BigNumber(Infinity) + * y = new BigNumber(5) + * x.comparedTo(y) // 1 + * x.comparedTo(x.minus(1)) // 0 + * y.cmp(NaN) // null + * y.cmp('110', 2) // -1 + * ``` + * + * @alias [[cmp]] + */ + comparedTo(n: number | string | BigNumber, base?: number): number; + + /** + * See [[comparedTo]] + */ + cmp(n: number | string | BigNumber, base?: number): number; + + /** + * Return the number of decimal places of the value of this BigNumber, or `null` if the value of this BigNumber is + * `±Infinity` or `NaN`. + * + * ```ts + * x = new BigNumber(123.45) + * x.decimalPlaces() // 2 + * y = new BigNumber('9.9e-101') + * y.dp() // 102 + * ``` + * + * @alias [[dp]] + */ + decimalPlaces(): number; + + /** + * See [[decimalPlaces]] + */ + dp(): number; + + /** + * Returns a BigNumber whose value is the value of this BigNumber divided by n, rounded according to the current + * DECIMAL_PLACES and ROUNDING_MODE configuration. + * + * ```ts + * x = new BigNumber(355) + * y = new BigNumber(113) + * x.dividedBy(y) // '3.14159292035398230088' + * x.div(5) // '71' + * x.div(47, 16) // '5' + * ``` + * + * @alias [[div]] + */ + dividedBy(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * See [[dividedBy]] + */ + div(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * Return a BigNumber whose value is the integer part of dividing the value of this BigNumber by n. + * + * ```ts + * x = new BigNumber(5) + * y = new BigNumber(3) + * x.dividedToIntegerBy(y) // '1' + * x.divToInt(0.7) // '7' + * x.divToInt('0.f', 16) // '5' + * ``` + * + * @alias [[divToInt]] + */ + dividedToIntegerBy(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * See [[dividedToIntegerBy]] + */ + divToInt(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * Returns true if the value of this BigNumber equals the value of `n`, otherwise returns `false`. As with JavaScript, + * `NaN` does not equal `NaN`. + * + * Note: This method uses the [[comparedTo]] internally. + * + * ```ts + * 0 === 1e-324 // true + * x = new BigNumber(0) + * x.equals('1e-324') // false + * BigNumber(-0).eq(x) // true ( -0 === 0 ) + * BigNumber(255).eq('ff', 16) // true + * + * y = new BigNumber(NaN) + * y.equals(NaN) // false + * ``` + * + * @alias [[eq]] + */ + equals(n: number | string | BigNumber, base?: number): boolean; + + /** + * See [[equals]] + */ + eq(n: number | string | BigNumber, base?: number): boolean; + + /** + * Returns a BigNumber whose value is the value of this BigNumber rounded to a whole number in the direction of + * negative `Infinity`. + * + * ```ts + * x = new BigNumber(1.8) + * x.floor() // '1' + * y = new BigNumber(-1.3) + * y.floor() // '-2' + * ``` + */ + floor(): BigNumber; + + /** + * Returns `true` if the value of this BigNumber is greater than the value of `n`, otherwise returns `false`. + * + * Note: This method uses the comparedTo method internally. + * + * ```ts + * 0.1 > (0.3 - 0.2) // true + * x = new BigNumber(0.1) + * x.greaterThan(BigNumber(0.3).minus(0.2)) // false + * BigNumber(0).gt(x) // false + * BigNumber(11, 3).gt(11.1, 2) // true + * ``` + * + * @alias [[gt]] + */ + greaterThan(n: number | string | BigNumber, base?: number): boolean; + + /** + * See [[greaterThan]] + */ + gt(n: number | string | BigNumber, base?: number): boolean; + + /** + * Returns `true` if the value of this BigNumber is greater than or equal to the value of `n`, otherwise returns `false`. + * + * Note: This method uses the comparedTo method internally. + * + * @alias [[gte]] + */ + greaterThanOrEqualTo(n: number | string | BigNumber, base?: number): boolean; + + /** + * See [[greaterThanOrEqualTo]] + */ + gte(n: number | string | BigNumber, base?: number): boolean; + + /** + * Returns true if the value of this BigNumber is a finite number, otherwise returns false. The only possible + * non-finite values of a BigNumber are `NaN`, `Infinity` and `-Infinity`. + * + * Note: The native method `isFinite()` can be used if `n <= Number.MAX_VALUE`. + */ + isFinite(): boolean; + + /** + * Returns true if the value of this BigNumber is a whole number, otherwise returns false. + * @alias [[isInt]] + */ + isInteger(): boolean; + + /** + * See [[isInteger]] + */ + isInt(): boolean; + + /** + * Returns `true` if the value of this BigNumber is `NaN`, otherwise returns `false`. + * + * Note: The native method isNaN() can also be used. + */ + isNaN(): boolean; + + /** + * Returns true if the value of this BigNumber is negative, otherwise returns false. + * + * Note: `n < 0` can be used if `n <= * -Number.MIN_VALUE`. + * + * @alias [[isNeg]] + */ + isNegative(): boolean; + + /** + * See [[isNegative]] + */ + isNeg(): boolean; + + /** + * Returns true if the value of this BigNumber is zero or minus zero, otherwise returns false. + * + * Note: `n == 0` can be used if `n >= Number.MIN_VALUE`. + */ + isZero(): boolean; + + /** + * Returns true if the value of this BigNumber is less than the value of n, otherwise returns false. + * + * Note: This method uses [[comparedTo]] internally. + * + * @alias [[lt]] + */ + lessThan(n: number | string | BigNumber, base?: number): boolean; + + /** + * See [[lessThan]] + */ + lt(n: number | string | BigNumber, base?: number): boolean; + + /** + * Returns true if the value of this BigNumber is less than or equal the value of n, otherwise returns false. + * + * Note: This method uses [[comparedTo]] internally. + */ + lessThanOrEqualTo(n: number | string | BigNumber, base?: number): boolean; + + /** + * See [[lessThanOrEqualTo]] + */ + lte(n: number | string | BigNumber, base?: number): boolean; + + /** + * Returns a BigNumber whose value is the value of this BigNumber minus `n`. + * + * The return value is always exact and unrounded. + * + * @alias [[sub]] + */ + minus(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber modulo n, i.e. the integer remainder of dividing + * this BigNumber by n. + * + * The value returned, and in particular its sign, is dependent on the value of the [[Configuration.MODULO_MODE]] + * setting of this BigNumber constructor. If it is `1` (default value), the result will have the same sign as this + * BigNumber, and it will match that of Javascript's `%` operator (within the limits of double precision) and + * BigDecimal's remainder method. + * + * The return value is always exact and unrounded. + * + * ```ts + * 1 % 0.9 // 0.09999999999999998 + * x = new BigNumber(1) + * x.modulo(0.9) // '0.1' + * y = new BigNumber(33) + * y.mod('a', 33) // '3' + * ``` + * + * @alias [[mod]] + */ + modulo(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * See [[modulo]] + */ + mod(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * See [[times]] + */ + mul(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber negated, i.e. multiplied by -1. + * + * ```ts + * x = new BigNumber(1.8) + * x.negated() // '-1.8' + * y = new BigNumber(-1.3) + * y.neg() // '1.3' + * ``` + * + * @alias [[neg]] + */ + negated(): BigNumber; + + /** + * See [[negated]] + */ + neg(): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber plus `n`. + * + * The return value is always exact and unrounded. + * + * @alias [[add]] + */ + plus(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * If z is true or 1 then any trailing zeros of the integer part of a number are counted as significant digits, + * otherwise they are not. + * + * @param z true, false, 0 or 1 + * @alias [[sd]] + */ + precision(z?: boolean | number): number; + + /** + * See [[precision]] + */ + sd(z?: boolean | number): number; + + /** + * Returns a BigNumber whose value is the value of this BigNumber rounded by rounding mode rm to a maximum of dp + * decimal places. + * + * - if dp is omitted, or is null or undefined, the return value is n rounded to a whole number. + * - if rm is omitted, or is null or undefined, ROUNDING_MODE is used. + * + * ```ts + * x = 1234.56 + * Math.round(x) // 1235 + * y = new BigNumber(x) + * y.round() // '1235' + * y.round(1) // '1234.6' + * y.round(2) // '1234.56' + * y.round(10) // '1234.56' + * y.round(0, 1) // '1234' + * y.round(0, 6) // '1235' + * y.round(1, 1) // '1234.5' + * y.round(1, BigNumber.ROUND_HALF_EVEN) // '1234.6' + * y // '1234.56' + * ``` + * + * @param dp integer, 0 to 1e+9 inclusive + * @param rm integer, 0 to 8 inclusive + */ + round(dp?: number, rm?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber shifted n places. + * + * The shift is of the decimal point, i.e. of powers of ten, and is to the left if n is negative or to the right if + * n is positive. The return value is always exact and unrounded. + * + * @param n integer, -9007199254740991 to 9007199254740991 inclusive + */ + shift(n: number): BigNumber; + + /** + * Returns a BigNumber whose value is the square root of the value of this BigNumber, rounded according to the + * current DECIMAL_PLACES and ROUNDING_MODE configuration. + * + * The return value will be correctly rounded, i.e. rounded + * as if the result was first calculated to an infinite number of correct digits before rounding. + * + * @alias [[sqrt]] + */ + squareRoot(): BigNumber; + + /** + * See [[squareRoot]] + */ + sqrt(): BigNumber; + + /** + * See [[minus]] + */ + sub(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber times n. + * + * The return value is always exact and unrounded. + * + * @alias [[mul]] + */ + times(n: number | string | BigNumber, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber rounded to sd significant digits using rounding mode rm. + * + * If sd is omitted or is null or undefined, the return value will not be rounded. + * + * If rm is omitted or is null or undefined, ROUNDING_MODE will be used. + * + * ```ts + * BigNumber.config({ precision: 5, rounding: 4 }) + * x = new BigNumber(9876.54321) + * + * x.toDigits() // '9876.5' + * x.toDigits(6) // '9876.54' + * x.toDigits(6, BigNumber.ROUND_UP) // '9876.55' + * x.toDigits(2) // '9900' + * x.toDigits(2, 1) // '9800' + * x // '9876.54321' + * ``` + * + * @param sd integer, 1 to 1e+9 inclusive + * @param rm integer, 0 to 8 inclusive + */ + toDigits(sd?: number, rm?: number): BigNumber; + + /** + * Returns a string representing the value of this BigNumber in exponential notation rounded using rounding mode rm + * to dp decimal places, i.e with one digit before the decimal point and dp digits after it. + * + * If the value of this BigNumber in exponential notation has fewer than dp fraction digits, the return value will + * be appended with zeros accordingly. + * + * If dp is omitted, or is null or undefined, the number of digits after the decimal point defaults to the minimum + * number of digits necessary to represent the value exactly. + * + * If rm is omitted or is null or undefined, ROUNDING_MODE is used. + * + * ```ts + * x = 45.6 + * y = new BigNumber(x) + * x.toExponential() // '4.56e+1' + * y.toExponential() // '4.56e+1' + * x.toExponential(0) // '5e+1' + * y.toExponential(0) // '5e+1' + * x.toExponential(1) // '4.6e+1' + * y.toExponential(1) // '4.6e+1' + * y.toExponential(1, 1) // '4.5e+1' (ROUND_DOWN) + * x.toExponential(3) // '4.560e+1' + * y.toExponential(3) // '4.560e+1' + * ``` + * + * @param dp integer, 0 to 1e+9 inclusive + * @param rm integer, 0 to 8 inclusive + */ + toExponential(dp?: number, rm?: number): string; + + /** + * Returns a string representing the value of this BigNumber in normal (fixed-point) notation rounded to dp decimal + * places using rounding mode `rm`. + * + * If the value of this BigNumber in normal notation has fewer than `dp` fraction digits, the return value will be + * appended with zeros accordingly. + * + * Unlike `Number.prototype.toFixed`, which returns exponential notation if a number is greater or equal to 1021, this + * method will always return normal notation. + * + * If dp is omitted or is `null` or `undefined`, the return value will be unrounded and in normal notation. This is also + * unlike `Number.prototype.toFixed`, which returns the value to zero decimal places. + * + * It is useful when fixed-point notation is required and the current `EXPONENTIAL_AT` setting causes toString to + * return exponential notation. + * + * If `rm` is omitted or is `null` or `undefined`, `ROUNDING_MODE` is used. + * + * ```ts + * x = 3.456 + * y = new BigNumber(x) + * x.toFixed() // '3' + * y.toFixed() // '3.456' + * y.toFixed(0) // '3' + * x.toFixed(2) // '3.46' + * y.toFixed(2) // '3.46' + * y.toFixed(2, 1) // '3.45' (ROUND_DOWN) + * x.toFixed(5) // '3.45600' + * y.toFixed(5) // '3.45600' + * ``` + * + * @param dp integer, 0 to 1e+9 inclusive + * @param rm integer, 0 to 8 inclusive + */ + toFixed(dp?: number, rm?: number): string; + + /** + * Returns a string representing the value of this BigNumber in normal (fixed-point) notation rounded to dp decimal + * places using rounding mode `rm`, and formatted according to the properties of the FORMAT object. + * + * See the examples below for the properties of the `FORMAT` object, their types and their usage. + * + * If `dp` is omitted or is `null` or `undefined`, then the return value is not rounded to a fixed number of decimal + * places. + * + * If `rm` is omitted or is `null` or `undefined`, `ROUNDING_MODE` is used. + * + * ```ts + * format = { + * decimalSeparator: '.', + * groupSeparator: ',', + * groupSize: 3, + * secondaryGroupSize: 0, + * fractionGroupSeparator: ' ', + * fractionGroupSize: 0 + * } + * BigNumber.config({ FORMAT: format }) + * + * x = new BigNumber('123456789.123456789') + * x.toFormat() // '123,456,789.123456789' + * x.toFormat(1) // '123,456,789.1' + * + * // If a reference to the object assigned to FORMAT has been retained, + * // the format properties can be changed directly + * format.groupSeparator = ' ' + * format.fractionGroupSize = 5 + * x.toFormat() // '123 456 789.12345 6789' + * + * BigNumber.config({ + * FORMAT: { + * decimalSeparator = ',', + * groupSeparator = '.', + * groupSize = 3, + * secondaryGroupSize = 2 + * } + * }) + * + * x.toFormat(6) // '12.34.56.789,123' + * ``` + * + * @param dp integer, 0 to 1e+9 inclusive + * @param rm integer, 0 to 8 inclusive + */ + toFormat(dp?: number, rm?: number): string; + + /** + * Returns a string array representing the value of this BigNumber as a simple fraction with an integer numerator + * and an integer denominator. The denominator will be a positive non-zero value less than or equal to max. + * + * If a maximum denominator, max, is not specified, or is null or undefined, the denominator will be the lowest + * value necessary to represent the number exactly. + * + * ```ts + * x = new BigNumber(1.75) + * x.toFraction() // '7, 4' + * + * pi = new BigNumber('3.14159265358') + * pi.toFraction() // '157079632679,50000000000' + * pi.toFraction(100000) // '312689, 99532' + * pi.toFraction(10000) // '355, 113' + * pi.toFraction(100) // '311, 99' + * pi.toFraction(10) // '22, 7' + * pi.toFraction(1) // '3, 1' + * ``` + * + * @param max integer >= `1` and < `Infinity` + */ + toFraction(max?: number | string | BigNumber): [string, string]; + + /** + * Same as [[valueOf]] + * + * ```ts + * x = new BigNumber('177.7e+457') + * y = new BigNumber(235.4325) + * z = new BigNumber('0.0098074') + * + * // Serialize an array of three BigNumbers + * str = JSON.stringify( [x, y, z] ) + * // "["1.777e+459","235.4325","0.0098074"]" + * + * // Return an array of three BigNumbers + * JSON.parse(str, function (key, val) { + * return key === '' ? val : new BigNumber(val) + * }) + * ``` + */ + toJSON(): string; + + /** + * Returns the value of this BigNumber as a JavaScript number primitive. + * + * Type coercion with, for example, the unary plus operator will also work, except that a BigNumber with the value + * minus zero will be converted to positive zero. + * + * ```ts + * x = new BigNumber(456.789) + * x.toNumber() // 456.789 + * +x // 456.789 + * + * y = new BigNumber('45987349857634085409857349856430985') + * y.toNumber() // 4.598734985763409e+34 + * + * z = new BigNumber(-0) + * 1 / +z // Infinity + * 1 / z.toNumber() // -Infinity + * ``` + */ + toNumber(): number; + + /** + * Returns a BigNumber whose value is the value of this BigNumber raised to the power `n`, and optionally modulo `a` + * modulus `m`. + * + * If `n` is negative the result is rounded according to the current [[Configuration.DECIMAL_PLACES]] and + * [[Configuration.ROUNDING_MODE]] configuration. + * + * If `n` is not an integer or is out of range: + * - If `ERRORS` is `true` a BigNumber Error is thrown, + * - else if `n` is greater than `9007199254740991`, it is interpreted as `Infinity`; + * - else if n is less than `-9007199254740991`, it is interpreted as `-Infinity`; + * - else if `n` is otherwise a number, it is truncated to an integer; + * - else it is interpreted as `NaN`. + * + * As the number of digits of the result of the power operation can grow so large so quickly, e.g. + * 123.45610000 has over 50000 digits, the number of significant digits calculated is limited to the + * value of the [[Configuration.POW_PRECISION]] setting (default value: `100`) unless a modulus `m` is specified. + * + * Set [[Configuration.POW_PRECISION]] to `0` for an unlimited number of significant digits to be calculated (this + * will cause the method to slow dramatically for larger exponents). + * + * Negative exponents will be calculated to the number of decimal places specified by + * [[Configuration.DECIMAL_PLACES]] (but not to more than [[Configuration.POW_PRECISION]] significant digits). + * + * If `m` is specified and the value of `m`, `n` and this BigNumber are positive integers, then a fast modular + * exponentiation algorithm is used, otherwise if any of the values is not a positive integer the operation will + * simply be performed as `x.toPower(n).modulo(m)` with a `POW_PRECISION` of `0`. + * + * ```ts + * Math.pow(0.7, 2) // 0.48999999999999994 + * x = new BigNumber(0.7) + * x.toPower(2) // '0.49' + * BigNumber(3).pow(-2) // '0.11111111111111111111' + * ``` + * + * @param n integer, -9007199254740991 to 9007199254740991 inclusive + * @alias [[pow]] + */ + toPower(n: number, m?: number | string | BigNumber): BigNumber; + + /** + * See [[toPower]] + */ + pow(n: number, m?: number | string | BigNumber): BigNumber; + + /** + * Returns a string representing the value of this BigNumber rounded to `sd` significant digits using rounding mode + * rm. + * + * - If `sd` is less than the number of digits necessary to represent the integer part of the value in normal + * (fixed-point) notation, then exponential notation is used. + * - If `sd` is omitted, or is `null` or `undefined`, then the return value is the same as `n.toString()`. + * - If `rm` is omitted or is `null` or `undefined`, `ROUNDING_MODE` is used. + * + * ```ts + * x = 45.6 + * y = new BigNumber(x) + * x.toPrecision() // '45.6' + * y.toPrecision() // '45.6' + * x.toPrecision(1) // '5e+1' + * y.toPrecision(1) // '5e+1' + * y.toPrecision(2, 0) // '4.6e+1' (ROUND_UP) + * y.toPrecision(2, 1) // '4.5e+1' (ROUND_DOWN) + * x.toPrecision(5) // '45.600' + * y.toPrecision(5) // '45.600' + * ``` + * + * @param sd integer, 1 to 1e+9 inclusive + * @param rm integer, 0 to 8 inclusive + */ + toPrecision(sd?: number, rm?: number): string; + + /** + * Returns a string representing the value of this BigNumber in the specified base, or base 10 if base is omitted or + * is `null` or `undefined`. + * + * For bases above 10, values from 10 to 35 are represented by a-z (as with `Number.prototype.toString`), 36 to 61 by + * A-Z, and 62 and 63 by `$` and `_` respectively. + * + * If a base is specified the value is rounded according to the current `DECIMAL_PLACES` and `ROUNDING_MODE` + * configuration. + * + * If a base is not specified, and this BigNumber has a positive exponent that is equal to or greater than the + * positive component of the current `EXPONENTIAL_AT` setting, or a negative exponent equal to or less than the + * negative component of the setting, then exponential notation is returned. + * + * If base is `null` or `undefined` it is ignored. + * + * ```ts + * x = new BigNumber(750000) + * x.toString() // '750000' + * BigNumber.config({ EXPONENTIAL_AT: 5 }) + * x.toString() // '7.5e+5' + * + * y = new BigNumber(362.875) + * y.toString(2) // '101101010.111' + * y.toString(9) // '442.77777777777777777778' + * y.toString(32) // 'ba.s' + * + * BigNumber.config({ DECIMAL_PLACES: 4 }); + * z = new BigNumber('1.23456789') + * z.toString() // '1.23456789' + * z.toString(10) // '1.2346' + * ``` + * + * @param base integer, 2 to 64 inclusive + */ + toString(base?: number): string; + + /** + * Returns a BigNumber whose value is the value of this BigNumber truncated to a whole number. + * + * ```ts + * x = new BigNumber(123.456) + * x.truncated() // '123' + * y = new BigNumber(-12.3) + * y.trunc() // '-12' + * ``` + * + * @alias [[trunc]] + */ + truncated(): BigNumber; + + /** + * See [[truncated]] + */ + trunc(): BigNumber; + + /** + * As [[toString]], but does not accept a base argument and includes the minus sign for negative zero.` + * + * ```ts + * x = new BigNumber('-0') + * x.toString() // '0' + * x.valueOf() // '-0' + * y = new BigNumber('1.777e+457') + * y.valueOf() // '1.777e+457' + * ``` + */ + valueOf(): string; +} + +export default BigNumber; diff --git a/html/RentForCamp/node_modules/bignumber.js/bignumber.js b/html/RentForCamp/node_modules/bignumber.js/bignumber.js new file mode 100644 index 0000000..421f544 --- /dev/null +++ b/html/RentForCamp/node_modules/bignumber.js/bignumber.js @@ -0,0 +1,2734 @@ +/*! bignumber.js v4.1.0 https://github.com/MikeMcl/bignumber.js/LICENCE */ + +;(function (globalObj) { + 'use strict'; + + /* + bignumber.js v4.1.0 + A JavaScript library for arbitrary-precision arithmetic. + https://github.com/MikeMcl/bignumber.js + Copyright (c) 2017 Michael Mclaughlin + MIT Expat Licence + */ + + + var BigNumber, + isNumeric = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, + mathceil = Math.ceil, + mathfloor = Math.floor, + notBool = ' not a boolean or binary digit', + roundingMode = 'rounding mode', + tooManyDigits = 'number type has more than 15 significant digits', + ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_', + BASE = 1e14, + LOG_BASE = 14, + MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1 + // MAX_INT32 = 0x7fffffff, // 2^31 - 1 + POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13], + SQRT_BASE = 1e7, + + /* + * The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and + * the arguments to toExponential, toFixed, toFormat, and toPrecision, beyond which an + * exception is thrown (if ERRORS is true). + */ + MAX = 1E9; // 0 to MAX_INT32 + + + /* + * Create and return a BigNumber constructor. + */ + function constructorFactory(config) { + var div, parseNumeric, + + // id tracks the caller function, so its name can be included in error messages. + id = 0, + P = BigNumber.prototype, + ONE = new BigNumber(1), + + + /********************************* EDITABLE DEFAULTS **********************************/ + + + /* + * The default values below must be integers within the inclusive ranges stated. + * The values can also be changed at run-time using BigNumber.config. + */ + + // The maximum number of decimal places for operations involving division. + DECIMAL_PLACES = 20, // 0 to MAX + + /* + * The rounding mode used when rounding to the above decimal places, and when using + * toExponential, toFixed, toFormat and toPrecision, and round (default value). + * UP 0 Away from zero. + * DOWN 1 Towards zero. + * CEIL 2 Towards +Infinity. + * FLOOR 3 Towards -Infinity. + * HALF_UP 4 Towards nearest neighbour. If equidistant, up. + * HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. + * HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. + * HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. + * HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. + */ + ROUNDING_MODE = 4, // 0 to 8 + + // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS] + + // The exponent value at and beneath which toString returns exponential notation. + // Number type: -7 + TO_EXP_NEG = -7, // 0 to -MAX + + // The exponent value at and above which toString returns exponential notation. + // Number type: 21 + TO_EXP_POS = 21, // 0 to MAX + + // RANGE : [MIN_EXP, MAX_EXP] + + // The minimum exponent value, beneath which underflow to zero occurs. + // Number type: -324 (5e-324) + MIN_EXP = -1e7, // -1 to -MAX + + // The maximum exponent value, above which overflow to Infinity occurs. + // Number type: 308 (1.7976931348623157e+308) + // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow. + MAX_EXP = 1e7, // 1 to MAX + + // Whether BigNumber Errors are ever thrown. + ERRORS = true, // true or false + + // Change to intValidatorNoErrors if ERRORS is false. + isValidInt = intValidatorWithErrors, // intValidatorWithErrors/intValidatorNoErrors + + // Whether to use cryptographically-secure random number generation, if available. + CRYPTO = false, // true or false + + /* + * The modulo mode used when calculating the modulus: a mod n. + * The quotient (q = a / n) is calculated according to the corresponding rounding mode. + * The remainder (r) is calculated as: r = a - n * q. + * + * UP 0 The remainder is positive if the dividend is negative, else is negative. + * DOWN 1 The remainder has the same sign as the dividend. + * This modulo mode is commonly known as 'truncated division' and is + * equivalent to (a % n) in JavaScript. + * FLOOR 3 The remainder has the same sign as the divisor (Python %). + * HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function. + * EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). + * The remainder is always positive. + * + * The truncated division, floored division, Euclidian division and IEEE 754 remainder + * modes are commonly used for the modulus operation. + * Although the other rounding modes can also be used, they may not give useful results. + */ + MODULO_MODE = 1, // 0 to 9 + + // The maximum number of significant digits of the result of the toPower operation. + // If POW_PRECISION is 0, there will be unlimited significant digits. + POW_PRECISION = 0, // 0 to MAX + + // The format specification used by the BigNumber.prototype.toFormat method. + FORMAT = { + decimalSeparator: '.', + groupSeparator: ',', + groupSize: 3, + secondaryGroupSize: 0, + fractionGroupSeparator: '\xA0', // non-breaking space + fractionGroupSize: 0 + }; + + + /******************************************************************************************/ + + + // CONSTRUCTOR + + + /* + * The BigNumber constructor and exported function. + * Create and return a new instance of a BigNumber object. + * + * n {number|string|BigNumber} A numeric value. + * [b] {number} The base of n. Integer, 2 to 64 inclusive. + */ + function BigNumber( n, b ) { + var c, e, i, num, len, str, + x = this; + + // Enable constructor usage without new. + if ( !( x instanceof BigNumber ) ) { + + // 'BigNumber() constructor call without new: {n}' + if (ERRORS) raise( 26, 'constructor call without new', n ); + return new BigNumber( n, b ); + } + + // 'new BigNumber() base not an integer: {b}' + // 'new BigNumber() base out of range: {b}' + if ( b == null || !isValidInt( b, 2, 64, id, 'base' ) ) { + + // Duplicate. + if ( n instanceof BigNumber ) { + x.s = n.s; + x.e = n.e; + x.c = ( n = n.c ) ? n.slice() : n; + id = 0; + return; + } + + if ( ( num = typeof n == 'number' ) && n * 0 == 0 ) { + x.s = 1 / n < 0 ? ( n = -n, -1 ) : 1; + + // Fast path for integers. + if ( n === ~~n ) { + for ( e = 0, i = n; i >= 10; i /= 10, e++ ); + x.e = e; + x.c = [n]; + id = 0; + return; + } + + str = n + ''; + } else { + if ( !isNumeric.test( str = n + '' ) ) return parseNumeric( x, str, num ); + x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1; + } + } else { + b = b | 0; + str = n + ''; + + // Ensure return value is rounded to DECIMAL_PLACES as with other bases. + // Allow exponential notation to be used with base 10 argument. + if ( b == 10 ) { + x = new BigNumber( n instanceof BigNumber ? n : str ); + return round( x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE ); + } + + // Avoid potential interpretation of Infinity and NaN as base 44+ values. + // Any number in exponential form will fail due to the [Ee][+-]. + if ( ( num = typeof n == 'number' ) && n * 0 != 0 || + !( new RegExp( '^-?' + ( c = '[' + ALPHABET.slice( 0, b ) + ']+' ) + + '(?:\\.' + c + ')?$',b < 37 ? 'i' : '' ) ).test(str) ) { + return parseNumeric( x, str, num, b ); + } + + if (num) { + x.s = 1 / n < 0 ? ( str = str.slice(1), -1 ) : 1; + + if ( ERRORS && str.replace( /^0\.0*|\./, '' ).length > 15 ) { + + // 'new BigNumber() number type has more than 15 significant digits: {n}' + raise( id, tooManyDigits, n ); + } + + // Prevent later check for length on converted number. + num = false; + } else { + x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1; + } + + str = convertBase( str, 10, b, x.s ); + } + + // Decimal point? + if ( ( e = str.indexOf('.') ) > -1 ) str = str.replace( '.', '' ); + + // Exponential form? + if ( ( i = str.search( /e/i ) ) > 0 ) { + + // Determine exponent. + if ( e < 0 ) e = i; + e += +str.slice( i + 1 ); + str = str.substring( 0, i ); + } else if ( e < 0 ) { + + // Integer. + e = str.length; + } + + // Determine leading zeros. + for ( i = 0; str.charCodeAt(i) === 48; i++ ); + + // Determine trailing zeros. + for ( len = str.length; str.charCodeAt(--len) === 48; ); + str = str.slice( i, len + 1 ); + + if (str) { + len = str.length; + + // Disallow numbers with over 15 significant digits if number type. + // 'new BigNumber() number type has more than 15 significant digits: {n}' + if ( num && ERRORS && len > 15 && ( n > MAX_SAFE_INTEGER || n !== mathfloor(n) ) ) { + raise( id, tooManyDigits, x.s * n ); + } + + e = e - i - 1; + + // Overflow? + if ( e > MAX_EXP ) { + + // Infinity. + x.c = x.e = null; + + // Underflow? + } else if ( e < MIN_EXP ) { + + // Zero. + x.c = [ x.e = 0 ]; + } else { + x.e = e; + x.c = []; + + // Transform base + + // e is the base 10 exponent. + // i is where to slice str to get the first element of the coefficient array. + i = ( e + 1 ) % LOG_BASE; + if ( e < 0 ) i += LOG_BASE; + + if ( i < len ) { + if (i) x.c.push( +str.slice( 0, i ) ); + + for ( len -= LOG_BASE; i < len; ) { + x.c.push( +str.slice( i, i += LOG_BASE ) ); + } + + str = str.slice(i); + i = LOG_BASE - str.length; + } else { + i -= len; + } + + for ( ; i--; str += '0' ); + x.c.push( +str ); + } + } else { + + // Zero. + x.c = [ x.e = 0 ]; + } + + id = 0; + } + + + // CONSTRUCTOR PROPERTIES + + + BigNumber.another = constructorFactory; + + BigNumber.ROUND_UP = 0; + BigNumber.ROUND_DOWN = 1; + BigNumber.ROUND_CEIL = 2; + BigNumber.ROUND_FLOOR = 3; + BigNumber.ROUND_HALF_UP = 4; + BigNumber.ROUND_HALF_DOWN = 5; + BigNumber.ROUND_HALF_EVEN = 6; + BigNumber.ROUND_HALF_CEIL = 7; + BigNumber.ROUND_HALF_FLOOR = 8; + BigNumber.EUCLID = 9; + + + /* + * Configure infrequently-changing library-wide settings. + * + * Accept an object or an argument list, with one or many of the following properties or + * parameters respectively: + * + * DECIMAL_PLACES {number} Integer, 0 to MAX inclusive + * ROUNDING_MODE {number} Integer, 0 to 8 inclusive + * EXPONENTIAL_AT {number|number[]} Integer, -MAX to MAX inclusive or + * [integer -MAX to 0 incl., 0 to MAX incl.] + * RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or + * [integer -MAX to -1 incl., integer 1 to MAX incl.] + * ERRORS {boolean|number} true, false, 1 or 0 + * CRYPTO {boolean|number} true, false, 1 or 0 + * MODULO_MODE {number} 0 to 9 inclusive + * POW_PRECISION {number} 0 to MAX inclusive + * FORMAT {object} See BigNumber.prototype.toFormat + * decimalSeparator {string} + * groupSeparator {string} + * groupSize {number} + * secondaryGroupSize {number} + * fractionGroupSeparator {string} + * fractionGroupSize {number} + * + * (The values assigned to the above FORMAT object properties are not checked for validity.) + * + * E.g. + * BigNumber.config(20, 4) is equivalent to + * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 }) + * + * Ignore properties/parameters set to null or undefined. + * Return an object with the properties current values. + */ + BigNumber.config = BigNumber.set = function () { + var v, p, + i = 0, + r = {}, + a = arguments, + o = a[0], + has = o && typeof o == 'object' + ? function () { if ( o.hasOwnProperty(p) ) return ( v = o[p] ) != null; } + : function () { if ( a.length > i ) return ( v = a[i++] ) != null; }; + + // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive. + // 'config() DECIMAL_PLACES not an integer: {v}' + // 'config() DECIMAL_PLACES out of range: {v}' + if ( has( p = 'DECIMAL_PLACES' ) && isValidInt( v, 0, MAX, 2, p ) ) { + DECIMAL_PLACES = v | 0; + } + r[p] = DECIMAL_PLACES; + + // ROUNDING_MODE {number} Integer, 0 to 8 inclusive. + // 'config() ROUNDING_MODE not an integer: {v}' + // 'config() ROUNDING_MODE out of range: {v}' + if ( has( p = 'ROUNDING_MODE' ) && isValidInt( v, 0, 8, 2, p ) ) { + ROUNDING_MODE = v | 0; + } + r[p] = ROUNDING_MODE; + + // EXPONENTIAL_AT {number|number[]} + // Integer, -MAX to MAX inclusive or [integer -MAX to 0 inclusive, 0 to MAX inclusive]. + // 'config() EXPONENTIAL_AT not an integer: {v}' + // 'config() EXPONENTIAL_AT out of range: {v}' + if ( has( p = 'EXPONENTIAL_AT' ) ) { + + if ( isArray(v) ) { + if ( isValidInt( v[0], -MAX, 0, 2, p ) && isValidInt( v[1], 0, MAX, 2, p ) ) { + TO_EXP_NEG = v[0] | 0; + TO_EXP_POS = v[1] | 0; + } + } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) { + TO_EXP_NEG = -( TO_EXP_POS = ( v < 0 ? -v : v ) | 0 ); + } + } + r[p] = [ TO_EXP_NEG, TO_EXP_POS ]; + + // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or + // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive]. + // 'config() RANGE not an integer: {v}' + // 'config() RANGE cannot be zero: {v}' + // 'config() RANGE out of range: {v}' + if ( has( p = 'RANGE' ) ) { + + if ( isArray(v) ) { + if ( isValidInt( v[0], -MAX, -1, 2, p ) && isValidInt( v[1], 1, MAX, 2, p ) ) { + MIN_EXP = v[0] | 0; + MAX_EXP = v[1] | 0; + } + } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) { + if ( v | 0 ) MIN_EXP = -( MAX_EXP = ( v < 0 ? -v : v ) | 0 ); + else if (ERRORS) raise( 2, p + ' cannot be zero', v ); + } + } + r[p] = [ MIN_EXP, MAX_EXP ]; + + // ERRORS {boolean|number} true, false, 1 or 0. + // 'config() ERRORS not a boolean or binary digit: {v}' + if ( has( p = 'ERRORS' ) ) { + + if ( v === !!v || v === 1 || v === 0 ) { + id = 0; + isValidInt = ( ERRORS = !!v ) ? intValidatorWithErrors : intValidatorNoErrors; + } else if (ERRORS) { + raise( 2, p + notBool, v ); + } + } + r[p] = ERRORS; + + // CRYPTO {boolean|number} true, false, 1 or 0. + // 'config() CRYPTO not a boolean or binary digit: {v}' + // 'config() crypto unavailable: {crypto}' + if ( has( p = 'CRYPTO' ) ) { + + if ( v === true || v === false || v === 1 || v === 0 ) { + if (v) { + v = typeof crypto == 'undefined'; + if ( !v && crypto && (crypto.getRandomValues || crypto.randomBytes)) { + CRYPTO = true; + } else if (ERRORS) { + raise( 2, 'crypto unavailable', v ? void 0 : crypto ); + } else { + CRYPTO = false; + } + } else { + CRYPTO = false; + } + } else if (ERRORS) { + raise( 2, p + notBool, v ); + } + } + r[p] = CRYPTO; + + // MODULO_MODE {number} Integer, 0 to 9 inclusive. + // 'config() MODULO_MODE not an integer: {v}' + // 'config() MODULO_MODE out of range: {v}' + if ( has( p = 'MODULO_MODE' ) && isValidInt( v, 0, 9, 2, p ) ) { + MODULO_MODE = v | 0; + } + r[p] = MODULO_MODE; + + // POW_PRECISION {number} Integer, 0 to MAX inclusive. + // 'config() POW_PRECISION not an integer: {v}' + // 'config() POW_PRECISION out of range: {v}' + if ( has( p = 'POW_PRECISION' ) && isValidInt( v, 0, MAX, 2, p ) ) { + POW_PRECISION = v | 0; + } + r[p] = POW_PRECISION; + + // FORMAT {object} + // 'config() FORMAT not an object: {v}' + if ( has( p = 'FORMAT' ) ) { + + if ( typeof v == 'object' ) { + FORMAT = v; + } else if (ERRORS) { + raise( 2, p + ' not an object', v ); + } + } + r[p] = FORMAT; + + return r; + }; + + + /* + * Return a new BigNumber whose value is the maximum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.max = function () { return maxOrMin( arguments, P.lt ); }; + + + /* + * Return a new BigNumber whose value is the minimum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.min = function () { return maxOrMin( arguments, P.gt ); }; + + + /* + * Return a new BigNumber with a random value equal to or greater than 0 and less than 1, + * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing + * zeros are produced). + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * + * 'random() decimal places not an integer: {dp}' + * 'random() decimal places out of range: {dp}' + * 'random() crypto unavailable: {crypto}' + */ + BigNumber.random = (function () { + var pow2_53 = 0x20000000000000; + + // Return a 53 bit integer n, where 0 <= n < 9007199254740992. + // Check if Math.random() produces more than 32 bits of randomness. + // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits. + // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1. + var random53bitInt = (Math.random() * pow2_53) & 0x1fffff + ? function () { return mathfloor( Math.random() * pow2_53 ); } + : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) + + (Math.random() * 0x800000 | 0); }; + + return function (dp) { + var a, b, e, k, v, + i = 0, + c = [], + rand = new BigNumber(ONE); + + dp = dp == null || !isValidInt( dp, 0, MAX, 14 ) ? DECIMAL_PLACES : dp | 0; + k = mathceil( dp / LOG_BASE ); + + if (CRYPTO) { + + // Browsers supporting crypto.getRandomValues. + if (crypto.getRandomValues) { + + a = crypto.getRandomValues( new Uint32Array( k *= 2 ) ); + + for ( ; i < k; ) { + + // 53 bits: + // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2) + // 11111 11111111 11111111 11111111 11100000 00000000 00000000 + // ((Math.pow(2, 32) - 1) >>> 11).toString(2) + // 11111 11111111 11111111 + // 0x20000 is 2^21. + v = a[i] * 0x20000 + (a[i + 1] >>> 11); + + // Rejection sampling: + // 0 <= v < 9007199254740992 + // Probability that v >= 9e15, is + // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251 + if ( v >= 9e15 ) { + b = crypto.getRandomValues( new Uint32Array(2) ); + a[i] = b[0]; + a[i + 1] = b[1]; + } else { + + // 0 <= v <= 8999999999999999 + // 0 <= (v % 1e14) <= 99999999999999 + c.push( v % 1e14 ); + i += 2; + } + } + i = k / 2; + + // Node.js supporting crypto.randomBytes. + } else if (crypto.randomBytes) { + + // buffer + a = crypto.randomBytes( k *= 7 ); + + for ( ; i < k; ) { + + // 0x1000000000000 is 2^48, 0x10000000000 is 2^40 + // 0x100000000 is 2^32, 0x1000000 is 2^24 + // 11111 11111111 11111111 11111111 11111111 11111111 11111111 + // 0 <= v < 9007199254740992 + v = ( ( a[i] & 31 ) * 0x1000000000000 ) + ( a[i + 1] * 0x10000000000 ) + + ( a[i + 2] * 0x100000000 ) + ( a[i + 3] * 0x1000000 ) + + ( a[i + 4] << 16 ) + ( a[i + 5] << 8 ) + a[i + 6]; + + if ( v >= 9e15 ) { + crypto.randomBytes(7).copy( a, i ); + } else { + + // 0 <= (v % 1e14) <= 99999999999999 + c.push( v % 1e14 ); + i += 7; + } + } + i = k / 7; + } else { + CRYPTO = false; + if (ERRORS) raise( 14, 'crypto unavailable', crypto ); + } + } + + // Use Math.random. + if (!CRYPTO) { + + for ( ; i < k; ) { + v = random53bitInt(); + if ( v < 9e15 ) c[i++] = v % 1e14; + } + } + + k = c[--i]; + dp %= LOG_BASE; + + // Convert trailing digits to zeros according to dp. + if ( k && dp ) { + v = POWS_TEN[LOG_BASE - dp]; + c[i] = mathfloor( k / v ) * v; + } + + // Remove trailing elements which are zero. + for ( ; c[i] === 0; c.pop(), i-- ); + + // Zero? + if ( i < 0 ) { + c = [ e = 0 ]; + } else { + + // Remove leading elements which are zero and adjust exponent accordingly. + for ( e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE); + + // Count the digits of the first element of c to determine leading zeros, and... + for ( i = 1, v = c[0]; v >= 10; v /= 10, i++); + + // adjust the exponent accordingly. + if ( i < LOG_BASE ) e -= LOG_BASE - i; + } + + rand.e = e; + rand.c = c; + return rand; + }; + })(); + + + // PRIVATE FUNCTIONS + + + // Convert a numeric string of baseIn to a numeric string of baseOut. + function convertBase( str, baseOut, baseIn, sign ) { + var d, e, k, r, x, xc, y, + i = str.indexOf( '.' ), + dp = DECIMAL_PLACES, + rm = ROUNDING_MODE; + + if ( baseIn < 37 ) str = str.toLowerCase(); + + // Non-integer. + if ( i >= 0 ) { + k = POW_PRECISION; + + // Unlimited precision. + POW_PRECISION = 0; + str = str.replace( '.', '' ); + y = new BigNumber(baseIn); + x = y.pow( str.length - i ); + POW_PRECISION = k; + + // Convert str as if an integer, then restore the fraction part by dividing the + // result by its base raised to a power. + y.c = toBaseOut( toFixedPoint( coeffToString( x.c ), x.e ), 10, baseOut ); + y.e = y.c.length; + } + + // Convert the number as integer. + xc = toBaseOut( str, baseIn, baseOut ); + e = k = xc.length; + + // Remove trailing zeros. + for ( ; xc[--k] == 0; xc.pop() ); + if ( !xc[0] ) return '0'; + + if ( i < 0 ) { + --e; + } else { + x.c = xc; + x.e = e; + + // sign is needed for correct rounding. + x.s = sign; + x = div( x, y, dp, rm, baseOut ); + xc = x.c; + r = x.r; + e = x.e; + } + + d = e + dp + 1; + + // The rounding digit, i.e. the digit to the right of the digit that may be rounded up. + i = xc[d]; + k = baseOut / 2; + r = r || d < 0 || xc[d + 1] != null; + + r = rm < 4 ? ( i != null || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) ) + : i > k || i == k &&( rm == 4 || r || rm == 6 && xc[d - 1] & 1 || + rm == ( x.s < 0 ? 8 : 7 ) ); + + if ( d < 1 || !xc[0] ) { + + // 1^-dp or 0. + str = r ? toFixedPoint( '1', -dp ) : '0'; + } else { + xc.length = d; + + if (r) { + + // Rounding up may mean the previous digit has to be rounded up and so on. + for ( --baseOut; ++xc[--d] > baseOut; ) { + xc[d] = 0; + + if ( !d ) { + ++e; + xc = [1].concat(xc); + } + } + } + + // Determine trailing zeros. + for ( k = xc.length; !xc[--k]; ); + + // E.g. [4, 11, 15] becomes 4bf. + for ( i = 0, str = ''; i <= k; str += ALPHABET.charAt( xc[i++] ) ); + str = toFixedPoint( str, e ); + } + + // The caller will add the sign. + return str; + } + + + // Perform division in the specified base. Called by div and convertBase. + div = (function () { + + // Assume non-zero x and k. + function multiply( x, k, base ) { + var m, temp, xlo, xhi, + carry = 0, + i = x.length, + klo = k % SQRT_BASE, + khi = k / SQRT_BASE | 0; + + for ( x = x.slice(); i--; ) { + xlo = x[i] % SQRT_BASE; + xhi = x[i] / SQRT_BASE | 0; + m = khi * xlo + xhi * klo; + temp = klo * xlo + ( ( m % SQRT_BASE ) * SQRT_BASE ) + carry; + carry = ( temp / base | 0 ) + ( m / SQRT_BASE | 0 ) + khi * xhi; + x[i] = temp % base; + } + + if (carry) x = [carry].concat(x); + + return x; + } + + function compare( a, b, aL, bL ) { + var i, cmp; + + if ( aL != bL ) { + cmp = aL > bL ? 1 : -1; + } else { + + for ( i = cmp = 0; i < aL; i++ ) { + + if ( a[i] != b[i] ) { + cmp = a[i] > b[i] ? 1 : -1; + break; + } + } + } + return cmp; + } + + function subtract( a, b, aL, base ) { + var i = 0; + + // Subtract b from a. + for ( ; aL--; ) { + a[aL] -= i; + i = a[aL] < b[aL] ? 1 : 0; + a[aL] = i * base + a[aL] - b[aL]; + } + + // Remove leading zeros. + for ( ; !a[0] && a.length > 1; a.splice(0, 1) ); + } + + // x: dividend, y: divisor. + return function ( x, y, dp, rm, base ) { + var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0, + yL, yz, + s = x.s == y.s ? 1 : -1, + xc = x.c, + yc = y.c; + + // Either NaN, Infinity or 0? + if ( !xc || !xc[0] || !yc || !yc[0] ) { + + return new BigNumber( + + // Return NaN if either NaN, or both Infinity or 0. + !x.s || !y.s || ( xc ? yc && xc[0] == yc[0] : !yc ) ? NaN : + + // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0. + xc && xc[0] == 0 || !yc ? s * 0 : s / 0 + ); + } + + q = new BigNumber(s); + qc = q.c = []; + e = x.e - y.e; + s = dp + e + 1; + + if ( !base ) { + base = BASE; + e = bitFloor( x.e / LOG_BASE ) - bitFloor( y.e / LOG_BASE ); + s = s / LOG_BASE | 0; + } + + // Result exponent may be one less then the current value of e. + // The coefficients of the BigNumbers from convertBase may have trailing zeros. + for ( i = 0; yc[i] == ( xc[i] || 0 ); i++ ); + if ( yc[i] > ( xc[i] || 0 ) ) e--; + + if ( s < 0 ) { + qc.push(1); + more = true; + } else { + xL = xc.length; + yL = yc.length; + i = 0; + s += 2; + + // Normalise xc and yc so highest order digit of yc is >= base / 2. + + n = mathfloor( base / ( yc[0] + 1 ) ); + + // Not necessary, but to handle odd bases where yc[0] == ( base / 2 ) - 1. + // if ( n > 1 || n++ == 1 && yc[0] < base / 2 ) { + if ( n > 1 ) { + yc = multiply( yc, n, base ); + xc = multiply( xc, n, base ); + yL = yc.length; + xL = xc.length; + } + + xi = yL; + rem = xc.slice( 0, yL ); + remL = rem.length; + + // Add zeros to make remainder as long as divisor. + for ( ; remL < yL; rem[remL++] = 0 ); + yz = yc.slice(); + yz = [0].concat(yz); + yc0 = yc[0]; + if ( yc[1] >= base / 2 ) yc0++; + // Not necessary, but to prevent trial digit n > base, when using base 3. + // else if ( base == 3 && yc0 == 1 ) yc0 = 1 + 1e-15; + + do { + n = 0; + + // Compare divisor and remainder. + cmp = compare( yc, rem, yL, remL ); + + // If divisor < remainder. + if ( cmp < 0 ) { + + // Calculate trial digit, n. + + rem0 = rem[0]; + if ( yL != remL ) rem0 = rem0 * base + ( rem[1] || 0 ); + + // n is how many times the divisor goes into the current remainder. + n = mathfloor( rem0 / yc0 ); + + // Algorithm: + // 1. product = divisor * trial digit (n) + // 2. if product > remainder: product -= divisor, n-- + // 3. remainder -= product + // 4. if product was < remainder at 2: + // 5. compare new remainder and divisor + // 6. If remainder > divisor: remainder -= divisor, n++ + + if ( n > 1 ) { + + // n may be > base only when base is 3. + if (n >= base) n = base - 1; + + // product = divisor * trial digit. + prod = multiply( yc, n, base ); + prodL = prod.length; + remL = rem.length; + + // Compare product and remainder. + // If product > remainder. + // Trial digit n too high. + // n is 1 too high about 5% of the time, and is not known to have + // ever been more than 1 too high. + while ( compare( prod, rem, prodL, remL ) == 1 ) { + n--; + + // Subtract divisor from product. + subtract( prod, yL < prodL ? yz : yc, prodL, base ); + prodL = prod.length; + cmp = 1; + } + } else { + + // n is 0 or 1, cmp is -1. + // If n is 0, there is no need to compare yc and rem again below, + // so change cmp to 1 to avoid it. + // If n is 1, leave cmp as -1, so yc and rem are compared again. + if ( n == 0 ) { + + // divisor < remainder, so n must be at least 1. + cmp = n = 1; + } + + // product = divisor + prod = yc.slice(); + prodL = prod.length; + } + + if ( prodL < remL ) prod = [0].concat(prod); + + // Subtract product from remainder. + subtract( rem, prod, remL, base ); + remL = rem.length; + + // If product was < remainder. + if ( cmp == -1 ) { + + // Compare divisor and new remainder. + // If divisor < new remainder, subtract divisor from remainder. + // Trial digit n too low. + // n is 1 too low about 5% of the time, and very rarely 2 too low. + while ( compare( yc, rem, yL, remL ) < 1 ) { + n++; + + // Subtract divisor from remainder. + subtract( rem, yL < remL ? yz : yc, remL, base ); + remL = rem.length; + } + } + } else if ( cmp === 0 ) { + n++; + rem = [0]; + } // else cmp === 1 and n will be 0 + + // Add the next digit, n, to the result array. + qc[i++] = n; + + // Update the remainder. + if ( rem[0] ) { + rem[remL++] = xc[xi] || 0; + } else { + rem = [ xc[xi] ]; + remL = 1; + } + } while ( ( xi++ < xL || rem[0] != null ) && s-- ); + + more = rem[0] != null; + + // Leading zero? + if ( !qc[0] ) qc.splice(0, 1); + } + + if ( base == BASE ) { + + // To calculate q.e, first get the number of digits of qc[0]. + for ( i = 1, s = qc[0]; s >= 10; s /= 10, i++ ); + round( q, dp + ( q.e = i + e * LOG_BASE - 1 ) + 1, rm, more ); + + // Caller is convertBase. + } else { + q.e = e; + q.r = +more; + } + + return q; + }; + })(); + + + /* + * Return a string representing the value of BigNumber n in fixed-point or exponential + * notation rounded to the specified decimal places or significant digits. + * + * n is a BigNumber. + * i is the index of the last digit required (i.e. the digit that may be rounded up). + * rm is the rounding mode. + * caller is caller id: toExponential 19, toFixed 20, toFormat 21, toPrecision 24. + */ + function format( n, i, rm, caller ) { + var c0, e, ne, len, str; + + rm = rm != null && isValidInt( rm, 0, 8, caller, roundingMode ) + ? rm | 0 : ROUNDING_MODE; + + if ( !n.c ) return n.toString(); + c0 = n.c[0]; + ne = n.e; + + if ( i == null ) { + str = coeffToString( n.c ); + str = caller == 19 || caller == 24 && ne <= TO_EXP_NEG + ? toExponential( str, ne ) + : toFixedPoint( str, ne ); + } else { + n = round( new BigNumber(n), i, rm ); + + // n.e may have changed if the value was rounded up. + e = n.e; + + str = coeffToString( n.c ); + len = str.length; + + // toPrecision returns exponential notation if the number of significant digits + // specified is less than the number of digits necessary to represent the integer + // part of the value in fixed-point notation. + + // Exponential notation. + if ( caller == 19 || caller == 24 && ( i <= e || e <= TO_EXP_NEG ) ) { + + // Append zeros? + for ( ; len < i; str += '0', len++ ); + str = toExponential( str, e ); + + // Fixed-point notation. + } else { + i -= ne; + str = toFixedPoint( str, e ); + + // Append zeros? + if ( e + 1 > len ) { + if ( --i > 0 ) for ( str += '.'; i--; str += '0' ); + } else { + i += e - len; + if ( i > 0 ) { + if ( e + 1 == len ) str += '.'; + for ( ; i--; str += '0' ); + } + } + } + } + + return n.s < 0 && c0 ? '-' + str : str; + } + + + // Handle BigNumber.max and BigNumber.min. + function maxOrMin( args, method ) { + var m, n, + i = 0; + + if ( isArray( args[0] ) ) args = args[0]; + m = new BigNumber( args[0] ); + + for ( ; ++i < args.length; ) { + n = new BigNumber( args[i] ); + + // If any number is NaN, return NaN. + if ( !n.s ) { + m = n; + break; + } else if ( method.call( m, n ) ) { + m = n; + } + } + + return m; + } + + + /* + * Return true if n is an integer in range, otherwise throw. + * Use for argument validation when ERRORS is true. + */ + function intValidatorWithErrors( n, min, max, caller, name ) { + if ( n < min || n > max || n != truncate(n) ) { + raise( caller, ( name || 'decimal places' ) + + ( n < min || n > max ? ' out of range' : ' not an integer' ), n ); + } + + return true; + } + + + /* + * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP. + * Called by minus, plus and times. + */ + function normalise( n, c, e ) { + var i = 1, + j = c.length; + + // Remove trailing zeros. + for ( ; !c[--j]; c.pop() ); + + // Calculate the base 10 exponent. First get the number of digits of c[0]. + for ( j = c[0]; j >= 10; j /= 10, i++ ); + + // Overflow? + if ( ( e = i + e * LOG_BASE - 1 ) > MAX_EXP ) { + + // Infinity. + n.c = n.e = null; + + // Underflow? + } else if ( e < MIN_EXP ) { + + // Zero. + n.c = [ n.e = 0 ]; + } else { + n.e = e; + n.c = c; + } + + return n; + } + + + // Handle values that fail the validity test in BigNumber. + parseNumeric = (function () { + var basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i, + dotAfter = /^([^.]+)\.$/, + dotBefore = /^\.([^.]+)$/, + isInfinityOrNaN = /^-?(Infinity|NaN)$/, + whitespaceOrPlus = /^\s*\+(?=[\w.])|^\s+|\s+$/g; + + return function ( x, str, num, b ) { + var base, + s = num ? str : str.replace( whitespaceOrPlus, '' ); + + // No exception on ±Infinity or NaN. + if ( isInfinityOrNaN.test(s) ) { + x.s = isNaN(s) ? null : s < 0 ? -1 : 1; + } else { + if ( !num ) { + + // basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i + s = s.replace( basePrefix, function ( m, p1, p2 ) { + base = ( p2 = p2.toLowerCase() ) == 'x' ? 16 : p2 == 'b' ? 2 : 8; + return !b || b == base ? p1 : m; + }); + + if (b) { + base = b; + + // E.g. '1.' to '1', '.1' to '0.1' + s = s.replace( dotAfter, '$1' ).replace( dotBefore, '0.$1' ); + } + + if ( str != s ) return new BigNumber( s, base ); + } + + // 'new BigNumber() not a number: {n}' + // 'new BigNumber() not a base {b} number: {n}' + if (ERRORS) raise( id, 'not a' + ( b ? ' base ' + b : '' ) + ' number', str ); + x.s = null; + } + + x.c = x.e = null; + id = 0; + } + })(); + + + // Throw a BigNumber Error. + function raise( caller, msg, val ) { + var error = new Error( [ + 'new BigNumber', // 0 + 'cmp', // 1 + 'config', // 2 + 'div', // 3 + 'divToInt', // 4 + 'eq', // 5 + 'gt', // 6 + 'gte', // 7 + 'lt', // 8 + 'lte', // 9 + 'minus', // 10 + 'mod', // 11 + 'plus', // 12 + 'precision', // 13 + 'random', // 14 + 'round', // 15 + 'shift', // 16 + 'times', // 17 + 'toDigits', // 18 + 'toExponential', // 19 + 'toFixed', // 20 + 'toFormat', // 21 + 'toFraction', // 22 + 'pow', // 23 + 'toPrecision', // 24 + 'toString', // 25 + 'BigNumber' // 26 + ][caller] + '() ' + msg + ': ' + val ); + + error.name = 'BigNumber Error'; + id = 0; + throw error; + } + + + /* + * Round x to sd significant digits using rounding mode rm. Check for over/under-flow. + * If r is truthy, it is known that there are more digits after the rounding digit. + */ + function round( x, sd, rm, r ) { + var d, i, j, k, n, ni, rd, + xc = x.c, + pows10 = POWS_TEN; + + // if x is not Infinity or NaN... + if (xc) { + + // rd is the rounding digit, i.e. the digit after the digit that may be rounded up. + // n is a base 1e14 number, the value of the element of array x.c containing rd. + // ni is the index of n within x.c. + // d is the number of digits of n. + // i is the index of rd within n including leading zeros. + // j is the actual index of rd within n (if < 0, rd is a leading zero). + out: { + + // Get the number of digits of the first element of xc. + for ( d = 1, k = xc[0]; k >= 10; k /= 10, d++ ); + i = sd - d; + + // If the rounding digit is in the first element of xc... + if ( i < 0 ) { + i += LOG_BASE; + j = sd; + n = xc[ ni = 0 ]; + + // Get the rounding digit at index j of n. + rd = n / pows10[ d - j - 1 ] % 10 | 0; + } else { + ni = mathceil( ( i + 1 ) / LOG_BASE ); + + if ( ni >= xc.length ) { + + if (r) { + + // Needed by sqrt. + for ( ; xc.length <= ni; xc.push(0) ); + n = rd = 0; + d = 1; + i %= LOG_BASE; + j = i - LOG_BASE + 1; + } else { + break out; + } + } else { + n = k = xc[ni]; + + // Get the number of digits of n. + for ( d = 1; k >= 10; k /= 10, d++ ); + + // Get the index of rd within n. + i %= LOG_BASE; + + // Get the index of rd within n, adjusted for leading zeros. + // The number of leading zeros of n is given by LOG_BASE - d. + j = i - LOG_BASE + d; + + // Get the rounding digit at index j of n. + rd = j < 0 ? 0 : n / pows10[ d - j - 1 ] % 10 | 0; + } + } + + r = r || sd < 0 || + + // Are there any non-zero digits after the rounding digit? + // The expression n % pows10[ d - j - 1 ] returns all digits of n to the right + // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714. + xc[ni + 1] != null || ( j < 0 ? n : n % pows10[ d - j - 1 ] ); + + r = rm < 4 + ? ( rd || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) ) + : rd > 5 || rd == 5 && ( rm == 4 || r || rm == 6 && + + // Check whether the digit to the left of the rounding digit is odd. + ( ( i > 0 ? j > 0 ? n / pows10[ d - j ] : 0 : xc[ni - 1] ) % 10 ) & 1 || + rm == ( x.s < 0 ? 8 : 7 ) ); + + if ( sd < 1 || !xc[0] ) { + xc.length = 0; + + if (r) { + + // Convert sd to decimal places. + sd -= x.e + 1; + + // 1, 0.1, 0.01, 0.001, 0.0001 etc. + xc[0] = pows10[ ( LOG_BASE - sd % LOG_BASE ) % LOG_BASE ]; + x.e = -sd || 0; + } else { + + // Zero. + xc[0] = x.e = 0; + } + + return x; + } + + // Remove excess digits. + if ( i == 0 ) { + xc.length = ni; + k = 1; + ni--; + } else { + xc.length = ni + 1; + k = pows10[ LOG_BASE - i ]; + + // E.g. 56700 becomes 56000 if 7 is the rounding digit. + // j > 0 means i > number of leading zeros of n. + xc[ni] = j > 0 ? mathfloor( n / pows10[ d - j ] % pows10[j] ) * k : 0; + } + + // Round up? + if (r) { + + for ( ; ; ) { + + // If the digit to be rounded up is in the first element of xc... + if ( ni == 0 ) { + + // i will be the length of xc[0] before k is added. + for ( i = 1, j = xc[0]; j >= 10; j /= 10, i++ ); + j = xc[0] += k; + for ( k = 1; j >= 10; j /= 10, k++ ); + + // if i != k the length has increased. + if ( i != k ) { + x.e++; + if ( xc[0] == BASE ) xc[0] = 1; + } + + break; + } else { + xc[ni] += k; + if ( xc[ni] != BASE ) break; + xc[ni--] = 0; + k = 1; + } + } + } + + // Remove trailing zeros. + for ( i = xc.length; xc[--i] === 0; xc.pop() ); + } + + // Overflow? Infinity. + if ( x.e > MAX_EXP ) { + x.c = x.e = null; + + // Underflow? Zero. + } else if ( x.e < MIN_EXP ) { + x.c = [ x.e = 0 ]; + } + } + + return x; + } + + + // PROTOTYPE/INSTANCE METHODS + + + /* + * Return a new BigNumber whose value is the absolute value of this BigNumber. + */ + P.absoluteValue = P.abs = function () { + var x = new BigNumber(this); + if ( x.s < 0 ) x.s = 1; + return x; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole + * number in the direction of Infinity. + */ + P.ceil = function () { + return round( new BigNumber(this), this.e + 1, 2 ); + }; + + + /* + * Return + * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b), + * -1 if the value of this BigNumber is less than the value of BigNumber(y, b), + * 0 if they have the same value, + * or null if the value of either is NaN. + */ + P.comparedTo = P.cmp = function ( y, b ) { + id = 1; + return compare( this, new BigNumber( y, b ) ); + }; + + + /* + * Return the number of decimal places of the value of this BigNumber, or null if the value + * of this BigNumber is ±Infinity or NaN. + */ + P.decimalPlaces = P.dp = function () { + var n, v, + c = this.c; + + if ( !c ) return null; + n = ( ( v = c.length - 1 ) - bitFloor( this.e / LOG_BASE ) ) * LOG_BASE; + + // Subtract the number of trailing zeros of the last number. + if ( v = c[v] ) for ( ; v % 10 == 0; v /= 10, n-- ); + if ( n < 0 ) n = 0; + + return n; + }; + + + /* + * n / 0 = I + * n / N = N + * n / I = 0 + * 0 / n = 0 + * 0 / 0 = N + * 0 / N = N + * 0 / I = 0 + * N / n = N + * N / 0 = N + * N / N = N + * N / I = N + * I / n = I + * I / 0 = I + * I / N = N + * I / I = N + * + * Return a new BigNumber whose value is the value of this BigNumber divided by the value of + * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE. + */ + P.dividedBy = P.div = function ( y, b ) { + id = 3; + return div( this, new BigNumber( y, b ), DECIMAL_PLACES, ROUNDING_MODE ); + }; + + + /* + * Return a new BigNumber whose value is the integer part of dividing the value of this + * BigNumber by the value of BigNumber(y, b). + */ + P.dividedToIntegerBy = P.divToInt = function ( y, b ) { + id = 4; + return div( this, new BigNumber( y, b ), 0, 1 ); + }; + + + /* + * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b), + * otherwise returns false. + */ + P.equals = P.eq = function ( y, b ) { + id = 5; + return compare( this, new BigNumber( y, b ) ) === 0; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole + * number in the direction of -Infinity. + */ + P.floor = function () { + return round( new BigNumber(this), this.e + 1, 3 ); + }; + + + /* + * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b), + * otherwise returns false. + */ + P.greaterThan = P.gt = function ( y, b ) { + id = 6; + return compare( this, new BigNumber( y, b ) ) > 0; + }; + + + /* + * Return true if the value of this BigNumber is greater than or equal to the value of + * BigNumber(y, b), otherwise returns false. + */ + P.greaterThanOrEqualTo = P.gte = function ( y, b ) { + id = 7; + return ( b = compare( this, new BigNumber( y, b ) ) ) === 1 || b === 0; + + }; + + + /* + * Return true if the value of this BigNumber is a finite number, otherwise returns false. + */ + P.isFinite = function () { + return !!this.c; + }; + + + /* + * Return true if the value of this BigNumber is an integer, otherwise return false. + */ + P.isInteger = P.isInt = function () { + return !!this.c && bitFloor( this.e / LOG_BASE ) > this.c.length - 2; + }; + + + /* + * Return true if the value of this BigNumber is NaN, otherwise returns false. + */ + P.isNaN = function () { + return !this.s; + }; + + + /* + * Return true if the value of this BigNumber is negative, otherwise returns false. + */ + P.isNegative = P.isNeg = function () { + return this.s < 0; + }; + + + /* + * Return true if the value of this BigNumber is 0 or -0, otherwise returns false. + */ + P.isZero = function () { + return !!this.c && this.c[0] == 0; + }; + + + /* + * Return true if the value of this BigNumber is less than the value of BigNumber(y, b), + * otherwise returns false. + */ + P.lessThan = P.lt = function ( y, b ) { + id = 8; + return compare( this, new BigNumber( y, b ) ) < 0; + }; + + + /* + * Return true if the value of this BigNumber is less than or equal to the value of + * BigNumber(y, b), otherwise returns false. + */ + P.lessThanOrEqualTo = P.lte = function ( y, b ) { + id = 9; + return ( b = compare( this, new BigNumber( y, b ) ) ) === -1 || b === 0; + }; + + + /* + * n - 0 = n + * n - N = N + * n - I = -I + * 0 - n = -n + * 0 - 0 = 0 + * 0 - N = N + * 0 - I = -I + * N - n = N + * N - 0 = N + * N - N = N + * N - I = N + * I - n = I + * I - 0 = I + * I - N = N + * I - I = N + * + * Return a new BigNumber whose value is the value of this BigNumber minus the value of + * BigNumber(y, b). + */ + P.minus = P.sub = function ( y, b ) { + var i, j, t, xLTy, + x = this, + a = x.s; + + id = 10; + y = new BigNumber( y, b ); + b = y.s; + + // Either NaN? + if ( !a || !b ) return new BigNumber(NaN); + + // Signs differ? + if ( a != b ) { + y.s = -b; + return x.plus(y); + } + + var xe = x.e / LOG_BASE, + ye = y.e / LOG_BASE, + xc = x.c, + yc = y.c; + + if ( !xe || !ye ) { + + // Either Infinity? + if ( !xc || !yc ) return xc ? ( y.s = -b, y ) : new BigNumber( yc ? x : NaN ); + + // Either zero? + if ( !xc[0] || !yc[0] ) { + + // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. + return yc[0] ? ( y.s = -b, y ) : new BigNumber( xc[0] ? x : + + // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity + ROUNDING_MODE == 3 ? -0 : 0 ); + } + } + + xe = bitFloor(xe); + ye = bitFloor(ye); + xc = xc.slice(); + + // Determine which is the bigger number. + if ( a = xe - ye ) { + + if ( xLTy = a < 0 ) { + a = -a; + t = xc; + } else { + ye = xe; + t = yc; + } + + t.reverse(); + + // Prepend zeros to equalise exponents. + for ( b = a; b--; t.push(0) ); + t.reverse(); + } else { + + // Exponents equal. Check digit by digit. + j = ( xLTy = ( a = xc.length ) < ( b = yc.length ) ) ? a : b; + + for ( a = b = 0; b < j; b++ ) { + + if ( xc[b] != yc[b] ) { + xLTy = xc[b] < yc[b]; + break; + } + } + } + + // x < y? Point xc to the array of the bigger number. + if (xLTy) t = xc, xc = yc, yc = t, y.s = -y.s; + + b = ( j = yc.length ) - ( i = xc.length ); + + // Append zeros to xc if shorter. + // No need to add zeros to yc if shorter as subtract only needs to start at yc.length. + if ( b > 0 ) for ( ; b--; xc[i++] = 0 ); + b = BASE - 1; + + // Subtract yc from xc. + for ( ; j > a; ) { + + if ( xc[--j] < yc[j] ) { + for ( i = j; i && !xc[--i]; xc[i] = b ); + --xc[i]; + xc[j] += BASE; + } + + xc[j] -= yc[j]; + } + + // Remove leading zeros and adjust exponent accordingly. + for ( ; xc[0] == 0; xc.splice(0, 1), --ye ); + + // Zero? + if ( !xc[0] ) { + + // Following IEEE 754 (2008) 6.3, + // n - n = +0 but n - n = -0 when rounding towards -Infinity. + y.s = ROUNDING_MODE == 3 ? -1 : 1; + y.c = [ y.e = 0 ]; + return y; + } + + // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity + // for finite x and y. + return normalise( y, xc, ye ); + }; + + + /* + * n % 0 = N + * n % N = N + * n % I = n + * 0 % n = 0 + * -0 % n = -0 + * 0 % 0 = N + * 0 % N = N + * 0 % I = 0 + * N % n = N + * N % 0 = N + * N % N = N + * N % I = N + * I % n = N + * I % 0 = N + * I % N = N + * I % I = N + * + * Return a new BigNumber whose value is the value of this BigNumber modulo the value of + * BigNumber(y, b). The result depends on the value of MODULO_MODE. + */ + P.modulo = P.mod = function ( y, b ) { + var q, s, + x = this; + + id = 11; + y = new BigNumber( y, b ); + + // Return NaN if x is Infinity or NaN, or y is NaN or zero. + if ( !x.c || !y.s || y.c && !y.c[0] ) { + return new BigNumber(NaN); + + // Return x if y is Infinity or x is zero. + } else if ( !y.c || x.c && !x.c[0] ) { + return new BigNumber(x); + } + + if ( MODULO_MODE == 9 ) { + + // Euclidian division: q = sign(y) * floor(x / abs(y)) + // r = x - qy where 0 <= r < abs(y) + s = y.s; + y.s = 1; + q = div( x, y, 0, 3 ); + y.s = s; + q.s *= s; + } else { + q = div( x, y, 0, MODULO_MODE ); + } + + return x.minus( q.times(y) ); + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber negated, + * i.e. multiplied by -1. + */ + P.negated = P.neg = function () { + var x = new BigNumber(this); + x.s = -x.s || null; + return x; + }; + + + /* + * n + 0 = n + * n + N = N + * n + I = I + * 0 + n = n + * 0 + 0 = 0 + * 0 + N = N + * 0 + I = I + * N + n = N + * N + 0 = N + * N + N = N + * N + I = N + * I + n = I + * I + 0 = I + * I + N = N + * I + I = I + * + * Return a new BigNumber whose value is the value of this BigNumber plus the value of + * BigNumber(y, b). + */ + P.plus = P.add = function ( y, b ) { + var t, + x = this, + a = x.s; + + id = 12; + y = new BigNumber( y, b ); + b = y.s; + + // Either NaN? + if ( !a || !b ) return new BigNumber(NaN); + + // Signs differ? + if ( a != b ) { + y.s = -b; + return x.minus(y); + } + + var xe = x.e / LOG_BASE, + ye = y.e / LOG_BASE, + xc = x.c, + yc = y.c; + + if ( !xe || !ye ) { + + // Return ±Infinity if either ±Infinity. + if ( !xc || !yc ) return new BigNumber( a / 0 ); + + // Either zero? + // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. + if ( !xc[0] || !yc[0] ) return yc[0] ? y : new BigNumber( xc[0] ? x : a * 0 ); + } + + xe = bitFloor(xe); + ye = bitFloor(ye); + xc = xc.slice(); + + // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts. + if ( a = xe - ye ) { + if ( a > 0 ) { + ye = xe; + t = yc; + } else { + a = -a; + t = xc; + } + + t.reverse(); + for ( ; a--; t.push(0) ); + t.reverse(); + } + + a = xc.length; + b = yc.length; + + // Point xc to the longer array, and b to the shorter length. + if ( a - b < 0 ) t = yc, yc = xc, xc = t, b = a; + + // Only start adding at yc.length - 1 as the further digits of xc can be ignored. + for ( a = 0; b; ) { + a = ( xc[--b] = xc[b] + yc[b] + a ) / BASE | 0; + xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE; + } + + if (a) { + xc = [a].concat(xc); + ++ye; + } + + // No need to check for zero, as +x + +y != 0 && -x + -y != 0 + // ye = MAX_EXP + 1 possible + return normalise( y, xc, ye ); + }; + + + /* + * Return the number of significant digits of the value of this BigNumber. + * + * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0. + */ + P.precision = P.sd = function (z) { + var n, v, + x = this, + c = x.c; + + // 'precision() argument not a boolean or binary digit: {z}' + if ( z != null && z !== !!z && z !== 1 && z !== 0 ) { + if (ERRORS) raise( 13, 'argument' + notBool, z ); + if ( z != !!z ) z = null; + } + + if ( !c ) return null; + v = c.length - 1; + n = v * LOG_BASE + 1; + + if ( v = c[v] ) { + + // Subtract the number of trailing zeros of the last element. + for ( ; v % 10 == 0; v /= 10, n-- ); + + // Add the number of digits of the first element. + for ( v = c[0]; v >= 10; v /= 10, n++ ); + } + + if ( z && x.e + 1 > n ) n = x.e + 1; + + return n; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of + * dp decimal places using rounding mode rm, or to 0 and ROUNDING_MODE respectively if + * omitted. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'round() decimal places out of range: {dp}' + * 'round() decimal places not an integer: {dp}' + * 'round() rounding mode not an integer: {rm}' + * 'round() rounding mode out of range: {rm}' + */ + P.round = function ( dp, rm ) { + var n = new BigNumber(this); + + if ( dp == null || isValidInt( dp, 0, MAX, 15 ) ) { + round( n, ~~dp + this.e + 1, rm == null || + !isValidInt( rm, 0, 8, 15, roundingMode ) ? ROUNDING_MODE : rm | 0 ); + } + + return n; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber shifted by k places + * (powers of 10). Shift to the right if n > 0, and to the left if n < 0. + * + * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive. + * + * If k is out of range and ERRORS is false, the result will be ±0 if k < 0, or ±Infinity + * otherwise. + * + * 'shift() argument not an integer: {k}' + * 'shift() argument out of range: {k}' + */ + P.shift = function (k) { + var n = this; + return isValidInt( k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 16, 'argument' ) + + // k < 1e+21, or truncate(k) will produce exponential notation. + ? n.times( '1e' + truncate(k) ) + : new BigNumber( n.c && n.c[0] && ( k < -MAX_SAFE_INTEGER || k > MAX_SAFE_INTEGER ) + ? n.s * ( k < 0 ? 0 : 1 / 0 ) + : n ); + }; + + + /* + * sqrt(-n) = N + * sqrt( N) = N + * sqrt(-I) = N + * sqrt( I) = I + * sqrt( 0) = 0 + * sqrt(-0) = -0 + * + * Return a new BigNumber whose value is the square root of the value of this BigNumber, + * rounded according to DECIMAL_PLACES and ROUNDING_MODE. + */ + P.squareRoot = P.sqrt = function () { + var m, n, r, rep, t, + x = this, + c = x.c, + s = x.s, + e = x.e, + dp = DECIMAL_PLACES + 4, + half = new BigNumber('0.5'); + + // Negative/NaN/Infinity/zero? + if ( s !== 1 || !c || !c[0] ) { + return new BigNumber( !s || s < 0 && ( !c || c[0] ) ? NaN : c ? x : 1 / 0 ); + } + + // Initial estimate. + s = Math.sqrt( +x ); + + // Math.sqrt underflow/overflow? + // Pass x to Math.sqrt as integer, then adjust the exponent of the result. + if ( s == 0 || s == 1 / 0 ) { + n = coeffToString(c); + if ( ( n.length + e ) % 2 == 0 ) n += '0'; + s = Math.sqrt(n); + e = bitFloor( ( e + 1 ) / 2 ) - ( e < 0 || e % 2 ); + + if ( s == 1 / 0 ) { + n = '1e' + e; + } else { + n = s.toExponential(); + n = n.slice( 0, n.indexOf('e') + 1 ) + e; + } + + r = new BigNumber(n); + } else { + r = new BigNumber( s + '' ); + } + + // Check for zero. + // r could be zero if MIN_EXP is changed after the this value was created. + // This would cause a division by zero (x/t) and hence Infinity below, which would cause + // coeffToString to throw. + if ( r.c[0] ) { + e = r.e; + s = e + dp; + if ( s < 3 ) s = 0; + + // Newton-Raphson iteration. + for ( ; ; ) { + t = r; + r = half.times( t.plus( div( x, t, dp, 1 ) ) ); + + if ( coeffToString( t.c ).slice( 0, s ) === ( n = + coeffToString( r.c ) ).slice( 0, s ) ) { + + // The exponent of r may here be one less than the final result exponent, + // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits + // are indexed correctly. + if ( r.e < e ) --s; + n = n.slice( s - 3, s + 1 ); + + // The 4th rounding digit may be in error by -1 so if the 4 rounding digits + // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the + // iteration. + if ( n == '9999' || !rep && n == '4999' ) { + + // On the first iteration only, check to see if rounding up gives the + // exact result as the nines may infinitely repeat. + if ( !rep ) { + round( t, t.e + DECIMAL_PLACES + 2, 0 ); + + if ( t.times(t).eq(x) ) { + r = t; + break; + } + } + + dp += 4; + s += 4; + rep = 1; + } else { + + // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact + // result. If not, then there are further digits and m will be truthy. + if ( !+n || !+n.slice(1) && n.charAt(0) == '5' ) { + + // Truncate to the first rounding digit. + round( r, r.e + DECIMAL_PLACES + 2, 1 ); + m = !r.times(r).eq(x); + } + + break; + } + } + } + } + + return round( r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m ); + }; + + + /* + * n * 0 = 0 + * n * N = N + * n * I = I + * 0 * n = 0 + * 0 * 0 = 0 + * 0 * N = N + * 0 * I = N + * N * n = N + * N * 0 = N + * N * N = N + * N * I = N + * I * n = I + * I * 0 = N + * I * N = N + * I * I = I + * + * Return a new BigNumber whose value is the value of this BigNumber times the value of + * BigNumber(y, b). + */ + P.times = P.mul = function ( y, b ) { + var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc, + base, sqrtBase, + x = this, + xc = x.c, + yc = ( id = 17, y = new BigNumber( y, b ) ).c; + + // Either NaN, ±Infinity or ±0? + if ( !xc || !yc || !xc[0] || !yc[0] ) { + + // Return NaN if either is NaN, or one is 0 and the other is Infinity. + if ( !x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc ) { + y.c = y.e = y.s = null; + } else { + y.s *= x.s; + + // Return ±Infinity if either is ±Infinity. + if ( !xc || !yc ) { + y.c = y.e = null; + + // Return ±0 if either is ±0. + } else { + y.c = [0]; + y.e = 0; + } + } + + return y; + } + + e = bitFloor( x.e / LOG_BASE ) + bitFloor( y.e / LOG_BASE ); + y.s *= x.s; + xcL = xc.length; + ycL = yc.length; + + // Ensure xc points to longer array and xcL to its length. + if ( xcL < ycL ) zc = xc, xc = yc, yc = zc, i = xcL, xcL = ycL, ycL = i; + + // Initialise the result array with zeros. + for ( i = xcL + ycL, zc = []; i--; zc.push(0) ); + + base = BASE; + sqrtBase = SQRT_BASE; + + for ( i = ycL; --i >= 0; ) { + c = 0; + ylo = yc[i] % sqrtBase; + yhi = yc[i] / sqrtBase | 0; + + for ( k = xcL, j = i + k; j > i; ) { + xlo = xc[--k] % sqrtBase; + xhi = xc[k] / sqrtBase | 0; + m = yhi * xlo + xhi * ylo; + xlo = ylo * xlo + ( ( m % sqrtBase ) * sqrtBase ) + zc[j] + c; + c = ( xlo / base | 0 ) + ( m / sqrtBase | 0 ) + yhi * xhi; + zc[j--] = xlo % base; + } + + zc[j] = c; + } + + if (c) { + ++e; + } else { + zc.splice(0, 1); + } + + return normalise( y, zc, e ); + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of + * sd significant digits using rounding mode rm, or ROUNDING_MODE if rm is omitted. + * + * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toDigits() precision out of range: {sd}' + * 'toDigits() precision not an integer: {sd}' + * 'toDigits() rounding mode not an integer: {rm}' + * 'toDigits() rounding mode out of range: {rm}' + */ + P.toDigits = function ( sd, rm ) { + var n = new BigNumber(this); + sd = sd == null || !isValidInt( sd, 1, MAX, 18, 'precision' ) ? null : sd | 0; + rm = rm == null || !isValidInt( rm, 0, 8, 18, roundingMode ) ? ROUNDING_MODE : rm | 0; + return sd ? round( n, sd, rm ) : n; + }; + + + /* + * Return a string representing the value of this BigNumber in exponential notation and + * rounded using ROUNDING_MODE to dp fixed decimal places. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toExponential() decimal places not an integer: {dp}' + * 'toExponential() decimal places out of range: {dp}' + * 'toExponential() rounding mode not an integer: {rm}' + * 'toExponential() rounding mode out of range: {rm}' + */ + P.toExponential = function ( dp, rm ) { + return format( this, + dp != null && isValidInt( dp, 0, MAX, 19 ) ? ~~dp + 1 : null, rm, 19 ); + }; + + + /* + * Return a string representing the value of this BigNumber in fixed-point notation rounding + * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted. + * + * Note: as with JavaScript's number type, (-0).toFixed(0) is '0', + * but e.g. (-0.00001).toFixed(0) is '-0'. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toFixed() decimal places not an integer: {dp}' + * 'toFixed() decimal places out of range: {dp}' + * 'toFixed() rounding mode not an integer: {rm}' + * 'toFixed() rounding mode out of range: {rm}' + */ + P.toFixed = function ( dp, rm ) { + return format( this, dp != null && isValidInt( dp, 0, MAX, 20 ) + ? ~~dp + this.e + 1 : null, rm, 20 ); + }; + + + /* + * Return a string representing the value of this BigNumber in fixed-point notation rounded + * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties + * of the FORMAT object (see BigNumber.config). + * + * FORMAT = { + * decimalSeparator : '.', + * groupSeparator : ',', + * groupSize : 3, + * secondaryGroupSize : 0, + * fractionGroupSeparator : '\xA0', // non-breaking space + * fractionGroupSize : 0 + * }; + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toFormat() decimal places not an integer: {dp}' + * 'toFormat() decimal places out of range: {dp}' + * 'toFormat() rounding mode not an integer: {rm}' + * 'toFormat() rounding mode out of range: {rm}' + */ + P.toFormat = function ( dp, rm ) { + var str = format( this, dp != null && isValidInt( dp, 0, MAX, 21 ) + ? ~~dp + this.e + 1 : null, rm, 21 ); + + if ( this.c ) { + var i, + arr = str.split('.'), + g1 = +FORMAT.groupSize, + g2 = +FORMAT.secondaryGroupSize, + groupSeparator = FORMAT.groupSeparator, + intPart = arr[0], + fractionPart = arr[1], + isNeg = this.s < 0, + intDigits = isNeg ? intPart.slice(1) : intPart, + len = intDigits.length; + + if (g2) i = g1, g1 = g2, g2 = i, len -= i; + + if ( g1 > 0 && len > 0 ) { + i = len % g1 || g1; + intPart = intDigits.substr( 0, i ); + + for ( ; i < len; i += g1 ) { + intPart += groupSeparator + intDigits.substr( i, g1 ); + } + + if ( g2 > 0 ) intPart += groupSeparator + intDigits.slice(i); + if (isNeg) intPart = '-' + intPart; + } + + str = fractionPart + ? intPart + FORMAT.decimalSeparator + ( ( g2 = +FORMAT.fractionGroupSize ) + ? fractionPart.replace( new RegExp( '\\d{' + g2 + '}\\B', 'g' ), + '$&' + FORMAT.fractionGroupSeparator ) + : fractionPart ) + : intPart; + } + + return str; + }; + + + /* + * Return a string array representing the value of this BigNumber as a simple fraction with + * an integer numerator and an integer denominator. The denominator will be a positive + * non-zero value less than or equal to the specified maximum denominator. If a maximum + * denominator is not specified, the denominator will be the lowest value necessary to + * represent the number exactly. + * + * [md] {number|string|BigNumber} Integer >= 1 and < Infinity. The maximum denominator. + * + * 'toFraction() max denominator not an integer: {md}' + * 'toFraction() max denominator out of range: {md}' + */ + P.toFraction = function (md) { + var arr, d0, d2, e, exp, n, n0, q, s, + k = ERRORS, + x = this, + xc = x.c, + d = new BigNumber(ONE), + n1 = d0 = new BigNumber(ONE), + d1 = n0 = new BigNumber(ONE); + + if ( md != null ) { + ERRORS = false; + n = new BigNumber(md); + ERRORS = k; + + if ( !( k = n.isInt() ) || n.lt(ONE) ) { + + if (ERRORS) { + raise( 22, + 'max denominator ' + ( k ? 'out of range' : 'not an integer' ), md ); + } + + // ERRORS is false: + // If md is a finite non-integer >= 1, round it to an integer and use it. + md = !k && n.c && round( n, n.e + 1, 1 ).gte(ONE) ? n : null; + } + } + + if ( !xc ) return x.toString(); + s = coeffToString(xc); + + // Determine initial denominator. + // d is a power of 10 and the minimum max denominator that specifies the value exactly. + e = d.e = s.length - x.e - 1; + d.c[0] = POWS_TEN[ ( exp = e % LOG_BASE ) < 0 ? LOG_BASE + exp : exp ]; + md = !md || n.cmp(d) > 0 ? ( e > 0 ? d : n1 ) : n; + + exp = MAX_EXP; + MAX_EXP = 1 / 0; + n = new BigNumber(s); + + // n0 = d1 = 0 + n0.c[0] = 0; + + for ( ; ; ) { + q = div( n, d, 0, 1 ); + d2 = d0.plus( q.times(d1) ); + if ( d2.cmp(md) == 1 ) break; + d0 = d1; + d1 = d2; + n1 = n0.plus( q.times( d2 = n1 ) ); + n0 = d2; + d = n.minus( q.times( d2 = d ) ); + n = d2; + } + + d2 = div( md.minus(d0), d1, 0, 1 ); + n0 = n0.plus( d2.times(n1) ); + d0 = d0.plus( d2.times(d1) ); + n0.s = n1.s = x.s; + e *= 2; + + // Determine which fraction is closer to x, n0/d0 or n1/d1 + arr = div( n1, d1, e, ROUNDING_MODE ).minus(x).abs().cmp( + div( n0, d0, e, ROUNDING_MODE ).minus(x).abs() ) < 1 + ? [ n1.toString(), d1.toString() ] + : [ n0.toString(), d0.toString() ]; + + MAX_EXP = exp; + return arr; + }; + + + /* + * Return the value of this BigNumber converted to a number primitive. + */ + P.toNumber = function () { + return +this; + }; + + + /* + * Return a BigNumber whose value is the value of this BigNumber raised to the power n. + * If m is present, return the result modulo m. + * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE. + * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using + * ROUNDING_MODE. + * + * The modular power operation works efficiently when x, n, and m are positive integers, + * otherwise it is equivalent to calculating x.toPower(n).modulo(m) (with POW_PRECISION 0). + * + * n {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive. + * [m] {number|string|BigNumber} The modulus. + * + * 'pow() exponent not an integer: {n}' + * 'pow() exponent out of range: {n}' + * + * Performs 54 loop iterations for n of 9007199254740991. + */ + P.toPower = P.pow = function ( n, m ) { + var k, y, z, + i = mathfloor( n < 0 ? -n : +n ), + x = this; + + if ( m != null ) { + id = 23; + m = new BigNumber(m); + } + + // Pass ±Infinity to Math.pow if exponent is out of range. + if ( !isValidInt( n, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 23, 'exponent' ) && + ( !isFinite(n) || i > MAX_SAFE_INTEGER && ( n /= 0 ) || + parseFloat(n) != n && !( n = NaN ) ) || n == 0 ) { + k = Math.pow( +x, n ); + return new BigNumber( m ? k % m : k ); + } + + if (m) { + if ( n > 1 && x.gt(ONE) && x.isInt() && m.gt(ONE) && m.isInt() ) { + x = x.mod(m); + } else { + z = m; + + // Nullify m so only a single mod operation is performed at the end. + m = null; + } + } else if (POW_PRECISION) { + + // Truncating each coefficient array to a length of k after each multiplication + // equates to truncating significant digits to POW_PRECISION + [28, 41], + // i.e. there will be a minimum of 28 guard digits retained. + // (Using + 1.5 would give [9, 21] guard digits.) + k = mathceil( POW_PRECISION / LOG_BASE + 2 ); + } + + y = new BigNumber(ONE); + + for ( ; ; ) { + if ( i % 2 ) { + y = y.times(x); + if ( !y.c ) break; + if (k) { + if ( y.c.length > k ) y.c.length = k; + } else if (m) { + y = y.mod(m); + } + } + + i = mathfloor( i / 2 ); + if ( !i ) break; + x = x.times(x); + if (k) { + if ( x.c && x.c.length > k ) x.c.length = k; + } else if (m) { + x = x.mod(m); + } + } + + if (m) return y; + if ( n < 0 ) y = ONE.div(y); + + return z ? y.mod(z) : k ? round( y, POW_PRECISION, ROUNDING_MODE ) : y; + }; + + + /* + * Return a string representing the value of this BigNumber rounded to sd significant digits + * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits + * necessary to represent the integer part of the value in fixed-point notation, then use + * exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toPrecision() precision not an integer: {sd}' + * 'toPrecision() precision out of range: {sd}' + * 'toPrecision() rounding mode not an integer: {rm}' + * 'toPrecision() rounding mode out of range: {rm}' + */ + P.toPrecision = function ( sd, rm ) { + return format( this, sd != null && isValidInt( sd, 1, MAX, 24, 'precision' ) + ? sd | 0 : null, rm, 24 ); + }; + + + /* + * Return a string representing the value of this BigNumber in base b, or base 10 if b is + * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and + * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent + * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than + * TO_EXP_NEG, return exponential notation. + * + * [b] {number} Integer, 2 to 64 inclusive. + * + * 'toString() base not an integer: {b}' + * 'toString() base out of range: {b}' + */ + P.toString = function (b) { + var str, + n = this, + s = n.s, + e = n.e; + + // Infinity or NaN? + if ( e === null ) { + + if (s) { + str = 'Infinity'; + if ( s < 0 ) str = '-' + str; + } else { + str = 'NaN'; + } + } else { + str = coeffToString( n.c ); + + if ( b == null || !isValidInt( b, 2, 64, 25, 'base' ) ) { + str = e <= TO_EXP_NEG || e >= TO_EXP_POS + ? toExponential( str, e ) + : toFixedPoint( str, e ); + } else { + str = convertBase( toFixedPoint( str, e ), b | 0, 10, s ); + } + + if ( s < 0 && n.c[0] ) str = '-' + str; + } + + return str; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber truncated to a whole + * number. + */ + P.truncated = P.trunc = function () { + return round( new BigNumber(this), this.e + 1, 1 ); + }; + + + /* + * Return as toString, but do not accept a base argument, and include the minus sign for + * negative zero. + */ + P.valueOf = P.toJSON = function () { + var str, + n = this, + e = n.e; + + if ( e === null ) return n.toString(); + + str = coeffToString( n.c ); + + str = e <= TO_EXP_NEG || e >= TO_EXP_POS + ? toExponential( str, e ) + : toFixedPoint( str, e ); + + return n.s < 0 ? '-' + str : str; + }; + + + P.isBigNumber = true; + + if ( config != null ) BigNumber.config(config); + + return BigNumber; + } + + + // PRIVATE HELPER FUNCTIONS + + + function bitFloor(n) { + var i = n | 0; + return n > 0 || n === i ? i : i - 1; + } + + + // Return a coefficient array as a string of base 10 digits. + function coeffToString(a) { + var s, z, + i = 1, + j = a.length, + r = a[0] + ''; + + for ( ; i < j; ) { + s = a[i++] + ''; + z = LOG_BASE - s.length; + for ( ; z--; s = '0' + s ); + r += s; + } + + // Determine trailing zeros. + for ( j = r.length; r.charCodeAt(--j) === 48; ); + return r.slice( 0, j + 1 || 1 ); + } + + + // Compare the value of BigNumbers x and y. + function compare( x, y ) { + var a, b, + xc = x.c, + yc = y.c, + i = x.s, + j = y.s, + k = x.e, + l = y.e; + + // Either NaN? + if ( !i || !j ) return null; + + a = xc && !xc[0]; + b = yc && !yc[0]; + + // Either zero? + if ( a || b ) return a ? b ? 0 : -j : i; + + // Signs differ? + if ( i != j ) return i; + + a = i < 0; + b = k == l; + + // Either Infinity? + if ( !xc || !yc ) return b ? 0 : !xc ^ a ? 1 : -1; + + // Compare exponents. + if ( !b ) return k > l ^ a ? 1 : -1; + + j = ( k = xc.length ) < ( l = yc.length ) ? k : l; + + // Compare digit by digit. + for ( i = 0; i < j; i++ ) if ( xc[i] != yc[i] ) return xc[i] > yc[i] ^ a ? 1 : -1; + + // Compare lengths. + return k == l ? 0 : k > l ^ a ? 1 : -1; + } + + + /* + * Return true if n is a valid number in range, otherwise false. + * Use for argument validation when ERRORS is false. + * Note: parseInt('1e+1') == 1 but parseFloat('1e+1') == 10. + */ + function intValidatorNoErrors( n, min, max ) { + return ( n = truncate(n) ) >= min && n <= max; + } + + + function isArray(obj) { + return Object.prototype.toString.call(obj) == '[object Array]'; + } + + + /* + * Convert string of baseIn to an array of numbers of baseOut. + * Eg. convertBase('255', 10, 16) returns [15, 15]. + * Eg. convertBase('ff', 16, 10) returns [2, 5, 5]. + */ + function toBaseOut( str, baseIn, baseOut ) { + var j, + arr = [0], + arrL, + i = 0, + len = str.length; + + for ( ; i < len; ) { + for ( arrL = arr.length; arrL--; arr[arrL] *= baseIn ); + arr[ j = 0 ] += ALPHABET.indexOf( str.charAt( i++ ) ); + + for ( ; j < arr.length; j++ ) { + + if ( arr[j] > baseOut - 1 ) { + if ( arr[j + 1] == null ) arr[j + 1] = 0; + arr[j + 1] += arr[j] / baseOut | 0; + arr[j] %= baseOut; + } + } + } + + return arr.reverse(); + } + + + function toExponential( str, e ) { + return ( str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str ) + + ( e < 0 ? 'e' : 'e+' ) + e; + } + + + function toFixedPoint( str, e ) { + var len, z; + + // Negative exponent? + if ( e < 0 ) { + + // Prepend zeros. + for ( z = '0.'; ++e; z += '0' ); + str = z + str; + + // Positive exponent + } else { + len = str.length; + + // Append zeros. + if ( ++e > len ) { + for ( z = '0', e -= len; --e; z += '0' ); + str += z; + } else if ( e < len ) { + str = str.slice( 0, e ) + '.' + str.slice(e); + } + } + + return str; + } + + + function truncate(n) { + n = parseFloat(n); + return n < 0 ? mathceil(n) : mathfloor(n); + } + + + // EXPORT + + + BigNumber = constructorFactory(); + BigNumber['default'] = BigNumber.BigNumber = BigNumber; + + + // AMD. + if ( typeof define == 'function' && define.amd ) { + define( function () { return BigNumber; } ); + + // Node.js and other environments that support module.exports. + } else if ( typeof module != 'undefined' && module.exports ) { + module.exports = BigNumber; + + // Browser. + } else { + if ( !globalObj ) globalObj = typeof self != 'undefined' ? self : Function('return this')(); + globalObj.BigNumber = BigNumber; + } +})(this); diff --git a/html/RentForCamp/node_modules/bignumber.js/bignumber.js.map b/html/RentForCamp/node_modules/bignumber.js/bignumber.js.map new file mode 100644 index 0000000..c993524 --- /dev/null +++ b/html/RentForCamp/node_modules/bignumber.js/bignumber.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bignumber.min.js","sources":["bignumber.js"],"names":["globalObj","constructorFactory","config","BigNumber","n","b","c","e","i","num","len","str","x","this","ERRORS","raise","isValidInt","id","round","DECIMAL_PLACES","ROUNDING_MODE","RegExp","ALPHABET","slice","test","parseNumeric","s","replace","length","tooManyDigits","charCodeAt","convertBase","isNumeric","indexOf","search","substring","MAX_SAFE_INTEGER","mathfloor","MAX_EXP","MIN_EXP","LOG_BASE","push","baseOut","baseIn","sign","d","k","r","xc","y","dp","rm","toLowerCase","POW_PRECISION","pow","toBaseOut","toFixedPoint","coeffToString","pop","div","concat","charAt","format","caller","c0","ne","roundingMode","toString","TO_EXP_NEG","toExponential","maxOrMin","args","method","m","isArray","call","intValidatorWithErrors","min","max","name","truncate","normalise","j","msg","val","error","Error","sd","ni","rd","pows10","POWS_TEN","out","mathceil","BASE","P","prototype","ONE","TO_EXP_POS","CRYPTO","MODULO_MODE","FORMAT","decimalSeparator","groupSeparator","groupSize","secondaryGroupSize","fractionGroupSeparator","fractionGroupSize","another","ROUND_UP","ROUND_DOWN","ROUND_CEIL","ROUND_FLOOR","ROUND_HALF_UP","ROUND_HALF_DOWN","ROUND_HALF_EVEN","ROUND_HALF_CEIL","ROUND_HALF_FLOOR","EUCLID","set","v","p","a","arguments","o","has","hasOwnProperty","MAX","intValidatorNoErrors","notBool","crypto","getRandomValues","randomBytes","lt","gt","random","pow2_53","random53bitInt","Math","rand","Uint32Array","copy","splice","multiply","base","temp","xlo","xhi","carry","klo","SQRT_BASE","khi","compare","aL","bL","cmp","subtract","more","prod","prodL","q","qc","rem","remL","rem0","xi","xL","yc0","yL","yz","yc","NaN","bitFloor","basePrefix","dotAfter","dotBefore","isInfinityOrNaN","whitespaceOrPlus","isNaN","p1","p2","absoluteValue","abs","ceil","comparedTo","decimalPlaces","dividedBy","dividedToIntegerBy","divToInt","equals","eq","floor","greaterThan","greaterThanOrEqualTo","gte","isFinite","isInteger","isInt","isNegative","isNeg","isZero","lessThan","lessThanOrEqualTo","lte","minus","sub","t","xLTy","plus","xe","ye","reverse","modulo","mod","times","negated","neg","add","precision","z","shift","squareRoot","sqrt","rep","half","mul","xcL","ycL","ylo","yhi","zc","sqrtBase","toDigits","toFixed","toFormat","arr","split","g1","g2","intPart","fractionPart","intDigits","substr","toFraction","md","d0","d2","exp","n0","n1","d1","toNumber","toPower","parseFloat","toPrecision","truncated","trunc","valueOf","toJSON","isBigNumber","l","obj","Object","arrL","define","amd","module","exports","self","Function"],"mappings":"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"} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/bignumber.js/bignumber.min.js b/html/RentForCamp/node_modules/bignumber.js/bignumber.min.js new file mode 100644 index 0000000..5b0f7ad --- /dev/null +++ b/html/RentForCamp/node_modules/bignumber.js/bignumber.min.js @@ -0,0 +1,3 @@ +/* bignumber.js v4.1.0 https://github.com/MikeMcl/bignumber.js/LICENCE */ +!function(e){"use strict";function n(e){function a(e,n){var t,r,i,o,u,s,l=this;if(!(l instanceof a))return z&&x(26,"constructor call without new",e),new a(e,n);if(null!=n&&V(n,2,64,C,"base")){if(n=0|n,s=e+"",10==n)return l=new a(e instanceof a?e:s),I(l,B+l.e+1,P);if((o="number"==typeof e)&&0*e!=0||!new RegExp("^-?"+(t="["+v.slice(0,n)+"]+")+"(?:\\."+t+")?$",37>n?"i":"").test(s))return U(l,s,o,n);o?(l.s=0>1/e?(s=s.slice(1),-1):1,z&&s.replace(/^0\.0*|\./,"").length>15&&x(C,w,e),o=!1):l.s=45===s.charCodeAt(0)?(s=s.slice(1),-1):1,s=A(s,10,n,l.s)}else{if(e instanceof a)return l.s=e.s,l.e=e.e,l.c=(e=e.c)?e.slice():e,void(C=0);if((o="number"==typeof e)&&0*e==0){if(l.s=0>1/e?(e=-e,-1):1,e===~~e){for(r=0,i=e;i>=10;i/=10,r++);return l.e=r,l.c=[e],void(C=0)}s=e+""}else{if(!h.test(s=e+""))return U(l,s,o);l.s=45===s.charCodeAt(0)?(s=s.slice(1),-1):1}}for((r=s.indexOf("."))>-1&&(s=s.replace(".","")),(i=s.search(/e/i))>0?(0>r&&(r=i),r+=+s.slice(i+1),s=s.substring(0,i)):0>r&&(r=s.length),i=0;48===s.charCodeAt(i);i++);for(u=s.length;48===s.charCodeAt(--u););if(s=s.slice(i,u+1))if(u=s.length,o&&z&&u>15&&(e>y||e!==p(e))&&x(C,w,l.s*e),r=r-i-1,r>G)l.c=l.e=null;else if($>r)l.c=[l.e=0];else{if(l.e=r,l.c=[],i=(r+1)%b,0>r&&(i+=b),u>i){for(i&&l.c.push(+s.slice(0,i)),u-=b;u>i;)l.c.push(+s.slice(i,i+=b));s=s.slice(i),i=b-s.length}else i-=u;for(;i--;s+="0");l.c.push(+s)}else l.c=[l.e=0];C=0}function A(e,n,t,i){var o,u,l,f,h,g,p,d=e.indexOf("."),m=B,w=P;for(37>t&&(e=e.toLowerCase()),d>=0&&(l=W,W=0,e=e.replace(".",""),p=new a(t),h=p.pow(e.length-d),W=l,p.c=s(c(r(h.c),h.e),10,n),p.e=p.c.length),g=s(e,t,n),u=l=g.length;0==g[--l];g.pop());if(!g[0])return"0";if(0>d?--u:(h.c=g,h.e=u,h.s=i,h=L(h,p,m,w,n),g=h.c,f=h.r,u=h.e),o=u+m+1,d=g[o],l=n/2,f=f||0>o||null!=g[o+1],f=4>w?(null!=d||f)&&(0==w||w==(h.s<0?3:2)):d>l||d==l&&(4==w||f||6==w&&1&g[o-1]||w==(h.s<0?8:7)),1>o||!g[0])e=f?c("1",-m):"0";else{if(g.length=o,f)for(--n;++g[--o]>n;)g[o]=0,o||(++u,g=[1].concat(g));for(l=g.length;!g[--l];);for(d=0,e="";l>=d;e+=v.charAt(g[d++]));e=c(e,u)}return e}function E(e,n,t,i){var o,u,s,f,h;if(t=null!=t&&V(t,0,8,i,m)?0|t:P,!e.c)return e.toString();if(o=e.c[0],s=e.e,null==n)h=r(e.c),h=19==i||24==i&&q>=s?l(h,s):c(h,s);else if(e=I(new a(e),n,t),u=e.e,h=r(e.c),f=h.length,19==i||24==i&&(u>=n||q>=u)){for(;n>f;h+="0",f++);h=l(h,u)}else if(n-=s,h=c(h,u),u+1>f){if(--n>0)for(h+=".";n--;h+="0");}else if(n+=u-f,n>0)for(u+1==f&&(h+=".");n--;h+="0");return e.s<0&&o?"-"+h:h}function D(e,n){var t,r,i=0;for(u(e[0])&&(e=e[0]),t=new a(e[0]);++ie||e>t||e!=f(e))&&x(r,(i||"decimal places")+(n>e||e>t?" out of range":" not an integer"),e),!0}function _(e,n,t){for(var r=1,i=n.length;!n[--i];n.pop());for(i=n[0];i>=10;i/=10,r++);return(t=r+t*b-1)>G?e.c=e.e=null:$>t?e.c=[e.e=0]:(e.e=t,e.c=n),e}function x(e,n,t){var r=new Error(["new BigNumber","cmp","config","div","divToInt","eq","gt","gte","lt","lte","minus","mod","plus","precision","random","round","shift","times","toDigits","toExponential","toFixed","toFormat","toFraction","pow","toPrecision","toString","BigNumber"][e]+"() "+n+": "+t);throw r.name="BigNumber Error",C=0,r}function I(e,n,t,r){var i,o,u,s,l,c,f,a=e.c,h=O;if(a){e:{for(i=1,s=a[0];s>=10;s/=10,i++);if(o=n-i,0>o)o+=b,u=n,l=a[c=0],f=l/h[i-u-1]%10|0;else if(c=g((o+1)/b),c>=a.length){if(!r)break e;for(;a.length<=c;a.push(0));l=f=0,i=1,o%=b,u=o-b+1}else{for(l=s=a[c],i=1;s>=10;s/=10,i++);o%=b,u=o-b+i,f=0>u?0:l/h[i-u-1]%10|0}if(r=r||0>n||null!=a[c+1]||(0>u?l:l%h[i-u-1]),r=4>t?(f||r)&&(0==t||t==(e.s<0?3:2)):f>5||5==f&&(4==t||r||6==t&&(o>0?u>0?l/h[i-u]:0:a[c-1])%10&1||t==(e.s<0?8:7)),1>n||!a[0])return a.length=0,r?(n-=e.e+1,a[0]=h[(b-n%b)%b],e.e=-n||0):a[0]=e.e=0,e;if(0==o?(a.length=c,s=1,c--):(a.length=c+1,s=h[b-o],a[c]=u>0?p(l/h[i-u]%h[u])*s:0),r)for(;;){if(0==c){for(o=1,u=a[0];u>=10;u/=10,o++);for(u=a[0]+=s,s=1;u>=10;u/=10,s++);o!=s&&(e.e++,a[0]==N&&(a[0]=1));break}if(a[c]+=s,a[c]!=N)break;a[c--]=0,s=1}for(o=a.length;0===a[--o];a.pop());}e.e>G?e.c=e.e=null:e.e<$&&(e.c=[e.e=0])}return e}var L,U,C=0,M=a.prototype,T=new a(1),B=20,P=4,q=-7,k=21,$=-1e7,G=1e7,z=!0,V=F,j=!1,H=1,W=0,J={decimalSeparator:".",groupSeparator:",",groupSize:3,secondaryGroupSize:0,fractionGroupSeparator:" ",fractionGroupSize:0};return a.another=n,a.ROUND_UP=0,a.ROUND_DOWN=1,a.ROUND_CEIL=2,a.ROUND_FLOOR=3,a.ROUND_HALF_UP=4,a.ROUND_HALF_DOWN=5,a.ROUND_HALF_EVEN=6,a.ROUND_HALF_CEIL=7,a.ROUND_HALF_FLOOR=8,a.EUCLID=9,a.config=a.set=function(){var e,n,t=0,r={},i=arguments,s=i[0],l=s&&"object"==typeof s?function(){return s.hasOwnProperty(n)?null!=(e=s[n]):void 0}:function(){return i.length>t?null!=(e=i[t++]):void 0};return l(n="DECIMAL_PLACES")&&V(e,0,S,2,n)&&(B=0|e),r[n]=B,l(n="ROUNDING_MODE")&&V(e,0,8,2,n)&&(P=0|e),r[n]=P,l(n="EXPONENTIAL_AT")&&(u(e)?V(e[0],-S,0,2,n)&&V(e[1],0,S,2,n)&&(q=0|e[0],k=0|e[1]):V(e,-S,S,2,n)&&(q=-(k=0|(0>e?-e:e)))),r[n]=[q,k],l(n="RANGE")&&(u(e)?V(e[0],-S,-1,2,n)&&V(e[1],1,S,2,n)&&($=0|e[0],G=0|e[1]):V(e,-S,S,2,n)&&(0|e?$=-(G=0|(0>e?-e:e)):z&&x(2,n+" cannot be zero",e))),r[n]=[$,G],l(n="ERRORS")&&(e===!!e||1===e||0===e?(C=0,V=(z=!!e)?F:o):z&&x(2,n+d,e)),r[n]=z,l(n="CRYPTO")&&(e===!0||e===!1||1===e||0===e?e?(e="undefined"==typeof crypto,!e&&crypto&&(crypto.getRandomValues||crypto.randomBytes)?j=!0:z?x(2,"crypto unavailable",e?void 0:crypto):j=!1):j=!1:z&&x(2,n+d,e)),r[n]=j,l(n="MODULO_MODE")&&V(e,0,9,2,n)&&(H=0|e),r[n]=H,l(n="POW_PRECISION")&&V(e,0,S,2,n)&&(W=0|e),r[n]=W,l(n="FORMAT")&&("object"==typeof e?J=e:z&&x(2,n+" not an object",e)),r[n]=J,r},a.max=function(){return D(arguments,M.lt)},a.min=function(){return D(arguments,M.gt)},a.random=function(){var e=9007199254740992,n=Math.random()*e&2097151?function(){return p(Math.random()*e)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)};return function(e){var t,r,i,o,u,s=0,l=[],c=new a(T);if(e=null!=e&&V(e,0,S,14)?0|e:B,o=g(e/b),j)if(crypto.getRandomValues){for(t=crypto.getRandomValues(new Uint32Array(o*=2));o>s;)u=131072*t[s]+(t[s+1]>>>11),u>=9e15?(r=crypto.getRandomValues(new Uint32Array(2)),t[s]=r[0],t[s+1]=r[1]):(l.push(u%1e14),s+=2);s=o/2}else if(crypto.randomBytes){for(t=crypto.randomBytes(o*=7);o>s;)u=281474976710656*(31&t[s])+1099511627776*t[s+1]+4294967296*t[s+2]+16777216*t[s+3]+(t[s+4]<<16)+(t[s+5]<<8)+t[s+6],u>=9e15?crypto.randomBytes(7).copy(t,s):(l.push(u%1e14),s+=7);s=o/7}else j=!1,z&&x(14,"crypto unavailable",crypto);if(!j)for(;o>s;)u=n(),9e15>u&&(l[s++]=u%1e14);for(o=l[--s],e%=b,o&&e&&(u=O[b-e],l[s]=p(o/u)*u);0===l[s];l.pop(),s--);if(0>s)l=[i=0];else{for(i=-1;0===l[0];l.splice(0,1),i-=b);for(s=1,u=l[0];u>=10;u/=10,s++);b>s&&(i-=b-s)}return c.e=i,c.c=l,c}}(),L=function(){function e(e,n,t){var r,i,o,u,s=0,l=e.length,c=n%R,f=n/R|0;for(e=e.slice();l--;)o=e[l]%R,u=e[l]/R|0,r=f*o+u*c,i=c*o+r%R*R+s,s=(i/t|0)+(r/R|0)+f*u,e[l]=i%t;return s&&(e=[s].concat(e)),e}function n(e,n,t,r){var i,o;if(t!=r)o=t>r?1:-1;else for(i=o=0;t>i;i++)if(e[i]!=n[i]){o=e[i]>n[i]?1:-1;break}return o}function r(e,n,t,r){for(var i=0;t--;)e[t]-=i,i=e[t]1;e.splice(0,1));}return function(i,o,u,s,l){var c,f,h,g,d,m,w,v,y,O,R,S,A,E,D,F,_,x=i.s==o.s?1:-1,L=i.c,U=o.c;if(!(L&&L[0]&&U&&U[0]))return new a(i.s&&o.s&&(L?!U||L[0]!=U[0]:U)?L&&0==L[0]||!U?0*x:x/0:NaN);for(v=new a(x),y=v.c=[],f=i.e-o.e,x=u+f+1,l||(l=N,f=t(i.e/b)-t(o.e/b),x=x/b|0),h=0;U[h]==(L[h]||0);h++);if(U[h]>(L[h]||0)&&f--,0>x)y.push(1),g=!0;else{for(E=L.length,F=U.length,h=0,x+=2,d=p(l/(U[0]+1)),d>1&&(U=e(U,d,l),L=e(L,d,l),F=U.length,E=L.length),A=F,O=L.slice(0,F),R=O.length;F>R;O[R++]=0);_=U.slice(),_=[0].concat(_),D=U[0],U[1]>=l/2&&D++;do{if(d=0,c=n(U,O,F,R),0>c){if(S=O[0],F!=R&&(S=S*l+(O[1]||0)),d=p(S/D),d>1)for(d>=l&&(d=l-1),m=e(U,d,l),w=m.length,R=O.length;1==n(m,O,w,R);)d--,r(m,w>F?_:U,w,l),w=m.length,c=1;else 0==d&&(c=d=1),m=U.slice(),w=m.length;if(R>w&&(m=[0].concat(m)),r(O,m,R,l),R=O.length,-1==c)for(;n(U,O,F,R)<1;)d++,r(O,R>F?_:U,R,l),R=O.length}else 0===c&&(d++,O=[0]);y[h++]=d,O[0]?O[R++]=L[A]||0:(O=[L[A]],R=1)}while((A++=10;x/=10,h++);I(v,u+(v.e=h+f*b-1)+1,s,g)}else v.e=f,v.r=+g;return v}}(),U=function(){var e=/^(-?)0([xbo])(?=\w[\w.]*$)/i,n=/^([^.]+)\.$/,t=/^\.([^.]+)$/,r=/^-?(Infinity|NaN)$/,i=/^\s*\+(?=[\w.])|^\s+|\s+$/g;return function(o,u,s,l){var c,f=s?u:u.replace(i,"");if(r.test(f))o.s=isNaN(f)?null:0>f?-1:1;else{if(!s&&(f=f.replace(e,function(e,n,t){return c="x"==(t=t.toLowerCase())?16:"b"==t?2:8,l&&l!=c?e:n}),l&&(c=l,f=f.replace(n,"$1").replace(t,"0.$1")),u!=f))return new a(f,c);z&&x(C,"not a"+(l?" base "+l:"")+" number",u),o.s=null}o.c=o.e=null,C=0}}(),M.absoluteValue=M.abs=function(){var e=new a(this);return e.s<0&&(e.s=1),e},M.ceil=function(){return I(new a(this),this.e+1,2)},M.comparedTo=M.cmp=function(e,n){return C=1,i(this,new a(e,n))},M.decimalPlaces=M.dp=function(){var e,n,r=this.c;if(!r)return null;if(e=((n=r.length-1)-t(this.e/b))*b,n=r[n])for(;n%10==0;n/=10,e--);return 0>e&&(e=0),e},M.dividedBy=M.div=function(e,n){return C=3,L(this,new a(e,n),B,P)},M.dividedToIntegerBy=M.divToInt=function(e,n){return C=4,L(this,new a(e,n),0,1)},M.equals=M.eq=function(e,n){return C=5,0===i(this,new a(e,n))},M.floor=function(){return I(new a(this),this.e+1,3)},M.greaterThan=M.gt=function(e,n){return C=6,i(this,new a(e,n))>0},M.greaterThanOrEqualTo=M.gte=function(e,n){return C=7,1===(n=i(this,new a(e,n)))||0===n},M.isFinite=function(){return!!this.c},M.isInteger=M.isInt=function(){return!!this.c&&t(this.e/b)>this.c.length-2},M.isNaN=function(){return!this.s},M.isNegative=M.isNeg=function(){return this.s<0},M.isZero=function(){return!!this.c&&0==this.c[0]},M.lessThan=M.lt=function(e,n){return C=8,i(this,new a(e,n))<0},M.lessThanOrEqualTo=M.lte=function(e,n){return C=9,-1===(n=i(this,new a(e,n)))||0===n},M.minus=M.sub=function(e,n){var r,i,o,u,s=this,l=s.s;if(C=10,e=new a(e,n),n=e.s,!l||!n)return new a(NaN);if(l!=n)return e.s=-n,s.plus(e);var c=s.e/b,f=e.e/b,h=s.c,g=e.c;if(!c||!f){if(!h||!g)return h?(e.s=-n,e):new a(g?s:NaN);if(!h[0]||!g[0])return g[0]?(e.s=-n,e):new a(h[0]?s:3==P?-0:0)}if(c=t(c),f=t(f),h=h.slice(),l=c-f){for((u=0>l)?(l=-l,o=h):(f=c,o=g),o.reverse(),n=l;n--;o.push(0));o.reverse()}else for(i=(u=(l=h.length)<(n=g.length))?l:n,l=n=0;i>n;n++)if(h[n]!=g[n]){u=h[n]0)for(;n--;h[r++]=0);for(n=N-1;i>l;){if(h[--i]0?(s=u,r=c):(o=-o,r=l),r.reverse();o--;r.push(0));r.reverse()}for(o=l.length,n=c.length,0>o-n&&(r=c,c=l,l=r,n=o),o=0;n;)o=(l[--n]=l[n]+c[n]+o)/N|0,l[n]=N===l[n]?0:l[n]%N;return o&&(l=[o].concat(l),++s),_(e,l,s)},M.precision=M.sd=function(e){var n,t,r=this,i=r.c;if(null!=e&&e!==!!e&&1!==e&&0!==e&&(z&&x(13,"argument"+d,e),e!=!!e&&(e=null)),!i)return null;if(t=i.length-1,n=t*b+1,t=i[t]){for(;t%10==0;t/=10,n--);for(t=i[0];t>=10;t/=10,n++);}return e&&r.e+1>n&&(n=r.e+1),n},M.round=function(e,n){var t=new a(this);return(null==e||V(e,0,S,15))&&I(t,~~e+this.e+1,null!=n&&V(n,0,8,15,m)?0|n:P),t},M.shift=function(e){var n=this;return V(e,-y,y,16,"argument")?n.times("1e"+f(e)):new a(n.c&&n.c[0]&&(-y>e||e>y)?n.s*(0>e?0:1/0):n)},M.squareRoot=M.sqrt=function(){var e,n,i,o,u,s=this,l=s.c,c=s.s,f=s.e,h=B+4,g=new a("0.5");if(1!==c||!l||!l[0])return new a(!c||0>c&&(!l||l[0])?NaN:l?s:1/0);if(c=Math.sqrt(+s),0==c||c==1/0?(n=r(l),(n.length+f)%2==0&&(n+="0"),c=Math.sqrt(n),f=t((f+1)/2)-(0>f||f%2),c==1/0?n="1e"+f:(n=c.toExponential(),n=n.slice(0,n.indexOf("e")+1)+f),i=new a(n)):i=new a(c+""),i.c[0])for(f=i.e,c=f+h,3>c&&(c=0);;)if(u=i,i=g.times(u.plus(L(s,u,h,1))),r(u.c).slice(0,c)===(n=r(i.c)).slice(0,c)){if(i.ec&&(m=O,O=S,S=m,o=c,c=g,g=o),o=c+g,m=[];o--;m.push(0));for(w=N,v=R,o=g;--o>=0;){for(r=0,p=S[o]%v,d=S[o]/v|0,s=c,u=o+s;u>o;)f=O[--s]%v,h=O[s]/v|0,l=d*f+h*p,f=p*f+l%v*v+m[u]+r,r=(f/w|0)+(l/v|0)+d*h,m[u--]=f%w;m[u]=r}return r?++i:m.splice(0,1),_(e,m,i)},M.toDigits=function(e,n){var t=new a(this);return e=null!=e&&V(e,1,S,18,"precision")?0|e:null,n=null!=n&&V(n,0,8,18,m)?0|n:P,e?I(t,e,n):t},M.toExponential=function(e,n){return E(this,null!=e&&V(e,0,S,19)?~~e+1:null,n,19)},M.toFixed=function(e,n){return E(this,null!=e&&V(e,0,S,20)?~~e+this.e+1:null,n,20)},M.toFormat=function(e,n){var t=E(this,null!=e&&V(e,0,S,21)?~~e+this.e+1:null,n,21);if(this.c){var r,i=t.split("."),o=+J.groupSize,u=+J.secondaryGroupSize,s=J.groupSeparator,l=i[0],c=i[1],f=this.s<0,a=f?l.slice(1):l,h=a.length;if(u&&(r=o,o=u,u=r,h-=r),o>0&&h>0){for(r=h%o||o,l=a.substr(0,r);h>r;r+=o)l+=s+a.substr(r,o);u>0&&(l+=s+a.slice(r)),f&&(l="-"+l)}t=c?l+J.decimalSeparator+((u=+J.fractionGroupSize)?c.replace(new RegExp("\\d{"+u+"}\\B","g"),"$&"+J.fractionGroupSeparator):c):l}return t},M.toFraction=function(e){var n,t,i,o,u,s,l,c,f,h=z,g=this,p=g.c,d=new a(T),m=t=new a(T),w=l=new a(T);if(null!=e&&(z=!1,s=new a(e),z=h,(!(h=s.isInt())||s.lt(T))&&(z&&x(22,"max denominator "+(h?"out of range":"not an integer"),e),e=!h&&s.c&&I(s,s.e+1,1).gte(T)?s:null)),!p)return g.toString();for(f=r(p),o=d.e=f.length-g.e-1,d.c[0]=O[(u=o%b)<0?b+u:u],e=!e||s.cmp(d)>0?o>0?d:m:s,u=G,G=1/0,s=new a(f),l.c[0]=0;c=L(s,d,0,1),i=t.plus(c.times(w)),1!=i.cmp(e);)t=w,w=i,m=l.plus(c.times(i=m)),l=i,d=s.minus(c.times(i=d)),s=i;return i=L(e.minus(t),w,0,1),l=l.plus(i.times(m)),t=t.plus(i.times(w)),l.s=m.s=g.s,o*=2,n=L(m,w,o,P).minus(g).abs().cmp(L(l,t,o,P).minus(g).abs())<1?[m.toString(),w.toString()]:[l.toString(),t.toString()],G=u,n},M.toNumber=function(){return+this},M.toPower=M.pow=function(e,n){var t,r,i,o=p(0>e?-e:+e),u=this;if(null!=n&&(C=23,n=new a(n)),!V(e,-y,y,23,"exponent")&&(!isFinite(e)||o>y&&(e/=0)||parseFloat(e)!=e&&!(e=NaN))||0==e)return t=Math.pow(+u,e),new a(n?t%n:t);for(n?e>1&&u.gt(T)&&u.isInt()&&n.gt(T)&&n.isInt()?u=u.mod(n):(i=n,n=null):W&&(t=g(W/b+2)),r=new a(T);;){if(o%2){if(r=r.times(u),!r.c)break;t?r.c.length>t&&(r.c.length=t):n&&(r=r.mod(n))}if(o=p(o/2),!o)break;u=u.times(u),t?u.c&&u.c.length>t&&(u.c.length=t):n&&(u=u.mod(n))}return n?r:(0>e&&(r=T.div(r)),i?r.mod(i):t?I(r,W,P):r)},M.toPrecision=function(e,n){return E(this,null!=e&&V(e,1,S,24,"precision")?0|e:null,n,24)},M.toString=function(e){var n,t=this,i=t.s,o=t.e;return null===o?i?(n="Infinity",0>i&&(n="-"+n)):n="NaN":(n=r(t.c),n=null!=e&&V(e,2,64,25,"base")?A(c(n,o),0|e,10,i):q>=o||o>=k?l(n,o):c(n,o),0>i&&t.c[0]&&(n="-"+n)),n},M.truncated=M.trunc=function(){return I(new a(this),this.e+1,1)},M.valueOf=M.toJSON=function(){var e,n=this,t=n.e;return null===t?n.toString():(e=r(n.c),e=q>=t||t>=k?l(e,t):c(e,t),n.s<0?"-"+e:e)},M.isBigNumber=!0,null!=e&&a.config(e),a}function t(e){var n=0|e;return e>0||e===n?n:n-1}function r(e){for(var n,t,r=1,i=e.length,o=e[0]+"";i>r;){for(n=e[r++]+"",t=b-n.length;t--;n="0"+n);o+=n}for(i=o.length;48===o.charCodeAt(--i););return o.slice(0,i+1||1)}function i(e,n){var t,r,i=e.c,o=n.c,u=e.s,s=n.s,l=e.e,c=n.e;if(!u||!s)return null;if(t=i&&!i[0],r=o&&!o[0],t||r)return t?r?0:-s:u;if(u!=s)return u;if(t=0>u,r=l==c,!i||!o)return r?0:!i^t?1:-1;if(!r)return l>c^t?1:-1;for(s=(l=i.length)<(c=o.length)?l:c,u=0;s>u;u++)if(i[u]!=o[u])return i[u]>o[u]^t?1:-1;return l==c?0:l>c^t?1:-1}function o(e,n,t){return(e=f(e))>=n&&t>=e}function u(e){return"[object Array]"==Object.prototype.toString.call(e)}function s(e,n,t){for(var r,i,o=[0],u=0,s=e.length;s>u;){for(i=o.length;i--;o[i]*=n);for(o[r=0]+=v.indexOf(e.charAt(u++));rt-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/t|0,o[r]%=t)}return o.reverse()}function l(e,n){return(e.length>1?e.charAt(0)+"."+e.slice(1):e)+(0>n?"e":"e+")+n}function c(e,n){var t,r;if(0>n){for(r="0.";++n;r+="0");e=r+e}else if(t=e.length,++n>t){for(r="0",n-=t;--n;r+="0");e+=r}else t>n&&(e=e.slice(0,n)+"."+e.slice(n));return e}function f(e){return e=parseFloat(e),0>e?g(e):p(e)}var a,h=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,g=Math.ceil,p=Math.floor,d=" not a boolean or binary digit",m="rounding mode",w="number type has more than 15 significant digits",v="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_",N=1e14,b=14,y=9007199254740991,O=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],R=1e7,S=1e9;a=n(),a["default"]=a.BigNumber=a,"function"==typeof define&&define.amd?define(function(){return a}):"undefined"!=typeof module&&module.exports?module.exports=a:(e||(e="undefined"!=typeof self?self:Function("return this")()),e.BigNumber=a)}(this); +//# sourceMappingURL=bignumber.js.map \ No newline at end of file diff --git a/html/RentForCamp/node_modules/bignumber.js/bignumber.mjs b/html/RentForCamp/node_modules/bignumber.js/bignumber.mjs new file mode 100644 index 0000000..f9537c2 --- /dev/null +++ b/html/RentForCamp/node_modules/bignumber.js/bignumber.mjs @@ -0,0 +1,2717 @@ +/* + * + * bignumber.js v4.1.0 + * A JavaScript library for arbitrary-precision arithmetic. + * https://github.com/MikeMcl/bignumber.js + * Copyright (c) 2017 Michael Mclaughlin + * MIT Expat Licence + * + */ + + +var BigNumber, + isNumeric = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, + mathceil = Math.ceil, + mathfloor = Math.floor, + notBool = ' not a boolean or binary digit', + roundingMode = 'rounding mode', + tooManyDigits = 'number type has more than 15 significant digits', + ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_', + BASE = 1e14, + LOG_BASE = 14, + MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1 + // MAX_INT32 = 0x7fffffff, // 2^31 - 1 + POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13], + SQRT_BASE = 1e7, + + /* + * The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and + * the arguments to toExponential, toFixed, toFormat, and toPrecision, beyond which an + * exception is thrown (if ERRORS is true). + */ + MAX = 1E9; // 0 to MAX_INT32 + + +/* + * Create and return a BigNumber constructor. + */ +function constructorFactory(config) { + var div, parseNumeric, + + // id tracks the caller function, so its name can be included in error messages. + id = 0, + P = BigNumber.prototype, + ONE = new BigNumber(1), + + +/*************************************** EDITABLE DEFAULTS ****************************************/ + + + /* + * The default values below must be integers within the inclusive ranges stated. + * The values can also be changed at run-time using BigNumber.config. + */ + + // The maximum number of decimal places for operations involving division. + DECIMAL_PLACES = 20, // 0 to MAX + + /* + * The rounding mode used when rounding to the above decimal places, and when using + * toExponential, toFixed, toFormat and toPrecision, and round (default value). + * UP 0 Away from zero. + * DOWN 1 Towards zero. + * CEIL 2 Towards +Infinity. + * FLOOR 3 Towards -Infinity. + * HALF_UP 4 Towards nearest neighbour. If equidistant, up. + * HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. + * HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. + * HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. + * HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. + */ + ROUNDING_MODE = 4, // 0 to 8 + + // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS] + + // The exponent value at and beneath which toString returns exponential notation. + // Number type: -7 + TO_EXP_NEG = -7, // 0 to -MAX + + // The exponent value at and above which toString returns exponential notation. + // Number type: 21 + TO_EXP_POS = 21, // 0 to MAX + + // RANGE : [MIN_EXP, MAX_EXP] + + // The minimum exponent value, beneath which underflow to zero occurs. + // Number type: -324 (5e-324) + MIN_EXP = -1e7, // -1 to -MAX + + // The maximum exponent value, above which overflow to Infinity occurs. + // Number type: 308 (1.7976931348623157e+308) + // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow. + MAX_EXP = 1e7, // 1 to MAX + + // Whether BigNumber Errors are ever thrown. + ERRORS = true, // true or false + + // Change to intValidatorNoErrors if ERRORS is false. + isValidInt = intValidatorWithErrors, // intValidatorWithErrors/intValidatorNoErrors + + // Whether to use cryptographically-secure random number generation, if available. + CRYPTO = false, // true or false + + /* + * The modulo mode used when calculating the modulus: a mod n. + * The quotient (q = a / n) is calculated according to the corresponding rounding mode. + * The remainder (r) is calculated as: r = a - n * q. + * + * UP 0 The remainder is positive if the dividend is negative, else is negative. + * DOWN 1 The remainder has the same sign as the dividend. + * This modulo mode is commonly known as 'truncated division' and is + * equivalent to (a % n) in JavaScript. + * FLOOR 3 The remainder has the same sign as the divisor (Python %). + * HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function. + * EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). + * The remainder is always positive. + * + * The truncated division, floored division, Euclidian division and IEEE 754 remainder + * modes are commonly used for the modulus operation. + * Although the other rounding modes can also be used, they may not give useful results. + */ + MODULO_MODE = 1, // 0 to 9 + + // The maximum number of significant digits of the result of the toPower operation. + // If POW_PRECISION is 0, there will be unlimited significant digits. + POW_PRECISION = 0, // 0 to MAX + + // The format specification used by the BigNumber.prototype.toFormat method. + FORMAT = { + decimalSeparator: '.', + groupSeparator: ',', + groupSize: 3, + secondaryGroupSize: 0, + fractionGroupSeparator: '\xA0', // non-breaking space + fractionGroupSize: 0 + }; + + +/**************************************************************************************************/ + + + // CONSTRUCTOR + + + /* + * The BigNumber constructor and exported function. + * Create and return a new instance of a BigNumber object. + * + * n {number|string|BigNumber} A numeric value. + * [b] {number} The base of n. Integer, 2 to 64 inclusive. + */ + function BigNumber( n, b ) { + var c, e, i, num, len, str, + x = this; + + // Enable constructor usage without new. + if ( !( x instanceof BigNumber ) ) { + + // 'BigNumber() constructor call without new: {n}' + if (ERRORS) raise( 26, 'constructor call without new', n ); + return new BigNumber( n, b ); + } + + // 'new BigNumber() base not an integer: {b}' + // 'new BigNumber() base out of range: {b}' + if ( b == null || !isValidInt( b, 2, 64, id, 'base' ) ) { + + // Duplicate. + if ( n instanceof BigNumber ) { + x.s = n.s; + x.e = n.e; + x.c = ( n = n.c ) ? n.slice() : n; + id = 0; + return; + } + + if ( ( num = typeof n == 'number' ) && n * 0 == 0 ) { + x.s = 1 / n < 0 ? ( n = -n, -1 ) : 1; + + // Fast path for integers. + if ( n === ~~n ) { + for ( e = 0, i = n; i >= 10; i /= 10, e++ ); + x.e = e; + x.c = [n]; + id = 0; + return; + } + + str = n + ''; + } else { + if ( !isNumeric.test( str = n + '' ) ) return parseNumeric( x, str, num ); + x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1; + } + } else { + b = b | 0; + str = n + ''; + + // Ensure return value is rounded to DECIMAL_PLACES as with other bases. + // Allow exponential notation to be used with base 10 argument. + if ( b == 10 ) { + x = new BigNumber( n instanceof BigNumber ? n : str ); + return round( x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE ); + } + + // Avoid potential interpretation of Infinity and NaN as base 44+ values. + // Any number in exponential form will fail due to the [Ee][+-]. + if ( ( num = typeof n == 'number' ) && n * 0 != 0 || + !( new RegExp( '^-?' + ( c = '[' + ALPHABET.slice( 0, b ) + ']+' ) + + '(?:\\.' + c + ')?$',b < 37 ? 'i' : '' ) ).test(str) ) { + return parseNumeric( x, str, num, b ); + } + + if (num) { + x.s = 1 / n < 0 ? ( str = str.slice(1), -1 ) : 1; + + if ( ERRORS && str.replace( /^0\.0*|\./, '' ).length > 15 ) { + + // 'new BigNumber() number type has more than 15 significant digits: {n}' + raise( id, tooManyDigits, n ); + } + + // Prevent later check for length on converted number. + num = false; + } else { + x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1; + } + + str = convertBase( str, 10, b, x.s ); + } + + // Decimal point? + if ( ( e = str.indexOf('.') ) > -1 ) str = str.replace( '.', '' ); + + // Exponential form? + if ( ( i = str.search( /e/i ) ) > 0 ) { + + // Determine exponent. + if ( e < 0 ) e = i; + e += +str.slice( i + 1 ); + str = str.substring( 0, i ); + } else if ( e < 0 ) { + + // Integer. + e = str.length; + } + + // Determine leading zeros. + for ( i = 0; str.charCodeAt(i) === 48; i++ ); + + // Determine trailing zeros. + for ( len = str.length; str.charCodeAt(--len) === 48; ); + str = str.slice( i, len + 1 ); + + if (str) { + len = str.length; + + // Disallow numbers with over 15 significant digits if number type. + // 'new BigNumber() number type has more than 15 significant digits: {n}' + if ( num && ERRORS && len > 15 && ( n > MAX_SAFE_INTEGER || n !== mathfloor(n) ) ) { + raise( id, tooManyDigits, x.s * n ); + } + + e = e - i - 1; + + // Overflow? + if ( e > MAX_EXP ) { + + // Infinity. + x.c = x.e = null; + + // Underflow? + } else if ( e < MIN_EXP ) { + + // Zero. + x.c = [ x.e = 0 ]; + } else { + x.e = e; + x.c = []; + + // Transform base + + // e is the base 10 exponent. + // i is where to slice str to get the first element of the coefficient array. + i = ( e + 1 ) % LOG_BASE; + if ( e < 0 ) i += LOG_BASE; + + if ( i < len ) { + if (i) x.c.push( +str.slice( 0, i ) ); + + for ( len -= LOG_BASE; i < len; ) { + x.c.push( +str.slice( i, i += LOG_BASE ) ); + } + + str = str.slice(i); + i = LOG_BASE - str.length; + } else { + i -= len; + } + + for ( ; i--; str += '0' ); + x.c.push( +str ); + } + } else { + + // Zero. + x.c = [ x.e = 0 ]; + } + + id = 0; + } + + + // CONSTRUCTOR PROPERTIES + + + BigNumber.another = constructorFactory; + + BigNumber.ROUND_UP = 0; + BigNumber.ROUND_DOWN = 1; + BigNumber.ROUND_CEIL = 2; + BigNumber.ROUND_FLOOR = 3; + BigNumber.ROUND_HALF_UP = 4; + BigNumber.ROUND_HALF_DOWN = 5; + BigNumber.ROUND_HALF_EVEN = 6; + BigNumber.ROUND_HALF_CEIL = 7; + BigNumber.ROUND_HALF_FLOOR = 8; + BigNumber.EUCLID = 9; + + + /* + * Configure infrequently-changing library-wide settings. + * + * Accept an object or an argument list, with one or many of the following properties or + * parameters respectively: + * + * DECIMAL_PLACES {number} Integer, 0 to MAX inclusive + * ROUNDING_MODE {number} Integer, 0 to 8 inclusive + * EXPONENTIAL_AT {number|number[]} Integer, -MAX to MAX inclusive or + * [integer -MAX to 0 incl., 0 to MAX incl.] + * RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or + * [integer -MAX to -1 incl., integer 1 to MAX incl.] + * ERRORS {boolean|number} true, false, 1 or 0 + * CRYPTO {boolean|number} true, false, 1 or 0 + * MODULO_MODE {number} 0 to 9 inclusive + * POW_PRECISION {number} 0 to MAX inclusive + * FORMAT {object} See BigNumber.prototype.toFormat + * decimalSeparator {string} + * groupSeparator {string} + * groupSize {number} + * secondaryGroupSize {number} + * fractionGroupSeparator {string} + * fractionGroupSize {number} + * + * (The values assigned to the above FORMAT object properties are not checked for validity.) + * + * E.g. + * BigNumber.config(20, 4) is equivalent to + * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 }) + * + * Ignore properties/parameters set to null or undefined. + * Return an object with the properties current values. + */ + BigNumber.config = BigNumber.set = function () { + var v, p, + i = 0, + r = {}, + a = arguments, + o = a[0], + has = o && typeof o == 'object' + ? function () { if ( o.hasOwnProperty(p) ) return ( v = o[p] ) != null; } + : function () { if ( a.length > i ) return ( v = a[i++] ) != null; }; + + // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive. + // 'config() DECIMAL_PLACES not an integer: {v}' + // 'config() DECIMAL_PLACES out of range: {v}' + if ( has( p = 'DECIMAL_PLACES' ) && isValidInt( v, 0, MAX, 2, p ) ) { + DECIMAL_PLACES = v | 0; + } + r[p] = DECIMAL_PLACES; + + // ROUNDING_MODE {number} Integer, 0 to 8 inclusive. + // 'config() ROUNDING_MODE not an integer: {v}' + // 'config() ROUNDING_MODE out of range: {v}' + if ( has( p = 'ROUNDING_MODE' ) && isValidInt( v, 0, 8, 2, p ) ) { + ROUNDING_MODE = v | 0; + } + r[p] = ROUNDING_MODE; + + // EXPONENTIAL_AT {number|number[]} + // Integer, -MAX to MAX inclusive or [integer -MAX to 0 inclusive, 0 to MAX inclusive]. + // 'config() EXPONENTIAL_AT not an integer: {v}' + // 'config() EXPONENTIAL_AT out of range: {v}' + if ( has( p = 'EXPONENTIAL_AT' ) ) { + + if ( isArray(v) ) { + if ( isValidInt( v[0], -MAX, 0, 2, p ) && isValidInt( v[1], 0, MAX, 2, p ) ) { + TO_EXP_NEG = v[0] | 0; + TO_EXP_POS = v[1] | 0; + } + } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) { + TO_EXP_NEG = -( TO_EXP_POS = ( v < 0 ? -v : v ) | 0 ); + } + } + r[p] = [ TO_EXP_NEG, TO_EXP_POS ]; + + // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or + // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive]. + // 'config() RANGE not an integer: {v}' + // 'config() RANGE cannot be zero: {v}' + // 'config() RANGE out of range: {v}' + if ( has( p = 'RANGE' ) ) { + + if ( isArray(v) ) { + if ( isValidInt( v[0], -MAX, -1, 2, p ) && isValidInt( v[1], 1, MAX, 2, p ) ) { + MIN_EXP = v[0] | 0; + MAX_EXP = v[1] | 0; + } + } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) { + if ( v | 0 ) MIN_EXP = -( MAX_EXP = ( v < 0 ? -v : v ) | 0 ); + else if (ERRORS) raise( 2, p + ' cannot be zero', v ); + } + } + r[p] = [ MIN_EXP, MAX_EXP ]; + + // ERRORS {boolean|number} true, false, 1 or 0. + // 'config() ERRORS not a boolean or binary digit: {v}' + if ( has( p = 'ERRORS' ) ) { + + if ( v === !!v || v === 1 || v === 0 ) { + id = 0; + isValidInt = ( ERRORS = !!v ) ? intValidatorWithErrors : intValidatorNoErrors; + } else if (ERRORS) { + raise( 2, p + notBool, v ); + } + } + r[p] = ERRORS; + + // CRYPTO {boolean|number} true, false, 1 or 0. + // 'config() CRYPTO not a boolean or binary digit: {v}' + // 'config() crypto unavailable: {crypto}' + if ( has( p = 'CRYPTO' ) ) { + + if ( v === true || v === false || v === 1 || v === 0 ) { + if (v) { + v = typeof crypto == 'undefined'; + if ( !v && crypto && (crypto.getRandomValues || crypto.randomBytes)) { + CRYPTO = true; + } else if (ERRORS) { + raise( 2, 'crypto unavailable', v ? void 0 : crypto ); + } else { + CRYPTO = false; + } + } else { + CRYPTO = false; + } + } else if (ERRORS) { + raise( 2, p + notBool, v ); + } + } + r[p] = CRYPTO; + + // MODULO_MODE {number} Integer, 0 to 9 inclusive. + // 'config() MODULO_MODE not an integer: {v}' + // 'config() MODULO_MODE out of range: {v}' + if ( has( p = 'MODULO_MODE' ) && isValidInt( v, 0, 9, 2, p ) ) { + MODULO_MODE = v | 0; + } + r[p] = MODULO_MODE; + + // POW_PRECISION {number} Integer, 0 to MAX inclusive. + // 'config() POW_PRECISION not an integer: {v}' + // 'config() POW_PRECISION out of range: {v}' + if ( has( p = 'POW_PRECISION' ) && isValidInt( v, 0, MAX, 2, p ) ) { + POW_PRECISION = v | 0; + } + r[p] = POW_PRECISION; + + // FORMAT {object} + // 'config() FORMAT not an object: {v}' + if ( has( p = 'FORMAT' ) ) { + + if ( typeof v == 'object' ) { + FORMAT = v; + } else if (ERRORS) { + raise( 2, p + ' not an object', v ); + } + } + r[p] = FORMAT; + + return r; + }; + + + /* + * Return a new BigNumber whose value is the maximum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.max = function () { return maxOrMin( arguments, P.lt ); }; + + + /* + * Return a new BigNumber whose value is the minimum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.min = function () { return maxOrMin( arguments, P.gt ); }; + + + /* + * Return a new BigNumber with a random value equal to or greater than 0 and less than 1, + * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing + * zeros are produced). + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * + * 'random() decimal places not an integer: {dp}' + * 'random() decimal places out of range: {dp}' + * 'random() crypto unavailable: {crypto}' + */ + BigNumber.random = (function () { + var pow2_53 = 0x20000000000000; + + // Return a 53 bit integer n, where 0 <= n < 9007199254740992. + // Check if Math.random() produces more than 32 bits of randomness. + // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits. + // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1. + var random53bitInt = (Math.random() * pow2_53) & 0x1fffff + ? function () { return mathfloor( Math.random() * pow2_53 ); } + : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) + + (Math.random() * 0x800000 | 0); }; + + return function (dp) { + var a, b, e, k, v, + i = 0, + c = [], + rand = new BigNumber(ONE); + + dp = dp == null || !isValidInt( dp, 0, MAX, 14 ) ? DECIMAL_PLACES : dp | 0; + k = mathceil( dp / LOG_BASE ); + + if (CRYPTO) { + + // Browsers supporting crypto.getRandomValues. + if (crypto.getRandomValues) { + + a = crypto.getRandomValues( new Uint32Array( k *= 2 ) ); + + for ( ; i < k; ) { + + // 53 bits: + // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2) + // 11111 11111111 11111111 11111111 11100000 00000000 00000000 + // ((Math.pow(2, 32) - 1) >>> 11).toString(2) + // 11111 11111111 11111111 + // 0x20000 is 2^21. + v = a[i] * 0x20000 + (a[i + 1] >>> 11); + + // Rejection sampling: + // 0 <= v < 9007199254740992 + // Probability that v >= 9e15, is + // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251 + if ( v >= 9e15 ) { + b = crypto.getRandomValues( new Uint32Array(2) ); + a[i] = b[0]; + a[i + 1] = b[1]; + } else { + + // 0 <= v <= 8999999999999999 + // 0 <= (v % 1e14) <= 99999999999999 + c.push( v % 1e14 ); + i += 2; + } + } + i = k / 2; + + // Node.js supporting crypto.randomBytes. + } else if (crypto.randomBytes) { + + // buffer + a = crypto.randomBytes( k *= 7 ); + + for ( ; i < k; ) { + + // 0x1000000000000 is 2^48, 0x10000000000 is 2^40 + // 0x100000000 is 2^32, 0x1000000 is 2^24 + // 11111 11111111 11111111 11111111 11111111 11111111 11111111 + // 0 <= v < 9007199254740992 + v = ( ( a[i] & 31 ) * 0x1000000000000 ) + ( a[i + 1] * 0x10000000000 ) + + ( a[i + 2] * 0x100000000 ) + ( a[i + 3] * 0x1000000 ) + + ( a[i + 4] << 16 ) + ( a[i + 5] << 8 ) + a[i + 6]; + + if ( v >= 9e15 ) { + crypto.randomBytes(7).copy( a, i ); + } else { + + // 0 <= (v % 1e14) <= 99999999999999 + c.push( v % 1e14 ); + i += 7; + } + } + i = k / 7; + } else { + CRYPTO = false; + if (ERRORS) raise( 14, 'crypto unavailable', crypto ); + } + } + + // Use Math.random. + if (!CRYPTO) { + + for ( ; i < k; ) { + v = random53bitInt(); + if ( v < 9e15 ) c[i++] = v % 1e14; + } + } + + k = c[--i]; + dp %= LOG_BASE; + + // Convert trailing digits to zeros according to dp. + if ( k && dp ) { + v = POWS_TEN[LOG_BASE - dp]; + c[i] = mathfloor( k / v ) * v; + } + + // Remove trailing elements which are zero. + for ( ; c[i] === 0; c.pop(), i-- ); + + // Zero? + if ( i < 0 ) { + c = [ e = 0 ]; + } else { + + // Remove leading elements which are zero and adjust exponent accordingly. + for ( e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE); + + // Count the digits of the first element of c to determine leading zeros, and... + for ( i = 1, v = c[0]; v >= 10; v /= 10, i++); + + // adjust the exponent accordingly. + if ( i < LOG_BASE ) e -= LOG_BASE - i; + } + + rand.e = e; + rand.c = c; + return rand; + }; + })(); + + + // PRIVATE FUNCTIONS + + + // Convert a numeric string of baseIn to a numeric string of baseOut. + function convertBase( str, baseOut, baseIn, sign ) { + var d, e, k, r, x, xc, y, + i = str.indexOf( '.' ), + dp = DECIMAL_PLACES, + rm = ROUNDING_MODE; + + if ( baseIn < 37 ) str = str.toLowerCase(); + + // Non-integer. + if ( i >= 0 ) { + k = POW_PRECISION; + + // Unlimited precision. + POW_PRECISION = 0; + str = str.replace( '.', '' ); + y = new BigNumber(baseIn); + x = y.pow( str.length - i ); + POW_PRECISION = k; + + // Convert str as if an integer, then restore the fraction part by dividing the + // result by its base raised to a power. + y.c = toBaseOut( toFixedPoint( coeffToString( x.c ), x.e ), 10, baseOut ); + y.e = y.c.length; + } + + // Convert the number as integer. + xc = toBaseOut( str, baseIn, baseOut ); + e = k = xc.length; + + // Remove trailing zeros. + for ( ; xc[--k] == 0; xc.pop() ); + if ( !xc[0] ) return '0'; + + if ( i < 0 ) { + --e; + } else { + x.c = xc; + x.e = e; + + // sign is needed for correct rounding. + x.s = sign; + x = div( x, y, dp, rm, baseOut ); + xc = x.c; + r = x.r; + e = x.e; + } + + d = e + dp + 1; + + // The rounding digit, i.e. the digit to the right of the digit that may be rounded up. + i = xc[d]; + k = baseOut / 2; + r = r || d < 0 || xc[d + 1] != null; + + r = rm < 4 ? ( i != null || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) ) + : i > k || i == k &&( rm == 4 || r || rm == 6 && xc[d - 1] & 1 || + rm == ( x.s < 0 ? 8 : 7 ) ); + + if ( d < 1 || !xc[0] ) { + + // 1^-dp or 0. + str = r ? toFixedPoint( '1', -dp ) : '0'; + } else { + xc.length = d; + + if (r) { + + // Rounding up may mean the previous digit has to be rounded up and so on. + for ( --baseOut; ++xc[--d] > baseOut; ) { + xc[d] = 0; + + if ( !d ) { + ++e; + xc = [1].concat(xc); + } + } + } + + // Determine trailing zeros. + for ( k = xc.length; !xc[--k]; ); + + // E.g. [4, 11, 15] becomes 4bf. + for ( i = 0, str = ''; i <= k; str += ALPHABET.charAt( xc[i++] ) ); + str = toFixedPoint( str, e ); + } + + // The caller will add the sign. + return str; + } + + + // Perform division in the specified base. Called by div and convertBase. + div = (function () { + + // Assume non-zero x and k. + function multiply( x, k, base ) { + var m, temp, xlo, xhi, + carry = 0, + i = x.length, + klo = k % SQRT_BASE, + khi = k / SQRT_BASE | 0; + + for ( x = x.slice(); i--; ) { + xlo = x[i] % SQRT_BASE; + xhi = x[i] / SQRT_BASE | 0; + m = khi * xlo + xhi * klo; + temp = klo * xlo + ( ( m % SQRT_BASE ) * SQRT_BASE ) + carry; + carry = ( temp / base | 0 ) + ( m / SQRT_BASE | 0 ) + khi * xhi; + x[i] = temp % base; + } + + if (carry) x = [carry].concat(x); + + return x; + } + + function compare( a, b, aL, bL ) { + var i, cmp; + + if ( aL != bL ) { + cmp = aL > bL ? 1 : -1; + } else { + + for ( i = cmp = 0; i < aL; i++ ) { + + if ( a[i] != b[i] ) { + cmp = a[i] > b[i] ? 1 : -1; + break; + } + } + } + return cmp; + } + + function subtract( a, b, aL, base ) { + var i = 0; + + // Subtract b from a. + for ( ; aL--; ) { + a[aL] -= i; + i = a[aL] < b[aL] ? 1 : 0; + a[aL] = i * base + a[aL] - b[aL]; + } + + // Remove leading zeros. + for ( ; !a[0] && a.length > 1; a.splice(0, 1) ); + } + + // x: dividend, y: divisor. + return function ( x, y, dp, rm, base ) { + var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0, + yL, yz, + s = x.s == y.s ? 1 : -1, + xc = x.c, + yc = y.c; + + // Either NaN, Infinity or 0? + if ( !xc || !xc[0] || !yc || !yc[0] ) { + + return new BigNumber( + + // Return NaN if either NaN, or both Infinity or 0. + !x.s || !y.s || ( xc ? yc && xc[0] == yc[0] : !yc ) ? NaN : + + // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0. + xc && xc[0] == 0 || !yc ? s * 0 : s / 0 + ); + } + + q = new BigNumber(s); + qc = q.c = []; + e = x.e - y.e; + s = dp + e + 1; + + if ( !base ) { + base = BASE; + e = bitFloor( x.e / LOG_BASE ) - bitFloor( y.e / LOG_BASE ); + s = s / LOG_BASE | 0; + } + + // Result exponent may be one less then the current value of e. + // The coefficients of the BigNumbers from convertBase may have trailing zeros. + for ( i = 0; yc[i] == ( xc[i] || 0 ); i++ ); + if ( yc[i] > ( xc[i] || 0 ) ) e--; + + if ( s < 0 ) { + qc.push(1); + more = true; + } else { + xL = xc.length; + yL = yc.length; + i = 0; + s += 2; + + // Normalise xc and yc so highest order digit of yc is >= base / 2. + + n = mathfloor( base / ( yc[0] + 1 ) ); + + // Not necessary, but to handle odd bases where yc[0] == ( base / 2 ) - 1. + // if ( n > 1 || n++ == 1 && yc[0] < base / 2 ) { + if ( n > 1 ) { + yc = multiply( yc, n, base ); + xc = multiply( xc, n, base ); + yL = yc.length; + xL = xc.length; + } + + xi = yL; + rem = xc.slice( 0, yL ); + remL = rem.length; + + // Add zeros to make remainder as long as divisor. + for ( ; remL < yL; rem[remL++] = 0 ); + yz = yc.slice(); + yz = [0].concat(yz); + yc0 = yc[0]; + if ( yc[1] >= base / 2 ) yc0++; + // Not necessary, but to prevent trial digit n > base, when using base 3. + // else if ( base == 3 && yc0 == 1 ) yc0 = 1 + 1e-15; + + do { + n = 0; + + // Compare divisor and remainder. + cmp = compare( yc, rem, yL, remL ); + + // If divisor < remainder. + if ( cmp < 0 ) { + + // Calculate trial digit, n. + + rem0 = rem[0]; + if ( yL != remL ) rem0 = rem0 * base + ( rem[1] || 0 ); + + // n is how many times the divisor goes into the current remainder. + n = mathfloor( rem0 / yc0 ); + + // Algorithm: + // 1. product = divisor * trial digit (n) + // 2. if product > remainder: product -= divisor, n-- + // 3. remainder -= product + // 4. if product was < remainder at 2: + // 5. compare new remainder and divisor + // 6. If remainder > divisor: remainder -= divisor, n++ + + if ( n > 1 ) { + + // n may be > base only when base is 3. + if (n >= base) n = base - 1; + + // product = divisor * trial digit. + prod = multiply( yc, n, base ); + prodL = prod.length; + remL = rem.length; + + // Compare product and remainder. + // If product > remainder. + // Trial digit n too high. + // n is 1 too high about 5% of the time, and is not known to have + // ever been more than 1 too high. + while ( compare( prod, rem, prodL, remL ) == 1 ) { + n--; + + // Subtract divisor from product. + subtract( prod, yL < prodL ? yz : yc, prodL, base ); + prodL = prod.length; + cmp = 1; + } + } else { + + // n is 0 or 1, cmp is -1. + // If n is 0, there is no need to compare yc and rem again below, + // so change cmp to 1 to avoid it. + // If n is 1, leave cmp as -1, so yc and rem are compared again. + if ( n == 0 ) { + + // divisor < remainder, so n must be at least 1. + cmp = n = 1; + } + + // product = divisor + prod = yc.slice(); + prodL = prod.length; + } + + if ( prodL < remL ) prod = [0].concat(prod); + + // Subtract product from remainder. + subtract( rem, prod, remL, base ); + remL = rem.length; + + // If product was < remainder. + if ( cmp == -1 ) { + + // Compare divisor and new remainder. + // If divisor < new remainder, subtract divisor from remainder. + // Trial digit n too low. + // n is 1 too low about 5% of the time, and very rarely 2 too low. + while ( compare( yc, rem, yL, remL ) < 1 ) { + n++; + + // Subtract divisor from remainder. + subtract( rem, yL < remL ? yz : yc, remL, base ); + remL = rem.length; + } + } + } else if ( cmp === 0 ) { + n++; + rem = [0]; + } // else cmp === 1 and n will be 0 + + // Add the next digit, n, to the result array. + qc[i++] = n; + + // Update the remainder. + if ( rem[0] ) { + rem[remL++] = xc[xi] || 0; + } else { + rem = [ xc[xi] ]; + remL = 1; + } + } while ( ( xi++ < xL || rem[0] != null ) && s-- ); + + more = rem[0] != null; + + // Leading zero? + if ( !qc[0] ) qc.splice(0, 1); + } + + if ( base == BASE ) { + + // To calculate q.e, first get the number of digits of qc[0]. + for ( i = 1, s = qc[0]; s >= 10; s /= 10, i++ ); + round( q, dp + ( q.e = i + e * LOG_BASE - 1 ) + 1, rm, more ); + + // Caller is convertBase. + } else { + q.e = e; + q.r = +more; + } + + return q; + }; + })(); + + + /* + * Return a string representing the value of BigNumber n in fixed-point or exponential + * notation rounded to the specified decimal places or significant digits. + * + * n is a BigNumber. + * i is the index of the last digit required (i.e. the digit that may be rounded up). + * rm is the rounding mode. + * caller is caller id: toExponential 19, toFixed 20, toFormat 21, toPrecision 24. + */ + function format( n, i, rm, caller ) { + var c0, e, ne, len, str; + + rm = rm != null && isValidInt( rm, 0, 8, caller, roundingMode ) + ? rm | 0 : ROUNDING_MODE; + + if ( !n.c ) return n.toString(); + c0 = n.c[0]; + ne = n.e; + + if ( i == null ) { + str = coeffToString( n.c ); + str = caller == 19 || caller == 24 && ne <= TO_EXP_NEG + ? toExponential( str, ne ) + : toFixedPoint( str, ne ); + } else { + n = round( new BigNumber(n), i, rm ); + + // n.e may have changed if the value was rounded up. + e = n.e; + + str = coeffToString( n.c ); + len = str.length; + + // toPrecision returns exponential notation if the number of significant digits + // specified is less than the number of digits necessary to represent the integer + // part of the value in fixed-point notation. + + // Exponential notation. + if ( caller == 19 || caller == 24 && ( i <= e || e <= TO_EXP_NEG ) ) { + + // Append zeros? + for ( ; len < i; str += '0', len++ ); + str = toExponential( str, e ); + + // Fixed-point notation. + } else { + i -= ne; + str = toFixedPoint( str, e ); + + // Append zeros? + if ( e + 1 > len ) { + if ( --i > 0 ) for ( str += '.'; i--; str += '0' ); + } else { + i += e - len; + if ( i > 0 ) { + if ( e + 1 == len ) str += '.'; + for ( ; i--; str += '0' ); + } + } + } + } + + return n.s < 0 && c0 ? '-' + str : str; + } + + + // Handle BigNumber.max and BigNumber.min. + function maxOrMin( args, method ) { + var m, n, + i = 0; + + if ( isArray( args[0] ) ) args = args[0]; + m = new BigNumber( args[0] ); + + for ( ; ++i < args.length; ) { + n = new BigNumber( args[i] ); + + // If any number is NaN, return NaN. + if ( !n.s ) { + m = n; + break; + } else if ( method.call( m, n ) ) { + m = n; + } + } + + return m; + } + + + /* + * Return true if n is an integer in range, otherwise throw. + * Use for argument validation when ERRORS is true. + */ + function intValidatorWithErrors( n, min, max, caller, name ) { + if ( n < min || n > max || n != truncate(n) ) { + raise( caller, ( name || 'decimal places' ) + + ( n < min || n > max ? ' out of range' : ' not an integer' ), n ); + } + + return true; + } + + + /* + * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP. + * Called by minus, plus and times. + */ + function normalise( n, c, e ) { + var i = 1, + j = c.length; + + // Remove trailing zeros. + for ( ; !c[--j]; c.pop() ); + + // Calculate the base 10 exponent. First get the number of digits of c[0]. + for ( j = c[0]; j >= 10; j /= 10, i++ ); + + // Overflow? + if ( ( e = i + e * LOG_BASE - 1 ) > MAX_EXP ) { + + // Infinity. + n.c = n.e = null; + + // Underflow? + } else if ( e < MIN_EXP ) { + + // Zero. + n.c = [ n.e = 0 ]; + } else { + n.e = e; + n.c = c; + } + + return n; + } + + + // Handle values that fail the validity test in BigNumber. + parseNumeric = (function () { + var basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i, + dotAfter = /^([^.]+)\.$/, + dotBefore = /^\.([^.]+)$/, + isInfinityOrNaN = /^-?(Infinity|NaN)$/, + whitespaceOrPlus = /^\s*\+(?=[\w.])|^\s+|\s+$/g; + + return function ( x, str, num, b ) { + var base, + s = num ? str : str.replace( whitespaceOrPlus, '' ); + + // No exception on ±Infinity or NaN. + if ( isInfinityOrNaN.test(s) ) { + x.s = isNaN(s) ? null : s < 0 ? -1 : 1; + } else { + if ( !num ) { + + // basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i + s = s.replace( basePrefix, function ( m, p1, p2 ) { + base = ( p2 = p2.toLowerCase() ) == 'x' ? 16 : p2 == 'b' ? 2 : 8; + return !b || b == base ? p1 : m; + }); + + if (b) { + base = b; + + // E.g. '1.' to '1', '.1' to '0.1' + s = s.replace( dotAfter, '$1' ).replace( dotBefore, '0.$1' ); + } + + if ( str != s ) return new BigNumber( s, base ); + } + + // 'new BigNumber() not a number: {n}' + // 'new BigNumber() not a base {b} number: {n}' + if (ERRORS) raise( id, 'not a' + ( b ? ' base ' + b : '' ) + ' number', str ); + x.s = null; + } + + x.c = x.e = null; + id = 0; + } + })(); + + + // Throw a BigNumber Error. + function raise( caller, msg, val ) { + var error = new Error( [ + 'new BigNumber', // 0 + 'cmp', // 1 + 'config', // 2 + 'div', // 3 + 'divToInt', // 4 + 'eq', // 5 + 'gt', // 6 + 'gte', // 7 + 'lt', // 8 + 'lte', // 9 + 'minus', // 10 + 'mod', // 11 + 'plus', // 12 + 'precision', // 13 + 'random', // 14 + 'round', // 15 + 'shift', // 16 + 'times', // 17 + 'toDigits', // 18 + 'toExponential', // 19 + 'toFixed', // 20 + 'toFormat', // 21 + 'toFraction', // 22 + 'pow', // 23 + 'toPrecision', // 24 + 'toString', // 25 + 'BigNumber' // 26 + ][caller] + '() ' + msg + ': ' + val ); + + error.name = 'BigNumber Error'; + id = 0; + throw error; + } + + + /* + * Round x to sd significant digits using rounding mode rm. Check for over/under-flow. + * If r is truthy, it is known that there are more digits after the rounding digit. + */ + function round( x, sd, rm, r ) { + var d, i, j, k, n, ni, rd, + xc = x.c, + pows10 = POWS_TEN; + + // if x is not Infinity or NaN... + if (xc) { + + // rd is the rounding digit, i.e. the digit after the digit that may be rounded up. + // n is a base 1e14 number, the value of the element of array x.c containing rd. + // ni is the index of n within x.c. + // d is the number of digits of n. + // i is the index of rd within n including leading zeros. + // j is the actual index of rd within n (if < 0, rd is a leading zero). + out: { + + // Get the number of digits of the first element of xc. + for ( d = 1, k = xc[0]; k >= 10; k /= 10, d++ ); + i = sd - d; + + // If the rounding digit is in the first element of xc... + if ( i < 0 ) { + i += LOG_BASE; + j = sd; + n = xc[ ni = 0 ]; + + // Get the rounding digit at index j of n. + rd = n / pows10[ d - j - 1 ] % 10 | 0; + } else { + ni = mathceil( ( i + 1 ) / LOG_BASE ); + + if ( ni >= xc.length ) { + + if (r) { + + // Needed by sqrt. + for ( ; xc.length <= ni; xc.push(0) ); + n = rd = 0; + d = 1; + i %= LOG_BASE; + j = i - LOG_BASE + 1; + } else { + break out; + } + } else { + n = k = xc[ni]; + + // Get the number of digits of n. + for ( d = 1; k >= 10; k /= 10, d++ ); + + // Get the index of rd within n. + i %= LOG_BASE; + + // Get the index of rd within n, adjusted for leading zeros. + // The number of leading zeros of n is given by LOG_BASE - d. + j = i - LOG_BASE + d; + + // Get the rounding digit at index j of n. + rd = j < 0 ? 0 : n / pows10[ d - j - 1 ] % 10 | 0; + } + } + + r = r || sd < 0 || + + // Are there any non-zero digits after the rounding digit? + // The expression n % pows10[ d - j - 1 ] returns all digits of n to the right + // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714. + xc[ni + 1] != null || ( j < 0 ? n : n % pows10[ d - j - 1 ] ); + + r = rm < 4 + ? ( rd || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) ) + : rd > 5 || rd == 5 && ( rm == 4 || r || rm == 6 && + + // Check whether the digit to the left of the rounding digit is odd. + ( ( i > 0 ? j > 0 ? n / pows10[ d - j ] : 0 : xc[ni - 1] ) % 10 ) & 1 || + rm == ( x.s < 0 ? 8 : 7 ) ); + + if ( sd < 1 || !xc[0] ) { + xc.length = 0; + + if (r) { + + // Convert sd to decimal places. + sd -= x.e + 1; + + // 1, 0.1, 0.01, 0.001, 0.0001 etc. + xc[0] = pows10[ ( LOG_BASE - sd % LOG_BASE ) % LOG_BASE ]; + x.e = -sd || 0; + } else { + + // Zero. + xc[0] = x.e = 0; + } + + return x; + } + + // Remove excess digits. + if ( i == 0 ) { + xc.length = ni; + k = 1; + ni--; + } else { + xc.length = ni + 1; + k = pows10[ LOG_BASE - i ]; + + // E.g. 56700 becomes 56000 if 7 is the rounding digit. + // j > 0 means i > number of leading zeros of n. + xc[ni] = j > 0 ? mathfloor( n / pows10[ d - j ] % pows10[j] ) * k : 0; + } + + // Round up? + if (r) { + + for ( ; ; ) { + + // If the digit to be rounded up is in the first element of xc... + if ( ni == 0 ) { + + // i will be the length of xc[0] before k is added. + for ( i = 1, j = xc[0]; j >= 10; j /= 10, i++ ); + j = xc[0] += k; + for ( k = 1; j >= 10; j /= 10, k++ ); + + // if i != k the length has increased. + if ( i != k ) { + x.e++; + if ( xc[0] == BASE ) xc[0] = 1; + } + + break; + } else { + xc[ni] += k; + if ( xc[ni] != BASE ) break; + xc[ni--] = 0; + k = 1; + } + } + } + + // Remove trailing zeros. + for ( i = xc.length; xc[--i] === 0; xc.pop() ); + } + + // Overflow? Infinity. + if ( x.e > MAX_EXP ) { + x.c = x.e = null; + + // Underflow? Zero. + } else if ( x.e < MIN_EXP ) { + x.c = [ x.e = 0 ]; + } + } + + return x; + } + + + // PROTOTYPE/INSTANCE METHODS + + + /* + * Return a new BigNumber whose value is the absolute value of this BigNumber. + */ + P.absoluteValue = P.abs = function () { + var x = new BigNumber(this); + if ( x.s < 0 ) x.s = 1; + return x; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole + * number in the direction of Infinity. + */ + P.ceil = function () { + return round( new BigNumber(this), this.e + 1, 2 ); + }; + + + /* + * Return + * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b), + * -1 if the value of this BigNumber is less than the value of BigNumber(y, b), + * 0 if they have the same value, + * or null if the value of either is NaN. + */ + P.comparedTo = P.cmp = function ( y, b ) { + id = 1; + return compare( this, new BigNumber( y, b ) ); + }; + + + /* + * Return the number of decimal places of the value of this BigNumber, or null if the value + * of this BigNumber is ±Infinity or NaN. + */ + P.decimalPlaces = P.dp = function () { + var n, v, + c = this.c; + + if ( !c ) return null; + n = ( ( v = c.length - 1 ) - bitFloor( this.e / LOG_BASE ) ) * LOG_BASE; + + // Subtract the number of trailing zeros of the last number. + if ( v = c[v] ) for ( ; v % 10 == 0; v /= 10, n-- ); + if ( n < 0 ) n = 0; + + return n; + }; + + + /* + * n / 0 = I + * n / N = N + * n / I = 0 + * 0 / n = 0 + * 0 / 0 = N + * 0 / N = N + * 0 / I = 0 + * N / n = N + * N / 0 = N + * N / N = N + * N / I = N + * I / n = I + * I / 0 = I + * I / N = N + * I / I = N + * + * Return a new BigNumber whose value is the value of this BigNumber divided by the value of + * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE. + */ + P.dividedBy = P.div = function ( y, b ) { + id = 3; + return div( this, new BigNumber( y, b ), DECIMAL_PLACES, ROUNDING_MODE ); + }; + + + /* + * Return a new BigNumber whose value is the integer part of dividing the value of this + * BigNumber by the value of BigNumber(y, b). + */ + P.dividedToIntegerBy = P.divToInt = function ( y, b ) { + id = 4; + return div( this, new BigNumber( y, b ), 0, 1 ); + }; + + + /* + * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b), + * otherwise returns false. + */ + P.equals = P.eq = function ( y, b ) { + id = 5; + return compare( this, new BigNumber( y, b ) ) === 0; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole + * number in the direction of -Infinity. + */ + P.floor = function () { + return round( new BigNumber(this), this.e + 1, 3 ); + }; + + + /* + * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b), + * otherwise returns false. + */ + P.greaterThan = P.gt = function ( y, b ) { + id = 6; + return compare( this, new BigNumber( y, b ) ) > 0; + }; + + + /* + * Return true if the value of this BigNumber is greater than or equal to the value of + * BigNumber(y, b), otherwise returns false. + */ + P.greaterThanOrEqualTo = P.gte = function ( y, b ) { + id = 7; + return ( b = compare( this, new BigNumber( y, b ) ) ) === 1 || b === 0; + + }; + + + /* + * Return true if the value of this BigNumber is a finite number, otherwise returns false. + */ + P.isFinite = function () { + return !!this.c; + }; + + + /* + * Return true if the value of this BigNumber is an integer, otherwise return false. + */ + P.isInteger = P.isInt = function () { + return !!this.c && bitFloor( this.e / LOG_BASE ) > this.c.length - 2; + }; + + + /* + * Return true if the value of this BigNumber is NaN, otherwise returns false. + */ + P.isNaN = function () { + return !this.s; + }; + + + /* + * Return true if the value of this BigNumber is negative, otherwise returns false. + */ + P.isNegative = P.isNeg = function () { + return this.s < 0; + }; + + + /* + * Return true if the value of this BigNumber is 0 or -0, otherwise returns false. + */ + P.isZero = function () { + return !!this.c && this.c[0] == 0; + }; + + + /* + * Return true if the value of this BigNumber is less than the value of BigNumber(y, b), + * otherwise returns false. + */ + P.lessThan = P.lt = function ( y, b ) { + id = 8; + return compare( this, new BigNumber( y, b ) ) < 0; + }; + + + /* + * Return true if the value of this BigNumber is less than or equal to the value of + * BigNumber(y, b), otherwise returns false. + */ + P.lessThanOrEqualTo = P.lte = function ( y, b ) { + id = 9; + return ( b = compare( this, new BigNumber( y, b ) ) ) === -1 || b === 0; + }; + + + /* + * n - 0 = n + * n - N = N + * n - I = -I + * 0 - n = -n + * 0 - 0 = 0 + * 0 - N = N + * 0 - I = -I + * N - n = N + * N - 0 = N + * N - N = N + * N - I = N + * I - n = I + * I - 0 = I + * I - N = N + * I - I = N + * + * Return a new BigNumber whose value is the value of this BigNumber minus the value of + * BigNumber(y, b). + */ + P.minus = P.sub = function ( y, b ) { + var i, j, t, xLTy, + x = this, + a = x.s; + + id = 10; + y = new BigNumber( y, b ); + b = y.s; + + // Either NaN? + if ( !a || !b ) return new BigNumber(NaN); + + // Signs differ? + if ( a != b ) { + y.s = -b; + return x.plus(y); + } + + var xe = x.e / LOG_BASE, + ye = y.e / LOG_BASE, + xc = x.c, + yc = y.c; + + if ( !xe || !ye ) { + + // Either Infinity? + if ( !xc || !yc ) return xc ? ( y.s = -b, y ) : new BigNumber( yc ? x : NaN ); + + // Either zero? + if ( !xc[0] || !yc[0] ) { + + // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. + return yc[0] ? ( y.s = -b, y ) : new BigNumber( xc[0] ? x : + + // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity + ROUNDING_MODE == 3 ? -0 : 0 ); + } + } + + xe = bitFloor(xe); + ye = bitFloor(ye); + xc = xc.slice(); + + // Determine which is the bigger number. + if ( a = xe - ye ) { + + if ( xLTy = a < 0 ) { + a = -a; + t = xc; + } else { + ye = xe; + t = yc; + } + + t.reverse(); + + // Prepend zeros to equalise exponents. + for ( b = a; b--; t.push(0) ); + t.reverse(); + } else { + + // Exponents equal. Check digit by digit. + j = ( xLTy = ( a = xc.length ) < ( b = yc.length ) ) ? a : b; + + for ( a = b = 0; b < j; b++ ) { + + if ( xc[b] != yc[b] ) { + xLTy = xc[b] < yc[b]; + break; + } + } + } + + // x < y? Point xc to the array of the bigger number. + if (xLTy) t = xc, xc = yc, yc = t, y.s = -y.s; + + b = ( j = yc.length ) - ( i = xc.length ); + + // Append zeros to xc if shorter. + // No need to add zeros to yc if shorter as subtract only needs to start at yc.length. + if ( b > 0 ) for ( ; b--; xc[i++] = 0 ); + b = BASE - 1; + + // Subtract yc from xc. + for ( ; j > a; ) { + + if ( xc[--j] < yc[j] ) { + for ( i = j; i && !xc[--i]; xc[i] = b ); + --xc[i]; + xc[j] += BASE; + } + + xc[j] -= yc[j]; + } + + // Remove leading zeros and adjust exponent accordingly. + for ( ; xc[0] == 0; xc.splice(0, 1), --ye ); + + // Zero? + if ( !xc[0] ) { + + // Following IEEE 754 (2008) 6.3, + // n - n = +0 but n - n = -0 when rounding towards -Infinity. + y.s = ROUNDING_MODE == 3 ? -1 : 1; + y.c = [ y.e = 0 ]; + return y; + } + + // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity + // for finite x and y. + return normalise( y, xc, ye ); + }; + + + /* + * n % 0 = N + * n % N = N + * n % I = n + * 0 % n = 0 + * -0 % n = -0 + * 0 % 0 = N + * 0 % N = N + * 0 % I = 0 + * N % n = N + * N % 0 = N + * N % N = N + * N % I = N + * I % n = N + * I % 0 = N + * I % N = N + * I % I = N + * + * Return a new BigNumber whose value is the value of this BigNumber modulo the value of + * BigNumber(y, b). The result depends on the value of MODULO_MODE. + */ + P.modulo = P.mod = function ( y, b ) { + var q, s, + x = this; + + id = 11; + y = new BigNumber( y, b ); + + // Return NaN if x is Infinity or NaN, or y is NaN or zero. + if ( !x.c || !y.s || y.c && !y.c[0] ) { + return new BigNumber(NaN); + + // Return x if y is Infinity or x is zero. + } else if ( !y.c || x.c && !x.c[0] ) { + return new BigNumber(x); + } + + if ( MODULO_MODE == 9 ) { + + // Euclidian division: q = sign(y) * floor(x / abs(y)) + // r = x - qy where 0 <= r < abs(y) + s = y.s; + y.s = 1; + q = div( x, y, 0, 3 ); + y.s = s; + q.s *= s; + } else { + q = div( x, y, 0, MODULO_MODE ); + } + + return x.minus( q.times(y) ); + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber negated, + * i.e. multiplied by -1. + */ + P.negated = P.neg = function () { + var x = new BigNumber(this); + x.s = -x.s || null; + return x; + }; + + + /* + * n + 0 = n + * n + N = N + * n + I = I + * 0 + n = n + * 0 + 0 = 0 + * 0 + N = N + * 0 + I = I + * N + n = N + * N + 0 = N + * N + N = N + * N + I = N + * I + n = I + * I + 0 = I + * I + N = N + * I + I = I + * + * Return a new BigNumber whose value is the value of this BigNumber plus the value of + * BigNumber(y, b). + */ + P.plus = P.add = function ( y, b ) { + var t, + x = this, + a = x.s; + + id = 12; + y = new BigNumber( y, b ); + b = y.s; + + // Either NaN? + if ( !a || !b ) return new BigNumber(NaN); + + // Signs differ? + if ( a != b ) { + y.s = -b; + return x.minus(y); + } + + var xe = x.e / LOG_BASE, + ye = y.e / LOG_BASE, + xc = x.c, + yc = y.c; + + if ( !xe || !ye ) { + + // Return ±Infinity if either ±Infinity. + if ( !xc || !yc ) return new BigNumber( a / 0 ); + + // Either zero? + // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. + if ( !xc[0] || !yc[0] ) return yc[0] ? y : new BigNumber( xc[0] ? x : a * 0 ); + } + + xe = bitFloor(xe); + ye = bitFloor(ye); + xc = xc.slice(); + + // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts. + if ( a = xe - ye ) { + if ( a > 0 ) { + ye = xe; + t = yc; + } else { + a = -a; + t = xc; + } + + t.reverse(); + for ( ; a--; t.push(0) ); + t.reverse(); + } + + a = xc.length; + b = yc.length; + + // Point xc to the longer array, and b to the shorter length. + if ( a - b < 0 ) t = yc, yc = xc, xc = t, b = a; + + // Only start adding at yc.length - 1 as the further digits of xc can be ignored. + for ( a = 0; b; ) { + a = ( xc[--b] = xc[b] + yc[b] + a ) / BASE | 0; + xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE; + } + + if (a) { + xc = [a].concat(xc); + ++ye; + } + + // No need to check for zero, as +x + +y != 0 && -x + -y != 0 + // ye = MAX_EXP + 1 possible + return normalise( y, xc, ye ); + }; + + + /* + * Return the number of significant digits of the value of this BigNumber. + * + * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0. + */ + P.precision = P.sd = function (z) { + var n, v, + x = this, + c = x.c; + + // 'precision() argument not a boolean or binary digit: {z}' + if ( z != null && z !== !!z && z !== 1 && z !== 0 ) { + if (ERRORS) raise( 13, 'argument' + notBool, z ); + if ( z != !!z ) z = null; + } + + if ( !c ) return null; + v = c.length - 1; + n = v * LOG_BASE + 1; + + if ( v = c[v] ) { + + // Subtract the number of trailing zeros of the last element. + for ( ; v % 10 == 0; v /= 10, n-- ); + + // Add the number of digits of the first element. + for ( v = c[0]; v >= 10; v /= 10, n++ ); + } + + if ( z && x.e + 1 > n ) n = x.e + 1; + + return n; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of + * dp decimal places using rounding mode rm, or to 0 and ROUNDING_MODE respectively if + * omitted. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'round() decimal places out of range: {dp}' + * 'round() decimal places not an integer: {dp}' + * 'round() rounding mode not an integer: {rm}' + * 'round() rounding mode out of range: {rm}' + */ + P.round = function ( dp, rm ) { + var n = new BigNumber(this); + + if ( dp == null || isValidInt( dp, 0, MAX, 15 ) ) { + round( n, ~~dp + this.e + 1, rm == null || + !isValidInt( rm, 0, 8, 15, roundingMode ) ? ROUNDING_MODE : rm | 0 ); + } + + return n; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber shifted by k places + * (powers of 10). Shift to the right if n > 0, and to the left if n < 0. + * + * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive. + * + * If k is out of range and ERRORS is false, the result will be ±0 if k < 0, or ±Infinity + * otherwise. + * + * 'shift() argument not an integer: {k}' + * 'shift() argument out of range: {k}' + */ + P.shift = function (k) { + var n = this; + return isValidInt( k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 16, 'argument' ) + + // k < 1e+21, or truncate(k) will produce exponential notation. + ? n.times( '1e' + truncate(k) ) + : new BigNumber( n.c && n.c[0] && ( k < -MAX_SAFE_INTEGER || k > MAX_SAFE_INTEGER ) + ? n.s * ( k < 0 ? 0 : 1 / 0 ) + : n ); + }; + + + /* + * sqrt(-n) = N + * sqrt( N) = N + * sqrt(-I) = N + * sqrt( I) = I + * sqrt( 0) = 0 + * sqrt(-0) = -0 + * + * Return a new BigNumber whose value is the square root of the value of this BigNumber, + * rounded according to DECIMAL_PLACES and ROUNDING_MODE. + */ + P.squareRoot = P.sqrt = function () { + var m, n, r, rep, t, + x = this, + c = x.c, + s = x.s, + e = x.e, + dp = DECIMAL_PLACES + 4, + half = new BigNumber('0.5'); + + // Negative/NaN/Infinity/zero? + if ( s !== 1 || !c || !c[0] ) { + return new BigNumber( !s || s < 0 && ( !c || c[0] ) ? NaN : c ? x : 1 / 0 ); + } + + // Initial estimate. + s = Math.sqrt( +x ); + + // Math.sqrt underflow/overflow? + // Pass x to Math.sqrt as integer, then adjust the exponent of the result. + if ( s == 0 || s == 1 / 0 ) { + n = coeffToString(c); + if ( ( n.length + e ) % 2 == 0 ) n += '0'; + s = Math.sqrt(n); + e = bitFloor( ( e + 1 ) / 2 ) - ( e < 0 || e % 2 ); + + if ( s == 1 / 0 ) { + n = '1e' + e; + } else { + n = s.toExponential(); + n = n.slice( 0, n.indexOf('e') + 1 ) + e; + } + + r = new BigNumber(n); + } else { + r = new BigNumber( s + '' ); + } + + // Check for zero. + // r could be zero if MIN_EXP is changed after the this value was created. + // This would cause a division by zero (x/t) and hence Infinity below, which would cause + // coeffToString to throw. + if ( r.c[0] ) { + e = r.e; + s = e + dp; + if ( s < 3 ) s = 0; + + // Newton-Raphson iteration. + for ( ; ; ) { + t = r; + r = half.times( t.plus( div( x, t, dp, 1 ) ) ); + + if ( coeffToString( t.c ).slice( 0, s ) === ( n = + coeffToString( r.c ) ).slice( 0, s ) ) { + + // The exponent of r may here be one less than the final result exponent, + // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits + // are indexed correctly. + if ( r.e < e ) --s; + n = n.slice( s - 3, s + 1 ); + + // The 4th rounding digit may be in error by -1 so if the 4 rounding digits + // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the + // iteration. + if ( n == '9999' || !rep && n == '4999' ) { + + // On the first iteration only, check to see if rounding up gives the + // exact result as the nines may infinitely repeat. + if ( !rep ) { + round( t, t.e + DECIMAL_PLACES + 2, 0 ); + + if ( t.times(t).eq(x) ) { + r = t; + break; + } + } + + dp += 4; + s += 4; + rep = 1; + } else { + + // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact + // result. If not, then there are further digits and m will be truthy. + if ( !+n || !+n.slice(1) && n.charAt(0) == '5' ) { + + // Truncate to the first rounding digit. + round( r, r.e + DECIMAL_PLACES + 2, 1 ); + m = !r.times(r).eq(x); + } + + break; + } + } + } + } + + return round( r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m ); + }; + + + /* + * n * 0 = 0 + * n * N = N + * n * I = I + * 0 * n = 0 + * 0 * 0 = 0 + * 0 * N = N + * 0 * I = N + * N * n = N + * N * 0 = N + * N * N = N + * N * I = N + * I * n = I + * I * 0 = N + * I * N = N + * I * I = I + * + * Return a new BigNumber whose value is the value of this BigNumber times the value of + * BigNumber(y, b). + */ + P.times = P.mul = function ( y, b ) { + var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc, + base, sqrtBase, + x = this, + xc = x.c, + yc = ( id = 17, y = new BigNumber( y, b ) ).c; + + // Either NaN, ±Infinity or ±0? + if ( !xc || !yc || !xc[0] || !yc[0] ) { + + // Return NaN if either is NaN, or one is 0 and the other is Infinity. + if ( !x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc ) { + y.c = y.e = y.s = null; + } else { + y.s *= x.s; + + // Return ±Infinity if either is ±Infinity. + if ( !xc || !yc ) { + y.c = y.e = null; + + // Return ±0 if either is ±0. + } else { + y.c = [0]; + y.e = 0; + } + } + + return y; + } + + e = bitFloor( x.e / LOG_BASE ) + bitFloor( y.e / LOG_BASE ); + y.s *= x.s; + xcL = xc.length; + ycL = yc.length; + + // Ensure xc points to longer array and xcL to its length. + if ( xcL < ycL ) zc = xc, xc = yc, yc = zc, i = xcL, xcL = ycL, ycL = i; + + // Initialise the result array with zeros. + for ( i = xcL + ycL, zc = []; i--; zc.push(0) ); + + base = BASE; + sqrtBase = SQRT_BASE; + + for ( i = ycL; --i >= 0; ) { + c = 0; + ylo = yc[i] % sqrtBase; + yhi = yc[i] / sqrtBase | 0; + + for ( k = xcL, j = i + k; j > i; ) { + xlo = xc[--k] % sqrtBase; + xhi = xc[k] / sqrtBase | 0; + m = yhi * xlo + xhi * ylo; + xlo = ylo * xlo + ( ( m % sqrtBase ) * sqrtBase ) + zc[j] + c; + c = ( xlo / base | 0 ) + ( m / sqrtBase | 0 ) + yhi * xhi; + zc[j--] = xlo % base; + } + + zc[j] = c; + } + + if (c) { + ++e; + } else { + zc.splice(0, 1); + } + + return normalise( y, zc, e ); + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of + * sd significant digits using rounding mode rm, or ROUNDING_MODE if rm is omitted. + * + * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toDigits() precision out of range: {sd}' + * 'toDigits() precision not an integer: {sd}' + * 'toDigits() rounding mode not an integer: {rm}' + * 'toDigits() rounding mode out of range: {rm}' + */ + P.toDigits = function ( sd, rm ) { + var n = new BigNumber(this); + sd = sd == null || !isValidInt( sd, 1, MAX, 18, 'precision' ) ? null : sd | 0; + rm = rm == null || !isValidInt( rm, 0, 8, 18, roundingMode ) ? ROUNDING_MODE : rm | 0; + return sd ? round( n, sd, rm ) : n; + }; + + + /* + * Return a string representing the value of this BigNumber in exponential notation and + * rounded using ROUNDING_MODE to dp fixed decimal places. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toExponential() decimal places not an integer: {dp}' + * 'toExponential() decimal places out of range: {dp}' + * 'toExponential() rounding mode not an integer: {rm}' + * 'toExponential() rounding mode out of range: {rm}' + */ + P.toExponential = function ( dp, rm ) { + return format( this, + dp != null && isValidInt( dp, 0, MAX, 19 ) ? ~~dp + 1 : null, rm, 19 ); + }; + + + /* + * Return a string representing the value of this BigNumber in fixed-point notation rounding + * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted. + * + * Note: as with JavaScript's number type, (-0).toFixed(0) is '0', + * but e.g. (-0.00001).toFixed(0) is '-0'. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toFixed() decimal places not an integer: {dp}' + * 'toFixed() decimal places out of range: {dp}' + * 'toFixed() rounding mode not an integer: {rm}' + * 'toFixed() rounding mode out of range: {rm}' + */ + P.toFixed = function ( dp, rm ) { + return format( this, dp != null && isValidInt( dp, 0, MAX, 20 ) + ? ~~dp + this.e + 1 : null, rm, 20 ); + }; + + + /* + * Return a string representing the value of this BigNumber in fixed-point notation rounded + * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties + * of the FORMAT object (see BigNumber.config). + * + * FORMAT = { + * decimalSeparator : '.', + * groupSeparator : ',', + * groupSize : 3, + * secondaryGroupSize : 0, + * fractionGroupSeparator : '\xA0', // non-breaking space + * fractionGroupSize : 0 + * }; + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toFormat() decimal places not an integer: {dp}' + * 'toFormat() decimal places out of range: {dp}' + * 'toFormat() rounding mode not an integer: {rm}' + * 'toFormat() rounding mode out of range: {rm}' + */ + P.toFormat = function ( dp, rm ) { + var str = format( this, dp != null && isValidInt( dp, 0, MAX, 21 ) + ? ~~dp + this.e + 1 : null, rm, 21 ); + + if ( this.c ) { + var i, + arr = str.split('.'), + g1 = +FORMAT.groupSize, + g2 = +FORMAT.secondaryGroupSize, + groupSeparator = FORMAT.groupSeparator, + intPart = arr[0], + fractionPart = arr[1], + isNeg = this.s < 0, + intDigits = isNeg ? intPart.slice(1) : intPart, + len = intDigits.length; + + if (g2) i = g1, g1 = g2, g2 = i, len -= i; + + if ( g1 > 0 && len > 0 ) { + i = len % g1 || g1; + intPart = intDigits.substr( 0, i ); + + for ( ; i < len; i += g1 ) { + intPart += groupSeparator + intDigits.substr( i, g1 ); + } + + if ( g2 > 0 ) intPart += groupSeparator + intDigits.slice(i); + if (isNeg) intPart = '-' + intPart; + } + + str = fractionPart + ? intPart + FORMAT.decimalSeparator + ( ( g2 = +FORMAT.fractionGroupSize ) + ? fractionPart.replace( new RegExp( '\\d{' + g2 + '}\\B', 'g' ), + '$&' + FORMAT.fractionGroupSeparator ) + : fractionPart ) + : intPart; + } + + return str; + }; + + + /* + * Return a string array representing the value of this BigNumber as a simple fraction with + * an integer numerator and an integer denominator. The denominator will be a positive + * non-zero value less than or equal to the specified maximum denominator. If a maximum + * denominator is not specified, the denominator will be the lowest value necessary to + * represent the number exactly. + * + * [md] {number|string|BigNumber} Integer >= 1 and < Infinity. The maximum denominator. + * + * 'toFraction() max denominator not an integer: {md}' + * 'toFraction() max denominator out of range: {md}' + */ + P.toFraction = function (md) { + var arr, d0, d2, e, exp, n, n0, q, s, + k = ERRORS, + x = this, + xc = x.c, + d = new BigNumber(ONE), + n1 = d0 = new BigNumber(ONE), + d1 = n0 = new BigNumber(ONE); + + if ( md != null ) { + ERRORS = false; + n = new BigNumber(md); + ERRORS = k; + + if ( !( k = n.isInt() ) || n.lt(ONE) ) { + + if (ERRORS) { + raise( 22, + 'max denominator ' + ( k ? 'out of range' : 'not an integer' ), md ); + } + + // ERRORS is false: + // If md is a finite non-integer >= 1, round it to an integer and use it. + md = !k && n.c && round( n, n.e + 1, 1 ).gte(ONE) ? n : null; + } + } + + if ( !xc ) return x.toString(); + s = coeffToString(xc); + + // Determine initial denominator. + // d is a power of 10 and the minimum max denominator that specifies the value exactly. + e = d.e = s.length - x.e - 1; + d.c[0] = POWS_TEN[ ( exp = e % LOG_BASE ) < 0 ? LOG_BASE + exp : exp ]; + md = !md || n.cmp(d) > 0 ? ( e > 0 ? d : n1 ) : n; + + exp = MAX_EXP; + MAX_EXP = 1 / 0; + n = new BigNumber(s); + + // n0 = d1 = 0 + n0.c[0] = 0; + + for ( ; ; ) { + q = div( n, d, 0, 1 ); + d2 = d0.plus( q.times(d1) ); + if ( d2.cmp(md) == 1 ) break; + d0 = d1; + d1 = d2; + n1 = n0.plus( q.times( d2 = n1 ) ); + n0 = d2; + d = n.minus( q.times( d2 = d ) ); + n = d2; + } + + d2 = div( md.minus(d0), d1, 0, 1 ); + n0 = n0.plus( d2.times(n1) ); + d0 = d0.plus( d2.times(d1) ); + n0.s = n1.s = x.s; + e *= 2; + + // Determine which fraction is closer to x, n0/d0 or n1/d1 + arr = div( n1, d1, e, ROUNDING_MODE ).minus(x).abs().cmp( + div( n0, d0, e, ROUNDING_MODE ).minus(x).abs() ) < 1 + ? [ n1.toString(), d1.toString() ] + : [ n0.toString(), d0.toString() ]; + + MAX_EXP = exp; + return arr; + }; + + + /* + * Return the value of this BigNumber converted to a number primitive. + */ + P.toNumber = function () { + return +this; + }; + + + /* + * Return a BigNumber whose value is the value of this BigNumber raised to the power n. + * If m is present, return the result modulo m. + * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE. + * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using + * ROUNDING_MODE. + * + * The modular power operation works efficiently when x, n, and m are positive integers, + * otherwise it is equivalent to calculating x.toPower(n).modulo(m) (with POW_PRECISION 0). + * + * n {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive. + * [m] {number|string|BigNumber} The modulus. + * + * 'pow() exponent not an integer: {n}' + * 'pow() exponent out of range: {n}' + * + * Performs 54 loop iterations for n of 9007199254740991. + */ + P.toPower = P.pow = function ( n, m ) { + var k, y, z, + i = mathfloor( n < 0 ? -n : +n ), + x = this; + + if ( m != null ) { + id = 23; + m = new BigNumber(m); + } + + // Pass ±Infinity to Math.pow if exponent is out of range. + if ( !isValidInt( n, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 23, 'exponent' ) && + ( !isFinite(n) || i > MAX_SAFE_INTEGER && ( n /= 0 ) || + parseFloat(n) != n && !( n = NaN ) ) || n == 0 ) { + k = Math.pow( +x, n ); + return new BigNumber( m ? k % m : k ); + } + + if (m) { + if ( n > 1 && x.gt(ONE) && x.isInt() && m.gt(ONE) && m.isInt() ) { + x = x.mod(m); + } else { + z = m; + + // Nullify m so only a single mod operation is performed at the end. + m = null; + } + } else if (POW_PRECISION) { + + // Truncating each coefficient array to a length of k after each multiplication + // equates to truncating significant digits to POW_PRECISION + [28, 41], + // i.e. there will be a minimum of 28 guard digits retained. + // (Using + 1.5 would give [9, 21] guard digits.) + k = mathceil( POW_PRECISION / LOG_BASE + 2 ); + } + + y = new BigNumber(ONE); + + for ( ; ; ) { + if ( i % 2 ) { + y = y.times(x); + if ( !y.c ) break; + if (k) { + if ( y.c.length > k ) y.c.length = k; + } else if (m) { + y = y.mod(m); + } + } + + i = mathfloor( i / 2 ); + if ( !i ) break; + x = x.times(x); + if (k) { + if ( x.c && x.c.length > k ) x.c.length = k; + } else if (m) { + x = x.mod(m); + } + } + + if (m) return y; + if ( n < 0 ) y = ONE.div(y); + + return z ? y.mod(z) : k ? round( y, POW_PRECISION, ROUNDING_MODE ) : y; + }; + + + /* + * Return a string representing the value of this BigNumber rounded to sd significant digits + * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits + * necessary to represent the integer part of the value in fixed-point notation, then use + * exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toPrecision() precision not an integer: {sd}' + * 'toPrecision() precision out of range: {sd}' + * 'toPrecision() rounding mode not an integer: {rm}' + * 'toPrecision() rounding mode out of range: {rm}' + */ + P.toPrecision = function ( sd, rm ) { + return format( this, sd != null && isValidInt( sd, 1, MAX, 24, 'precision' ) + ? sd | 0 : null, rm, 24 ); + }; + + + /* + * Return a string representing the value of this BigNumber in base b, or base 10 if b is + * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and + * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent + * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than + * TO_EXP_NEG, return exponential notation. + * + * [b] {number} Integer, 2 to 64 inclusive. + * + * 'toString() base not an integer: {b}' + * 'toString() base out of range: {b}' + */ + P.toString = function (b) { + var str, + n = this, + s = n.s, + e = n.e; + + // Infinity or NaN? + if ( e === null ) { + + if (s) { + str = 'Infinity'; + if ( s < 0 ) str = '-' + str; + } else { + str = 'NaN'; + } + } else { + str = coeffToString( n.c ); + + if ( b == null || !isValidInt( b, 2, 64, 25, 'base' ) ) { + str = e <= TO_EXP_NEG || e >= TO_EXP_POS + ? toExponential( str, e ) + : toFixedPoint( str, e ); + } else { + str = convertBase( toFixedPoint( str, e ), b | 0, 10, s ); + } + + if ( s < 0 && n.c[0] ) str = '-' + str; + } + + return str; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber truncated to a whole + * number. + */ + P.truncated = P.trunc = function () { + return round( new BigNumber(this), this.e + 1, 1 ); + }; + + + /* + * Return as toString, but do not accept a base argument, and include the minus sign for + * negative zero. + */ + P.valueOf = P.toJSON = function () { + var str, + n = this, + e = n.e; + + if ( e === null ) return n.toString(); + + str = coeffToString( n.c ); + + str = e <= TO_EXP_NEG || e >= TO_EXP_POS + ? toExponential( str, e ) + : toFixedPoint( str, e ); + + return n.s < 0 ? '-' + str : str; + }; + + + P.isBigNumber = true; + + if ( config != null ) BigNumber.config(config); + + return BigNumber; +} + + +// PRIVATE HELPER FUNCTIONS + + +function bitFloor(n) { + var i = n | 0; + return n > 0 || n === i ? i : i - 1; +} + + +// Return a coefficient array as a string of base 10 digits. +function coeffToString(a) { + var s, z, + i = 1, + j = a.length, + r = a[0] + ''; + + for ( ; i < j; ) { + s = a[i++] + ''; + z = LOG_BASE - s.length; + for ( ; z--; s = '0' + s ); + r += s; + } + + // Determine trailing zeros. + for ( j = r.length; r.charCodeAt(--j) === 48; ); + return r.slice( 0, j + 1 || 1 ); +} + + +// Compare the value of BigNumbers x and y. +function compare( x, y ) { + var a, b, + xc = x.c, + yc = y.c, + i = x.s, + j = y.s, + k = x.e, + l = y.e; + + // Either NaN? + if ( !i || !j ) return null; + + a = xc && !xc[0]; + b = yc && !yc[0]; + + // Either zero? + if ( a || b ) return a ? b ? 0 : -j : i; + + // Signs differ? + if ( i != j ) return i; + + a = i < 0; + b = k == l; + + // Either Infinity? + if ( !xc || !yc ) return b ? 0 : !xc ^ a ? 1 : -1; + + // Compare exponents. + if ( !b ) return k > l ^ a ? 1 : -1; + + j = ( k = xc.length ) < ( l = yc.length ) ? k : l; + + // Compare digit by digit. + for ( i = 0; i < j; i++ ) if ( xc[i] != yc[i] ) return xc[i] > yc[i] ^ a ? 1 : -1; + + // Compare lengths. + return k == l ? 0 : k > l ^ a ? 1 : -1; +} + + +/* + * Return true if n is a valid number in range, otherwise false. + * Use for argument validation when ERRORS is false. + * Note: parseInt('1e+1') == 1 but parseFloat('1e+1') == 10. + */ +function intValidatorNoErrors( n, min, max ) { + return ( n = truncate(n) ) >= min && n <= max; +} + + +function isArray(obj) { + return Object.prototype.toString.call(obj) == '[object Array]'; +} + + +/* + * Convert string of baseIn to an array of numbers of baseOut. + * Eg. convertBase('255', 10, 16) returns [15, 15]. + * Eg. convertBase('ff', 16, 10) returns [2, 5, 5]. + */ +function toBaseOut( str, baseIn, baseOut ) { + var j, + arr = [0], + arrL, + i = 0, + len = str.length; + + for ( ; i < len; ) { + for ( arrL = arr.length; arrL--; arr[arrL] *= baseIn ); + arr[ j = 0 ] += ALPHABET.indexOf( str.charAt( i++ ) ); + + for ( ; j < arr.length; j++ ) { + + if ( arr[j] > baseOut - 1 ) { + if ( arr[j + 1] == null ) arr[j + 1] = 0; + arr[j + 1] += arr[j] / baseOut | 0; + arr[j] %= baseOut; + } + } + } + + return arr.reverse(); +} + + +function toExponential( str, e ) { + return ( str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str ) + + ( e < 0 ? 'e' : 'e+' ) + e; +} + + +function toFixedPoint( str, e ) { + var len, z; + + // Negative exponent? + if ( e < 0 ) { + + // Prepend zeros. + for ( z = '0.'; ++e; z += '0' ); + str = z + str; + + // Positive exponent + } else { + len = str.length; + + // Append zeros. + if ( ++e > len ) { + for ( z = '0', e -= len; --e; z += '0' ); + str += z; + } else if ( e < len ) { + str = str.slice( 0, e ) + '.' + str.slice(e); + } + } + + return str; +} + + +function truncate(n) { + n = parseFloat(n); + return n < 0 ? mathceil(n) : mathfloor(n); +} + + +// EXPORT + + +BigNumber = constructorFactory(); +BigNumber['default'] = BigNumber.BigNumber = BigNumber; + +export default BigNumber; diff --git a/html/RentForCamp/node_modules/bignumber.js/bower.json b/html/RentForCamp/node_modules/bignumber.js/bower.json new file mode 100644 index 0000000..3144f5c --- /dev/null +++ b/html/RentForCamp/node_modules/bignumber.js/bower.json @@ -0,0 +1,36 @@ +{ + "name": "bignumber.js", + "main": "bignumber.js", + "version": "4.1.0", + "homepage": "https://github.com/MikeMcl/bignumber.js", + "authors": [ + "Michael Mclaughlin " + ], + "description": "A library for arbitrary-precision decimal and non-decimal arithmetic", + "moduleType": [ + "amd", + "globals", + "node" + ], + "keywords": [ + "arbitrary", + "precision", + "arithmetic", + "big", + "number", + "decimal", + "float", + "biginteger", + "bigdecimal", + "bignumber", + "bigint", + "bignum" + ], + "license": "MIT", + "ignore": [ + ".*", + "*.json", + "test" + ] +} + diff --git a/html/RentForCamp/node_modules/bignumber.js/doc/API.html b/html/RentForCamp/node_modules/bignumber.js/doc/API.html new file mode 100644 index 0000000..c8df246 --- /dev/null +++ b/html/RentForCamp/node_modules/bignumber.js/doc/API.html @@ -0,0 +1,2197 @@ + + + + + + +bignumber.js API + + + + + + +
        + +

        bignumber.js

        + +

        A JavaScript library for arbitrary-precision arithmetic.

        +

        Hosted on GitHub.

        + +

        API

        + +

        + See the README on GitHub for a + quick-start introduction. +

        +

        + In all examples below, var and semicolons are not shown, and if a commented-out + value is in quotes it means toString has been called on the preceding expression. +

        + + +

        CONSTRUCTOR

        + +
        + BigNumberBigNumber(value [, base]) ⇒ BigNumber +
        +
        +
        value
        +
        + number|string|BigNumber: see RANGE for + range. +
        +
        + A numeric value. +
        +
        + Legitimate values include ±0, ±Infinity and + NaN. +
        +
        + Values of type number with more than 15 significant digits are + considered invalid (if ERRORS is true) as calling + toString or valueOf on + such numbers may not result in the intended value. +
        console.log( 823456789123456.3 );    // 823456789123456.2
        +
        +
        + There is no limit to the number of digits of a value of type string (other than + that of JavaScript's maximum array size). +
        +
        + Decimal string values may be in exponential, as well as normal (fixed-point) notation. + Non-decimal values must be in normal notation. +
        +
        + String values in hexadecimal literal form, e.g. '0xff', are valid, as are + string values with the octal and binary prefixs '0o' and '0b'. + String values in octal literal form without the prefix will be interpreted as + decimals, e.g. '011' is interpreted as 11, not 9. +
        +
        Values in any base may have fraction digits.
        +
        + For bases from 10 to 36, lower and/or upper case letters can be + used to represent values from 10 to 35. +
        +
        + For bases above 36, a-z represents values from 10 to + 35, A-Z from 36 to 61, and + $ and _ represent 62 and 63 respectively + (this can be changed by editing the ALPHABET variable near the top of the + source file). +
        +
        +
        +
        base
        +
        + number: integer, 2 to 64 inclusive +
        +
        The base of value.
        +
        + If base is omitted, or is null or undefined, base + 10 is assumed. +
        +
        +
        +

        Returns a new instance of a BigNumber object.

        +

        + If a base is specified, the value is rounded according to + the current DECIMAL_PLACES and + ROUNDING_MODE configuration. +

        +

        + See Errors for the treatment of an invalid value or + base. +

        +
        +x = new BigNumber(9)                       // '9'
        +y = new BigNumber(x)                       // '9'
        +
        +// 'new' is optional if ERRORS is false
        +BigNumber(435.345)                         // '435.345'
        +
        +new BigNumber('5032485723458348569331745.33434346346912144534543')
        +new BigNumber('4.321e+4')                  // '43210'
        +new BigNumber('-735.0918e-430')            // '-7.350918e-428'
        +new BigNumber(Infinity)                    // 'Infinity'
        +new BigNumber(NaN)                         // 'NaN'
        +new BigNumber('.5')                        // '0.5'
        +new BigNumber('+2')                        // '2'
        +new BigNumber(-10110100.1, 2)              // '-180.5'
        +new BigNumber(-0b10110100.1)               // '-180.5'
        +new BigNumber('123412421.234324', 5)       // '607236.557696'
        +new BigNumber('ff.8', 16)                  // '255.5'
        +new BigNumber('0xff.8')                    // '255.5'
        +

        + The following throws 'not a base 2 number' if + ERRORS is true, otherwise it returns a BigNumber with value + NaN. +

        +
        new BigNumber(9, 2)
        +

        + The following throws 'number type has more than 15 significant digits' if + ERRORS is true, otherwise it returns a BigNumber with value + 96517860459076820. +

        +
        new BigNumber(96517860459076817.4395)
        +

        + The following throws 'not a number' if ERRORS + is true, otherwise it returns a BigNumber with value NaN. +

        +
        new BigNumber('blurgh')
        +

        + A value is only rounded by the constructor if a base is specified. +

        +
        BigNumber.config({ DECIMAL_PLACES: 5 })
        +new BigNumber(1.23456789)                  // '1.23456789'
        +new BigNumber(1.23456789, 10)              // '1.23457'
        + + + +

        Methods

        +

        The static methods of a BigNumber constructor.

        + + + + +
        + another.another([obj]) ⇒ BigNumber constructor +
        +

        obj: object

        +

        + Returns a new independent BigNumber constructor with configuration as described by + obj (see config), or with the default + configuration if obj is null or undefined. +

        +
        BigNumber.config({ DECIMAL_PLACES: 5 })
        +BN = BigNumber.another({ DECIMAL_PLACES: 9 })
        +
        +x = new BigNumber(1)
        +y = new BN(1)
        +
        +x.div(3)                        // 0.33333
        +y.div(3)                        // 0.333333333
        +
        +// BN = BigNumber.another({ DECIMAL_PLACES: 9 }) is equivalent to:
        +BN = BigNumber.another()
        +BN.config({ DECIMAL_PLACES: 9 })
        + + + +
        configset([obj]) ⇒ object
        +

        + obj: object: an object that contains some or all of the following + properties. +

        +

        Configures the settings for this particular BigNumber constructor.

        +

        Note: the configuration can also be supplied as an argument list, see below.

        +
        +
        DECIMAL_PLACES
        +
        + number: integer, 0 to 1e+9 inclusive
        + Default value: 20 +
        +
        + The maximum number of decimal places of the results of operations involving + division, i.e. division, square root and base conversion operations, and power + operations with negative exponents.
        +
        +
        +
        BigNumber.config({ DECIMAL_PLACES: 5 })
        +BigNumber.set({ DECIMAL_PLACES: 5 })    // equivalent
        +BigNumber.config(5)    // equivalent
        +
        + + + +
        ROUNDING_MODE
        +
        + number: integer, 0 to 8 inclusive
        + Default value: 4 (ROUND_HALF_UP) +
        +
        + The rounding mode used in the above operations and the default rounding mode of + round, + toExponential, + toFixed, + toFormat and + toPrecision. +
        +
        The modes are available as enumerated properties of the BigNumber constructor.
        +
        +
        BigNumber.config({ ROUNDING_MODE: 0 })
        +BigNumber.config(null, BigNumber.ROUND_UP)    // equivalent
        +
        + + + +
        EXPONENTIAL_AT
        +
        + number: integer, magnitude 0 to 1e+9 inclusive, or +
        + number[]: [ integer -1e+9 to 0 inclusive, integer + 0 to 1e+9 inclusive ]
        + Default value: [-7, 20] +
        +
        + The exponent value(s) at which toString returns exponential notation. +
        +
        + If a single number is assigned, the value is the exponent magnitude.
        + If an array of two numbers is assigned then the first number is the negative exponent + value at and beneath which exponential notation is used, and the second number is the + positive exponent value at and above which the same. +
        +
        + For example, to emulate JavaScript numbers in terms of the exponent values at which they + begin to use exponential notation, use [-7, 20]. +
        +
        +
        BigNumber.config({ EXPONENTIAL_AT: 2 })
        +new BigNumber(12.3)         // '12.3'        e is only 1
        +new BigNumber(123)          // '1.23e+2'
        +new BigNumber(0.123)        // '0.123'       e is only -1
        +new BigNumber(0.0123)       // '1.23e-2'
        +
        +BigNumber.config({ EXPONENTIAL_AT: [-7, 20] })
        +new BigNumber(123456789)    // '123456789'   e is only 8
        +new BigNumber(0.000000123)  // '1.23e-7'
        +
        +// Almost never return exponential notation:
        +BigNumber.config({ EXPONENTIAL_AT: 1e+9 })
        +
        +// Always return exponential notation:
        +BigNumber.config({ EXPONENTIAL_AT: 0 })
        +
        +
        + Regardless of the value of EXPONENTIAL_AT, the toFixed method + will always return a value in normal notation and the toExponential method + will always return a value in exponential form. +
        +
        + Calling toString with a base argument, e.g. toString(10), will + also always return normal notation. +
        + + + +
        RANGE
        +
        + number: integer, magnitude 1 to 1e+9 inclusive, or +
        + number[]: [ integer -1e+9 to -1 inclusive, integer + 1 to 1e+9 inclusive ]
        + Default value: [-1e+9, 1e+9] +
        +
        + The exponent value(s) beyond which overflow to Infinity and underflow to + zero occurs. +
        +
        + If a single number is assigned, it is the maximum exponent magnitude: values wth a + positive exponent of greater magnitude become Infinity and those with a + negative exponent of greater magnitude become zero. +
        + If an array of two numbers is assigned then the first number is the negative exponent + limit and the second number is the positive exponent limit. +
        +
        + For example, to emulate JavaScript numbers in terms of the exponent values at which they + become zero and Infinity, use [-324, 308]. +
        +
        +
        BigNumber.config({ RANGE: 500 })
        +BigNumber.config().RANGE     // [ -500, 500 ]
        +new BigNumber('9.999e499')   // '9.999e+499'
        +new BigNumber('1e500')       // 'Infinity'
        +new BigNumber('1e-499')      // '1e-499'
        +new BigNumber('1e-500')      // '0'
        +
        +BigNumber.config({ RANGE: [-3, 4] })
        +new BigNumber(99999)         // '99999'      e is only 4
        +new BigNumber(100000)        // 'Infinity'   e is 5
        +new BigNumber(0.001)         // '0.01'       e is only -3
        +new BigNumber(0.0001)        // '0'          e is -4
        +
        +
        + The largest possible magnitude of a finite BigNumber is + 9.999...e+1000000000.
        + The smallest possible magnitude of a non-zero BigNumber is 1e-1000000000. +
        + + + +
        ERRORS
        +
        + boolean|number: true, false, 0 or + 1.
        + Default value: true +
        +
        + The value that determines whether BigNumber Errors are thrown.
        + If ERRORS is false, no errors will be thrown. +
        +
        See Errors.
        +
        BigNumber.config({ ERRORS: false })
        + + + +
        CRYPTO
        +
        + boolean|number: true, false, 0 or + 1.
        + Default value: false +
        +
        + The value that determines whether cryptographically-secure pseudo-random number + generation is used. +
        +
        + If CRYPTO is set to true then the + random method will generate random digits using + crypto.getRandomValues in browsers that support it, or + crypto.randomBytes if using a version of Node.js that supports it. +
        +
        + If neither function is supported by the host environment then attempting to set + CRYPTO to true will fail, and if ERRORS + is true an exception will be thrown. +
        +
        + If CRYPTO is false then the source of randomness used will be + Math.random (which is assumed to generate at least 30 bits of + randomness). +
        +
        See random.
        +
        +
        BigNumber.config({ CRYPTO: true })
        +BigNumber.config().CRYPTO       // true
        +BigNumber.random()              // 0.54340758610486147524
        +
        + + + +
        MODULO_MODE
        +
        + number: integer, 0 to 9 inclusive
        + Default value: 1 (ROUND_DOWN) +
        +
        The modulo mode used when calculating the modulus: a mod n.
        +
        + The quotient, q = a / n, is calculated according to the + ROUNDING_MODE that corresponds to the chosen + MODULO_MODE. +
        +
        The remainder, r, is calculated as: r = a - n * q.
        +
        + The modes that are most commonly used for the modulus/remainder operation are shown in + the following table. Although the other rounding modes can be used, they may not give + useful results. +
        +
        + + + + + + + + + + + + + + + + + + + + + + +
        PropertyValueDescription
        ROUND_UP0 + The remainder is positive if the dividend is negative, otherwise it is negative. +
        ROUND_DOWN1 + The remainder has the same sign as the dividend.
        + This uses 'truncating division' and matches the behaviour of JavaScript's + remainder operator %. +
        ROUND_FLOOR3 + The remainder has the same sign as the divisor.
        + This matches Python's % operator. +
        ROUND_HALF_EVEN6The IEEE 754 remainder function.
        EUCLID9 + The remainder is always positive. Euclidian division:
        + q = sign(n) * floor(a / abs(n)) +
        +
        +
        + The rounding/modulo modes are available as enumerated properties of the BigNumber + constructor. +
        +
        See modulo.
        +
        +
        BigNumber.config({ MODULO_MODE: BigNumber.EUCLID })
        +BigNumber.config({ MODULO_MODE: 9 })          // equivalent
        +
        + + + +
        POW_PRECISION
        +
        + number: integer, 0 to 1e+9 inclusive.
        + Default value: 0 +
        +
        + The maximum number of significant digits of the result of the power operation + (unless a modulus is specified). +
        +
        If set to 0, the number of signifcant digits will not be limited.
        +
        See toPower.
        +
        BigNumber.config({ POW_PRECISION: 100 })
        + + + +
        FORMAT
        +
        object
        +
        + The FORMAT object configures the format of the string returned by the + toFormat method. +
        +
        + The example below shows the properties of the FORMAT object that are + recognised, and their default values. +
        +
        + Unlike the other configuration properties, the values of the properties of the + FORMAT object will not be checked for validity. The existing + FORMAT object will simply be replaced by the object that is passed in. + Note that all the properties shown below do not have to be included. +
        +
        See toFormat for examples of usage.
        +
        +
        +BigNumber.config({
        +    FORMAT: {
        +        // the decimal separator
        +        decimalSeparator: '.',
        +        // the grouping separator of the integer part
        +        groupSeparator: ',',
        +        // the primary grouping size of the integer part
        +        groupSize: 3,
        +        // the secondary grouping size of the integer part
        +        secondaryGroupSize: 0,
        +        // the grouping separator of the fraction part
        +        fractionGroupSeparator: ' ',
        +        // the grouping size of the fraction part
        +        fractionGroupSize: 0
        +    }
        +});
        +
        +
        +
        +

        Returns an object with the above properties and their current values.

        +

        + If the value to be assigned to any of the above properties is null or + undefined it is ignored. +

        +

        See Errors for the treatment of invalid values.

        +
        +BigNumber.config({
        +    DECIMAL_PLACES: 40,
        +    ROUNDING_MODE: BigNumber.ROUND_HALF_CEIL,
        +    EXPONENTIAL_AT: [-10, 20],
        +    RANGE: [-500, 500],
        +    ERRORS: true,
        +    CRYPTO: true,
        +    MODULO_MODE: BigNumber.ROUND_FLOOR,
        +    POW_PRECISION: 80,
        +    FORMAT: {
        +        groupSize: 3,
        +        groupSeparator: ' ',
        +        decimalSeparator: ','
        +    }
        +});
        +
        +// Alternatively but equivalently (excluding FORMAT):
        +BigNumber.config( 40, 7, [-10, 20], 500, 1, 1, 3, 80 )
        +
        +obj = BigNumber.config();
        +obj.ERRORS       // true
        +obj.RANGE        // [-500, 500]
        + + + +
        + max.max([arg1 [, arg2, ...]]) ⇒ BigNumber +
        +

        + arg1, arg2, ...: number|string|BigNumber
        + See BigNumber for further parameter details. +

        +

        + Returns a BigNumber whose value is the maximum of arg1, + arg2,... . +

        +

        The argument to this method can also be an array of values.

        +

        The return value is always exact and unrounded.

        +
        x = new BigNumber('3257869345.0378653')
        +BigNumber.max(4e9, x, '123456789.9')          // '4000000000'
        +
        +arr = [12, '13', new BigNumber(14)]
        +BigNumber.max(arr)                            // '14'
        + + + +
        + min.min([arg1 [, arg2, ...]]) ⇒ BigNumber +
        +

        + arg1, arg2, ...: number|string|BigNumber
        + See BigNumber for further parameter details. +

        +

        + Returns a BigNumber whose value is the minimum of arg1, + arg2,... . +

        +

        The argument to this method can also be an array of values.

        +

        The return value is always exact and unrounded.

        +
        x = new BigNumber('3257869345.0378653')
        +BigNumber.min(4e9, x, '123456789.9')          // '123456789.9'
        +
        +arr = [2, new BigNumber(-14), '-15.9999', -12]
        +BigNumber.min(arr)                            // '-15.9999'
        + + + +
        + random.random([dp]) ⇒ BigNumber +
        +

        dp: number: integer, 0 to 1e+9 inclusive

        +

        + Returns a new BigNumber with a pseudo-random value equal to or greater than 0 and + less than 1. +

        +

        + The return value will have dp decimal places (or less if trailing zeros are + produced).
        + If dp is omitted then the number of decimal places will default to the current + DECIMAL_PLACES setting. +

        +

        + Depending on the value of this BigNumber constructor's + CRYPTO setting and the support for the + crypto object in the host environment, the random digits of the return value are + generated by either Math.random (fastest), crypto.getRandomValues + (Web Cryptography API in recent browsers) or crypto.randomBytes (Node.js). +

        +

        + If CRYPTO is true, i.e. one of the + crypto methods is to be used, the value of a returned BigNumber should be + cryptographically-secure and statistically indistinguishable from a random value. +

        +
        BigNumber.config({ DECIMAL_PLACES: 10 })
        +BigNumber.random()              // '0.4117936847'
        +BigNumber.random(20)            // '0.78193327636914089009'
        + + + +

        Properties

        +

        + The library's enumerated rounding modes are stored as properties of the constructor.
        + (They are not referenced internally by the library itself.) +

        +

        + Rounding modes 0 to 6 (inclusive) are the same as those of Java's + BigDecimal class. +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        PropertyValueDescription
        ROUND_UP0Rounds away from zero
        ROUND_DOWN1Rounds towards zero
        ROUND_CEIL2Rounds towards Infinity
        ROUND_FLOOR3Rounds towards -Infinity
        ROUND_HALF_UP4 + Rounds towards nearest neighbour.
        + If equidistant, rounds away from zero +
        ROUND_HALF_DOWN5 + Rounds towards nearest neighbour.
        + If equidistant, rounds towards zero +
        ROUND_HALF_EVEN6 + Rounds towards nearest neighbour.
        + If equidistant, rounds towards even neighbour +
        ROUND_HALF_CEIL7 + Rounds towards nearest neighbour.
        + If equidistant, rounds towards Infinity +
        ROUND_HALF_FLOOR8 + Rounds towards nearest neighbour.
        + If equidistant, rounds towards -Infinity +
        +
        +BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_CEIL })
        +BigNumber.config({ ROUNDING_MODE: 2 })     // equivalent
        + + +

        INSTANCE

        + +

        Methods

        +

        The methods inherited by a BigNumber instance from its constructor's prototype object.

        +

        A BigNumber is immutable in the sense that it is not changed by its methods.

        +

        + The treatment of ±0, ±Infinity and NaN is + consistent with how JavaScript treats these values. +

        +

        + Many method names have a shorter alias.
        + (Internally, the library always uses the shorter method names.) +

        + + + +
        absoluteValue.abs() ⇒ BigNumber
        +

        + Returns a BigNumber whose value is the absolute value, i.e. the magnitude, of the value of + this BigNumber. +

        +

        The return value is always exact and unrounded.

        +
        +x = new BigNumber(-0.8)
        +y = x.absoluteValue()           // '0.8'
        +z = y.abs()                     // '0.8'
        + + + +
        ceil.ceil() ⇒ BigNumber
        +

        + Returns a BigNumber whose value is the value of this BigNumber rounded to + a whole number in the direction of positive Infinity. +

        +
        +x = new BigNumber(1.3)
        +x.ceil()                        // '2'
        +y = new BigNumber(-1.8)
        +y.ceil()                        // '-1'
        + + + +
        comparedTo.cmp(n [, base]) ⇒ number
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        + + + + + + + + + + + + + + + + + + +
        Returns 
        1If the value of this BigNumber is greater than the value of n
        -1If the value of this BigNumber is less than the value of n
        0If this BigNumber and n have the same value
        nullIf the value of either this BigNumber or n is NaN
        +
        +x = new BigNumber(Infinity)
        +y = new BigNumber(5)
        +x.comparedTo(y)                 // 1
        +x.comparedTo(x.minus(1))        // 0
        +y.cmp(NaN)                      // null
        +y.cmp('110', 2)                 // -1
        + + + +
        decimalPlaces.dp() ⇒ number
        +

        + Return the number of decimal places of the value of this BigNumber, or null if + the value of this BigNumber is ±Infinity or NaN. +

        +
        +x = new BigNumber(123.45)
        +x.decimalPlaces()               // 2
        +y = new BigNumber('9.9e-101')
        +y.dp()                          // 102
        + + + +
        dividedBy.div(n [, base]) ⇒ BigNumber +
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        +

        + Returns a BigNumber whose value is the value of this BigNumber divided by + n, rounded according to the current + DECIMAL_PLACES and + ROUNDING_MODE configuration. +

        +
        +x = new BigNumber(355)
        +y = new BigNumber(113)
        +x.dividedBy(y)                  // '3.14159292035398230088'
        +x.div(5)                        // '71'
        +x.div(47, 16)                   // '5'
        + + + +
        + dividedToIntegerBy.divToInt(n [, base]) ⇒ + BigNumber +
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        +

        + Return a BigNumber whose value is the integer part of dividing the value of this BigNumber by + n. +

        +
        +x = new BigNumber(5)
        +y = new BigNumber(3)
        +x.dividedToIntegerBy(y)         // '1'
        +x.divToInt(0.7)                 // '7'
        +x.divToInt('0.f', 16)           // '5'
        + + + +
        equals.eq(n [, base]) ⇒ boolean
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        +

        + Returns true if the value of this BigNumber equals the value of n, + otherwise returns false.
        + As with JavaScript, NaN does not equal NaN. +

        +

        Note: This method uses the comparedTo method internally.

        +
        +0 === 1e-324                    // true
        +x = new BigNumber(0)
        +x.equals('1e-324')              // false
        +BigNumber(-0).eq(x)             // true  ( -0 === 0 )
        +BigNumber(255).eq('ff', 16)     // true
        +
        +y = new BigNumber(NaN)
        +y.equals(NaN)                   // false
        + + + +
        floor.floor() ⇒ BigNumber
        +

        + Returns a BigNumber whose value is the value of this BigNumber rounded to a whole number in + the direction of negative Infinity. +

        +
        +x = new BigNumber(1.8)
        +x.floor()                       // '1'
        +y = new BigNumber(-1.3)
        +y.floor()                       // '-2'
        + + + +
        greaterThan.gt(n [, base]) ⇒ boolean
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        +

        + Returns true if the value of this BigNumber is greater than the value of + n, otherwise returns false. +

        +

        Note: This method uses the comparedTo method internally.

        +
        +0.1 > (0.3 - 0.2)                           // true
        +x = new BigNumber(0.1)
        +x.greaterThan(BigNumber(0.3).minus(0.2))    // false
        +BigNumber(0).gt(x)                          // false
        +BigNumber(11, 3).gt(11.1, 2)                // true
        + + + +
        + greaterThanOrEqualTo.gte(n [, base]) ⇒ boolean +
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        +

        + Returns true if the value of this BigNumber is greater than or equal to the value + of n, otherwise returns false. +

        +

        Note: This method uses the comparedTo method internally.

        +
        +(0.3 - 0.2) >= 0.1                   // false
        +x = new BigNumber(0.3).minus(0.2)
        +x.greaterThanOrEqualTo(0.1)          // true
        +BigNumber(1).gte(x)                  // true
        +BigNumber(10, 18).gte('i', 36)       // true
        + + + +
        isFinite.isFinite() ⇒ boolean
        +

        + Returns true if the value of this BigNumber is a finite number, otherwise + returns false. +

        +

        + The only possible non-finite values of a BigNumber are NaN, Infinity + and -Infinity. +

        +
        +x = new BigNumber(1)
        +x.isFinite()                    // true
        +y = new BigNumber(Infinity)
        +y.isFinite()                    // false
        +

        + Note: The native method isFinite() can be used if + n <= Number.MAX_VALUE. +

        + + + +
        isInteger.isInt() ⇒ boolean
        +

        + Returns true if the value of this BigNumber is a whole number, otherwise returns + false. +

        +
        +x = new BigNumber(1)
        +x.isInteger()                   // true
        +y = new BigNumber(123.456)
        +y.isInt()                       // false
        + + + +
        isNaN.isNaN() ⇒ boolean
        +

        + Returns true if the value of this BigNumber is NaN, otherwise + returns false. +

        +
        +x = new BigNumber(NaN)
        +x.isNaN()                       // true
        +y = new BigNumber('Infinity')
        +y.isNaN()                       // false
        +

        Note: The native method isNaN() can also be used.

        + + + +
        isNegative.isNeg() ⇒ boolean
        +

        + Returns true if the value of this BigNumber is negative, otherwise returns + false. +

        +
        +x = new BigNumber(-0)
        +x.isNegative()                  // true
        +y = new BigNumber(2)
        +y.isNeg()                       // false
        +

        Note: n < 0 can be used if n <= -Number.MIN_VALUE.

        + + + +
        isZero.isZero() ⇒ boolean
        +

        + Returns true if the value of this BigNumber is zero or minus zero, otherwise + returns false. +

        +
        +x = new BigNumber(-0)
        +x.isZero() && x.isNeg()         // true
        +y = new BigNumber(Infinity)
        +y.isZero()                      // false
        +

        Note: n == 0 can be used if n >= Number.MIN_VALUE.

        + + + +
        lessThan.lt(n [, base]) ⇒ boolean
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        +

        + Returns true if the value of this BigNumber is less than the value of + n, otherwise returns false. +

        +

        Note: This method uses the comparedTo method internally.

        +
        +(0.3 - 0.2) < 0.1                     // true
        +x = new BigNumber(0.3).minus(0.2)
        +x.lessThan(0.1)                       // false
        +BigNumber(0).lt(x)                    // true
        +BigNumber(11.1, 2).lt(11, 3)          // true
        + + + +
        + lessThanOrEqualTo.lte(n [, base]) ⇒ boolean +
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        +

        + Returns true if the value of this BigNumber is less than or equal to the value of + n, otherwise returns false. +

        +

        Note: This method uses the comparedTo method internally.

        +
        +0.1 <= (0.3 - 0.2)                                // false
        +x = new BigNumber(0.1)
        +x.lessThanOrEqualTo(BigNumber(0.3).minus(0.2))    // true
        +BigNumber(-1).lte(x)                              // true
        +BigNumber(10, 18).lte('i', 36)                    // true
        + + + +
        + minus.minus(n [, base]) ⇒ BigNumber +
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        +

        Returns a BigNumber whose value is the value of this BigNumber minus n.

        +

        The return value is always exact and unrounded.

        +
        +0.3 - 0.1                       // 0.19999999999999998
        +x = new BigNumber(0.3)
        +x.minus(0.1)                    // '0.2'
        +x.minus(0.6, 20)                // '0'
        + + + +
        modulo.mod(n [, base]) ⇒ BigNumber
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        +

        + Returns a BigNumber whose value is the value of this BigNumber modulo n, i.e. + the integer remainder of dividing this BigNumber by n. +

        +

        + The value returned, and in particular its sign, is dependent on the value of the + MODULO_MODE setting of this BigNumber constructor. + If it is 1 (default value), the result will have the same sign as this BigNumber, + and it will match that of Javascript's % operator (within the limits of double + precision) and BigDecimal's remainder method. +

        +

        The return value is always exact and unrounded.

        +

        + See MODULO_MODE for a description of the other + modulo modes. +

        +
        +1 % 0.9                         // 0.09999999999999998
        +x = new BigNumber(1)
        +x.modulo(0.9)                   // '0.1'
        +y = new BigNumber(33)
        +y.mod('a', 33)                  // '3'
        + + + +
        negated.neg() ⇒ BigNumber
        +

        + Returns a BigNumber whose value is the value of this BigNumber negated, i.e. multiplied by + -1. +

        +
        +x = new BigNumber(1.8)
        +x.negated()                     // '-1.8'
        +y = new BigNumber(-1.3)
        +y.neg()                         // '1.3'
        + + + +
        plus.plus(n [, base]) ⇒ BigNumber
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        +

        Returns a BigNumber whose value is the value of this BigNumber plus n.

        +

        The return value is always exact and unrounded.

        +
        +0.1 + 0.2                       // 0.30000000000000004
        +x = new BigNumber(0.1)
        +y = x.plus(0.2)                 // '0.3'
        +BigNumber(0.7).plus(x).plus(y)  // '1'
        +x.plus('0.1', 8)                // '0.225'
        + + + +
        precision.sd([z]) ⇒ number
        +

        + z: boolean|number: true, false, 0 + or 1 +

        +

        Returns the number of significant digits of the value of this BigNumber.

        +

        + If z is true or 1 then any trailing zeros of the + integer part of a number are counted as significant digits, otherwise they are not. +

        +
        +x = new BigNumber(1.234)
        +x.precision()                   // 4
        +y = new BigNumber(987000)
        +y.sd()                          // 3
        +y.sd(true)                      // 6
        + + + +
        round.round([dp [, rm]]) ⇒ BigNumber
        +

        + dp: number: integer, 0 to 1e+9 inclusive
        + rm: number: integer, 0 to 8 inclusive +

        +

        + Returns a BigNumber whose value is the value of this BigNumber rounded by rounding mode + rm to a maximum of dp decimal places. +

        +

        + if dp is omitted, or is null or undefined, the + return value is n rounded to a whole number.
        + if rm is omitted, or is null or undefined, + ROUNDING_MODE is used. +

        +

        + See Errors for the treatment of other non-integer or out of range + dp or rm values. +

        +
        +x = 1234.56
        +Math.round(x)                             // 1235
        +
        +y = new BigNumber(x)
        +y.round()                                 // '1235'
        +y.round(1)                                // '1234.6'
        +y.round(2)                                // '1234.56'
        +y.round(10)                               // '1234.56'
        +y.round(0, 1)                             // '1234'
        +y.round(0, 6)                             // '1235'
        +y.round(1, 1)                             // '1234.5'
        +y.round(1, BigNumber.ROUND_HALF_EVEN)     // '1234.6'
        +y                                         // '1234.56'
        + + + +
        shift.shift(n) ⇒ BigNumber
        +

        + n: number: integer, + -9007199254740991 to 9007199254740991 inclusive +

        +

        + Returns a BigNumber whose value is the value of this BigNumber shifted n places. +

        + The shift is of the decimal point, i.e. of powers of ten, and is to the left if n + is negative or to the right if n is positive. +

        +

        The return value is always exact and unrounded.

        +
        +x = new BigNumber(1.23)
        +x.shift(3)                      // '1230'
        +x.shift(-3)                     // '0.00123'
        + + + +
        squareRoot.sqrt() ⇒ BigNumber
        +

        + Returns a BigNumber whose value is the square root of the value of this BigNumber, + rounded according to the current + DECIMAL_PLACES and + ROUNDING_MODE configuration. +

        +

        + The return value will be correctly rounded, i.e. rounded as if the result was first calculated + to an infinite number of correct digits before rounding. +

        +
        +x = new BigNumber(16)
        +x.squareRoot()                  // '4'
        +y = new BigNumber(3)
        +y.sqrt()                        // '1.73205080756887729353'
        + + + +
        times.times(n [, base]) ⇒ BigNumber
        +

        + n: number|string|BigNumber
        + base: number
        + See BigNumber for further parameter details. +

        +

        Returns a BigNumber whose value is the value of this BigNumber times n.

        +

        The return value is always exact and unrounded.

        +
        +0.6 * 3                         // 1.7999999999999998
        +x = new BigNumber(0.6)
        +y = x.times(3)                  // '1.8'
        +BigNumber('7e+500').times(y)    // '1.26e+501'
        +x.times('-a', 16)               // '-6'
        + + + +
        + toDigits.toDigits([sd [, rm]]) ⇒ BigNumber +
        +

        + sd: number: integer, 1 to 1e+9 inclusive.
        + rm: number: integer, 0 to 8 inclusive. +

        +

        + Returns a BigNumber whose value is the value of this BigNumber rounded to sd + significant digits using rounding mode rm. +

        +

        + If sd is omitted or is null or undefined, the return + value will not be rounded.
        + If rm is omitted or is null or undefined, + ROUNDING_MODE will be used. +

        +

        + See Errors for the treatment of other non-integer or out of range + sd or rm values. +

        +
        +BigNumber.config({ precision: 5, rounding: 4 })
        +x = new BigNumber(9876.54321)
        +
        +x.toDigits()                          // '9876.5'
        +x.toDigits(6)                         // '9876.54'
        +x.toDigits(6, BigNumber.ROUND_UP)     // '9876.55'
        +x.toDigits(2)                         // '9900'
        +x.toDigits(2, 1)                      // '9800'
        +x                                     // '9876.54321'
        + + + +
        + toExponential.toExponential([dp [, rm]]) ⇒ string +
        +

        + dp: number: integer, 0 to 1e+9 inclusive
        + rm: number: integer, 0 to 8 inclusive +

        +

        + Returns a string representing the value of this BigNumber in exponential notation rounded + using rounding mode rm to dp decimal places, i.e with one digit + before the decimal point and dp digits after it. +

        +

        + If the value of this BigNumber in exponential notation has fewer than dp fraction + digits, the return value will be appended with zeros accordingly. +

        +

        + If dp is omitted, or is null or undefined, the number + of digits after the decimal point defaults to the minimum number of digits necessary to + represent the value exactly.
        + If rm is omitted or is null or undefined, + ROUNDING_MODE is used. +

        +

        + See Errors for the treatment of other non-integer or out of range + dp or rm values. +

        +
        +x = 45.6
        +y = new BigNumber(x)
        +x.toExponential()               // '4.56e+1'
        +y.toExponential()               // '4.56e+1'
        +x.toExponential(0)              // '5e+1'
        +y.toExponential(0)              // '5e+1'
        +x.toExponential(1)              // '4.6e+1'
        +y.toExponential(1)              // '4.6e+1'
        +y.toExponential(1, 1)           // '4.5e+1'  (ROUND_DOWN)
        +x.toExponential(3)              // '4.560e+1'
        +y.toExponential(3)              // '4.560e+1'
        + + + +
        + toFixed.toFixed([dp [, rm]]) ⇒ string +
        +

        + dp: number: integer, 0 to 1e+9 inclusive
        + rm: number: integer, 0 to 8 inclusive +

        +

        + Returns a string representing the value of this BigNumber in normal (fixed-point) notation + rounded to dp decimal places using rounding mode rm. +

        +

        + If the value of this BigNumber in normal notation has fewer than dp fraction + digits, the return value will be appended with zeros accordingly. +

        +

        + Unlike Number.prototype.toFixed, which returns exponential notation if a number + is greater or equal to 1021, this method will always return normal + notation. +

        +

        + If dp is omitted or is null or undefined, the return + value will be unrounded and in normal notation. This is also unlike + Number.prototype.toFixed, which returns the value to zero decimal places.
        + It is useful when fixed-point notation is required and the current + EXPONENTIAL_AT setting causes + toString to return exponential notation.
        + If rm is omitted or is null or undefined, + ROUNDING_MODE is used. +

        +

        + See Errors for the treatment of other non-integer or out of range + dp or rm values. +

        +
        +x = 3.456
        +y = new BigNumber(x)
        +x.toFixed()                     // '3'
        +y.toFixed()                     // '3.456'
        +y.toFixed(0)                    // '3'
        +x.toFixed(2)                    // '3.46'
        +y.toFixed(2)                    // '3.46'
        +y.toFixed(2, 1)                 // '3.45'  (ROUND_DOWN)
        +x.toFixed(5)                    // '3.45600'
        +y.toFixed(5)                    // '3.45600'
        + + + +
        + toFormat.toFormat([dp [, rm]]) ⇒ string +
        +

        + dp: number: integer, 0 to 1e+9 inclusive
        + rm: number: integer, 0 to 8 inclusive +

        +

        +

        + Returns a string representing the value of this BigNumber in normal (fixed-point) notation + rounded to dp decimal places using rounding mode rm, and formatted + according to the properties of the FORMAT object. +

        +

        + See the examples below for the properties of the + FORMAT object, their types and their usage. +

        +

        + If dp is omitted or is null or undefined, then the + return value is not rounded to a fixed number of decimal places.
        + If rm is omitted or is null or undefined, + ROUNDING_MODE is used. +

        +

        + See Errors for the treatment of other non-integer or out of range + dp or rm values. +

        +
        +format = {
        +    decimalSeparator: '.',
        +    groupSeparator: ',',
        +    groupSize: 3,
        +    secondaryGroupSize: 0,
        +    fractionGroupSeparator: ' ',
        +    fractionGroupSize: 0
        +}
        +BigNumber.config({ FORMAT: format })
        +
        +x = new BigNumber('123456789.123456789')
        +x.toFormat()                    // '123,456,789.123456789'
        +x.toFormat(1)                   // '123,456,789.1'
        +
        +// If a reference to the object assigned to FORMAT has been retained,
        +// the format properties can be changed directly
        +format.groupSeparator = ' '
        +format.fractionGroupSize = 5
        +x.toFormat()                    // '123 456 789.12345 6789'
        +
        +BigNumber.config({
        +    FORMAT: {
        +        decimalSeparator: ',',
        +        groupSeparator: '.',
        +        groupSize: 3,
        +        secondaryGroupSize: 2
        +    }
        +})
        +
        +x.toFormat(6)                   // '12.34.56.789,123'
        + + + +
        + toFraction.toFraction([max]) ⇒ [string, string] +
        +

        + max: number|string|BigNumber: integer >= 1 and < + Infinity +

        +

        + Returns a string array representing the value of this BigNumber as a simple fraction with an + integer numerator and an integer denominator. The denominator will be a positive non-zero + value less than or equal to max. +

        +

        + If a maximum denominator, max, is not specified, or is null or + undefined, the denominator will be the lowest value necessary to represent the + number exactly. +

        +

        + See Errors for the treatment of other non-integer or out of range + max values. +

        +
        +x = new BigNumber(1.75)
        +x.toFraction()                  // '7, 4'
        +
        +pi = new BigNumber('3.14159265358')
        +pi.toFraction()                 // '157079632679,50000000000'
        +pi.toFraction(100000)           // '312689, 99532'
        +pi.toFraction(10000)            // '355, 113'
        +pi.toFraction(100)              // '311, 99'
        +pi.toFraction(10)               // '22, 7'
        +pi.toFraction(1)                // '3, 1'
        + + + +
        toJSON.toJSON() ⇒ string
        +

        As valueOf.

        +
        +x = new BigNumber('177.7e+457')
        +y = new BigNumber(235.4325)
        +z = new BigNumber('0.0098074')
        +
        +// Serialize an array of three BigNumbers
        +str = JSON.stringify( [x, y, z] )
        +// "["1.777e+459","235.4325","0.0098074"]"
        +
        +// Return an array of three BigNumbers
        +JSON.parse(str, function (key, val) {
        +    return key === '' ? val : new BigNumber(val)
        +})
        + + + +
        toNumber.toNumber() ⇒ number
        +

        Returns the value of this BigNumber as a JavaScript number primitive.

        +

        + Type coercion with, for example, the unary plus operator will also work, except that a + BigNumber with the value minus zero will be converted to positive zero. +

        +
        +x = new BigNumber(456.789)
        +x.toNumber()                    // 456.789
        ++x                              // 456.789
        +
        +y = new BigNumber('45987349857634085409857349856430985')
        +y.toNumber()                    // 4.598734985763409e+34
        +
        +z = new BigNumber(-0)
        +1 / +z                          // Infinity
        +1 / z.toNumber()                // -Infinity
        + + + +
        toPower.pow(n [, m]) ⇒ BigNumber
        +

        + n: number: integer, + -9007199254740991 to 9007199254740991 inclusive
        + m: number|string|BigNumber +

        +

        + Returns a BigNumber whose value is the value of this BigNumber raised to the power + n, and optionally modulo a modulus m. +

        +

        + If n is negative the result is rounded according to the current + DECIMAL_PLACES and + ROUNDING_MODE configuration. +

        +

        + If n is not an integer or is out of range: +

        +

        + If ERRORS is true a BigNumber Error is thrown,
        + else if n is greater than 9007199254740991, it is interpreted as + Infinity;
        + else if n is less than -9007199254740991, it is interpreted as + -Infinity;
        + else if n is otherwise a number, it is truncated to an integer;
        + else it is interpreted as NaN. +

        +

        + As the number of digits of the result of the power operation can grow so large so quickly, + e.g. 123.45610000 has over 50000 digits, the number of significant + digits calculated is limited to the value of the + POW_PRECISION setting (unless a modulus + m is specified). +

        +

        + By default POW_PRECISION is set to 0. + This means that an unlimited number of significant digits will be calculated, and that the + method's performance will decrease dramatically for larger exponents. +

        +

        + Negative exponents will be calculated to the number of decimal places specified by + DECIMAL_PLACES (but not to more than + POW_PRECISION significant digits). +

        +

        + If m is specified and the value of m, n and this + BigNumber are positive integers, then a fast modular exponentiation algorithm is used, + otherwise if any of the values is not a positive integer the operation will simply be + performed as x.toPower(n).modulo(m) with a + POW_PRECISION of 0. +

        +
        +Math.pow(0.7, 2)                // 0.48999999999999994
        +x = new BigNumber(0.7)
        +x.toPower(2)                    // '0.49'
        +BigNumber(3).pow(-2)            // '0.11111111111111111111'
        + + + +
        + toPrecision.toPrecision([sd [, rm]]) ⇒ string +
        +

        + sd: number: integer, 1 to 1e+9 inclusive
        + rm: number: integer, 0 to 8 inclusive +

        +

        + Returns a string representing the value of this BigNumber rounded to sd + significant digits using rounding mode rm. +

        +

        + If sd is less than the number of digits necessary to represent the integer part + of the value in normal (fixed-point) notation, then exponential notation is used. +

        +

        + If sd is omitted, or is null or undefined, then the + return value is the same as n.toString().
        + If rm is omitted or is null or undefined, + ROUNDING_MODE is used. +

        +

        + See Errors for the treatment of other non-integer or out of range + sd or rm values. +

        +
        +x = 45.6
        +y = new BigNumber(x)
        +x.toPrecision()                 // '45.6'
        +y.toPrecision()                 // '45.6'
        +x.toPrecision(1)                // '5e+1'
        +y.toPrecision(1)                // '5e+1'
        +y.toPrecision(2, 0)             // '4.6e+1'  (ROUND_UP)
        +y.toPrecision(2, 1)             // '4.5e+1'  (ROUND_DOWN)
        +x.toPrecision(5)                // '45.600'
        +y.toPrecision(5)                // '45.600'
        + + + +
        toString.toString([base]) ⇒ string
        +

        base: number: integer, 2 to 64 inclusive

        +

        + Returns a string representing the value of this BigNumber in the specified base, or base + 10 if base is omitted or is null or + undefined. +

        +

        + For bases above 10, values from 10 to 35 are + represented by a-z (as with Number.prototype.toString), + 36 to 61 by A-Z, and 62 and + 63 by $ and _ respectively. +

        +

        + If a base is specified the value is rounded according to the current + DECIMAL_PLACES + and ROUNDING_MODE configuration. +

        +

        + If a base is not specified, and this BigNumber has a positive + exponent that is equal to or greater than the positive component of the + current EXPONENTIAL_AT setting, + or a negative exponent equal to or less than the negative component of the + setting, then exponential notation is returned. +

        +

        If base is null or undefined it is ignored.

        +

        + See Errors for the treatment of other non-integer or out of range + base values. +

        +
        +x = new BigNumber(750000)
        +x.toString()                    // '750000'
        +BigNumber.config({ EXPONENTIAL_AT: 5 })
        +x.toString()                    // '7.5e+5'
        +
        +y = new BigNumber(362.875)
        +y.toString(2)                   // '101101010.111'
        +y.toString(9)                   // '442.77777777777777777778'
        +y.toString(32)                  // 'ba.s'
        +
        +BigNumber.config({ DECIMAL_PLACES: 4 });
        +z = new BigNumber('1.23456789')
        +z.toString()                    // '1.23456789'
        +z.toString(10)                  // '1.2346'
        + + + +
        truncated.trunc() ⇒ BigNumber
        +

        + Returns a BigNumber whose value is the value of this BigNumber truncated to a whole number. +

        +
        +x = new BigNumber(123.456)
        +x.truncated()                   // '123'
        +y = new BigNumber(-12.3)
        +y.trunc()                       // '-12'
        + + + +
        valueOf.valueOf() ⇒ string
        +

        + As toString, but does not accept a base argument and includes the minus sign + for negative zero. +

        +
        +x = new BigNumber('-0')
        +x.toString()                    // '0'
        +x.valueOf()                     // '-0'
        +y = new BigNumber('1.777e+457')
        +y.valueOf()                     // '1.777e+457'
        + + + +

        Properties

        +

        The properties of a BigNumber instance:

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        PropertyDescriptionTypeValue
        ccoefficient*number[] Array of base 1e14 numbers
        eexponentnumberInteger, -1000000000 to 1000000000 inclusive
        ssignnumber-1 or 1
        isBigNumbertype identifierbooleantrue
        +

        *significand

        +

        + The value of any of the c, e and s properties may also + be null. +

        +

        + From v2.0.0 of this library, the value of the coefficient of a BigNumber is stored in a + normalised base 100000000000000 floating point format, as opposed to the base + 10 format used in v1.x.x +

        +

        + This change means the properties of a BigNumber are now best considered to be read-only. + Previously it was acceptable to change the exponent of a BigNumber by writing to its exponent + property directly, but this is no longer recommended as the number of digits in the first + element of the coefficient array is dependent on the exponent, so the coefficient would also + need to be altered. +

        +

        + Note that, as with JavaScript numbers, the original exponent and fractional trailing zeros are + not necessarily preserved. +

        +
        x = new BigNumber(0.123)              // '0.123'
        +x.toExponential()                     // '1.23e-1'
        +x.c                                   // '1,2,3'
        +x.e                                   // -1
        +x.s                                   // 1
        +
        +y = new Number(-123.4567000e+2)       // '-12345.67'
        +y.toExponential()                     // '-1.234567e+4'
        +z = new BigNumber('-123.4567000e+2')  // '-12345.67'
        +z.toExponential()                     // '-1.234567e+4'
        +z.c                                   // '1,2,3,4,5,6,7'
        +z.e                                   // 4
        +z.s                                   // -1
        +

        Checking if a value is a BigNumber instance:

        +
        +x = new BigNumber(3)
        +x instanceof BigNumber     // true
        +x.isBigNumber              // true
        +
        +BN = BigNumber.another();
        +
        +y = new BN(3)
        +y instanceof BigNumber     // false
        +y.isBigNumber              // true
        + + + + +

        Zero, NaN and Infinity

        +

        + The table below shows how ±0, NaN and + ±Infinity are stored. +

        + + + + + + + + + + + + + + + + + + + + + + + + + +
        ces
        ±0[0]0±1
        NaNnullnullnull
        ±Infinitynullnull±1
        +
        +x = new Number(-0)              // 0
        +1 / x == -Infinity              // true
        +
        +y = new BigNumber(-0)           // '0'
        +y.c                             // '0' ( [0].toString() )
        +y.e                             // 0
        +y.s                             // -1
        + + + +

        Errors

        +

        + The errors that are thrown are generic Error objects with name + BigNumber Error. +

        +

        + The table below shows the errors that may be thrown if ERRORS is + true, and the action taken if ERRORS is false. +

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Method(s)ERRORS: true
        Throw BigNumber Error
        ERRORS: false
        Action on invalid argument
        + + BigNumber
        + comparedTo
        + dividedBy
        + dividedToIntegerBy
        + equals
        + greaterThan
        + greaterThanOrEqualTo
        + lessThan
        + lessThanOrEqualTo
        + minus
        + modulo
        + plus
        + times +
        number type has more than
        15 significant digits
        Accept.
        not a base... numberSubstitute NaN.
        base not an integerTruncate to integer.
        Ignore if not a number.
        base out of rangeIgnore.
        not a number*Substitute NaN.
        anothernot an objectIgnore.
        configDECIMAL_PLACES not an integerTruncate to integer.
        Ignore if not a number.
        DECIMAL_PLACES out of rangeIgnore.
        ROUNDING_MODE not an integerTruncate to integer.
        Ignore if not a number.
        ROUNDING_MODE out of rangeIgnore.
        EXPONENTIAL_AT not an integer
        or not [integer, integer]
        Truncate to integer(s).
        Ignore if not number(s).
        EXPONENTIAL_AT out of range
        or not [negative, positive]
        Ignore.
        RANGE not an integer
        or not [integer, integer]
        Truncate to integer(s).
        Ignore if not number(s).
        RANGE cannot be zeroIgnore.
        RANGE out of range
        or not [negative, positive]
        Ignore.
        ERRORS not a boolean
        or binary digit
        Ignore.
        CRYPTO not a boolean
        or binary digit
        Ignore.
        CRYPTO crypto unavailableIgnore.
        MODULO_MODE not an integerTruncate to integer.
        Ignore if not a number.
        MODULO_MODE out of rangeIgnore.
        POW_PRECISION not an integerTruncate to integer.
        Ignore if not a number.
        POW_PRECISION out of rangeIgnore.
        FORMAT not an objectIgnore.
        precisionargument not a boolean
        or binary digit
        Ignore.
        rounddecimal places not an integerTruncate to integer.
        Ignore if not a number.
        decimal places out of rangeIgnore.
        rounding mode not an integerTruncate to integer.
        Ignore if not a number.
        rounding mode out of rangeIgnore.
        shiftargument not an integerTruncate to integer.
        Ignore if not a number.
        argument out of rangeSubstitute ±Infinity. +
        + toExponential
        + toFixed
        + toFormat +
        decimal places not an integerTruncate to integer.
        Ignore if not a number.
        decimal places out of rangeIgnore.
        rounding mode not an integerTruncate to integer.
        Ignore if not a number.
        rounding mode out of rangeIgnore.
        toFractionmax denominator not an integerTruncate to integer.
        Ignore if not a number.
        max denominator out of rangeIgnore.
        + toDigits
        + toPrecision +
        precision not an integerTruncate to integer.
        Ignore if not a number.
        precision out of rangeIgnore.
        rounding mode not an integerTruncate to integer.
        Ignore if not a number.
        rounding mode out of rangeIgnore.
        toPowerexponent not an integerTruncate to integer.
        Substitute NaN if not a number.
        exponent out of rangeSubstitute ±Infinity. +
        toStringbase not an integerTruncate to integer.
        Ignore if not a number.
        base out of rangeIgnore.
        +

        *No error is thrown if the value is NaN or 'NaN'.

        +

        + The message of a BigNumber Error will also contain the name of the method from which + the error originated. +

        +

        To determine if an exception is a BigNumber Error:

        +
        +try {
        +    // ...
        +} catch (e) {
        +    if ( e instanceof Error && e.name == 'BigNumber Error' ) {
        +        // ...
        +    }
        +}
        + + + +

        FAQ

        + +
        Why are trailing fractional zeros removed from BigNumbers?
        +

        + Some arbitrary-precision libraries retain trailing fractional zeros as they can indicate the + precision of a value. This can be useful but the results of arithmetic operations can be + misleading. +

        +
        +x = new BigDecimal("1.0")
        +y = new BigDecimal("1.1000")
        +z = x.add(y)                      // 2.1000
        +
        +x = new BigDecimal("1.20")
        +y = new BigDecimal("3.45000")
        +z = x.multiply(y)                 // 4.1400000
        +

        + To specify the precision of a value is to specify that the value lies + within a certain range. +

        +

        + In the first example, x has a value of 1.0. The trailing zero shows + the precision of the value, implying that it is in the range 0.95 to + 1.05. Similarly, the precision indicated by the trailing zeros of y + indicates that the value is in the range 1.09995 to 1.10005. +

        +

        + If we add the two lowest values in the ranges we have, 0.95 + 1.09995 = 2.04995, + and if we add the two highest values we have, 1.05 + 1.10005 = 2.15005, so the + range of the result of the addition implied by the precision of its operands is + 2.04995 to 2.15005. +

        +

        + The result given by BigDecimal of 2.1000 however, indicates that the value is in + the range 2.09995 to 2.10005 and therefore the precision implied by + its trailing zeros may be misleading. +

        +

        + In the second example, the true range is 4.122744 to 4.157256 yet + the BigDecimal answer of 4.1400000 indicates a range of 4.13999995 + to 4.14000005. Again, the precision implied by the trailing zeros may be + misleading. +

        +

        + This library, like binary floating point and most calculators, does not retain trailing + fractional zeros. Instead, the toExponential, toFixed and + toPrecision methods enable trailing zeros to be added if and when required.
        +

        +
        + + + diff --git a/html/RentForCamp/node_modules/bignumber.js/package.json b/html/RentForCamp/node_modules/bignumber.js/package.json new file mode 100644 index 0000000..212df5a --- /dev/null +++ b/html/RentForCamp/node_modules/bignumber.js/package.json @@ -0,0 +1,104 @@ +{ + "_args": [ + [ + { + "raw": "bignumber.js@4.1.0", + "scope": null, + "escapedName": "bignumber.js", + "name": "bignumber.js", + "rawSpec": "4.1.0", + "spec": "4.1.0", + "type": "version" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/mysql" + ] + ], + "_from": "bignumber.js@4.1.0", + "_id": "bignumber.js@4.1.0", + "_inCache": true, + "_location": "/bignumber.js", + "_nodeVersion": "8.5.0", + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/bignumber.js-4.1.0.tgz_1506461103217_0.030498685780912638" + }, + "_npmUser": { + "name": "mikemcl", + "email": "M8ch88l@gmail.com" + }, + "_npmVersion": "5.0.4", + "_phantomChildren": {}, + "_requested": { + "raw": "bignumber.js@4.1.0", + "scope": null, + "escapedName": "bignumber.js", + "name": "bignumber.js", + "rawSpec": "4.1.0", + "spec": "4.1.0", + "type": "version" + }, + "_requiredBy": [ + "/mysql" + ], + "_resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", + "_shasum": "db6f14067c140bd46624815a7916c92d9b6c24b1", + "_shrinkwrap": null, + "_spec": "bignumber.js@4.1.0", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/mysql", + "author": { + "name": "Michael Mclaughlin", + "email": "M8ch88l@gmail.com" + }, + "bugs": { + "url": "https://github.com/MikeMcl/bignumber.js/issues" + }, + "dependencies": {}, + "description": "A library for arbitrary-precision decimal and non-decimal arithmetic", + "devDependencies": {}, + "directories": {}, + "dist": { + "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==", + "shasum": "db6f14067c140bd46624815a7916c92d9b6c24b1", + "tarball": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz" + }, + "engines": { + "node": "*" + }, + "gitHead": "e545d41b2f43874399101ac7ee5098093ac96b6b", + "homepage": "https://github.com/MikeMcl/bignumber.js#readme", + "keywords": [ + "arbitrary", + "precision", + "arithmetic", + "big", + "number", + "decimal", + "float", + "biginteger", + "bigdecimal", + "bignumber", + "bigint", + "bignum" + ], + "license": "MIT", + "main": "bignumber.js", + "maintainers": [ + { + "name": "mikemcl", + "email": "M8ch88l@gmail.com" + } + ], + "name": "bignumber.js", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/MikeMcl/bignumber.js.git" + }, + "scripts": { + "build": "uglifyjs bignumber.js --source-map bignumber.js.map -c -m -o bignumber.min.js --preamble \"/* bignumber.js v4.1.0 https://github.com/MikeMcl/bignumber.js/LICENCE */\"", + "test": "node ./test/every-test.js" + }, + "types": "bignumber.d.ts", + "version": "4.1.0" +} diff --git a/html/RentForCamp/node_modules/chalk/index.js b/html/RentForCamp/node_modules/chalk/index.js new file mode 100644 index 0000000..a21f702 --- /dev/null +++ b/html/RentForCamp/node_modules/chalk/index.js @@ -0,0 +1,63 @@ +'use strict'; +var ansi = require('ansi-styles'); +var stripAnsi = require('strip-ansi'); +var hasColor = require('has-color'); +var defineProps = Object.defineProperties; +var chalk = module.exports; + +var styles = (function () { + var ret = {}; + + ansi.grey = ansi.gray; + + Object.keys(ansi).forEach(function (key) { + ret[key] = { + get: function () { + this._styles.push(key); + return this; + } + }; + }); + + return ret; +})(); + +function init() { + var ret = {}; + + Object.keys(styles).forEach(function (name) { + ret[name] = { + get: function () { + var obj = defineProps(function self() { + var str = [].slice.call(arguments).join(' '); + + if (!chalk.enabled) { + return str; + } + + return self._styles.reduce(function (str, name) { + var code = ansi[name]; + return str ? code.open + str + code.close : ''; + }, str); + }, styles); + + obj._styles = []; + + return obj[name]; + } + } + }); + + return ret; +} + +defineProps(chalk, init()); + +chalk.styles = ansi; +chalk.stripColor = stripAnsi; +chalk.supportsColor = hasColor; + +// detect mode if not set manually +if (chalk.enabled === undefined) { + chalk.enabled = chalk.supportsColor; +} diff --git a/html/RentForCamp/node_modules/chalk/package.json b/html/RentForCamp/node_modules/chalk/package.json new file mode 100644 index 0000000..5ff9c58 --- /dev/null +++ b/html/RentForCamp/node_modules/chalk/package.json @@ -0,0 +1,111 @@ +{ + "_args": [ + [ + { + "raw": "chalk@~0.4.0", + "scope": null, + "escapedName": "chalk", + "name": "chalk", + "rawSpec": "~0.4.0", + "spec": ">=0.4.0 <0.5.0", + "type": "range" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/nomnom" + ] + ], + "_from": "chalk@>=0.4.0 <0.5.0", + "_id": "chalk@0.4.0", + "_inCache": true, + "_location": "/chalk", + "_npmUser": { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + }, + "_npmVersion": "1.3.17", + "_phantomChildren": {}, + "_requested": { + "raw": "chalk@~0.4.0", + "scope": null, + "escapedName": "chalk", + "name": "chalk", + "rawSpec": "~0.4.0", + "spec": ">=0.4.0 <0.5.0", + "type": "range" + }, + "_requiredBy": [ + "/nomnom" + ], + "_resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "_shasum": "5199a3ddcd0c1efe23bc08c1b027b06176e0c64f", + "_shrinkwrap": null, + "_spec": "chalk@~0.4.0", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/nomnom", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "bugs": { + "url": "https://github.com/sindresorhus/chalk/issues" + }, + "dependencies": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + }, + "description": "Terminal string styling done right. Created because the `colors` module does some really horrible things.", + "devDependencies": { + "mocha": "~1.x" + }, + "directories": {}, + "dist": { + "shasum": "5199a3ddcd0c1efe23bc08c1b027b06176e0c64f", + "tarball": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz" + }, + "engines": { + "node": ">=0.8.0" + }, + "files": [ + "index.js" + ], + "homepage": "https://github.com/sindresorhus/chalk", + "keywords": [ + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "ansi", + "styles", + "tty", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "maintainers": [ + { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + } + ], + "name": "chalk", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/chalk.git" + }, + "scripts": { + "test": "mocha" + }, + "version": "0.4.0" +} diff --git a/html/RentForCamp/node_modules/chalk/readme.md b/html/RentForCamp/node_modules/chalk/readme.md new file mode 100644 index 0000000..46813ac --- /dev/null +++ b/html/RentForCamp/node_modules/chalk/readme.md @@ -0,0 +1,158 @@ +# chalk + +> Terminal string styling done right + +[![Build Status](https://secure.travis-ci.org/sindresorhus/chalk.png?branch=master)](http://travis-ci.org/sindresorhus/chalk) + +[colors.js](https://github.com/Marak/colors.js) is currently the most popular string styling module, but it has serious deficiencies like extending String.prototype which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68). Although there are other ones, they either do too much or not enough. + +**Chalk is a clean and focused alternative.** + +![screenshot](screenshot.png) + + +## Why + +- **Doesn't extend String.prototype** +- Expressive API +- Clean and focused +- Auto-detects color support +- Actively maintained +- [Used by 150+ modules](https://npmjs.org/browse/depended/chalk) + + +## Install + +Install with [npm](https://npmjs.org/package/chalk): `npm install --save chalk` + + +## Example + +Chalk comes with an easy to use composable API where you just chain and nest the styles you want. + +```js +var chalk = require('chalk'); + +// style a string +console.log( chalk.blue('Hello world!') ); + +// combine styled and normal strings +console.log( chalk.blue('Hello'), 'World' + chalk.red('!') ); + +// compose multiple styles using the chainable API +console.log( chalk.blue.bgRed.bold('Hello world!') ); + +// nest styles +console.log( chalk.red('Hello', chalk.underline.bgBlue('world') + '!') ); + +// pass in multiple arguments +console.log( chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz') ); +``` + +You can easily define your own themes. + +```js +var chalk = require('chalk'); +var error = chalk.bold.red; +console.log(error('Error!')); +``` + + +## API + +### chalk.` + + +

        JSON Lint

        +

        A pure JavaScript version of the service provided at jsonlint.com.

        + +

        + + +

        +

        Results

        +
        
        +  

        project on github

        + + diff --git a/html/RentForCamp/node_modules/jsonlint/web/jsonlint.js b/html/RentForCamp/node_modules/jsonlint/web/jsonlint.js new file mode 100644 index 0000000..f34759e --- /dev/null +++ b/html/RentForCamp/node_modules/jsonlint/web/jsonlint.js @@ -0,0 +1 @@ +var jsonlint=function(){var a=!0,b=!1,c={},d=function(){var a={trace:function(){},yy:{},symbols_:{error:2,JSONString:3,STRING:4,JSONNumber:5,NUMBER:6,JSONNullLiteral:7,NULL:8,JSONBooleanLiteral:9,TRUE:10,FALSE:11,JSONText:12,JSONValue:13,EOF:14,JSONObject:15,JSONArray:16,"{":17,"}":18,JSONMemberList:19,JSONMember:20,":":21,",":22,"[":23,"]":24,JSONElementList:25,$accept:0,$end:1},terminals_:{2:"error",4:"STRING",6:"NUMBER",8:"NULL",10:"TRUE",11:"FALSE",14:"EOF",17:"{",18:"}",21:":",22:",",23:"[",24:"]"},productions_:[0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]],performAction:function(b,c,d,e,f,g,h){var i=g.length-1;switch(f){case 1:this.$=b.replace(/\\(\\|")/g,"$1").replace(/\\n/g,"\n").replace(/\\r/g,"\r").replace(/\\t/g," ").replace(/\\v/g," ").replace(/\\f/g,"\f").replace(/\\b/g,"\b");break;case 2:this.$=Number(b);break;case 3:this.$=null;break;case 4:this.$=!0;break;case 5:this.$=!1;break;case 6:return this.$=g[i-1];case 13:this.$={};break;case 14:this.$=g[i-1];break;case 15:this.$=[g[i-2],g[i]];break;case 16:this.$={},this.$[g[i][0]]=g[i][1];break;case 17:this.$=g[i-2],g[i-2][g[i][0]]=g[i][1];break;case 18:this.$=[];break;case 19:this.$=g[i-1];break;case 20:this.$=[g[i]];break;case 21:this.$=g[i-2],g[i-2].push(g[i])}},table:[{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],12:1,13:2,15:7,16:8,17:[1,14],23:[1,15]},{1:[3]},{14:[1,16]},{14:[2,7],18:[2,7],22:[2,7],24:[2,7]},{14:[2,8],18:[2,8],22:[2,8],24:[2,8]},{14:[2,9],18:[2,9],22:[2,9],24:[2,9]},{14:[2,10],18:[2,10],22:[2,10],24:[2,10]},{14:[2,11],18:[2,11],22:[2,11],24:[2,11]},{14:[2,12],18:[2,12],22:[2,12],24:[2,12]},{14:[2,3],18:[2,3],22:[2,3],24:[2,3]},{14:[2,4],18:[2,4],22:[2,4],24:[2,4]},{14:[2,5],18:[2,5],22:[2,5],24:[2,5]},{14:[2,1],18:[2,1],21:[2,1],22:[2,1],24:[2,1]},{14:[2,2],18:[2,2],22:[2,2],24:[2,2]},{3:20,4:[1,12],18:[1,17],19:18,20:19},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:23,15:7,16:8,17:[1,14],23:[1,15],24:[1,21],25:22},{1:[2,6]},{14:[2,13],18:[2,13],22:[2,13],24:[2,13]},{18:[1,24],22:[1,25]},{18:[2,16],22:[2,16]},{21:[1,26]},{14:[2,18],18:[2,18],22:[2,18],24:[2,18]},{22:[1,28],24:[1,27]},{22:[2,20],24:[2,20]},{14:[2,14],18:[2,14],22:[2,14],24:[2,14]},{3:20,4:[1,12],20:29},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:30,15:7,16:8,17:[1,14],23:[1,15]},{14:[2,19],18:[2,19],22:[2,19],24:[2,19]},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:31,15:7,16:8,17:[1,14],23:[1,15]},{18:[2,17],22:[2,17]},{18:[2,15],22:[2,15]},{22:[2,21],24:[2,21]}],defaultActions:{16:[2,6]},parseError:function(b,c){throw new Error(b)},parse:function(b){function o(a){d.length=d.length-2*a,e.length=e.length-a,f.length=f.length-a}function p(){var a;return a=c.lexer.lex()||1,typeof a!="number"&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0,l=2,m=1;this.lexer.setInput(b),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,typeof this.lexer.yylloc=="undefined"&&(this.lexer.yylloc={});var n=this.lexer.yylloc;f.push(n),typeof this.yy.parseError=="function"&&(this.parseError=this.yy.parseError);var q,r,s,t,u,v,w={},x,y,z,A;for(;;){s=d[d.length-1],this.defaultActions[s]?t=this.defaultActions[s]:(q==null&&(q=p()),t=g[s]&&g[s][q]);if(typeof t=="undefined"||!t.length||!t[0]){if(!k){A=[];for(x in g[s])this.terminals_[x]&&x>2&&A.push("'"+this.terminals_[x]+"'");var B="";this.lexer.showPosition?B="Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+A.join(", ")+", got '"+this.terminals_[q]+"'":B="Parse error on line "+(i+1)+": Unexpected "+(q==1?"end of input":"'"+(this.terminals_[q]||q)+"'"),this.parseError(B,{text:this.lexer.match,token:this.terminals_[q]||q,line:this.lexer.yylineno,loc:n,expected:A})}if(k==3){if(q==m)throw new Error(B||"Parsing halted.");j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,n=this.lexer.yylloc,q=p()}for(;;){if(l.toString()in g[s])break;if(s==0)throw new Error(B||"Parsing halted.");o(1),s=d[d.length-1]}r=q,q=l,s=d[d.length-1],t=g[s]&&g[s][l],k=3}if(t[0]instanceof Array&&t.length>1)throw new Error("Parse Error: multiple actions possible at state: "+s+", token: "+q);switch(t[0]){case 1:d.push(q),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(t[1]),q=null,r?(q=r,r=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,n=this.lexer.yylloc,k>0&&k--);break;case 2:y=this.productions_[t[1]][1],w.$=e[e.length-y],w._$={first_line:f[f.length-(y||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(y||1)].first_column,last_column:f[f.length-1].last_column},v=this.performAction.call(w,h,j,i,this.yy,t[1],e,f);if(typeof v!="undefined")return v;y&&(d=d.slice(0,-1*y*2),e=e.slice(0,-1*y),f=f.slice(0,-1*y)),d.push(this.productions_[t[1]][0]),e.push(w.$),f.push(w._$),z=g[d[d.length-2]][d[d.length-1]],d.push(z);break;case 3:return!0}}return!0}},b=function(){var a={EOF:1,parseError:function(b,c){if(!this.yy.parseError)throw new Error(b);this.yy.parseError(b,c)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.match+=a,this.matched+=a;var b=a.match(/\n/);return b&&this.yylineno++,this._input=this._input.slice(1),a},unput:function(a){return this._input=a+this._input,this},more:function(){return this._more=!0,this},less:function(a){this._input=this.match.slice(a)+this._input},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=(new Array(a.length+1)).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e,f;this._more||(this.yytext="",this.match="");var g=this._currentRules();for(var h=0;hb[0].length)){b=c,d=h;if(!this.options.flex)break}}if(b){f=b[0].match(/\n.*/g),f&&(this.yylineno+=f.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:f?f[f.length-1].length-1:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.yyleng=this.yytext.length,this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,g[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1);if(a)return a;return}if(this._input==="")return this.EOF;this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var b=this.next();return typeof b!="undefined"?b:this.lex()},begin:function(b){this.conditionStack.push(b)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(b){this.begin(b)}};return a.options={},a.performAction=function(b,c,d,e){var f=e;switch(d){case 0:break;case 1:return 6;case 2:return c.yytext=c.yytext.substr(1,c.yyleng-2),4;case 3:return 17;case 4:return 18;case 5:return 23;case 6:return 24;case 7:return 22;case 8:return 21;case 9:return 10;case 10:return 11;case 11:return 8;case 12:return 14;case 13:return"INVALID"}},a.rules=[/^(?:\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/,/^(?:"(?:\\[\\"bfnrt/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/,/^(?:\{)/,/^(?:\})/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?::)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:null\b)/,/^(?:$)/,/^(?:.)/],a.conditions={INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],inclusive:!0}},a}();return a.lexer=b,a}();return typeof a!="undefined"&&typeof c!="undefined"&&(c.parser=d,c.parse=function(){return d.parse.apply(d,arguments)},c.main=function(d){if(!d[1])throw new Error("Usage: "+d[0]+" FILE");if(typeof process!="undefined")var e=a("fs").readFileSync(a("path").join(process.cwd(),d[1]),"utf8");else var f=a("file").path(a("file").cwd()),e=f.join(d[1]).read({charset:"utf-8"});return c.parser.parse(e)},typeof b!="undefined"&&a.main===b&&c.main(typeof process!="undefined"?process.argv.slice(1):a("system").args)),c}(); \ No newline at end of file diff --git a/html/RentForCamp/node_modules/mysql/Changes.md b/html/RentForCamp/node_modules/mysql/Changes.md new file mode 100644 index 0000000..ba51bb7 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/Changes.md @@ -0,0 +1,536 @@ +# Changes + +This file is a manually maintained list of changes for each release. Feel free +to add your changes here when sending pull requests. Also send corrections if +you spot any mistakes. + +## v2.16.0 (2018-07-17) + +* Add Amazon RDS GovCloud SSL certificates #1876 +* Add new error codes up to MySQL 5.7.21 +* Include connection ID in debug output +* Support Node.js 9.x +* Support Node.js 10.x #2003 #2024 #2026 #2034 +* Update Amazon RDS SSL certificates +* Update `bignumber.js` to 4.1.0 +* Update `readable-stream` to 2.3.6 +* Update `sqlstring` to 2.3.1 + - Fix incorrectly replacing non-placeholders in SQL + +## v2.15.0 (2017-10-05) + +* Add new Amazon RDS ca-central-1 certificate CA to Amazon RDS SSL profile #1809 +* Add new error codes up to MySQL 5.7.19 +* Add `mysql.raw()` to generate pre-escaped values #877 #1821 +* Fix "changedRows" to work on non-English servers #1819 +* Fix error when server sends RST on `QUIT` #1811 +* Fix typo in insecure auth error message +* Support `mysql_native_password` auth switch request for Azure #1396 #1729 #1730 +* Update `sqlstring` to 2.3.0 + - Add `.toSqlString()` escape overriding + - Small performance improvement on `escapeId` +* Update `bignumber.js` to 4.0.4 + +## v2.14.1 (2017-08-01) + +* Fix holding first closure for lifetime of connection #1785 + +## v2.14.0 (2017-07-25) + +* Add new Amazon RDS ap-south-1 certificate CA to Amazon RDS SSL profile #1780 +* Add new Amazon RDS eu-west-2 certificate CA to Amazon RDS SSL profile #1770 +* Add `sql` property to query `Error` objects #1462 #1628 #1629 +* Add `sqlMessage` property to `Error` objects #1714 +* Fix the MySQL 5.7.17 error codes +* Support Node.js 8.x +* Update `bignumber.js` to 4.0.2 +* Update `readable-stream` to 2.3.3 +* Use `safe-buffer` for improved Buffer API + +## v2.13.0 (2017-01-24) + +* Accept regular expression as pool cluster pattern #1572 +* Accept wildcard anywhere in pool cluster pattern #1570 +* Add `acquire` and `release` events to `Pool` for tracking #1366 #1449 #1528 #1625 +* Add new error codes up to MySQL 5.7.17 +* Fix edge cases when determing Query result packets #1547 +* Fix memory leak when using long-running domains #1619 #1620 +* Remove unnecessary buffer copies when receiving large packets +* Update `bignumber.js` to 3.1.2 +* Use a simple buffer list to improve performance #566 #1590 + +## v2.12.0 (2016-11-02) + +* Accept array of type names to `dateStrings` option #605 #1481 +* Add `query` method to `PoolNamespace` #1256 #1505 #1506 + - Used as `cluster.of(...).query(...)` +* Add new error codes up to MySQL 5.7.16 +* Fix edge cases writing certain length coded values +* Fix typo in `HANDSHAKE_NO_SSL_SUPPORT` error message #1534 +* Support Node.js 7.x +* Update `bignumber.js` to 2.4.0 +* Update `sqlstring` to 2.2.0 + - Accept numbers and other value types in `escapeId` + - Escape invalid `Date` objects as `NULL` + - Run `buffer.toString()` through escaping + +## v2.11.1 (2016-06-07) + +* Fix writing truncated packets starting with large string/buffer #1438 + +## v2.11.0 (2016-06-06) + +* Add `POOL_CLOSED` code to "Pool is closed." error +* Add `POOL_CONNLIMIT` code to "No connections available." error #1332 +* Bind underlying connections in pool to same domain as pool #1242 +* Bind underlying socket to same domain as connection #1243 +* Fix allocation errors receiving many result rows #918 #1265 #1324 #1415 +* Fix edge cases constructing long stack traces #1387 +* Fix handshake inactivity timeout on Node.js v4.2.0 #1223 #1236 #1239 #1240 #1241 #1252 +* Fix Query stream to emit close after ending #1349 #1350 +* Fix type cast for BIGINT columns when number is negative #1376 +* Performance improvements for array/object escaping in SqlString #1331 +* Performance improvements for formatting in SqlString #1431 +* Performance improvements for string escaping in SqlString #1390 +* Performance improvements for writing packets to network +* Support Node.js 6.x +* Update `bignumber.js` to 2.3.0 +* Update `readable-stream` to 1.1.14 +* Use the `sqlstring` module for SQL escaping and formatting + +## v2.10.2 (2016-01-12) + +* Fix exception/hang from certain SSL connection errors #1153 +* Update `bignumber.js` to 2.1.4 + +## v2.10.1 (2016-01-11) + +* Add new Amazon RDS ap-northeast-2 certificate CA to Amazon RDS SSL profile #1329 + +## v2.10.0 (2015-12-15) + +* Add new error codes up to MySQL 5.7.9 #1294 +* Add new JSON type constant #1295 +* Add types for fractional seconds support +* Fix `connection.destroy()` on pool connection creating sequences #1291 +* Fix error code 139 `HA_ERR_TO_BIG_ROW` to be `HA_ERR_TOO_BIG_ROW` +* Fix error when call site error is missing stack #1179 +* Fix reading password from MySQL URL that has bare colon #1278 +* Handle MySQL servers not closing TCP connection after QUIT -> OK exchange #1277 +* Minor SqlString Date to string performance improvement #1233 +* Support Node.js 4.x +* Support Node.js 5.x +* Update `bignumber.js` to 2.1.2 + +## v2.9.0 (2015-08-19) + +* Accept the `ciphers` property in connection `ssl` option #1185 +* Fix bad timezone conversion from `Date` to string for certain times #1045 #1155 + +## v2.8.0 (2015-07-13) + +* Add `connect` event to `Connection` #1129 +* Default `timeout` for `connection.end` to 30 seconds #1057 +* Fix a sync callback when sequence enqueue fails #1147 +* Provide static require analysis +* Re-use connection from pool after `conn.changeUser` is used #837 #1088 + +## v2.7.0 (2015-05-27) + +* Destroy/end connections removed from the pool on error +* Delay implied connect until after `.query` argument validation +* Do not remove connections with non-fatal errors from the pool +* Error early if `callback` argument to `.query` is not a function #1060 +* Lazy-load modules from many entry point; reduced memory use + +## v2.6.2 (2015-04-14) + +* Fix `Connection.createQuery` for no SQL #1058 +* Update `bignumber.js` to 2.0.7 + +## v2.6.1 (2015-03-26) + +* Update `bignumber.js` to 2.0.5 #1037 #1038 + +## v2.6.0 (2015-03-24) + +* Add `poolCluster.remove` to remove pools from the cluster #1006 #1007 +* Add optional callback to `poolCluster.end` +* Add `restoreNodeTimeout` option to `PoolCluster` #880 #906 +* Fix LOAD DATA INFILE handling in multiple statements #1036 +* Fix `poolCluster.add` to throw if `PoolCluster` has been closed +* Fix `poolCluster.add` to throw if `id` already defined +* Fix un-catchable error from `PoolCluster` when MySQL server offline #1033 +* Improve speed formatting SQL #1019 +* Support io.js + +## v2.5.5 (2015-02-23) + +* Store SSL presets in JS instead of JSON #959 +* Support Node.js 0.12 +* Update Amazon RDS SSL certificates #1001 + +## v2.5.4 (2014-12-16) + +* Fix error if falsy error thrown in callback handler #960 +* Fix various error code strings #954 + +## v2.5.3 (2014-11-06) + +* Fix `pool.query` streaming interface not emitting connection errors #941 + +## v2.5.2 (2014-10-10) + +* Fix receiving large text fields #922 + +## v2.5.1 (2014-09-22) + +* Fix `pool.end` race conditions #915 +* Fix `pool.getConnection` race conditions + +## v2.5.0 (2014-09-07) + +* Add code `POOL_ENQUEUELIMIT` to error reaching `queueLimit` +* Add `enqueue` event to pool #716 +* Add `enqueue` event to protocol and connection #381 +* Blacklist unsupported connection flags #881 +* Make only column names enumerable in `RowDataPacket` #549 #895 +* Support Node.js 0.6 #718 + +## v2.4.3 (2014-08-25) + +* Fix `pool.query` to use `typeCast` configuration + +## v2.4.2 (2014-08-03) + +* Fix incorrect sequence packet errors to be catchable #867 +* Fix stray protocol packet errors to be catchable #867 +* Fix timing of fatal protocol errors bubbling to user #879 + +## v2.4.1 (2014-07-17) + +* Fix `pool.query` not invoking callback on connection error #872 + +## v2.4.0 (2014-07-13) + +* Add code `POOL_NOEXIST` in PoolCluster error #846 +* Add `acquireTimeout` pool option to specify a timeout for acquiring a connection #821 #854 +* Add `connection.escapeId` +* Add `pool.escapeId` +* Add `timeout` option to all sequences #855 #863 +* Default `connectTimeout` to 10 seconds +* Fix domain binding with `conn.connect` +* Fix `packet.default` to actually be a string +* Fix `PARSER_*` errors to be catchable +* Fix `PROTOCOL_PACKETS_OUT_OF_ORDER` error to be catchable #844 +* Include packets that failed parsing under `debug` +* Return `Query` object from `pool.query` like `conn.query` #830 +* Use `EventEmitter.listenerCount` when possible for faster counting + +## v2.3.2 (2014-05-29) + +* Fix pool leaking connections after `conn.changeUser` #833 + +## v2.3.1 (2014-05-26) + +* Add database errors to error constants +* Add global errors to error constants +* Throw when calling `conn.release` multiple times #824 #827 +* Update known error codes + +## v2.3.0 (2014-05-16) + +* Accept MySQL charset (like `UTF8` or `UTF8MB4`) in `charset` option #808 +* Accept pool options in connection string to `mysql.createPool` #811 +* Clone connection config for new pool connections +* Default `connectTimeout` to 2 minutes +* Reject unauthorized SSL connections (use `ssl.rejectUnauthorized` to override) #816 +* Return last error when PoolCluster exhausts connection retries #818 +* Remove connection from pool after `conn.changeUser` is released #806 +* Throw on unknown SSL profile name #817 +* User newer TLS functions when available #809 + +## v2.2.0 (2014-04-27) + +* Use indexOf instead of for loops removing conn from pool #611 +* Make callback to `pool.query` optional like `conn.query` #585 +* Prevent enqueuing sequences after fatal error #400 +* Fix geometry parser for empty fields #742 +* Accept lower-case charset option +* Throw on unknown charset option #789 +* Update known charsets +* Remove console.warn from PoolCluster #744 +* Fix `pool.end` to handle queued connections #797 +* Fix `pool.releaseConnection` to keep connection queue flowing #797 +* Fix SSL handshake error to be catchable #800 +* Add `connection.threadId` to get MySQL connection ID #602 +* Ensure `pool.getConnection` retrieves good connections #434 #557 #778 +* Fix pool cluster wildcard matching #627 +* Pass query values through to `SqlString.format` #590 + +## v2.1.1 (2014-03-13) + +* fix authentication w/password failure for node.js 0.10.5 #746 #752 +* fix authentication w/password TypeError exception for node.js 0.10.0-0.10.4 #747 +* fix specifying `values` in `conn.query({...}).on(...)` pattern #755 +* fix long stack trace to include the `pool.query(...)` call #715 + +## v2.1.0 (2014-02-20) + +* crypto.createHash fix for node.js < 11 #735 +* Add `connectTimeout` option to specify a timeout for establishing a connection #726 +* SSL support #481 + +## v2.0.1 + +* internal parser speed improvement #702 +* domains support +* 'trace' connection option to control if long stack traces are generated #713 #710 #439 + +## v2.0.0 (2014-01-09) + +* stream improvements: + - node 0.8 support #692 + - Emit 'close' events from query streams #688 +* encoding fix in streaming LOAD DATA LOCAL INFILE #670 +* Doc improvements + +## v2.0.0-rc2 (2013-12-07) + +* Streaming LOAD DATA LOCAL INFILE #668 +* Doc improvements + +## v2.0.0-rc1 (2013-11-30) + +* Transaction support +* Expose SqlString.format as mysql.format() +* Many bug fixes +* Better support for dates in local time zone +* Doc improvements + +## v2.0.0-alpha9 (2013-08-27) + +* Add query to pool to execute queries directly using the pool +* Add `sqlState` property to `Error` objects #556 +* Pool option to set queue limit +* Pool sends 'connection' event when it opens a new connection +* Added stringifyObjects option to treat input as strings rather than objects (#501) +* Support for poolClusters +* Datetime improvements +* Bug fixes + +## v2.0.0-alpha8 (2013-04-30) + +* Switch to old mode for Streams 2 (Node.js v 0.10.x) +* Add stream method to Query Wraps events from the query object into a node v0.10.x Readable stream +* DECIMAL should also be treated as big number +* Removed slow unnecessary stack access +* Added charsets +* Added bigNumberStrings option for forcing BIGINT columns as strings +* Changes date parsing to return String if not a valid JS Date +* Adds support for ?? escape sequence to escape identifiers +* Changes Auth.token() to force password to be in binary, not utf8 (#378) +* Restrict debugging by packet types +* Add 'multipleStatements' option tracking to ConnectionConfig. Fixes GH-408 +* Changes Pool to handle 'error' events and dispose connection +* Allows db.query({ sql: "..." }, [ val1, ... ], cb); (#390) +* Improved documentation +* Bug fixes + +## v2.0.0-alpha7 (2013-02-03) + +* Add connection pooling (#351) + +## v2.0.0-alpha6 (2013-01-31) + +* Add supportBigNumbers option (#381, #382) +* Accept prebuilt Query object in connection.query +* Bug fixes + +## v2.0.0-alpha5 (2012-12-03) + +* Add mysql.escapeId to escape identifiers (closes #342) +* Allow custom escaping mode (config.queryFormat) +* Convert DATE columns to configured timezone instead of UTC (#332) +* Convert LONGLONG and NEWDECIMAL to numbers (#333) +* Fix Connection.escape() (fixes #330) +* Changed Readme ambiguity about custom type cast fallback +* Change typeCast to receive Connection instead of Connection.config.timezone +* Fix drain event having useless err parameter +* Add Connection.statistics() back from v0.9 +* Add Connection.ping() back from v0.9 + +## v2.0.0-alpha4 (2012-10-03) + +* Fix some OOB errors on resume() +* Fix quick pause() / resume() usage +* Properly parse host denied / similar errors +* Add Connection.ChangeUser functionality +* Make sure changeUser errors are fatal +* Enable formatting nested arrays for bulk inserts +* Add Connection.escape functionality +* Renamed 'close' to 'end' event +* Return parsed object instead of Buffer for GEOMETRY types +* Allow nestTables inline (using a string instead of a boolean) +* Check for ZEROFILL_FLAG and format number accordingly +* Add timezone support (default: local) +* Add custom typeCast functionality +* Export mysql column types +* Add connection flags functionality (#237) +* Exports drain event when queue finishes processing (#272, #271, #306) + +## v2.0.0-alpha3 (2012-06-12) + +* Implement support for `LOAD DATA LOCAL INFILE` queries (#182). +* Support OLD\_PASSWORD() accounts like 0.9.x did. You should still upgrade any + user accounts in your your MySQL user table that has short (16 byte) Password + values. Connecting to those accounts is not secure. (#204) +* Ignore function values when escaping objects, allows to use RowDataPacket + objects as query arguments. (Alex Gorbatchev, #213) +* Handle initial error packets from server such as `ER_HOST_NOT_PRIVILEGED`. +* Treat `utf8\_bin` as a String, not Buffer. (#214) +* Handle empty strings in first row column value. (#222) +* Honor Connection#nestTables setting for queries. (#221) +* Remove `CLIENT_INTERACTIVE` flag from config. Improves #225. +* Improve docs for connections settings. +* Implement url string support for Connection configs. + +## v2.0.0-alpha2 (2012-05-31) + +* Specify escaping before for NaN / Infinity (they are as unquoted constants). +* Support for unix domain socket connections (use: {socketPath: '...'}). +* Fix type casting for NULL values for Date/Number fields +* Add `fields` argument to `query()` as well as `'fields'` event. This is + similar to what was available in 0.9.x. +* Support connecting to the sphinx searchd daemon as well as MariaDB (#199). +* Implement long stack trace support, will be removed / disabled if the node + core ever supports it natively. +* Implement `nestTables` option for queries, allows fetching JOIN result sets + with overlapping column names. +* Fix ? placeholder mechanism for values containing '?' characters (#205). +* Detect when `connect()` is called more than once on a connection and provide + the user with a good error message for it (#204). +* Switch to `UTF8_GENERAL_CI` (previously `UTF8_UNICODE_CI`) as the default + charset for all connections to avoid strange MySQL performance issues (#200), + and also make the charset user configurable. +* Fix BLOB type casting for `TINY_BLOB`, `MEDIUM_BLOB` and `LONG_BLOB`. +* Add support for sending and receiving large (> 16 MB) packets. + +## v2.0.0-alpha (2012-05-15) + +This release is a rewrite. You should carefully test your application after +upgrading to avoid problems. This release features many improvements, most +importantly: + +* ~5x faster than v0.9.x for parsing query results +* Support for pause() / resume() (for streaming rows) +* Support for multiple statement queries +* Support for stored procedures +* Support for transactions +* Support for binary columns (as blobs) +* Consistent & well documented error handling +* A new Connection class that has well defined semantics (unlike the old Client class). +* Convenient escaping of objects / arrays that allows for simpler query construction +* A significantly simpler code base +* Many bug fixes & other small improvements (Closed 62 out of 66 GitHub issues) + +Below are a few notes on the upgrade process itself: + +The first thing you will run into is that the old `Client` class is gone and +has been replaced with a less ambitious `Connection` class. So instead of +`mysql.createClient()`, you now have to: + +```js +var mysql = require('mysql'); +var connection = mysql.createConnection({ + host : 'localhost', + user : 'me', + password : 'secret', +}); + +connection.query('SELECT 1', function(err, rows) { + if (err) throw err; + + console.log('Query result: ', rows); +}); + +connection.end(); +``` + +The new `Connection` class does not try to handle re-connects, please study the +`Server disconnects` section in the new Readme. + +Other than that, the interface has stayed very similar. Here are a few things +to check out so: + +* BIGINT's are now cast into strings +* Binary data is now cast to buffers +* The `'row'` event on the `Query` object is now called `'result'` and will + also be emitted for queries that produce an OK/Error response. +* Error handling is consistently defined now, check the Readme +* Escaping has become more powerful which may break your code if you are + currently using objects to fill query placeholders. +* Connections can now be established explicitly again, so you may wish to do so + if you want to handle connection errors specifically. + +That should be most of it, if you run into anything else, please send a patch +or open an issue to improve this document. + +## v0.9.6 (2012-03-12) + +* Escape array values so they produce sql arrays (Roger Castells, Colin Smith) +* docs: mention mysql transaction stop gap solution (Blake Miner) +* docs: Mention affectedRows in FAQ (Michael Baldwin) + +## v0.9.5 (2011-11-26) + +* Fix #142 Driver stalls upon reconnect attempt that's immediately closed +* Add travis build +* Switch to urun as a test runner +* Switch to utest for unit tests +* Remove fast-or-slow dependency for tests +* Split integration tests into individual files again + +## v0.9.4 (2011-08-31) + +* Expose package.json as `mysql.PACKAGE` (#104) + +## v0.9.3 (2011-08-22) + +* Set default `client.user` to root +* Fix #91: Client#format should not mutate params array +* Fix #94: TypeError in client.js +* Parse decimals as string (vadimg) + +## v0.9.2 (2011-08-07) + +* The underlaying socket connection is now managed implicitly rather than explicitly. +* Check the [upgrading guide][] for a full list of changes. + +## v0.9.1 (2011-02-20) + +* Fix issue #49 / `client.escape()` throwing exceptions on objects. (Nick Payne) +* Drop < v0.4.x compatibility. From now on you need node v0.4.x to use this module. + +## Older releases + +These releases were done before maintaining this file: + +* [v0.9.0](https://github.com/mysqljs/mysql/compare/v0.8.0...v0.9.0) + (2011-01-04) +* [v0.8.0](https://github.com/mysqljs/mysql/compare/v0.7.0...v0.8.0) + (2010-10-30) +* [v0.7.0](https://github.com/mysqljs/mysql/compare/v0.6.0...v0.7.0) + (2010-10-14) +* [v0.6.0](https://github.com/mysqljs/mysql/compare/v0.5.0...v0.6.0) + (2010-09-28) +* [v0.5.0](https://github.com/mysqljs/mysql/compare/v0.4.0...v0.5.0) + (2010-09-17) +* [v0.4.0](https://github.com/mysqljs/mysql/compare/v0.3.0...v0.4.0) + (2010-09-02) +* [v0.3.0](https://github.com/mysqljs/mysql/compare/v0.2.0...v0.3.0) + (2010-08-25) +* [v0.2.0](https://github.com/mysqljs/mysql/compare/v0.1.0...v0.2.0) + (2010-08-22) +* [v0.1.0](https://github.com/mysqljs/mysql/commits/v0.1.0) + (2010-08-22) diff --git a/html/RentForCamp/node_modules/mysql/License b/html/RentForCamp/node_modules/mysql/License new file mode 100644 index 0000000..c7ff12a --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/License @@ -0,0 +1,19 @@ +Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and 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. diff --git a/html/RentForCamp/node_modules/mysql/Readme.md b/html/RentForCamp/node_modules/mysql/Readme.md new file mode 100644 index 0000000..5af3ed2 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/Readme.md @@ -0,0 +1,1504 @@ +# mysql + +[![NPM Version][npm-image]][npm-url] +[![NPM Downloads][downloads-image]][downloads-url] +[![Node.js Version][node-version-image]][node-version-url] +[![Linux Build][travis-image]][travis-url] +[![Windows Build][appveyor-image]][appveyor-url] +[![Test Coverage][coveralls-image]][coveralls-url] + +## Table of Contents + +- [Install](#install) +- [Introduction](#introduction) +- [Contributors](#contributors) +- [Sponsors](#sponsors) +- [Community](#community) +- [Establishing connections](#establishing-connections) +- [Connection options](#connection-options) +- [SSL options](#ssl-options) +- [Terminating connections](#terminating-connections) +- [Pooling connections](#pooling-connections) +- [Pool options](#pool-options) +- [Pool events](#pool-events) +- [Closing all the connections in a pool](#closing-all-the-connections-in-a-pool) +- [PoolCluster](#poolcluster) +- [PoolCluster options](#poolcluster-options) +- [Switching users and altering connection state](#switching-users-and-altering-connection-state) +- [Server disconnects](#server-disconnects) +- [Performing queries](#performing-queries) +- [Escaping query values](#escaping-query-values) +- [Escaping query identifiers](#escaping-query-identifiers) +- [Preparing Queries](#preparing-queries) +- [Custom format](#custom-format) +- [Getting the id of an inserted row](#getting-the-id-of-an-inserted-row) +- [Getting the number of affected rows](#getting-the-number-of-affected-rows) +- [Getting the number of changed rows](#getting-the-number-of-changed-rows) +- [Getting the connection ID](#getting-the-connection-id) +- [Executing queries in parallel](#executing-queries-in-parallel) +- [Streaming query rows](#streaming-query-rows) +- [Piping results with Streams](#piping-results-with-streams) +- [Multiple statement queries](#multiple-statement-queries) +- [Stored procedures](#stored-procedures) +- [Joins with overlapping column names](#joins-with-overlapping-column-names) +- [Transactions](#transactions) +- [Ping](#ping) +- [Timeouts](#timeouts) +- [Error handling](#error-handling) +- [Exception Safety](#exception-safety) +- [Type casting](#type-casting) +- [Connection Flags](#connection-flags) +- [Debugging and reporting problems](#debugging-and-reporting-problems) +- [Security issues](#security-issues) +- [Contributing](#contributing) +- [Running tests](#running-tests) +- [Todo](#todo) + +## Install + +This is a [Node.js](https://nodejs.org/en/) module available through the +[npm registry](https://www.npmjs.com/). + +Before installing, [download and install Node.js](https://nodejs.org/en/download/). +Node.js 0.6 or higher is required. + +Installation is done using the +[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): + +```sh +$ npm install mysql +``` + +For information about the previous 0.9.x releases, visit the [v0.9 branch][]. + +Sometimes I may also ask you to install the latest version from Github to check +if a bugfix is working. In this case, please do: + +```sh +$ npm install mysqljs/mysql +``` + +[v0.9 branch]: https://github.com/mysqljs/mysql/tree/v0.9 + +## Introduction + +This is a node.js driver for mysql. It is written in JavaScript, does not +require compiling, and is 100% MIT licensed. + +Here is an example on how to use it: + +```js +var mysql = require('mysql'); +var connection = mysql.createConnection({ + host : 'localhost', + user : 'me', + password : 'secret', + database : 'my_db' +}); + +connection.connect(); + +connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) { + if (error) throw error; + console.log('The solution is: ', results[0].solution); +}); + +connection.end(); +``` + +From this example, you can learn the following: + +* Every method you invoke on a connection is queued and executed in sequence. +* Closing the connection is done using `end()` which makes sure all remaining + queries are executed before sending a quit packet to the mysql server. + +## Contributors + +Thanks goes to the people who have contributed code to this module, see the +[GitHub Contributors page][]. + +[GitHub Contributors page]: https://github.com/mysqljs/mysql/graphs/contributors + +Additionally I'd like to thank the following people: + +* [Andrey Hristov][] (Oracle) - for helping me with protocol questions. +* [Ulf Wendel][] (Oracle) - for helping me with protocol questions. + +[Ulf Wendel]: http://blog.ulf-wendel.de/ +[Andrey Hristov]: http://andrey.hristov.com/ + +## Sponsors + +The following companies have supported this project financially, allowing me to +spend more time on it (ordered by time of contribution): + +* [Transloadit](http://transloadit.com) (my startup, we do file uploading & + video encoding as a service, check it out) +* [Joyent](http://www.joyent.com/) +* [pinkbike.com](http://pinkbike.com/) +* [Holiday Extras](http://www.holidayextras.co.uk/) (they are [hiring](http://join.holidayextras.co.uk/)) +* [Newscope](http://newscope.com/) (they are [hiring](https://newscope.com/unternehmen/jobs/)) + +## Community + +If you'd like to discuss this module, or ask questions about it, please use one +of the following: + +* **Mailing list**: https://groups.google.com/forum/#!forum/node-mysql +* **IRC Channel**: #node.js (on freenode.net, I pay attention to any message + including the term `mysql`) + +## Establishing connections + +The recommended way to establish a connection is this: + +```js +var mysql = require('mysql'); +var connection = mysql.createConnection({ + host : 'example.org', + user : 'bob', + password : 'secret' +}); + +connection.connect(function(err) { + if (err) { + console.error('error connecting: ' + err.stack); + return; + } + + console.log('connected as id ' + connection.threadId); +}); +``` + +However, a connection can also be implicitly established by invoking a query: + +```js +var mysql = require('mysql'); +var connection = mysql.createConnection(...); + +connection.query('SELECT 1', function (error, results, fields) { + if (error) throw error; + // connected! +}); +``` + +Depending on how you like to handle your errors, either method may be +appropriate. Any type of connection error (handshake or network) is considered +a fatal error, see the [Error Handling](#error-handling) section for more +information. + +## Connection options + +When establishing a connection, you can set the following options: + +* `host`: The hostname of the database you are connecting to. (Default: + `localhost`) +* `port`: The port number to connect to. (Default: `3306`) +* `localAddress`: The source IP address to use for TCP connection. (Optional) +* `socketPath`: The path to a unix domain socket to connect to. When used `host` + and `port` are ignored. +* `user`: The MySQL user to authenticate as. +* `password`: The password of that MySQL user. +* `database`: Name of the database to use for this connection (Optional). +* `charset`: The charset for the connection. This is called "collation" in the SQL-level + of MySQL (like `utf8_general_ci`). If a SQL-level charset is specified (like `utf8mb4`) + then the default collation for that charset is used. (Default: `'UTF8_GENERAL_CI'`) +* `timezone`: The timezone configured on the MySQL server. This is used to type cast server date/time values to JavaScript `Date` object and vice versa. This can be `'local'`, `'Z'`, or an offset in the form `+HH:MM` or `-HH:MM`. (Default: `'local'`) +* `connectTimeout`: The milliseconds before a timeout occurs during the initial connection + to the MySQL server. (Default: `10000`) +* `stringifyObjects`: Stringify objects instead of converting to values. See +issue [#501](https://github.com/mysqljs/mysql/issues/501). (Default: `false`) +* `insecureAuth`: Allow connecting to MySQL instances that ask for the old + (insecure) authentication method. (Default: `false`) +* `typeCast`: Determines if column values should be converted to native + JavaScript types. (Default: `true`) +* `queryFormat`: A custom query format function. See [Custom format](#custom-format). +* `supportBigNumbers`: When dealing with big numbers (BIGINT and DECIMAL columns) in the database, + you should enable this option (Default: `false`). +* `bigNumberStrings`: Enabling both `supportBigNumbers` and `bigNumberStrings` forces big numbers + (BIGINT and DECIMAL columns) to be always returned as JavaScript String objects (Default: `false`). + Enabling `supportBigNumbers` but leaving `bigNumberStrings` disabled will return big numbers as String + objects only when they cannot be accurately represented with [JavaScript Number objects] (http://ecma262-5.com/ELS5_HTML.htm#Section_8.5) + (which happens when they exceed the [-2^53, +2^53] range), otherwise they will be returned as + Number objects. This option is ignored if `supportBigNumbers` is disabled. +* `dateStrings`: Force date types (TIMESTAMP, DATETIME, DATE) to be returned as strings rather then + inflated into JavaScript Date objects. Can be `true`/`false` or an array of type names to keep as + strings. (Default: `false`) +* `debug`: Prints protocol details to stdout. Can be `true`/`false` or an array of packet type names + that should be printed. (Default: `false`) +* `trace`: Generates stack traces on `Error` to include call site of library + entrance ("long stack traces"). Slight performance penalty for most calls. + (Default: `true`) +* `multipleStatements`: Allow multiple mysql statements per query. Be careful + with this, it could increase the scope of SQL injection attacks. (Default: `false`) +* `flags`: List of connection flags to use other than the default ones. It is + also possible to blacklist default ones. For more information, check + [Connection Flags](#connection-flags). +* `ssl`: object with ssl parameters or a string containing name of ssl profile. See [SSL options](#ssl-options). + + +In addition to passing these options as an object, you can also use a url +string. For example: + +```js +var connection = mysql.createConnection('mysql://user:pass@host/db?debug=true&charset=BIG5_CHINESE_CI&timezone=-0700'); +``` + +Note: The query values are first attempted to be parsed as JSON, and if that +fails assumed to be plaintext strings. + +### SSL options + +The `ssl` option in the connection options takes a string or an object. When given a string, +it uses one of the predefined SSL profiles included. The following profiles are included: + +* `"Amazon RDS"`: this profile is for connecting to an Amazon RDS server and contains the + certificates from https://rds.amazonaws.com/doc/rds-ssl-ca-cert.pem and + https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem + +When connecting to other servers, you will need to provide an object of options, in the +same format as [tls.createSecureContext](https://nodejs.org/api/tls.html#tls_tls_createsecurecontext_options). +Please note the arguments expect a string of the certificate, not a file name to the +certificate. Here is a simple example: + +```js +var connection = mysql.createConnection({ + host : 'localhost', + ssl : { + ca : fs.readFileSync(__dirname + '/mysql-ca.crt') + } +}); +``` + +You can also connect to a MySQL server without properly providing the appropriate +CA to trust. _You should not do this_. + +```js +var connection = mysql.createConnection({ + host : 'localhost', + ssl : { + // DO NOT DO THIS + // set up your ca correctly to trust the connection + rejectUnauthorized: false + } +}); +``` + +## Terminating connections + +There are two ways to end a connection. Terminating a connection gracefully is +done by calling the `end()` method: + +```js +connection.end(function(err) { + // The connection is terminated now +}); +``` + +This will make sure all previously enqueued queries are still before sending a +`COM_QUIT` packet to the MySQL server. If a fatal error occurs before the +`COM_QUIT` packet can be sent, an `err` argument will be provided to the +callback, but the connection will be terminated regardless of that. + +An alternative way to end the connection is to call the `destroy()` method. +This will cause an immediate termination of the underlying socket. +Additionally `destroy()` guarantees that no more events or callbacks will be +triggered for the connection. + +```js +connection.destroy(); +``` + +Unlike `end()` the `destroy()` method does not take a callback argument. + +## Pooling connections + +Rather than creating and managing connections one-by-one, this module also +provides built-in connection pooling using `mysql.createPool(config)`. +[Read more about connection pooling](https://en.wikipedia.org/wiki/Connection_pool). + +Create a pool and use it directly: + +```js +var mysql = require('mysql'); +var pool = mysql.createPool({ + connectionLimit : 10, + host : 'example.org', + user : 'bob', + password : 'secret', + database : 'my_db' +}); + +pool.query('SELECT 1 + 1 AS solution', function (error, results, fields) { + if (error) throw error; + console.log('The solution is: ', results[0].solution); +}); +``` + +This is a shortcut for the `pool.getConnection()` -> `connection.query()` -> +`connection.release()` code flow. Using `pool.getConnection()` is useful to +share connection state for subsequent queries. This is because two calls to +`pool.query()` may use two different connections and run in parallel. This is +the basic structure: + +```js +var mysql = require('mysql'); +var pool = mysql.createPool(...); + +pool.getConnection(function(err, connection) { + if (err) throw err; // not connected! + + // Use the connection + connection.query('SELECT something FROM sometable', function (error, results, fields) { + // When done with the connection, release it. + connection.release(); + + // Handle error after the release. + if (error) throw error; + + // Don't use the connection here, it has been returned to the pool. + }); +}); +``` + +If you would like to close the connection and remove it from the pool, use +`connection.destroy()` instead. The pool will create a new connection the next +time one is needed. + +Connections are lazily created by the pool. If you configure the pool to allow +up to 100 connections, but only ever use 5 simultaneously, only 5 connections +will be made. Connections are also cycled round-robin style, with connections +being taken from the top of the pool and returning to the bottom. + +When a previous connection is retrieved from the pool, a ping packet is sent +to the server to check if the connection is still good. + +## Pool options + +Pools accept all the same [options as a connection](#connection-options). +When creating a new connection, the options are simply passed to the connection +constructor. In addition to those options pools accept a few extras: + +* `acquireTimeout`: The milliseconds before a timeout occurs during the connection + acquisition. This is slightly different from `connectTimeout`, because acquiring + a pool connection does not always involve making a connection. (Default: `10000`) +* `waitForConnections`: Determines the pool's action when no connections are + available and the limit has been reached. If `true`, the pool will queue the + connection request and call it when one becomes available. If `false`, the + pool will immediately call back with an error. (Default: `true`) +* `connectionLimit`: The maximum number of connections to create at once. + (Default: `10`) +* `queueLimit`: The maximum number of connection requests the pool will queue + before returning an error from `getConnection`. If set to `0`, there is no + limit to the number of queued connection requests. (Default: `0`) + +## Pool events + +### acquire + +The pool will emit an `acquire` event when a connection is acquired from the pool. +This is called after all acquiring activity has been performed on the connection, +right before the connection is handed to the callback of the acquiring code. + +```js +pool.on('acquire', function (connection) { + console.log('Connection %d acquired', connection.threadId); +}); +``` + +### connection + +The pool will emit a `connection` event when a new connection is made within the pool. +If you need to set session variables on the connection before it gets used, you can +listen to the `connection` event. + +```js +pool.on('connection', function (connection) { + connection.query('SET SESSION auto_increment_increment=1') +}); +``` + +### enqueue + +The pool will emit an `enqueue` event when a callback has been queued to wait for +an available connection. + +```js +pool.on('enqueue', function () { + console.log('Waiting for available connection slot'); +}); +``` + +### release + +The pool will emit a `release` event when a connection is released back to the +pool. This is called after all release activity has been performed on the connection, +so the connection will be listed as free at the time of the event. + +```js +pool.on('release', function (connection) { + console.log('Connection %d released', connection.threadId); +}); +``` + +## Closing all the connections in a pool + +When you are done using the pool, you have to end all the connections or the +Node.js event loop will stay active until the connections are closed by the +MySQL server. This is typically done if the pool is used in a script or when +trying to gracefully shutdown a server. To end all the connections in the +pool, use the `end` method on the pool: + +```js +pool.end(function (err) { + // all connections in the pool have ended +}); +``` + +The `end` method takes an _optional_ callback that you can use to know when +all the connections are ended. + +**Once `pool.end` is called, `pool.getConnection` and other operations +can no longer be performed.** Wait until all connections in the pool are +released before calling `pool.end`. If you use the shortcut method +`pool.query`, in place of `pool.getConnection` → `connection.query` → +`connection.release`, wait until it completes. + +`pool.end` calls `connection.end` on every active connection in the pool. +This queues a `QUIT` packet on the connection and sets a flag to prevent +`pool.getConnection` from creating new connections. All commands / queries +already in progress will complete, but new commands won't execute. + +## PoolCluster + +PoolCluster provides multiple hosts connection. (group & retry & selector) + +```js +// create +var poolCluster = mysql.createPoolCluster(); + +// add configurations (the config is a pool config object) +poolCluster.add(config); // add configuration with automatic name +poolCluster.add('MASTER', masterConfig); // add a named configuration +poolCluster.add('SLAVE1', slave1Config); +poolCluster.add('SLAVE2', slave2Config); + +// remove configurations +poolCluster.remove('SLAVE2'); // By nodeId +poolCluster.remove('SLAVE*'); // By target group : SLAVE1-2 + +// Target Group : ALL(anonymous, MASTER, SLAVE1-2), Selector : round-robin(default) +poolCluster.getConnection(function (err, connection) {}); + +// Target Group : MASTER, Selector : round-robin +poolCluster.getConnection('MASTER', function (err, connection) {}); + +// Target Group : SLAVE1-2, Selector : order +// If can't connect to SLAVE1, return SLAVE2. (remove SLAVE1 in the cluster) +poolCluster.on('remove', function (nodeId) { + console.log('REMOVED NODE : ' + nodeId); // nodeId = SLAVE1 +}); + +// A pattern can be passed with * as wildcard +poolCluster.getConnection('SLAVE*', 'ORDER', function (err, connection) {}); + +// The pattern can also be a regular expression +poolCluster.getConnection(/^SLAVE[12]$/, function (err, connection) {}); + +// of namespace : of(pattern, selector) +poolCluster.of('*').getConnection(function (err, connection) {}); + +var pool = poolCluster.of('SLAVE*', 'RANDOM'); +pool.getConnection(function (err, connection) {}); +pool.getConnection(function (err, connection) {}); +pool.query(function (error, results, fields) {}); + +// close all connections +poolCluster.end(function (err) { + // all connections in the pool cluster have ended +}); +``` + +### PoolCluster options + +* `canRetry`: If `true`, `PoolCluster` will attempt to reconnect when connection fails. (Default: `true`) +* `removeNodeErrorCount`: If connection fails, node's `errorCount` increases. + When `errorCount` is greater than `removeNodeErrorCount`, remove a node in the `PoolCluster`. (Default: `5`) +* `restoreNodeTimeout`: If connection fails, specifies the number of milliseconds + before another connection attempt will be made. If set to `0`, then node will be + removed instead and never re-used. (Default: `0`) +* `defaultSelector`: The default selector. (Default: `RR`) + * `RR`: Select one alternately. (Round-Robin) + * `RANDOM`: Select the node by random function. + * `ORDER`: Select the first node available unconditionally. + +```js +var clusterConfig = { + removeNodeErrorCount: 1, // Remove the node immediately when connection fails. + defaultSelector: 'ORDER' +}; + +var poolCluster = mysql.createPoolCluster(clusterConfig); +``` + +## Switching users and altering connection state + +MySQL offers a changeUser command that allows you to alter the current user and +other aspects of the connection without shutting down the underlying socket: + +```js +connection.changeUser({user : 'john'}, function(err) { + if (err) throw err; +}); +``` + +The available options for this feature are: + +* `user`: The name of the new user (defaults to the previous one). +* `password`: The password of the new user (defaults to the previous one). +* `charset`: The new charset (defaults to the previous one). +* `database`: The new database (defaults to the previous one). + +A sometimes useful side effect of this functionality is that this function also +resets any connection state (variables, transactions, etc.). + +Errors encountered during this operation are treated as fatal connection errors +by this module. + +## Server disconnects + +You may lose the connection to a MySQL server due to network problems, the +server timing you out, the server being restarted, or crashing. All of these +events are considered fatal errors, and will have the `err.code = +'PROTOCOL_CONNECTION_LOST'`. See the [Error Handling](#error-handling) section +for more information. + +Re-connecting a connection is done by establishing a new connection. Once +terminated, an existing connection object cannot be re-connected by design. + +With Pool, disconnected connections will be removed from the pool freeing up +space for a new connection to be created on the next getConnection call. + +## Performing queries + +The most basic way to perform a query is to call the `.query()` method on an object +(like a `Connection`, `Pool`, or `PoolNamespace` instance). + +The simplest form of .`query()` is `.query(sqlString, callback)`, where a SQL string +is the first argument and the second is a callback: + +```js +connection.query('SELECT * FROM `books` WHERE `author` = "David"', function (error, results, fields) { + // error will be an Error if one occurred during the query + // results will contain the results of the query + // fields will contain information about the returned results fields (if any) +}); +``` + +The second form `.query(sqlString, values, callback)` comes when using +placeholder values (see [escaping query values](#escaping-query-values)): + +```js +connection.query('SELECT * FROM `books` WHERE `author` = ?', ['David'], function (error, results, fields) { + // error will be an Error if one occurred during the query + // results will contain the results of the query + // fields will contain information about the returned results fields (if any) +}); +``` + +The third form `.query(options, callback)` comes when using various advanced +options on the query, like [escaping query values](#escaping-query-values), +[joins with overlapping column names](#joins-with-overlapping-column-names), +[timeouts](#timeout), and [type casting](#type-casting). + +```js +connection.query({ + sql: 'SELECT * FROM `books` WHERE `author` = ?', + timeout: 40000, // 40s + values: ['David'] +}, function (error, results, fields) { + // error will be an Error if one occurred during the query + // results will contain the results of the query + // fields will contain information about the returned results fields (if any) +}); +``` + +Note that a combination of the second and third forms can be used where the +placeholder values are passed as an argument and not in the options object. +The `values` argument will override the `values` in the option object. + +```js +connection.query({ + sql: 'SELECT * FROM `books` WHERE `author` = ?', + timeout: 40000, // 40s + }, + ['David'], + function (error, results, fields) { + // error will be an Error if one occurred during the query + // results will contain the results of the query + // fields will contain information about the returned results fields (if any) + } +); +``` + +If the query only has a single replacement character (`?`), and the value is +not `null`, `undefined`, or an array, it can be passed directly as the second +argument to `.query`: + +```js +connection.query( + 'SELECT * FROM `books` WHERE `author` = ?', + 'David', + function (error, results, fields) { + // error will be an Error if one occurred during the query + // results will contain the results of the query + // fields will contain information about the returned results fields (if any) + } +); +``` + +## Escaping query values + +**Caution** These methods of escaping values only works when the +[NO_BACKSLASH_ESCAPES](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_backslash_escapes) +SQL mode is disabled (which is the default state for MySQL servers). + +In order to avoid SQL Injection attacks, you should always escape any user +provided data before using it inside a SQL query. You can do so using the +`mysql.escape()`, `connection.escape()` or `pool.escape()` methods: + +```js +var userId = 'some user provided value'; +var sql = 'SELECT * FROM users WHERE id = ' + connection.escape(userId); +connection.query(sql, function (error, results, fields) { + if (error) throw error; + // ... +}); +``` + +Alternatively, you can use `?` characters as placeholders for values you would +like to have escaped like this: + +```js +connection.query('SELECT * FROM users WHERE id = ?', [userId], function (error, results, fields) { + if (error) throw error; + // ... +}); +``` + +Multiple placeholders are mapped to values in the same order as passed. For example, +in the following query `foo` equals `a`, `bar` equals `b`, `baz` equals `c`, and +`id` will be `userId`: + +```js +connection.query('UPDATE users SET foo = ?, bar = ?, baz = ? WHERE id = ?', ['a', 'b', 'c', userId], function (error, results, fields) { + if (error) throw error; + // ... +}); +``` + +This looks similar to prepared statements in MySQL, however it really just uses +the same `connection.escape()` method internally. + +**Caution** This also differs from prepared statements in that all `?` are +replaced, even those contained in comments and strings. + +Different value types are escaped differently, here is how: + +* Numbers are left untouched +* Booleans are converted to `true` / `false` +* Date objects are converted to `'YYYY-mm-dd HH:ii:ss'` strings +* Buffers are converted to hex strings, e.g. `X'0fa5'` +* Strings are safely escaped +* Arrays are turned into list, e.g. `['a', 'b']` turns into `'a', 'b'` +* Nested arrays are turned into grouped lists (for bulk inserts), e.g. `[['a', + 'b'], ['c', 'd']]` turns into `('a', 'b'), ('c', 'd')` +* Objects that have a `toSqlString` method will have `.toSqlString()` called + and the returned value is used as the raw SQL. +* Objects are turned into `key = 'val'` pairs for each enumerable property on + the object. If the property's value is a function, it is skipped; if the + property's value is an object, toString() is called on it and the returned + value is used. +* `undefined` / `null` are converted to `NULL` +* `NaN` / `Infinity` are left as-is. MySQL does not support these, and trying + to insert them as values will trigger MySQL errors until they implement + support. + +This escaping allows you to do neat things like this: + +```js +var post = {id: 1, title: 'Hello MySQL'}; +var query = connection.query('INSERT INTO posts SET ?', post, function (error, results, fields) { + if (error) throw error; + // Neat! +}); +console.log(query.sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL' +``` + +And the `toSqlString` method allows you to form complex queries with functions: + +```js +var CURRENT_TIMESTAMP = { toSqlString: function() { return 'CURRENT_TIMESTAMP()'; } }; +var sql = mysql.format('UPDATE posts SET modified = ? WHERE id = ?', [CURRENT_TIMESTAMP, 42]); +console.log(sql); // UPDATE posts SET modified = CURRENT_TIMESTAMP() WHERE id = 42 +``` + +To generate objects with a `toSqlString` method, the `mysql.raw()` method can +be used. This creates an object that will be left un-touched when using in a `?` +placeholder, useful for using functions as dynamic values: + +**Caution** The string provided to `mysql.raw()` will skip all escaping +functions when used, so be careful when passing in unvalidated input. + +```js +var CURRENT_TIMESTAMP = mysql.raw('CURRENT_TIMESTAMP()'); +var sql = mysql.format('UPDATE posts SET modified = ? WHERE id = ?', [CURRENT_TIMESTAMP, 42]); +console.log(sql); // UPDATE posts SET modified = CURRENT_TIMESTAMP() WHERE id = 42 +``` + +If you feel the need to escape queries by yourself, you can also use the escaping +function directly: + +```js +var query = "SELECT * FROM posts WHERE title=" + mysql.escape("Hello MySQL"); + +console.log(query); // SELECT * FROM posts WHERE title='Hello MySQL' +``` + +## Escaping query identifiers + +If you can't trust an SQL identifier (database / table / column name) because it is +provided by a user, you should escape it with `mysql.escapeId(identifier)`, +`connection.escapeId(identifier)` or `pool.escapeId(identifier)` like this: + +```js +var sorter = 'date'; +var sql = 'SELECT * FROM posts ORDER BY ' + connection.escapeId(sorter); +connection.query(sql, function (error, results, fields) { + if (error) throw error; + // ... +}); +``` + +It also supports adding qualified identifiers. It will escape both parts. + +```js +var sorter = 'date'; +var sql = 'SELECT * FROM posts ORDER BY ' + connection.escapeId('posts.' + sorter); +// -> SELECT * FROM posts ORDER BY `posts`.`date` +``` + +If you do not want to treat `.` as qualified identifiers, you can set the second +argument to `true` in order to keep the string as a literal identifier: + +```js +var sorter = 'date.2'; +var sql = 'SELECT * FROM posts ORDER BY ' + connection.escapeId(sorter, true); +// -> SELECT * FROM posts ORDER BY `date.2` +``` + +Alternatively, you can use `??` characters as placeholders for identifiers you would +like to have escaped like this: + +```js +var userId = 1; +var columns = ['username', 'email']; +var query = connection.query('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId], function (error, results, fields) { + if (error) throw error; + // ... +}); + +console.log(query.sql); // SELECT `username`, `email` FROM `users` WHERE id = 1 +``` +**Please note that this last character sequence is experimental and syntax might change** + +When you pass an Object to `.escape()` or `.query()`, `.escapeId()` is used to avoid SQL injection in object keys. + +### Preparing Queries + +You can use mysql.format to prepare a query with multiple insertion points, utilizing the proper escaping for ids and values. A simple example of this follows: + +```js +var sql = "SELECT * FROM ?? WHERE ?? = ?"; +var inserts = ['users', 'id', userId]; +sql = mysql.format(sql, inserts); +``` + +Following this you then have a valid, escaped query that you can then send to the database safely. This is useful if you are looking to prepare the query before actually sending it to the database. As mysql.format is exposed from SqlString.format you also have the option (but are not required) to pass in stringifyObject and timezone, allowing you provide a custom means of turning objects into strings, as well as a location-specific/timezone-aware Date. + +### Custom format + +If you prefer to have another type of query escape format, there's a connection configuration option you can use to define a custom format function. You can access the connection object if you want to use the built-in `.escape()` or any other connection function. + +Here's an example of how to implement another format: + +```js +connection.config.queryFormat = function (query, values) { + if (!values) return query; + return query.replace(/\:(\w+)/g, function (txt, key) { + if (values.hasOwnProperty(key)) { + return this.escape(values[key]); + } + return txt; + }.bind(this)); +}; + +connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" }); +``` + +## Getting the id of an inserted row + +If you are inserting a row into a table with an auto increment primary key, you +can retrieve the insert id like this: + +```js +connection.query('INSERT INTO posts SET ?', {title: 'test'}, function (error, results, fields) { + if (error) throw error; + console.log(results.insertId); +}); +``` + +When dealing with big numbers (above JavaScript Number precision limit), you should +consider enabling `supportBigNumbers` option to be able to read the insert id as a +string, otherwise it will throw an error. + +This option is also required when fetching big numbers from the database, otherwise +you will get values rounded to hundreds or thousands due to the precision limit. + +## Getting the number of affected rows + +You can get the number of affected rows from an insert, update or delete statement. + +```js +connection.query('DELETE FROM posts WHERE title = "wrong"', function (error, results, fields) { + if (error) throw error; + console.log('deleted ' + results.affectedRows + ' rows'); +}) +``` + +## Getting the number of changed rows + +You can get the number of changed rows from an update statement. + +"changedRows" differs from "affectedRows" in that it does not count updated rows +whose values were not changed. + +```js +connection.query('UPDATE posts SET ...', function (error, results, fields) { + if (error) throw error; + console.log('changed ' + results.changedRows + ' rows'); +}) +``` + +## Getting the connection ID + +You can get the MySQL connection ID ("thread ID") of a given connection using the `threadId` +property. + +```js +connection.connect(function(err) { + if (err) throw err; + console.log('connected as id ' + connection.threadId); +}); +``` + +## Executing queries in parallel + +The MySQL protocol is sequential, this means that you need multiple connections +to execute queries in parallel. You can use a Pool to manage connections, one +simple approach is to create one connection per incoming http request. + +## Streaming query rows + +Sometimes you may want to select large quantities of rows and process each of +them as they are received. This can be done like this: + +```js +var query = connection.query('SELECT * FROM posts'); +query + .on('error', function(err) { + // Handle error, an 'end' event will be emitted after this as well + }) + .on('fields', function(fields) { + // the field packets for the rows to follow + }) + .on('result', function(row) { + // Pausing the connnection is useful if your processing involves I/O + connection.pause(); + + processRow(row, function() { + connection.resume(); + }); + }) + .on('end', function() { + // all rows have been received + }); +``` + +Please note a few things about the example above: + +* Usually you will want to receive a certain amount of rows before starting to + throttle the connection using `pause()`. This number will depend on the + amount and size of your rows. +* `pause()` / `resume()` operate on the underlying socket and parser. You are + guaranteed that no more `'result'` events will fire after calling `pause()`. +* You MUST NOT provide a callback to the `query()` method when streaming rows. +* The `'result'` event will fire for both rows as well as OK packets + confirming the success of a INSERT/UPDATE query. +* It is very important not to leave the result paused too long, or you may + encounter `Error: Connection lost: The server closed the connection.` + The time limit for this is determined by the + [net_write_timeout setting](https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_net_write_timeout) + on your MySQL server. + +Additionally you may be interested to know that it is currently not possible to +stream individual row columns, they will always be buffered up entirely. If you +have a good use case for streaming large fields to and from MySQL, I'd love to +get your thoughts and contributions on this. + +### Piping results with Streams + +The query object provides a convenience method `.stream([options])` that wraps +query events into a [Readable Stream](http://nodejs.org/api/stream.html#stream_class_stream_readable) +object. This stream can easily be piped downstream and provides automatic +pause/resume, based on downstream congestion and the optional `highWaterMark`. +The `objectMode` parameter of the stream is set to `true` and cannot be changed +(if you need a byte stream, you will need to use a transform stream, like +[objstream](https://www.npmjs.com/package/objstream) for example). + +For example, piping query results into another stream (with a max buffer of 5 +objects) is simply: + +```js +connection.query('SELECT * FROM posts') + .stream({highWaterMark: 5}) + .pipe(...); +``` + +## Multiple statement queries + +Support for multiple statements is disabled for security reasons (it allows for +SQL injection attacks if values are not properly escaped). To use this feature +you have to enable it for your connection: + +```js +var connection = mysql.createConnection({multipleStatements: true}); +``` + +Once enabled, you can execute multiple statement queries like any other query: + +```js +connection.query('SELECT 1; SELECT 2', function (error, results, fields) { + if (error) throw error; + // `results` is an array with one element for every statement in the query: + console.log(results[0]); // [{1: 1}] + console.log(results[1]); // [{2: 2}] +}); +``` + +Additionally you can also stream the results of multiple statement queries: + +```js +var query = connection.query('SELECT 1; SELECT 2'); + +query + .on('fields', function(fields, index) { + // the fields for the result rows that follow + }) + .on('result', function(row, index) { + // index refers to the statement this result belongs to (starts at 0) + }); +``` + +If one of the statements in your query causes an error, the resulting Error +object contains a `err.index` property which tells you which statement caused +it. MySQL will also stop executing any remaining statements when an error +occurs. + +Please note that the interface for streaming multiple statement queries is +experimental and I am looking forward to feedback on it. + +## Stored procedures + +You can call stored procedures from your queries as with any other mysql driver. +If the stored procedure produces several result sets, they are exposed to you +the same way as the results for multiple statement queries. + +## Joins with overlapping column names + +When executing joins, you are likely to get result sets with overlapping column +names. + +By default, node-mysql will overwrite colliding column names in the +order the columns are received from MySQL, causing some of the received values +to be unavailable. + +However, you can also specify that you want your columns to be nested below +the table name like this: + +```js +var options = {sql: '...', nestTables: true}; +connection.query(options, function (error, results, fields) { + if (error) throw error; + /* results will be an array like this now: + [{ + table1: { + fieldA: '...', + fieldB: '...', + }, + table2: { + fieldA: '...', + fieldB: '...', + }, + }, ...] + */ +}); +``` + +Or use a string separator to have your results merged. + +```js +var options = {sql: '...', nestTables: '_'}; +connection.query(options, function (error, results, fields) { + if (error) throw error; + /* results will be an array like this now: + [{ + table1_fieldA: '...', + table1_fieldB: '...', + table2_fieldA: '...', + table2_fieldB: '...', + }, ...] + */ +}); +``` + +## Transactions + +Simple transaction support is available at the connection level: + +```js +connection.beginTransaction(function(err) { + if (err) { throw err; } + connection.query('INSERT INTO posts SET title=?', title, function (error, results, fields) { + if (error) { + return connection.rollback(function() { + throw error; + }); + } + + var log = 'Post ' + results.insertId + ' added'; + + connection.query('INSERT INTO log SET data=?', log, function (error, results, fields) { + if (error) { + return connection.rollback(function() { + throw error; + }); + } + connection.commit(function(err) { + if (err) { + return connection.rollback(function() { + throw err; + }); + } + console.log('success!'); + }); + }); + }); +}); +``` +Please note that beginTransaction(), commit() and rollback() are simply convenience +functions that execute the START TRANSACTION, COMMIT, and ROLLBACK commands respectively. +It is important to understand that many commands in MySQL can cause an implicit commit, +as described [in the MySQL documentation](http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html) + +## Ping + +A ping packet can be sent over a connection using the `connection.ping` method. This +method will send a ping packet to the server and when the server responds, the callback +will fire. If an error occurred, the callback will fire with an error argument. + +```js +connection.ping(function (err) { + if (err) throw err; + console.log('Server responded to ping'); +}) +``` + +## Timeouts + +Every operation takes an optional inactivity timeout option. This allows you to +specify appropriate timeouts for operations. It is important to note that these +timeouts are not part of the MySQL protocol, and rather timeout operations through +the client. This means that when a timeout is reached, the connection it occurred +on will be destroyed and no further operations can be performed. + +```js +// Kill query after 60s +connection.query({sql: 'SELECT COUNT(*) AS count FROM big_table', timeout: 60000}, function (error, results, fields) { + if (error && error.code === 'PROTOCOL_SEQUENCE_TIMEOUT') { + throw new Error('too long to count table rows!'); + } + + if (error) { + throw error; + } + + console.log(results[0].count + ' rows'); +}); +``` + +## Error handling + +This module comes with a consistent approach to error handling that you should +review carefully in order to write solid applications. + +Most errors created by this module are instances of the JavaScript [Error][] +object. Additionally they typically come with two extra properties: + +* `err.code`: Either a [MySQL server error][] (e.g. + `'ER_ACCESS_DENIED_ERROR'`), a Node.js error (e.g. `'ECONNREFUSED'`) or an + internal error (e.g. `'PROTOCOL_CONNECTION_LOST'`). +* `err.fatal`: Boolean, indicating if this error is terminal to the connection + object. If the error is not from a MySQL protocol operation, this properly + will not be defined. +* `err.sql`: String, contains the full SQL of the failed query. This can be + useful when using a higher level interface like an ORM that is generating + the queries. +* `err.sqlState`: String, contains the five-character SQLSTATE value. Only populated from [MySQL server error][]. +* `err.sqlMessage`: String, contains the message string that provides a + textual description of the error. Only populated from [MySQL server error][]. + +[Error]: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error +[MySQL server error]: http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html + +Fatal errors are propagated to *all* pending callbacks. In the example below, a +fatal error is triggered by trying to connect to an invalid port. Therefore the +error object is propagated to both pending callbacks: + +```js +var connection = require('mysql').createConnection({ + port: 84943, // WRONG PORT +}); + +connection.connect(function(err) { + console.log(err.code); // 'ECONNREFUSED' + console.log(err.fatal); // true +}); + +connection.query('SELECT 1', function (error, results, fields) { + console.log(error.code); // 'ECONNREFUSED' + console.log(error.fatal); // true +}); +``` + +Normal errors however are only delegated to the callback they belong to. So in +the example below, only the first callback receives an error, the second query +works as expected: + +```js +connection.query('USE name_of_db_that_does_not_exist', function (error, results, fields) { + console.log(error.code); // 'ER_BAD_DB_ERROR' +}); + +connection.query('SELECT 1', function (error, results, fields) { + console.log(error); // null + console.log(results.length); // 1 +}); +``` + +Last but not least: If a fatal errors occurs and there are no pending +callbacks, or a normal error occurs which has no callback belonging to it, the +error is emitted as an `'error'` event on the connection object. This is +demonstrated in the example below: + +```js +connection.on('error', function(err) { + console.log(err.code); // 'ER_BAD_DB_ERROR' +}); + +connection.query('USE name_of_db_that_does_not_exist'); +``` + +Note: `'error'` events are special in node. If they occur without an attached +listener, a stack trace is printed and your process is killed. + +**tl;dr:** This module does not want you to deal with silent failures. You +should always provide callbacks to your method calls. If you want to ignore +this advice and suppress unhandled errors, you can do this: + +```js +// I am Chuck Norris: +connection.on('error', function() {}); +``` + +## Exception Safety + +This module is exception safe. That means you can continue to use it, even if +one of your callback functions throws an error which you're catching using +'uncaughtException' or a domain. + +## Type casting + +For your convenience, this driver will cast mysql types into native JavaScript +types by default. The following mappings exist: + +### Number + +* TINYINT +* SMALLINT +* INT +* MEDIUMINT +* YEAR +* FLOAT +* DOUBLE + +### Date + +* TIMESTAMP +* DATE +* DATETIME + +### Buffer + +* TINYBLOB +* MEDIUMBLOB +* LONGBLOB +* BLOB +* BINARY +* VARBINARY +* BIT (last byte will be filled with 0 bits as necessary) + +### String + +**Note** text in the binary character set is returned as `Buffer`, rather +than a string. + +* CHAR +* VARCHAR +* TINYTEXT +* MEDIUMTEXT +* LONGTEXT +* TEXT +* ENUM +* SET +* DECIMAL (may exceed float precision) +* BIGINT (may exceed float precision) +* TIME (could be mapped to Date, but what date would be set?) +* GEOMETRY (never used those, get in touch if you do) + +It is not recommended (and may go away / change in the future) to disable type +casting, but you can currently do so on either the connection: + +```js +var connection = require('mysql').createConnection({typeCast: false}); +``` + +Or on the query level: + +```js +var options = {sql: '...', typeCast: false}; +var query = connection.query(options, function (error, results, fields) { + if (error) throw error; + // ... +}); +``` + +You can also pass a function and handle type casting yourself. You're given some +column information like database, table and name and also type and length. If you +just want to apply a custom type casting to a specific type you can do it and then +fallback to the default. Here's an example of converting `TINYINT(1)` to boolean: + +```js +connection.query({ + sql: '...', + typeCast: function (field, next) { + if (field.type == 'TINY' && field.length == 1) { + return (field.string() == '1'); // 1 = true, 0 = false + } + return next(); + } +}); +``` +__WARNING: YOU MUST INVOKE the parser using one of these three field functions in your custom typeCast callback. They can only be called once. (see [#539](https://github.com/mysqljs/mysql/issues/539) for discussion)__ + +``` +field.string() +field.buffer() +field.geometry() +``` +are aliases for +``` +parser.parseLengthCodedString() +parser.parseLengthCodedBuffer() +parser.parseGeometryValue() +``` +__You can find which field function you need to use by looking at: [RowDataPacket.prototype._typeCast](https://github.com/mysqljs/mysql/blob/master/lib/protocol/packets/RowDataPacket.js#L41)__ + + +## Connection Flags + +If, for any reason, you would like to change the default connection flags, you +can use the connection option `flags`. Pass a string with a comma separated list +of items to add to the default flags. If you don't want a default flag to be used +prepend the flag with a minus sign. To add a flag that is not in the default list, +just write the flag name, or prefix it with a plus (case insensitive). + +**Please note that some available flags that are not supported (e.g.: Compression), +are still not allowed to be specified.** + +### Example + +The next example blacklists FOUND_ROWS flag from default connection flags. + +```js +var connection = mysql.createConnection("mysql://localhost/test?flags=-FOUND_ROWS"); +``` + +### Default Flags + +The following flags are sent by default on a new connection: + +- `CONNECT_WITH_DB` - Ability to specify the database on connection. +- `FOUND_ROWS` - Send the found rows instead of the affected rows as `affectedRows`. +- `IGNORE_SIGPIPE` - Old; no effect. +- `IGNORE_SPACE` - Let the parser ignore spaces before the `(` in queries. +- `LOCAL_FILES` - Can use `LOAD DATA LOCAL`. +- `LONG_FLAG` +- `LONG_PASSWORD` - Use the improved version of Old Password Authentication. +- `MULTI_RESULTS` - Can handle multiple resultsets for COM_QUERY. +- `ODBC` Old; no effect. +- `PROTOCOL_41` - Uses the 4.1 protocol. +- `PS_MULTI_RESULTS` - Can handle multiple resultsets for COM_STMT_EXECUTE. +- `RESERVED` - Old flag for the 4.1 protocol. +- `SECURE_CONNECTION` - Support native 4.1 authentication. +- `TRANSACTIONS` - Asks for the transaction status flags. + +In addition, the following flag will be sent if the option `multipleStatements` +is set to `true`: + +- `MULTI_STATEMENTS` - The client may send multiple statement per query or + statement prepare. + +### Other Available Flags + +There are other flags available. They may or may not function, but are still +available to specify. + +- `COMPRESS` +- `INTERACTIVE` +- `NO_SCHEMA` +- `PLUGIN_AUTH` +- `REMEMBER_OPTIONS` +- `SSL` +- `SSL_VERIFY_SERVER_CERT` + +## Debugging and reporting problems + +If you are running into problems, one thing that may help is enabling the +`debug` mode for the connection: + +```js +var connection = mysql.createConnection({debug: true}); +``` + +This will print all incoming and outgoing packets on stdout. You can also restrict debugging to +packet types by passing an array of types to debug: + +```js +var connection = mysql.createConnection({debug: ['ComQueryPacket', 'RowDataPacket']}); +``` + +to restrict debugging to the query and data packets. + +If that does not help, feel free to open a GitHub issue. A good GitHub issue +will have: + +* The minimal amount of code required to reproduce the problem (if possible) +* As much debugging output and information about your environment (mysql + version, node version, os, etc.) as you can gather. + +## Security issues + +Security issues should not be first reported through GitHub or another public +forum, but kept private in order for the collaborators to assess the report +and either (a) devise a fix and plan a release date or (b) assert that it is +not a security issue (in which case it can be posted in a public forum, like +a GitHub issue). + +The primary private forum is email, either by emailing the module's author or +opening a GitHub issue simply asking to whom a security issues should be +addressed to without disclosing the issue or type of issue. + +An ideal report would include a clear indication of what the security issue is +and how it would be exploited, ideally with an accompaning proof of concept +("PoC") for collaborators to work again and validate potentional fixes against. + +## Contributing + +This project welcomes contributions from the community. Contributions are +accepted using GitHub pull requests. If you're not familiar with making +GitHub pull requests, please refer to the +[GitHub documentation "Creating a pull request"](https://help.github.com/articles/creating-a-pull-request/). + +For a good pull request, we ask you provide the following: + +1. Try to include a clear description of your pull request in the description. + It should include the basic "what" and "why"s for the request. +2. The tests should pass as best as you can. See the [Running tests](#running-tests) + section on how to run the different tests. GitHub will automatically run + the tests as well, to act as a safety net. +3. The pull request should include tests for the change. A new feature should + have tests for the new feature and bug fixes should include a test that fails + without the corresponding code change and passes after they are applied. + The command `npm run test-cov` will generate a `coverage/` folder that + contains HTML pages of the code coverage, to better understand if everything + you're adding is being tested. +4. If the pull request is a new feature, please be sure to include all + appropriate documentation additions in the `Readme.md` file as well. +5. To help ensure that your code is similar in style to the existing code, + run the command `npm run lint` and fix any displayed issues. + +## Running tests + +The test suite is split into two parts: unit tests and integration tests. +The unit tests run on any machine while the integration tests require a +MySQL server instance to be setup. + +### Running unit tests + +```sh +$ FILTER=unit npm test +``` + +### Running integration tests + +Set the environment variables `MYSQL_DATABASE`, `MYSQL_HOST`, `MYSQL_PORT`, +`MYSQL_USER` and `MYSQL_PASSWORD`. `MYSQL_SOCKET` can also be used in place +of `MYSQL_HOST` and `MYSQL_PORT` to connect over a UNIX socket. Then run +`npm test`. + +For example, if you have an installation of mysql running on localhost:3306 +and no password set for the `root` user, run: + +```sh +$ mysql -u root -e "CREATE DATABASE IF NOT EXISTS node_mysql_test" +$ MYSQL_HOST=localhost MYSQL_PORT=3306 MYSQL_DATABASE=node_mysql_test MYSQL_USER=root MYSQL_PASSWORD= FILTER=integration npm test +``` + +## Todo + +* Prepared statements +* Support for encodings other than UTF-8 / ASCII + +[npm-image]: https://img.shields.io/npm/v/mysql.svg +[npm-url]: https://npmjs.org/package/mysql +[node-version-image]: https://img.shields.io/node/v/mysql.svg +[node-version-url]: https://nodejs.org/en/download/ +[travis-image]: https://img.shields.io/travis/mysqljs/mysql/master.svg?label=linux +[travis-url]: https://travis-ci.org/mysqljs/mysql +[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/node-mysql/master.svg?label=windows +[appveyor-url]: https://ci.appveyor.com/project/dougwilson/node-mysql +[coveralls-image]: https://img.shields.io/coveralls/mysqljs/mysql/master.svg +[coveralls-url]: https://coveralls.io/r/mysqljs/mysql?branch=master +[downloads-image]: https://img.shields.io/npm/dm/mysql.svg +[downloads-url]: https://npmjs.org/package/mysql diff --git a/html/RentForCamp/node_modules/mysql/index.js b/html/RentForCamp/node_modules/mysql/index.js new file mode 100644 index 0000000..7262407 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/index.js @@ -0,0 +1,161 @@ +var Classes = Object.create(null); + +/** + * Create a new Connection instance. + * @param {object|string} config Configuration or connection string for new MySQL connection + * @return {Connection} A new MySQL connection + * @public + */ +exports.createConnection = function createConnection(config) { + var Connection = loadClass('Connection'); + var ConnectionConfig = loadClass('ConnectionConfig'); + + return new Connection({config: new ConnectionConfig(config)}); +}; + +/** + * Create a new Pool instance. + * @param {object|string} config Configuration or connection string for new MySQL connections + * @return {Pool} A new MySQL pool + * @public + */ +exports.createPool = function createPool(config) { + var Pool = loadClass('Pool'); + var PoolConfig = loadClass('PoolConfig'); + + return new Pool({config: new PoolConfig(config)}); +}; + +/** + * Create a new PoolCluster instance. + * @param {object} [config] Configuration for pool cluster + * @return {PoolCluster} New MySQL pool cluster + * @public + */ +exports.createPoolCluster = function createPoolCluster(config) { + var PoolCluster = loadClass('PoolCluster'); + + return new PoolCluster(config); +}; + +/** + * Create a new Query instance. + * @param {string} sql The SQL for the query + * @param {array} [values] Any values to insert into placeholders in sql + * @param {function} [callback] The callback to use when query is complete + * @return {Query} New query object + * @public + */ +exports.createQuery = function createQuery(sql, values, callback) { + var Connection = loadClass('Connection'); + + return Connection.createQuery(sql, values, callback); +}; + +/** + * Escape a value for SQL. + * @param {*} value The value to escape + * @param {boolean} [stringifyObjects=false] Setting if objects should be stringified + * @param {string} [timeZone=local] Setting for time zone to use for Date conversion + * @return {string} Escaped string value + * @public + */ +exports.escape = function escape(value, stringifyObjects, timeZone) { + var SqlString = loadClass('SqlString'); + + return SqlString.escape(value, stringifyObjects, timeZone); +}; + +/** + * Escape an identifier for SQL. + * @param {*} value The value to escape + * @param {boolean} [forbidQualified=false] Setting to treat '.' as part of identifier + * @return {string} Escaped string value + * @public + */ +exports.escapeId = function escapeId(value, forbidQualified) { + var SqlString = loadClass('SqlString'); + + return SqlString.escapeId(value, forbidQualified); +}; + +/** + * Format SQL and replacement values into a SQL string. + * @param {string} sql The SQL for the query + * @param {array} [values] Any values to insert into placeholders in sql + * @param {boolean} [stringifyObjects=false] Setting if objects should be stringified + * @param {string} [timeZone=local] Setting for time zone to use for Date conversion + * @return {string} Formatted SQL string + * @public + */ +exports.format = function format(sql, values, stringifyObjects, timeZone) { + var SqlString = loadClass('SqlString'); + + return SqlString.format(sql, values, stringifyObjects, timeZone); +}; + +/** + * Wrap raw SQL strings from escape overriding. + * @param {string} sql The raw SQL + * @return {object} Wrapped object + * @public + */ +exports.raw = function raw(sql) { + var SqlString = loadClass('SqlString'); + + return SqlString.raw(sql); +}; + +/** + * The type constants. + * @public + */ +Object.defineProperty(exports, 'Types', { + get: loadClass.bind(null, 'Types') +}); + +/** + * Load the given class. + * @param {string} className Name of class to default + * @return {function|object} Class constructor or exports + * @private + */ +function loadClass(className) { + var Class = Classes[className]; + + if (Class !== undefined) { + return Class; + } + + // This uses a switch for static require analysis + switch (className) { + case 'Connection': + Class = require('./lib/Connection'); + break; + case 'ConnectionConfig': + Class = require('./lib/ConnectionConfig'); + break; + case 'Pool': + Class = require('./lib/Pool'); + break; + case 'PoolCluster': + Class = require('./lib/PoolCluster'); + break; + case 'PoolConfig': + Class = require('./lib/PoolConfig'); + break; + case 'SqlString': + Class = require('./lib/protocol/SqlString'); + break; + case 'Types': + Class = require('./lib/protocol/constants/types'); + break; + default: + throw new Error('Cannot find class \'' + className + '\''); + } + + // Store to prevent invoking require() + Classes[className] = Class; + + return Class; +} diff --git a/html/RentForCamp/node_modules/mysql/lib/Connection.js b/html/RentForCamp/node_modules/mysql/lib/Connection.js new file mode 100644 index 0000000..2a37798 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/Connection.js @@ -0,0 +1,505 @@ +var Crypto = require('crypto'); +var Events = require('events'); +var Net = require('net'); +var tls = require('tls'); +var ConnectionConfig = require('./ConnectionConfig'); +var Protocol = require('./protocol/Protocol'); +var SqlString = require('./protocol/SqlString'); +var Query = require('./protocol/sequences/Query'); +var Util = require('util'); + +module.exports = Connection; +Util.inherits(Connection, Events.EventEmitter); +function Connection(options) { + Events.EventEmitter.call(this); + + this.config = options.config; + + this._socket = options.socket; + this._protocol = new Protocol({config: this.config, connection: this}); + this._connectCalled = false; + this.state = 'disconnected'; + this.threadId = null; +} + +Connection.createQuery = function createQuery(sql, values, callback) { + if (sql instanceof Query) { + return sql; + } + + var cb = wrapCallbackInDomain(null, callback); + var options = {}; + + if (typeof sql === 'function') { + cb = wrapCallbackInDomain(null, sql); + return new Query(options, cb); + } + + if (typeof sql === 'object') { + for (var prop in sql) { + options[prop] = sql[prop]; + } + + if (typeof values === 'function') { + cb = wrapCallbackInDomain(null, values); + } else if (values !== undefined) { + options.values = values; + } + + return new Query(options, cb); + } + + options.sql = sql; + options.values = values; + + if (typeof values === 'function') { + cb = wrapCallbackInDomain(null, values); + options.values = undefined; + } + + if (cb === undefined && callback !== undefined) { + throw new TypeError('argument callback must be a function when provided'); + } + + return new Query(options, cb); +}; + +Connection.prototype.connect = function connect(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + if (!this._connectCalled) { + this._connectCalled = true; + + // Connect either via a UNIX domain socket or a TCP socket. + this._socket = (this.config.socketPath) + ? Net.createConnection(this.config.socketPath) + : Net.createConnection(this.config.port, this.config.host); + + // Connect socket to connection domain + if (Events.usingDomains) { + this._socket.domain = this.domain; + } + + var connection = this; + this._protocol.on('data', function(data) { + connection._socket.write(data); + }); + this._socket.on('data', wrapToDomain(connection, function (data) { + connection._protocol.write(data); + })); + this._protocol.on('end', function() { + connection._socket.end(); + }); + this._socket.on('end', wrapToDomain(connection, function () { + connection._protocol.end(); + })); + + this._socket.on('error', this._handleNetworkError.bind(this)); + this._socket.on('connect', this._handleProtocolConnect.bind(this)); + this._protocol.on('handshake', this._handleProtocolHandshake.bind(this)); + this._protocol.on('unhandledError', this._handleProtocolError.bind(this)); + this._protocol.on('drain', this._handleProtocolDrain.bind(this)); + this._protocol.on('end', this._handleProtocolEnd.bind(this)); + this._protocol.on('enqueue', this._handleProtocolEnqueue.bind(this)); + + if (this.config.connectTimeout) { + var handleConnectTimeout = this._handleConnectTimeout.bind(this); + + this._socket.setTimeout(this.config.connectTimeout, handleConnectTimeout); + this._socket.once('connect', function() { + this.setTimeout(0, handleConnectTimeout); + }); + } + } + + this._protocol.handshake(options, wrapCallbackInDomain(this, callback)); +}; + +Connection.prototype.changeUser = function changeUser(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + this._implyConnect(); + + var charsetNumber = (options.charset) + ? ConnectionConfig.getCharsetNumber(options.charset) + : this.config.charsetNumber; + + return this._protocol.changeUser({ + user : options.user || this.config.user, + password : options.password || this.config.password, + database : options.database || this.config.database, + timeout : options.timeout, + charsetNumber : charsetNumber, + currentConfig : this.config + }, wrapCallbackInDomain(this, callback)); +}; + +Connection.prototype.beginTransaction = function beginTransaction(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + options.sql = 'START TRANSACTION'; + options.values = null; + + return this.query(options, callback); +}; + +Connection.prototype.commit = function commit(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + options.sql = 'COMMIT'; + options.values = null; + + return this.query(options, callback); +}; + +Connection.prototype.rollback = function rollback(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + options.sql = 'ROLLBACK'; + options.values = null; + + return this.query(options, callback); +}; + +Connection.prototype.query = function query(sql, values, cb) { + var query = Connection.createQuery(sql, values, cb); + query._connection = this; + + if (!(typeof sql === 'object' && 'typeCast' in sql)) { + query.typeCast = this.config.typeCast; + } + + if (query.sql) { + query.sql = this.format(query.sql, query.values); + } + + if (query._callback) { + query._callback = wrapCallbackInDomain(this, query._callback); + } + + this._implyConnect(); + + return this._protocol._enqueue(query); +}; + +Connection.prototype.ping = function ping(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + this._implyConnect(); + this._protocol.ping(options, wrapCallbackInDomain(this, callback)); +}; + +Connection.prototype.statistics = function statistics(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + this._implyConnect(); + this._protocol.stats(options, wrapCallbackInDomain(this, callback)); +}; + +Connection.prototype.end = function end(options, callback) { + var cb = callback; + var opts = options; + + if (!callback && typeof options === 'function') { + cb = options; + opts = null; + } + + // create custom options reference + opts = Object.create(opts || null); + + if (opts.timeout === undefined) { + // default timeout of 30 seconds + opts.timeout = 30000; + } + + this._implyConnect(); + this._protocol.quit(opts, wrapCallbackInDomain(this, cb)); +}; + +Connection.prototype.destroy = function() { + this.state = 'disconnected'; + this._implyConnect(); + this._socket.destroy(); + this._protocol.destroy(); +}; + +Connection.prototype.pause = function() { + this._socket.pause(); + this._protocol.pause(); +}; + +Connection.prototype.resume = function() { + this._socket.resume(); + this._protocol.resume(); +}; + +Connection.prototype.escape = function(value) { + return SqlString.escape(value, false, this.config.timezone); +}; + +Connection.prototype.escapeId = function escapeId(value) { + return SqlString.escapeId(value, false); +}; + +Connection.prototype.format = function(sql, values) { + if (typeof this.config.queryFormat === 'function') { + return this.config.queryFormat.call(this, sql, values, this.config.timezone); + } + return SqlString.format(sql, values, this.config.stringifyObjects, this.config.timezone); +}; + +if (tls.TLSSocket) { + // 0.11+ environment + Connection.prototype._startTLS = function _startTLS(onSecure) { + var connection = this; + var secureContext = tls.createSecureContext({ + ca : this.config.ssl.ca, + cert : this.config.ssl.cert, + ciphers : this.config.ssl.ciphers, + key : this.config.ssl.key, + passphrase : this.config.ssl.passphrase + }); + + // "unpipe" + this._socket.removeAllListeners('data'); + this._protocol.removeAllListeners('data'); + + // socket <-> encrypted + var rejectUnauthorized = this.config.ssl.rejectUnauthorized; + var secureEstablished = false; + var secureSocket = new tls.TLSSocket(this._socket, { + rejectUnauthorized : rejectUnauthorized, + requestCert : true, + secureContext : secureContext, + isServer : false + }); + + // error handler for secure socket + secureSocket.on('_tlsError', function(err) { + if (secureEstablished) { + connection._handleNetworkError(err); + } else { + onSecure(err); + } + }); + + // cleartext <-> protocol + secureSocket.pipe(this._protocol); + this._protocol.on('data', function(data) { + secureSocket.write(data); + }); + + secureSocket.on('secure', function() { + secureEstablished = true; + + onSecure(rejectUnauthorized ? this.ssl.verifyError() : null); + }); + + // start TLS communications + secureSocket._start(); + }; +} else { + // pre-0.11 environment + Connection.prototype._startTLS = function _startTLS(onSecure) { + // before TLS: + // _socket <-> _protocol + // after: + // _socket <-> securePair.encrypted <-> securePair.cleartext <-> _protocol + + var connection = this; + var credentials = Crypto.createCredentials({ + ca : this.config.ssl.ca, + cert : this.config.ssl.cert, + ciphers : this.config.ssl.ciphers, + key : this.config.ssl.key, + passphrase : this.config.ssl.passphrase + }); + + var rejectUnauthorized = this.config.ssl.rejectUnauthorized; + var secureEstablished = false; + var securePair = tls.createSecurePair(credentials, false, true, rejectUnauthorized); + + // error handler for secure pair + securePair.on('error', function(err) { + if (secureEstablished) { + connection._handleNetworkError(err); + } else { + onSecure(err); + } + }); + + // "unpipe" + this._socket.removeAllListeners('data'); + this._protocol.removeAllListeners('data'); + + // socket <-> encrypted + securePair.encrypted.pipe(this._socket); + this._socket.on('data', function(data) { + securePair.encrypted.write(data); + }); + + // cleartext <-> protocol + securePair.cleartext.pipe(this._protocol); + this._protocol.on('data', function(data) { + securePair.cleartext.write(data); + }); + + // secure established + securePair.on('secure', function() { + secureEstablished = true; + + if (!rejectUnauthorized) { + onSecure(); + return; + } + + var verifyError = this.ssl.verifyError(); + var err = verifyError; + + // node.js 0.6 support + if (typeof err === 'string') { + err = new Error(verifyError); + err.code = verifyError; + } + + onSecure(err); + }); + + // node.js 0.8 bug + securePair._cycle = securePair.cycle; + securePair.cycle = function cycle() { + if (this.ssl && this.ssl.error) { + this.error(); + } + + return this._cycle.apply(this, arguments); + }; + }; +} + +Connection.prototype._handleConnectTimeout = function() { + if (this._socket) { + this._socket.setTimeout(0); + this._socket.destroy(); + } + + var err = new Error('connect ETIMEDOUT'); + err.errorno = 'ETIMEDOUT'; + err.code = 'ETIMEDOUT'; + err.syscall = 'connect'; + + this._handleNetworkError(err); +}; + +Connection.prototype._handleNetworkError = function(err) { + this._protocol.handleNetworkError(err); +}; + +Connection.prototype._handleProtocolError = function(err) { + this.state = 'protocol_error'; + this.emit('error', err); +}; + +Connection.prototype._handleProtocolDrain = function() { + this.emit('drain'); +}; + +Connection.prototype._handleProtocolConnect = function() { + this.state = 'connected'; + this.emit('connect'); +}; + +Connection.prototype._handleProtocolHandshake = function _handleProtocolHandshake(packet) { + this.state = 'authenticated'; + this.threadId = packet.threadId; +}; + +Connection.prototype._handleProtocolEnd = function(err) { + this.state = 'disconnected'; + this.emit('end', err); +}; + +Connection.prototype._handleProtocolEnqueue = function _handleProtocolEnqueue(sequence) { + this.emit('enqueue', sequence); +}; + +Connection.prototype._implyConnect = function() { + if (!this._connectCalled) { + this.connect(); + } +}; + +function unwrapFromDomain(fn) { + return function () { + var domains = []; + var ret; + + while (process.domain) { + domains.shift(process.domain); + process.domain.exit(); + } + + try { + ret = fn.apply(this, arguments); + } finally { + for (var i = 0; i < domains.length; i++) { + domains[i].enter(); + } + } + + return ret; + }; +} + +function wrapCallbackInDomain(ee, fn) { + if (typeof fn !== 'function' || fn.domain) { + return fn; + } + + var domain = process.domain; + + if (domain) { + return domain.bind(fn); + } else if (ee) { + return unwrapFromDomain(wrapToDomain(ee, fn)); + } else { + return fn; + } +} + +function wrapToDomain(ee, fn) { + return function () { + if (Events.usingDomains && ee.domain) { + ee.domain.enter(); + fn.apply(this, arguments); + ee.domain.exit(); + } else { + fn.apply(this, arguments); + } + }; +} diff --git a/html/RentForCamp/node_modules/mysql/lib/ConnectionConfig.js b/html/RentForCamp/node_modules/mysql/lib/ConnectionConfig.js new file mode 100644 index 0000000..147aa0a --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/ConnectionConfig.js @@ -0,0 +1,201 @@ +var urlParse = require('url').parse; +var ClientConstants = require('./protocol/constants/client'); +var Charsets = require('./protocol/constants/charsets'); +var SSLProfiles = null; + +module.exports = ConnectionConfig; +function ConnectionConfig(options) { + if (typeof options === 'string') { + options = ConnectionConfig.parseUrl(options); + } + + this.host = options.host || 'localhost'; + this.port = options.port || 3306; + this.localAddress = options.localAddress; + this.socketPath = options.socketPath; + this.user = options.user || undefined; + this.password = options.password || undefined; + this.database = options.database; + this.connectTimeout = (options.connectTimeout === undefined) + ? (10 * 1000) + : options.connectTimeout; + this.insecureAuth = options.insecureAuth || false; + this.supportBigNumbers = options.supportBigNumbers || false; + this.bigNumberStrings = options.bigNumberStrings || false; + this.dateStrings = options.dateStrings || false; + this.debug = options.debug; + this.trace = options.trace !== false; + this.stringifyObjects = options.stringifyObjects || false; + this.timezone = options.timezone || 'local'; + this.flags = options.flags || ''; + this.queryFormat = options.queryFormat; + this.pool = options.pool || undefined; + this.ssl = (typeof options.ssl === 'string') + ? ConnectionConfig.getSSLProfile(options.ssl) + : (options.ssl || false); + this.multipleStatements = options.multipleStatements || false; + this.typeCast = (options.typeCast === undefined) + ? true + : options.typeCast; + + if (this.timezone[0] === ' ') { + // "+" is a url encoded char for space so it + // gets translated to space when giving a + // connection string.. + this.timezone = '+' + this.timezone.substr(1); + } + + if (this.ssl) { + // Default rejectUnauthorized to true + this.ssl.rejectUnauthorized = this.ssl.rejectUnauthorized !== false; + } + + this.maxPacketSize = 0; + this.charsetNumber = (options.charset) + ? ConnectionConfig.getCharsetNumber(options.charset) + : options.charsetNumber || Charsets.UTF8_GENERAL_CI; + + // Set the client flags + var defaultFlags = ConnectionConfig.getDefaultFlags(options); + this.clientFlags = ConnectionConfig.mergeFlags(defaultFlags, options.flags); +} + +ConnectionConfig.mergeFlags = function mergeFlags(defaultFlags, userFlags) { + var allFlags = ConnectionConfig.parseFlagList(defaultFlags); + var newFlags = ConnectionConfig.parseFlagList(userFlags); + + // Merge the new flags + for (var flag in newFlags) { + if (allFlags[flag] !== false) { + allFlags[flag] = newFlags[flag]; + } + } + + // Build flags + var flags = 0x0; + for (var flag in allFlags) { + if (allFlags[flag]) { + // TODO: Throw here on some future release + flags |= ClientConstants['CLIENT_' + flag] || 0x0; + } + } + + return flags; +}; + +ConnectionConfig.getCharsetNumber = function getCharsetNumber(charset) { + var num = Charsets[charset.toUpperCase()]; + + if (num === undefined) { + throw new TypeError('Unknown charset \'' + charset + '\''); + } + + return num; +}; + +ConnectionConfig.getDefaultFlags = function getDefaultFlags(options) { + var defaultFlags = [ + '-COMPRESS', // Compression protocol *NOT* supported + '-CONNECT_ATTRS', // Does *NOT* send connection attributes in Protocol::HandshakeResponse41 + '+CONNECT_WITH_DB', // One can specify db on connect in Handshake Response Packet + '+FOUND_ROWS', // Send found rows instead of affected rows + '+IGNORE_SIGPIPE', // Don't issue SIGPIPE if network failures + '+IGNORE_SPACE', // Let the parser ignore spaces before '(' + '+LOCAL_FILES', // Can use LOAD DATA LOCAL + '+LONG_FLAG', // Longer flags in Protocol::ColumnDefinition320 + '+LONG_PASSWORD', // Use the improved version of Old Password Authentication + '+MULTI_RESULTS', // Can handle multiple resultsets for COM_QUERY + '+ODBC', // Special handling of ODBC behaviour + '-PLUGIN_AUTH', // Does *NOT* support auth plugins + '+PROTOCOL_41', // Uses the 4.1 protocol + '+PS_MULTI_RESULTS', // Can handle multiple resultsets for COM_STMT_EXECUTE + '+RESERVED', // Unused + '+SECURE_CONNECTION', // Supports Authentication::Native41 + '+TRANSACTIONS' // Expects status flags + ]; + + if (options && options.multipleStatements) { + // May send multiple statements per COM_QUERY and COM_STMT_PREPARE + defaultFlags.push('+MULTI_STATEMENTS'); + } + + return defaultFlags; +}; + +ConnectionConfig.getSSLProfile = function getSSLProfile(name) { + if (!SSLProfiles) { + SSLProfiles = require('./protocol/constants/ssl_profiles'); + } + + var ssl = SSLProfiles[name]; + + if (ssl === undefined) { + throw new TypeError('Unknown SSL profile \'' + name + '\''); + } + + return ssl; +}; + +ConnectionConfig.parseFlagList = function parseFlagList(flagList) { + var allFlags = Object.create(null); + + if (!flagList) { + return allFlags; + } + + var flags = !Array.isArray(flagList) + ? String(flagList || '').toUpperCase().split(/\s*,+\s*/) + : flagList; + + for (var i = 0; i < flags.length; i++) { + var flag = flags[i]; + var offset = 1; + var state = flag[0]; + + if (state === undefined) { + // TODO: throw here on some future release + continue; + } + + if (state !== '-' && state !== '+') { + offset = 0; + state = '+'; + } + + allFlags[flag.substr(offset)] = state === '+'; + } + + return allFlags; +}; + +ConnectionConfig.parseUrl = function(url) { + url = urlParse(url, true); + + var options = { + host : url.hostname, + port : url.port, + database : url.pathname.substr(1) + }; + + if (url.auth) { + var auth = url.auth.split(':'); + options.user = auth.shift(); + options.password = auth.join(':'); + } + + if (url.query) { + for (var key in url.query) { + var value = url.query[key]; + + try { + // Try to parse this as a JSON expression first + options[key] = JSON.parse(value); + } catch (err) { + // Otherwise assume it is a plain string + options[key] = value; + } + } + } + + return options; +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/Pool.js b/html/RentForCamp/node_modules/mysql/lib/Pool.js new file mode 100644 index 0000000..87a4011 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/Pool.js @@ -0,0 +1,294 @@ +var mysql = require('../'); +var Connection = require('./Connection'); +var EventEmitter = require('events').EventEmitter; +var Util = require('util'); +var PoolConnection = require('./PoolConnection'); + +module.exports = Pool; + +Util.inherits(Pool, EventEmitter); +function Pool(options) { + EventEmitter.call(this); + this.config = options.config; + this.config.connectionConfig.pool = this; + + this._acquiringConnections = []; + this._allConnections = []; + this._freeConnections = []; + this._connectionQueue = []; + this._closed = false; +} + +Pool.prototype.getConnection = function (cb) { + + if (this._closed) { + var err = new Error('Pool is closed.'); + err.code = 'POOL_CLOSED'; + process.nextTick(function () { + cb(err); + }); + return; + } + + var connection; + var pool = this; + + if (this._freeConnections.length > 0) { + connection = this._freeConnections.shift(); + this.acquireConnection(connection, cb); + return; + } + + if (this.config.connectionLimit === 0 || this._allConnections.length < this.config.connectionLimit) { + connection = new PoolConnection(this, { config: this.config.newConnectionConfig() }); + + this._acquiringConnections.push(connection); + this._allConnections.push(connection); + + connection.connect({timeout: this.config.acquireTimeout}, function onConnect(err) { + spliceConnection(pool._acquiringConnections, connection); + + if (pool._closed) { + err = new Error('Pool is closed.'); + err.code = 'POOL_CLOSED'; + } + + if (err) { + pool._purgeConnection(connection); + cb(err); + return; + } + + pool.emit('connection', connection); + pool.emit('acquire', connection); + cb(null, connection); + }); + return; + } + + if (!this.config.waitForConnections) { + process.nextTick(function(){ + var err = new Error('No connections available.'); + err.code = 'POOL_CONNLIMIT'; + cb(err); + }); + return; + } + + this._enqueueCallback(cb); +}; + +Pool.prototype.acquireConnection = function acquireConnection(connection, cb) { + if (connection._pool !== this) { + throw new Error('Connection acquired from wrong pool.'); + } + + var changeUser = this._needsChangeUser(connection); + var pool = this; + + this._acquiringConnections.push(connection); + + function onOperationComplete(err) { + spliceConnection(pool._acquiringConnections, connection); + + if (pool._closed) { + err = new Error('Pool is closed.'); + err.code = 'POOL_CLOSED'; + } + + if (err) { + pool._connectionQueue.unshift(cb); + pool._purgeConnection(connection); + return; + } + + if (changeUser) { + pool.emit('connection', connection); + } + + pool.emit('acquire', connection); + cb(null, connection); + } + + if (changeUser) { + // restore user back to pool configuration + connection.config = this.config.newConnectionConfig(); + connection.changeUser({timeout: this.config.acquireTimeout}, onOperationComplete); + } else { + // ping connection + connection.ping({timeout: this.config.acquireTimeout}, onOperationComplete); + } +}; + +Pool.prototype.releaseConnection = function releaseConnection(connection) { + + if (this._acquiringConnections.indexOf(connection) !== -1) { + // connection is being acquired + return; + } + + if (connection._pool) { + if (connection._pool !== this) { + throw new Error('Connection released to wrong pool'); + } + + if (this._freeConnections.indexOf(connection) !== -1) { + // connection already in free connection pool + // this won't catch all double-release cases + throw new Error('Connection already released'); + } else { + // add connection to end of free queue + this._freeConnections.push(connection); + this.emit('release', connection); + } + } + + if (this._closed) { + // empty the connection queue + this._connectionQueue.splice(0).forEach(function (cb) { + var err = new Error('Pool is closed.'); + err.code = 'POOL_CLOSED'; + process.nextTick(function () { + cb(err); + }); + }); + } else if (this._connectionQueue.length) { + // get connection with next waiting callback + this.getConnection(this._connectionQueue.shift()); + } +}; + +Pool.prototype.end = function (cb) { + this._closed = true; + + if (typeof cb !== 'function') { + cb = function (err) { + if (err) throw err; + }; + } + + var calledBack = false; + var waitingClose = 0; + + function onEnd(err) { + if (!calledBack && (err || --waitingClose <= 0)) { + calledBack = true; + cb(err); + } + } + + while (this._allConnections.length !== 0) { + waitingClose++; + this._purgeConnection(this._allConnections[0], onEnd); + } + + if (waitingClose === 0) { + process.nextTick(onEnd); + } +}; + +Pool.prototype.query = function (sql, values, cb) { + var query = Connection.createQuery(sql, values, cb); + + if (!(typeof sql === 'object' && 'typeCast' in sql)) { + query.typeCast = this.config.connectionConfig.typeCast; + } + + if (this.config.connectionConfig.trace) { + // Long stack trace support + query._callSite = new Error(); + } + + this.getConnection(function (err, conn) { + if (err) { + query.on('error', function () {}); + query.end(err); + return; + } + + // Release connection based off event + query.once('end', function() { + conn.release(); + }); + + conn.query(query); + }); + + return query; +}; + +Pool.prototype._enqueueCallback = function _enqueueCallback(callback) { + + if (this.config.queueLimit && this._connectionQueue.length >= this.config.queueLimit) { + process.nextTick(function () { + var err = new Error('Queue limit reached.'); + err.code = 'POOL_ENQUEUELIMIT'; + callback(err); + }); + return; + } + + // Bind to domain, as dequeue will likely occur in a different domain + var cb = process.domain + ? process.domain.bind(callback) + : callback; + + this._connectionQueue.push(cb); + this.emit('enqueue'); +}; + +Pool.prototype._needsChangeUser = function _needsChangeUser(connection) { + var connConfig = connection.config; + var poolConfig = this.config.connectionConfig; + + // check if changeUser values are different + return connConfig.user !== poolConfig.user + || connConfig.database !== poolConfig.database + || connConfig.password !== poolConfig.password + || connConfig.charsetNumber !== poolConfig.charsetNumber; +}; + +Pool.prototype._purgeConnection = function _purgeConnection(connection, callback) { + var cb = callback || function () {}; + + if (connection.state === 'disconnected') { + connection.destroy(); + } + + this._removeConnection(connection); + + if (connection.state !== 'disconnected' && !connection._protocol._quitSequence) { + connection._realEnd(cb); + return; + } + + process.nextTick(cb); +}; + +Pool.prototype._removeConnection = function(connection) { + connection._pool = null; + + // Remove connection from all connections + spliceConnection(this._allConnections, connection); + + // Remove connection from free connections + spliceConnection(this._freeConnections, connection); + + this.releaseConnection(connection); +}; + +Pool.prototype.escape = function(value) { + return mysql.escape(value, this.config.connectionConfig.stringifyObjects, this.config.connectionConfig.timezone); +}; + +Pool.prototype.escapeId = function escapeId(value) { + return mysql.escapeId(value, false); +}; + +function spliceConnection(array, connection) { + var index; + if ((index = array.indexOf(connection)) !== -1) { + // Remove connection from all connections + array.splice(index, 1); + } +} diff --git a/html/RentForCamp/node_modules/mysql/lib/PoolCluster.js b/html/RentForCamp/node_modules/mysql/lib/PoolCluster.js new file mode 100644 index 0000000..d0aed2c --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/PoolCluster.js @@ -0,0 +1,288 @@ +var Pool = require('./Pool'); +var PoolConfig = require('./PoolConfig'); +var PoolNamespace = require('./PoolNamespace'); +var PoolSelector = require('./PoolSelector'); +var Util = require('util'); +var EventEmitter = require('events').EventEmitter; + +module.exports = PoolCluster; + +/** + * PoolCluster + * @constructor + * @param {object} [config] The pool cluster configuration + * @public + */ +function PoolCluster(config) { + EventEmitter.call(this); + + config = config || {}; + this._canRetry = typeof config.canRetry === 'undefined' ? true : config.canRetry; + this._defaultSelector = config.defaultSelector || 'RR'; + this._removeNodeErrorCount = config.removeNodeErrorCount || 5; + this._restoreNodeTimeout = config.restoreNodeTimeout || 0; + + this._closed = false; + this._findCaches = Object.create(null); + this._lastId = 0; + this._namespaces = Object.create(null); + this._nodes = Object.create(null); +} + +Util.inherits(PoolCluster, EventEmitter); + +PoolCluster.prototype.add = function add(id, config) { + if (this._closed) { + throw new Error('PoolCluster is closed.'); + } + + var nodeId = typeof id === 'object' + ? 'CLUSTER::' + (++this._lastId) + : String(id); + + if (this._nodes[nodeId] !== undefined) { + throw new Error('Node ID "' + nodeId + '" is already defined in PoolCluster.'); + } + + var poolConfig = typeof id !== 'object' + ? new PoolConfig(config) + : new PoolConfig(id); + + this._nodes[nodeId] = { + id : nodeId, + errorCount : 0, + pool : new Pool({config: poolConfig}), + _offlineUntil : 0 + }; + + this._clearFindCaches(); +}; + +PoolCluster.prototype.end = function end(callback) { + var cb = callback !== undefined + ? callback + : _cb; + + if (typeof cb !== 'function') { + throw TypeError('callback argument must be a function'); + } + + if (this._closed) { + process.nextTick(cb); + return; + } + + this._closed = true; + + var calledBack = false; + var nodeIds = Object.keys(this._nodes); + var waitingClose = 0; + + function onEnd(err) { + if (!calledBack && (err || --waitingClose <= 0)) { + calledBack = true; + cb(err); + } + } + + for (var i = 0; i < nodeIds.length; i++) { + var nodeId = nodeIds[i]; + var node = this._nodes[nodeId]; + + waitingClose++; + node.pool.end(onEnd); + } + + if (waitingClose === 0) { + process.nextTick(onEnd); + } +}; + +PoolCluster.prototype.of = function(pattern, selector) { + pattern = pattern || '*'; + + selector = selector || this._defaultSelector; + selector = selector.toUpperCase(); + if (typeof PoolSelector[selector] === 'undefined') { + selector = this._defaultSelector; + } + + var key = pattern + selector; + + if (typeof this._namespaces[key] === 'undefined') { + this._namespaces[key] = new PoolNamespace(this, pattern, selector); + } + + return this._namespaces[key]; +}; + +PoolCluster.prototype.remove = function remove(pattern) { + var foundNodeIds = this._findNodeIds(pattern, true); + + for (var i = 0; i < foundNodeIds.length; i++) { + var node = this._getNode(foundNodeIds[i]); + + if (node) { + this._removeNode(node); + } + } +}; + +PoolCluster.prototype.getConnection = function(pattern, selector, cb) { + var namespace; + if (typeof pattern === 'function') { + cb = pattern; + namespace = this.of(); + } else { + if (typeof selector === 'function') { + cb = selector; + selector = this._defaultSelector; + } + + namespace = this.of(pattern, selector); + } + + namespace.getConnection(cb); +}; + +PoolCluster.prototype._clearFindCaches = function _clearFindCaches() { + this._findCaches = Object.create(null); +}; + +PoolCluster.prototype._decreaseErrorCount = function _decreaseErrorCount(node) { + var errorCount = node.errorCount; + + if (errorCount > this._removeNodeErrorCount) { + errorCount = this._removeNodeErrorCount; + } + + if (errorCount < 1) { + errorCount = 1; + } + + node.errorCount = errorCount - 1; + + if (node._offlineUntil) { + node._offlineUntil = 0; + this.emit('online', node.id); + } +}; + +PoolCluster.prototype._findNodeIds = function _findNodeIds(pattern, includeOffline) { + var currentTime = 0; + var foundNodeIds = this._findCaches[pattern]; + + if (foundNodeIds === undefined) { + var expression = patternRegExp(pattern); + var nodeIds = Object.keys(this._nodes); + + foundNodeIds = nodeIds.filter(function (id) { + return id.match(expression); + }); + + this._findCaches[pattern] = foundNodeIds; + } + + if (includeOffline) { + return foundNodeIds; + } + + return foundNodeIds.filter(function (nodeId) { + var node = this._getNode(nodeId); + + if (!node._offlineUntil) { + return true; + } + + if (!currentTime) { + currentTime = getMonotonicMilliseconds(); + } + + return node._offlineUntil <= currentTime; + }, this); +}; + +PoolCluster.prototype._getNode = function _getNode(id) { + return this._nodes[id] || null; +}; + +PoolCluster.prototype._increaseErrorCount = function _increaseErrorCount(node) { + var errorCount = ++node.errorCount; + + if (this._removeNodeErrorCount > errorCount) { + return; + } + + if (this._restoreNodeTimeout > 0) { + node._offlineUntil = getMonotonicMilliseconds() + this._restoreNodeTimeout; + this.emit('offline', node.id); + return; + } + + this._removeNode(node); + this.emit('remove', node.id); +}; + +PoolCluster.prototype._getConnection = function(node, cb) { + var self = this; + + node.pool.getConnection(function (err, connection) { + if (err) { + self._increaseErrorCount(node); + cb(err); + return; + } else { + self._decreaseErrorCount(node); + } + + connection._clusterId = node.id; + + cb(null, connection); + }); +}; + +PoolCluster.prototype._removeNode = function _removeNode(node) { + delete this._nodes[node.id]; + + this._clearFindCaches(); + + node.pool.end(_noop); +}; + +function getMonotonicMilliseconds() { + var ms; + + if (typeof process.hrtime === 'function') { + ms = process.hrtime(); + ms = ms[0] * 1e3 + ms[1] * 1e-6; + } else { + ms = process.uptime() * 1000; + } + + return Math.floor(ms); +} + +function isRegExp(val) { + return typeof val === 'object' + && Object.prototype.toString.call(val) === '[object RegExp]'; +} + +function patternRegExp(pattern) { + if (isRegExp(pattern)) { + return pattern; + } + + var source = pattern + .replace(/([.+?^=!:${}()|\[\]\/\\])/g, '\\$1') + .replace(/\*/g, '.*'); + + return new RegExp('^' + source + '$'); +} + +function _cb(err) { + if (err) { + throw err; + } +} + +function _noop() {} diff --git a/html/RentForCamp/node_modules/mysql/lib/PoolConfig.js b/html/RentForCamp/node_modules/mysql/lib/PoolConfig.js new file mode 100644 index 0000000..8c5017a --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/PoolConfig.js @@ -0,0 +1,32 @@ + +var ConnectionConfig = require('./ConnectionConfig'); + +module.exports = PoolConfig; +function PoolConfig(options) { + if (typeof options === 'string') { + options = ConnectionConfig.parseUrl(options); + } + + this.acquireTimeout = (options.acquireTimeout === undefined) + ? 10 * 1000 + : Number(options.acquireTimeout); + this.connectionConfig = new ConnectionConfig(options); + this.waitForConnections = (options.waitForConnections === undefined) + ? true + : Boolean(options.waitForConnections); + this.connectionLimit = (options.connectionLimit === undefined) + ? 10 + : Number(options.connectionLimit); + this.queueLimit = (options.queueLimit === undefined) + ? 0 + : Number(options.queueLimit); +} + +PoolConfig.prototype.newConnectionConfig = function newConnectionConfig() { + var connectionConfig = new ConnectionConfig(this.connectionConfig); + + connectionConfig.clientFlags = this.connectionConfig.clientFlags; + connectionConfig.maxPacketSize = this.connectionConfig.maxPacketSize; + + return connectionConfig; +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/PoolConnection.js b/html/RentForCamp/node_modules/mysql/lib/PoolConnection.js new file mode 100644 index 0000000..064c99d --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/PoolConnection.js @@ -0,0 +1,65 @@ +var inherits = require('util').inherits; +var Connection = require('./Connection'); +var Events = require('events'); + +module.exports = PoolConnection; +inherits(PoolConnection, Connection); + +function PoolConnection(pool, options) { + Connection.call(this, options); + this._pool = pool; + + // Bind connection to pool domain + if (Events.usingDomains) { + this.domain = pool.domain; + } + + // When a fatal error occurs the connection's protocol ends, which will cause + // the connection to end as well, thus we only need to watch for the end event + // and we will be notified of disconnects. + this.on('end', this._removeFromPool); + this.on('error', function (err) { + if (err.fatal) { + this._removeFromPool(); + } + }); +} + +PoolConnection.prototype.release = function release() { + var pool = this._pool; + + if (!pool || pool._closed) { + return undefined; + } + + return pool.releaseConnection(this); +}; + +// TODO: Remove this when we are removing PoolConnection#end +PoolConnection.prototype._realEnd = Connection.prototype.end; + +PoolConnection.prototype.end = function () { + console.warn( + 'Calling conn.end() to release a pooled connection is ' + + 'deprecated. In next version calling conn.end() will be ' + + 'restored to default conn.end() behavior. Use ' + + 'conn.release() instead.' + ); + this.release(); +}; + +PoolConnection.prototype.destroy = function () { + Connection.prototype.destroy.apply(this, arguments); + this._removeFromPool(this); +}; + +PoolConnection.prototype._removeFromPool = function _removeFromPool() { + if (!this._pool || this._pool._closed) { + return; + } + + var pool = this._pool; + this._pool = null; + + pool._purgeConnection(this); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/PoolNamespace.js b/html/RentForCamp/node_modules/mysql/lib/PoolNamespace.js new file mode 100644 index 0000000..d3ea786 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/PoolNamespace.js @@ -0,0 +1,136 @@ +var Connection = require('./Connection'); +var PoolSelector = require('./PoolSelector'); + +module.exports = PoolNamespace; + +/** + * PoolNamespace + * @constructor + * @param {PoolCluster} cluster The parent cluster for the namespace + * @param {string} pattern The selection pattern to use + * @param {string} selector The selector name to use + * @public + */ +function PoolNamespace(cluster, pattern, selector) { + this._cluster = cluster; + this._pattern = pattern; + this._selector = new PoolSelector[selector](); +} + +PoolNamespace.prototype.getConnection = function(cb) { + var clusterNode = this._getClusterNode(); + var cluster = this._cluster; + var namespace = this; + + if (clusterNode === null) { + var err = null; + + if (this._cluster._findNodeIds(this._pattern, true).length !== 0) { + err = new Error('Pool does not have online node.'); + err.code = 'POOL_NONEONLINE'; + } else { + err = new Error('Pool does not exist.'); + err.code = 'POOL_NOEXIST'; + } + + cb(err); + return; + } + + cluster._getConnection(clusterNode, function(err, connection) { + var retry = err && cluster._canRetry + && cluster._findNodeIds(namespace._pattern).length !== 0; + + if (retry) { + namespace.getConnection(cb); + return; + } + + if (err) { + cb(err); + return; + } + + cb(null, connection); + }); +}; + +PoolNamespace.prototype.query = function (sql, values, cb) { + var cluster = this._cluster; + var clusterNode = this._getClusterNode(); + var query = Connection.createQuery(sql, values, cb); + var namespace = this; + + if (clusterNode === null) { + var err = null; + + if (this._cluster._findNodeIds(this._pattern, true).length !== 0) { + err = new Error('Pool does not have online node.'); + err.code = 'POOL_NONEONLINE'; + } else { + err = new Error('Pool does not exist.'); + err.code = 'POOL_NOEXIST'; + } + + process.nextTick(function () { + query.on('error', function () {}); + query.end(err); + }); + return query; + } + + if (!(typeof sql === 'object' && 'typeCast' in sql)) { + query.typeCast = clusterNode.pool.config.connectionConfig.typeCast; + } + + if (clusterNode.pool.config.connectionConfig.trace) { + // Long stack trace support + query._callSite = new Error(); + } + + cluster._getConnection(clusterNode, function (err, conn) { + var retry = err && cluster._canRetry + && cluster._findNodeIds(namespace._pattern).length !== 0; + + if (retry) { + namespace.query(query); + return; + } + + if (err) { + query.on('error', function () {}); + query.end(err); + return; + } + + // Release connection based off event + query.once('end', function() { + conn.release(); + }); + + conn.query(query); + }); + + return query; +}; + +PoolNamespace.prototype._getClusterNode = function _getClusterNode() { + var foundNodeIds = this._cluster._findNodeIds(this._pattern); + var nodeId; + + switch (foundNodeIds.length) { + case 0: + nodeId = null; + break; + case 1: + nodeId = foundNodeIds[0]; + break; + default: + nodeId = this._selector(foundNodeIds); + break; + } + + return nodeId !== null + ? this._cluster._getNode(nodeId) + : null; +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/PoolSelector.js b/html/RentForCamp/node_modules/mysql/lib/PoolSelector.js new file mode 100644 index 0000000..9a3c455 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/PoolSelector.js @@ -0,0 +1,31 @@ + +/** + * PoolSelector + */ +var PoolSelector = module.exports = {}; + +PoolSelector.RR = function PoolSelectorRoundRobin() { + var index = 0; + + return function(clusterIds) { + if (index >= clusterIds.length) { + index = 0; + } + + var clusterId = clusterIds[index++]; + + return clusterId; + }; +}; + +PoolSelector.RANDOM = function PoolSelectorRandom() { + return function(clusterIds) { + return clusterIds[Math.floor(Math.random() * clusterIds.length)]; + }; +}; + +PoolSelector.ORDER = function PoolSelectorOrder() { + return function(clusterIds) { + return clusterIds[0]; + }; +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/Auth.js b/html/RentForCamp/node_modules/mysql/lib/protocol/Auth.js new file mode 100644 index 0000000..e00e893 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/Auth.js @@ -0,0 +1,152 @@ +var Buffer = require('safe-buffer').Buffer; +var Crypto = require('crypto'); +var Auth = exports; + +function sha1(msg) { + var hash = Crypto.createHash('sha1'); + hash.update(msg, 'binary'); + return hash.digest('binary'); +} +Auth.sha1 = sha1; + +function xor(a, b) { + a = Buffer.from(a, 'binary'); + b = Buffer.from(b, 'binary'); + var result = Buffer.allocUnsafe(a.length); + for (var i = 0; i < a.length; i++) { + result[i] = (a[i] ^ b[i]); + } + return result; +} +Auth.xor = xor; + +Auth.token = function(password, scramble) { + if (!password) { + return Buffer.alloc(0); + } + + // password must be in binary format, not utf8 + var stage1 = sha1((Buffer.from(password, 'utf8')).toString('binary')); + var stage2 = sha1(stage1); + var stage3 = sha1(scramble.toString('binary') + stage2); + return xor(stage3, stage1); +}; + +// This is a port of sql/password.c:hash_password which needs to be used for +// pre-4.1 passwords. +Auth.hashPassword = function(password) { + var nr = [0x5030, 0x5735]; + var add = 7; + var nr2 = [0x1234, 0x5671]; + var result = Buffer.alloc(8); + + if (typeof password === 'string'){ + password = Buffer.from(password); + } + + for (var i = 0; i < password.length; i++) { + var c = password[i]; + if (c === 32 || c === 9) { + // skip space in password + continue; + } + + // nr^= (((nr & 63)+add)*c)+ (nr << 8); + // nr = xor(nr, add(mul(add(and(nr, 63), add), c), shl(nr, 8))) + nr = this.xor32(nr, this.add32(this.mul32(this.add32(this.and32(nr, [0, 63]), [0, add]), [0, c]), this.shl32(nr, 8))); + + // nr2+=(nr2 << 8) ^ nr; + // nr2 = add(nr2, xor(shl(nr2, 8), nr)) + nr2 = this.add32(nr2, this.xor32(this.shl32(nr2, 8), nr)); + + // add+=tmp; + add += c; + } + + this.int31Write(result, nr, 0); + this.int31Write(result, nr2, 4); + + return result; +}; + +Auth.randomInit = function(seed1, seed2) { + return { + max_value : 0x3FFFFFFF, + max_value_dbl : 0x3FFFFFFF, + seed1 : seed1 % 0x3FFFFFFF, + seed2 : seed2 % 0x3FFFFFFF + }; +}; + +Auth.myRnd = function(r){ + r.seed1 = (r.seed1 * 3 + r.seed2) % r.max_value; + r.seed2 = (r.seed1 + r.seed2 + 33) % r.max_value; + + return r.seed1 / r.max_value_dbl; +}; + +Auth.scramble323 = function(message, password) { + var to = Buffer.allocUnsafe(8); + var hashPass = this.hashPassword(password); + var hashMessage = this.hashPassword(message.slice(0, 8)); + var seed1 = this.int32Read(hashPass, 0) ^ this.int32Read(hashMessage, 0); + var seed2 = this.int32Read(hashPass, 4) ^ this.int32Read(hashMessage, 4); + var r = this.randomInit(seed1, seed2); + + for (var i = 0; i < 8; i++){ + to[i] = Math.floor(this.myRnd(r) * 31) + 64; + } + var extra = (Math.floor(this.myRnd(r) * 31)); + + for (var i = 0; i < 8; i++){ + to[i] ^= extra; + } + + return to; +}; + +Auth.xor32 = function(a, b){ + return [a[0] ^ b[0], a[1] ^ b[1]]; +}; + +Auth.add32 = function(a, b){ + var w1 = a[1] + b[1]; + var w2 = a[0] + b[0] + ((w1 & 0xFFFF0000) >> 16); + + return [w2 & 0xFFFF, w1 & 0xFFFF]; +}; + +Auth.mul32 = function(a, b){ + // based on this example of multiplying 32b ints using 16b + // http://www.dsprelated.com/showmessage/89790/1.php + var w1 = a[1] * b[1]; + var w2 = (((a[1] * b[1]) >> 16) & 0xFFFF) + ((a[0] * b[1]) & 0xFFFF) + (a[1] * b[0] & 0xFFFF); + + return [w2 & 0xFFFF, w1 & 0xFFFF]; +}; + +Auth.and32 = function(a, b){ + return [a[0] & b[0], a[1] & b[1]]; +}; + +Auth.shl32 = function(a, b){ + // assume b is 16 or less + var w1 = a[1] << b; + var w2 = (a[0] << b) | ((w1 & 0xFFFF0000) >> 16); + + return [w2 & 0xFFFF, w1 & 0xFFFF]; +}; + +Auth.int31Write = function(buffer, number, offset) { + buffer[offset] = (number[0] >> 8) & 0x7F; + buffer[offset + 1] = (number[0]) & 0xFF; + buffer[offset + 2] = (number[1] >> 8) & 0xFF; + buffer[offset + 3] = (number[1]) & 0xFF; +}; + +Auth.int32Read = function(buffer, offset){ + return (buffer[offset] << 24) + + (buffer[offset + 1] << 16) + + (buffer[offset + 2] << 8) + + (buffer[offset + 3]); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/BufferList.js b/html/RentForCamp/node_modules/mysql/lib/protocol/BufferList.js new file mode 100644 index 0000000..3cd0192 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/BufferList.js @@ -0,0 +1,25 @@ + +module.exports = BufferList; +function BufferList() { + this.bufs = []; + this.size = 0; +} + +BufferList.prototype.shift = function shift() { + var buf = this.bufs.shift(); + + if (buf) { + this.size -= buf.length; + } + + return buf; +}; + +BufferList.prototype.push = function push(buf) { + if (!buf || !buf.length) { + return; + } + + this.bufs.push(buf); + this.size += buf.length; +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/PacketHeader.js b/html/RentForCamp/node_modules/mysql/lib/protocol/PacketHeader.js new file mode 100644 index 0000000..1bb282e --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/PacketHeader.js @@ -0,0 +1,5 @@ +module.exports = PacketHeader; +function PacketHeader(length, number) { + this.length = length; + this.number = number; +} diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/PacketWriter.js b/html/RentForCamp/node_modules/mysql/lib/protocol/PacketWriter.js new file mode 100644 index 0000000..4d0afd2 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/PacketWriter.js @@ -0,0 +1,211 @@ +var BIT_16 = Math.pow(2, 16); +var BIT_24 = Math.pow(2, 24); +var BUFFER_ALLOC_SIZE = Math.pow(2, 8); +// The maximum precision JS Numbers can hold precisely +// Don't panic: Good enough to represent byte values up to 8192 TB +var IEEE_754_BINARY_64_PRECISION = Math.pow(2, 53); +var MAX_PACKET_LENGTH = Math.pow(2, 24) - 1; +var Buffer = require('safe-buffer').Buffer; + +module.exports = PacketWriter; +function PacketWriter() { + this._buffer = null; + this._offset = 0; +} + +PacketWriter.prototype.toBuffer = function toBuffer(parser) { + if (!this._buffer) { + this._buffer = Buffer.alloc(0); + this._offset = 0; + } + + var buffer = this._buffer; + var length = this._offset; + var packets = Math.floor(length / MAX_PACKET_LENGTH) + 1; + + this._buffer = Buffer.allocUnsafe(length + packets * 4); + this._offset = 0; + + for (var packet = 0; packet < packets; packet++) { + var isLast = (packet + 1 === packets); + var packetLength = (isLast) + ? length % MAX_PACKET_LENGTH + : MAX_PACKET_LENGTH; + + var packetNumber = parser.incrementPacketNumber(); + + this.writeUnsignedNumber(3, packetLength); + this.writeUnsignedNumber(1, packetNumber); + + var start = packet * MAX_PACKET_LENGTH; + var end = start + packetLength; + + this.writeBuffer(buffer.slice(start, end)); + } + + return this._buffer; +}; + +PacketWriter.prototype.writeUnsignedNumber = function(bytes, value) { + this._allocate(bytes); + + for (var i = 0; i < bytes; i++) { + this._buffer[this._offset++] = (value >> (i * 8)) & 0xff; + } +}; + +PacketWriter.prototype.writeFiller = function(bytes) { + this._allocate(bytes); + + for (var i = 0; i < bytes; i++) { + this._buffer[this._offset++] = 0x00; + } +}; + +PacketWriter.prototype.writeNullTerminatedString = function(value, encoding) { + // Typecast undefined into '' and numbers into strings + value = value || ''; + value = value + ''; + + var bytes = Buffer.byteLength(value, encoding || 'utf-8') + 1; + this._allocate(bytes); + + this._buffer.write(value, this._offset, encoding); + this._buffer[this._offset + bytes - 1] = 0x00; + + this._offset += bytes; +}; + +PacketWriter.prototype.writeString = function(value) { + // Typecast undefined into '' and numbers into strings + value = value || ''; + value = value + ''; + + var bytes = Buffer.byteLength(value, 'utf-8'); + this._allocate(bytes); + + this._buffer.write(value, this._offset, 'utf-8'); + + this._offset += bytes; +}; + +PacketWriter.prototype.writeBuffer = function(value) { + var bytes = value.length; + + this._allocate(bytes); + value.copy(this._buffer, this._offset); + this._offset += bytes; +}; + +PacketWriter.prototype.writeLengthCodedNumber = function(value) { + if (value === null) { + this._allocate(1); + this._buffer[this._offset++] = 251; + return; + } + + if (value <= 250) { + this._allocate(1); + this._buffer[this._offset++] = value; + return; + } + + if (value > IEEE_754_BINARY_64_PRECISION) { + throw new Error( + 'writeLengthCodedNumber: JS precision range exceeded, your ' + + 'number is > 53 bit: "' + value + '"' + ); + } + + if (value < BIT_16) { + this._allocate(3); + this._buffer[this._offset++] = 252; + } else if (value < BIT_24) { + this._allocate(4); + this._buffer[this._offset++] = 253; + } else { + this._allocate(9); + this._buffer[this._offset++] = 254; + } + + // 16 Bit + this._buffer[this._offset++] = value & 0xff; + this._buffer[this._offset++] = (value >> 8) & 0xff; + + if (value < BIT_16) { + return; + } + + // 24 Bit + this._buffer[this._offset++] = (value >> 16) & 0xff; + + if (value < BIT_24) { + return; + } + + this._buffer[this._offset++] = (value >> 24) & 0xff; + + // Hack: Get the most significant 32 bit (JS bitwise operators are 32 bit) + value = value.toString(2); + value = value.substr(0, value.length - 32); + value = parseInt(value, 2); + + this._buffer[this._offset++] = value & 0xff; + this._buffer[this._offset++] = (value >> 8) & 0xff; + this._buffer[this._offset++] = (value >> 16) & 0xff; + + // Set last byte to 0, as we can only support 53 bits in JS (see above) + this._buffer[this._offset++] = 0; +}; + +PacketWriter.prototype.writeLengthCodedBuffer = function(value) { + var bytes = value.length; + this.writeLengthCodedNumber(bytes); + this.writeBuffer(value); +}; + +PacketWriter.prototype.writeNullTerminatedBuffer = function(value) { + this.writeBuffer(value); + this.writeFiller(1); // 0x00 terminator +}; + +PacketWriter.prototype.writeLengthCodedString = function(value) { + if (value === null) { + this.writeLengthCodedNumber(null); + return; + } + + value = (value === undefined) + ? '' + : String(value); + + var bytes = Buffer.byteLength(value, 'utf-8'); + this.writeLengthCodedNumber(bytes); + + if (!bytes) { + return; + } + + this._allocate(bytes); + this._buffer.write(value, this._offset, 'utf-8'); + this._offset += bytes; +}; + +PacketWriter.prototype._allocate = function _allocate(bytes) { + if (!this._buffer) { + this._buffer = Buffer.alloc(Math.max(BUFFER_ALLOC_SIZE, bytes)); + this._offset = 0; + return; + } + + var bytesRemaining = this._buffer.length - this._offset; + if (bytesRemaining >= bytes) { + return; + } + + var newSize = this._buffer.length + Math.max(BUFFER_ALLOC_SIZE, bytes); + var oldBuffer = this._buffer; + + this._buffer = Buffer.alloc(newSize); + oldBuffer.copy(this._buffer); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/Parser.js b/html/RentForCamp/node_modules/mysql/lib/protocol/Parser.js new file mode 100644 index 0000000..a7f5859 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/Parser.js @@ -0,0 +1,476 @@ +var MAX_PACKET_LENGTH = Math.pow(2, 24) - 1; +var MUL_32BIT = Math.pow(2, 32); +var PacketHeader = require('./PacketHeader'); +var BigNumber = require('bignumber.js'); +var Buffer = require('safe-buffer').Buffer; +var BufferList = require('./BufferList'); + +module.exports = Parser; +function Parser(options) { + options = options || {}; + + this._supportBigNumbers = options.config && options.config.supportBigNumbers; + this._buffer = Buffer.alloc(0); + this._nextBuffers = new BufferList(); + this._longPacketBuffers = new BufferList(); + this._offset = 0; + this._packetEnd = null; + this._packetHeader = null; + this._packetOffset = null; + this._onError = options.onError || function(err) { throw err; }; + this._onPacket = options.onPacket || function() {}; + this._nextPacketNumber = 0; + this._encoding = 'utf-8'; + this._paused = false; +} + +Parser.prototype.write = function write(chunk) { + this._nextBuffers.push(chunk); + + while (!this._paused) { + if (!this._packetHeader) { + if (!this._combineNextBuffers(4)) { + break; + } + + this._packetHeader = new PacketHeader( + this.parseUnsignedNumber(3), + this.parseUnsignedNumber(1) + ); + + if (this._packetHeader.number !== this._nextPacketNumber) { + var err = new Error( + 'Packets out of order. Got: ' + this._packetHeader.number + ' ' + + 'Expected: ' + this._nextPacketNumber + ); + + err.code = 'PROTOCOL_PACKETS_OUT_OF_ORDER'; + err.fatal = true; + + this._onError(err); + } + + this.incrementPacketNumber(); + } + + if (!this._combineNextBuffers(this._packetHeader.length)) { + break; + } + + this._packetEnd = this._offset + this._packetHeader.length; + this._packetOffset = this._offset; + + if (this._packetHeader.length === MAX_PACKET_LENGTH) { + this._longPacketBuffers.push(this._buffer.slice(this._packetOffset, this._packetEnd)); + + this._advanceToNextPacket(); + continue; + } + + this._combineLongPacketBuffers(); + + // Try...finally to ensure exception safety. Unfortunately this is costing + // us up to ~10% performance in some benchmarks. + var hadException = true; + try { + this._onPacket(this._packetHeader); + hadException = false; + } catch (err) { + if (!err || typeof err.code !== 'string' || err.code.substr(0, 7) !== 'PARSER_') { + throw err; // Rethrow non-MySQL errors + } + + // Pass down parser errors + this._onError(err); + hadException = false; + } finally { + this._advanceToNextPacket(); + + // If we had an exception, the parser while loop will be broken out + // of after the finally block. So we need to make sure to re-enter it + // to continue parsing any bytes that may already have been received. + if (hadException) { + process.nextTick(this.write.bind(this)); + } + } + } +}; + +Parser.prototype.append = function append(chunk) { + if (!chunk || chunk.length === 0) { + return; + } + + // Calculate slice ranges + var sliceEnd = this._buffer.length; + var sliceStart = this._packetOffset === null + ? this._offset + : this._packetOffset; + var sliceLength = sliceEnd - sliceStart; + + // Get chunk data + var buffer = null; + var chunks = !(chunk instanceof Array || Array.isArray(chunk)) ? [chunk] : chunk; + var length = 0; + var offset = 0; + + for (var i = 0; i < chunks.length; i++) { + length += chunks[i].length; + } + + if (sliceLength !== 0) { + // Create a new Buffer + buffer = Buffer.allocUnsafe(sliceLength + length); + offset = 0; + + // Copy data slice + offset += this._buffer.copy(buffer, 0, sliceStart, sliceEnd); + + // Copy chunks + for (var i = 0; i < chunks.length; i++) { + offset += chunks[i].copy(buffer, offset); + } + } else if (chunks.length > 1) { + // Create a new Buffer + buffer = Buffer.allocUnsafe(length); + offset = 0; + + // Copy chunks + for (var i = 0; i < chunks.length; i++) { + offset += chunks[i].copy(buffer, offset); + } + } else { + // Buffer is the only chunk + buffer = chunks[0]; + } + + // Adjust data-tracking pointers + this._buffer = buffer; + this._offset = this._offset - sliceStart; + this._packetEnd = this._packetEnd !== null + ? this._packetEnd - sliceStart + : null; + this._packetOffset = this._packetOffset !== null + ? this._packetOffset - sliceStart + : null; +}; + +Parser.prototype.pause = function() { + this._paused = true; +}; + +Parser.prototype.resume = function() { + this._paused = false; + + // nextTick() to avoid entering write() multiple times within the same stack + // which would cause problems as write manipulates the state of the object. + process.nextTick(this.write.bind(this)); +}; + +Parser.prototype.peak = function peak(offset) { + return this._buffer[this._offset + (offset >>> 0)]; +}; + +Parser.prototype.parseUnsignedNumber = function parseUnsignedNumber(bytes) { + if (bytes === 1) { + return this._buffer[this._offset++]; + } + + var buffer = this._buffer; + var offset = this._offset + bytes - 1; + var value = 0; + + if (bytes > 4) { + var err = new Error('parseUnsignedNumber: Supports only up to 4 bytes'); + err.offset = (this._offset - this._packetOffset - 1); + err.code = 'PARSER_UNSIGNED_TOO_LONG'; + throw err; + } + + while (offset >= this._offset) { + value = ((value << 8) | buffer[offset]) >>> 0; + offset--; + } + + this._offset += bytes; + + return value; +}; + +Parser.prototype.parseLengthCodedString = function() { + var length = this.parseLengthCodedNumber(); + + if (length === null) { + return null; + } + + return this.parseString(length); +}; + +Parser.prototype.parseLengthCodedBuffer = function() { + var length = this.parseLengthCodedNumber(); + + if (length === null) { + return null; + } + + return this.parseBuffer(length); +}; + +Parser.prototype.parseLengthCodedNumber = function parseLengthCodedNumber() { + if (this._offset >= this._buffer.length) { + var err = new Error('Parser: read past end'); + err.offset = (this._offset - this._packetOffset); + err.code = 'PARSER_READ_PAST_END'; + throw err; + } + + var bits = this._buffer[this._offset++]; + + if (bits <= 250) { + return bits; + } + + switch (bits) { + case 251: + return null; + case 252: + return this.parseUnsignedNumber(2); + case 253: + return this.parseUnsignedNumber(3); + case 254: + break; + default: + var err = new Error('Unexpected first byte' + (bits ? ': 0x' + bits.toString(16) : '')); + err.offset = (this._offset - this._packetOffset - 1); + err.code = 'PARSER_BAD_LENGTH_BYTE'; + throw err; + } + + var low = this.parseUnsignedNumber(4); + var high = this.parseUnsignedNumber(4); + var value; + + if (high >>> 21) { + value = (new BigNumber(low)).plus((new BigNumber(MUL_32BIT)).times(high)).toString(); + + if (this._supportBigNumbers) { + return value; + } + + var err = new Error( + 'parseLengthCodedNumber: JS precision range exceeded, ' + + 'number is >= 53 bit: "' + value + '"' + ); + err.offset = (this._offset - this._packetOffset - 8); + err.code = 'PARSER_JS_PRECISION_RANGE_EXCEEDED'; + throw err; + } + + value = low + (MUL_32BIT * high); + + return value; +}; + +Parser.prototype.parseFiller = function(length) { + return this.parseBuffer(length); +}; + +Parser.prototype.parseNullTerminatedBuffer = function() { + var end = this._nullByteOffset(); + var value = this._buffer.slice(this._offset, end); + this._offset = end + 1; + + return value; +}; + +Parser.prototype.parseNullTerminatedString = function() { + var end = this._nullByteOffset(); + var value = this._buffer.toString(this._encoding, this._offset, end); + this._offset = end + 1; + + return value; +}; + +Parser.prototype._nullByteOffset = function() { + var offset = this._offset; + + while (this._buffer[offset] !== 0x00) { + offset++; + + if (offset >= this._buffer.length) { + var err = new Error('Offset of null terminated string not found.'); + err.offset = (this._offset - this._packetOffset); + err.code = 'PARSER_MISSING_NULL_BYTE'; + throw err; + } + } + + return offset; +}; + +Parser.prototype.parsePacketTerminatedBuffer = function parsePacketTerminatedBuffer() { + var length = this._packetEnd - this._offset; + return this.parseBuffer(length); +}; + +Parser.prototype.parsePacketTerminatedString = function() { + var length = this._packetEnd - this._offset; + return this.parseString(length); +}; + +Parser.prototype.parseBuffer = function(length) { + var response = Buffer.alloc(length); + this._buffer.copy(response, 0, this._offset, this._offset + length); + + this._offset += length; + return response; +}; + +Parser.prototype.parseString = function(length) { + var offset = this._offset; + var end = offset + length; + var value = this._buffer.toString(this._encoding, offset, end); + + this._offset = end; + return value; +}; + +Parser.prototype.parseGeometryValue = function() { + var buffer = this.parseLengthCodedBuffer(); + var offset = 4; + + if (buffer === null || !buffer.length) { + return null; + } + + function parseGeometry() { + var result = null; + var byteOrder = buffer.readUInt8(offset); offset += 1; + var wkbType = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + switch (wkbType) { + case 1: // WKBPoint + var x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + var y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + result = {x: x, y: y}; + break; + case 2: // WKBLineString + var numPoints = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + result = []; + for (var i = numPoints; i > 0; i--) { + var x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + var y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + result.push({x: x, y: y}); + } + break; + case 3: // WKBPolygon + var numRings = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + result = []; + for (var i = numRings; i > 0; i--) { + var numPoints = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + var line = []; + for (var j = numPoints; j > 0; j--) { + var x = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + var y = byteOrder ? buffer.readDoubleLE(offset) : buffer.readDoubleBE(offset); offset += 8; + line.push({x: x, y: y}); + } + result.push(line); + } + break; + case 4: // WKBMultiPoint + case 5: // WKBMultiLineString + case 6: // WKBMultiPolygon + case 7: // WKBGeometryCollection + var num = byteOrder ? buffer.readUInt32LE(offset) : buffer.readUInt32BE(offset); offset += 4; + var result = []; + for (var i = num; i > 0; i--) { + result.push(parseGeometry()); + } + break; + } + return result; + } + return parseGeometry(); +}; + +Parser.prototype.reachedPacketEnd = function() { + return this._offset === this._packetEnd; +}; + +Parser.prototype.incrementPacketNumber = function() { + var currentPacketNumber = this._nextPacketNumber; + this._nextPacketNumber = (this._nextPacketNumber + 1) % 256; + + return currentPacketNumber; +}; + +Parser.prototype.resetPacketNumber = function() { + this._nextPacketNumber = 0; +}; + +Parser.prototype.packetLength = function packetLength() { + if (!this._packetHeader) { + return null; + } + + return this._packetHeader.length + this._longPacketBuffers.size; +}; + +Parser.prototype._combineNextBuffers = function _combineNextBuffers(bytes) { + var length = this._buffer.length - this._offset; + + if (length >= bytes) { + return true; + } + + if ((length + this._nextBuffers.size) < bytes) { + return false; + } + + var buffers = []; + var bytesNeeded = bytes - length; + + while (bytesNeeded > 0) { + var buffer = this._nextBuffers.shift(); + buffers.push(buffer); + bytesNeeded -= buffer.length; + } + + this.append(buffers); + return true; +}; + +Parser.prototype._combineLongPacketBuffers = function _combineLongPacketBuffers() { + if (!this._longPacketBuffers.size) { + return; + } + + // Calculate bytes + var remainingBytes = this._buffer.length - this._offset; + var trailingPacketBytes = this._buffer.length - this._packetEnd; + + // Create buffer + var buf = null; + var buffer = Buffer.allocUnsafe(remainingBytes + this._longPacketBuffers.size); + var offset = 0; + + // Copy long buffers + while ((buf = this._longPacketBuffers.shift())) { + offset += buf.copy(buffer, offset); + } + + // Copy remaining bytes + this._buffer.copy(buffer, offset, this._offset); + + this._buffer = buffer; + this._offset = 0; + this._packetEnd = this._buffer.length - trailingPacketBytes; + this._packetOffset = 0; +}; + +Parser.prototype._advanceToNextPacket = function() { + this._offset = this._packetEnd; + this._packetHeader = null; + this._packetEnd = null; + this._packetOffset = null; +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/Protocol.js b/html/RentForCamp/node_modules/mysql/lib/protocol/Protocol.js new file mode 100644 index 0000000..5db4f56 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/Protocol.js @@ -0,0 +1,457 @@ +var Parser = require('./Parser'); +var Sequences = require('./sequences'); +var Packets = require('./packets'); +var Stream = require('stream').Stream; +var Util = require('util'); +var PacketWriter = require('./PacketWriter'); + +module.exports = Protocol; +Util.inherits(Protocol, Stream); +function Protocol(options) { + Stream.call(this); + + options = options || {}; + + this.readable = true; + this.writable = true; + + this._config = options.config || {}; + this._connection = options.connection; + this._callback = null; + this._fatalError = null; + this._quitSequence = null; + this._handshake = false; + this._handshaked = false; + this._ended = false; + this._destroyed = false; + this._queue = []; + this._handshakeInitializationPacket = null; + + this._parser = new Parser({ + onError : this.handleParserError.bind(this), + onPacket : this._parsePacket.bind(this), + config : this._config + }); +} + +Protocol.prototype.write = function(buffer) { + this._parser.write(buffer); + return true; +}; + +Protocol.prototype.handshake = function handshake(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + options = options || {}; + options.config = this._config; + + var sequence = this._enqueue(new Sequences.Handshake(options, callback)); + + this._handshake = true; + + return sequence; +}; + +Protocol.prototype.query = function query(options, callback) { + return this._enqueue(new Sequences.Query(options, callback)); +}; + +Protocol.prototype.changeUser = function changeUser(options, callback) { + return this._enqueue(new Sequences.ChangeUser(options, callback)); +}; + +Protocol.prototype.ping = function ping(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + return this._enqueue(new Sequences.Ping(options, callback)); +}; + +Protocol.prototype.stats = function stats(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + return this._enqueue(new Sequences.Statistics(options, callback)); +}; + +Protocol.prototype.quit = function quit(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + var self = this; + var sequence = this._enqueue(new Sequences.Quit(options, callback)); + + sequence.on('end', function () { + self.end(); + }); + + return this._quitSequence = sequence; +}; + +Protocol.prototype.end = function() { + if (this._ended) { + return; + } + this._ended = true; + + if (this._quitSequence && (this._quitSequence._ended || this._queue[0] === this._quitSequence)) { + this._quitSequence.end(); + this.emit('end'); + return; + } + + var err = new Error('Connection lost: The server closed the connection.'); + err.fatal = true; + err.code = 'PROTOCOL_CONNECTION_LOST'; + + this._delegateError(err); +}; + +Protocol.prototype.pause = function() { + this._parser.pause(); + // Since there is a file stream in query, we must transmit pause/resume event to current sequence. + var seq = this._queue[0]; + if (seq && seq.emit) { + seq.emit('pause'); + } +}; + +Protocol.prototype.resume = function() { + this._parser.resume(); + // Since there is a file stream in query, we must transmit pause/resume event to current sequence. + var seq = this._queue[0]; + if (seq && seq.emit) { + seq.emit('resume'); + } +}; + +Protocol.prototype._enqueue = function(sequence) { + if (!this._validateEnqueue(sequence)) { + return sequence; + } + + if (this._config.trace) { + // Long stack trace support + sequence._callSite = sequence._callSite || new Error(); + } + + this._queue.push(sequence); + this.emit('enqueue', sequence); + + var self = this; + sequence + .on('error', function(err) { + self._delegateError(err, sequence); + }) + .on('packet', function(packet) { + sequence._timer.active(); + self._emitPacket(packet); + }) + .on('end', function() { + self._dequeue(sequence); + }) + .on('timeout', function() { + var err = new Error(sequence.constructor.name + ' inactivity timeout'); + + err.code = 'PROTOCOL_SEQUENCE_TIMEOUT'; + err.fatal = true; + err.timeout = sequence._timeout; + + self._delegateError(err, sequence); + }) + .on('start-tls', function() { + sequence._timer.active(); + self._connection._startTLS(function(err) { + if (err) { + // SSL negotiation error are fatal + err.code = 'HANDSHAKE_SSL_ERROR'; + err.fatal = true; + sequence.end(err); + return; + } + + sequence._timer.active(); + sequence._tlsUpgradeCompleteHandler(); + }); + }); + + if (this._queue.length === 1) { + this._parser.resetPacketNumber(); + this._startSequence(sequence); + } + + return sequence; +}; + +Protocol.prototype._validateEnqueue = function _validateEnqueue(sequence) { + var err; + var prefix = 'Cannot enqueue ' + sequence.constructor.name; + + if (this._fatalError) { + err = new Error(prefix + ' after fatal error.'); + err.code = 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR'; + } else if (this._quitSequence) { + err = new Error(prefix + ' after invoking quit.'); + err.code = 'PROTOCOL_ENQUEUE_AFTER_QUIT'; + } else if (this._destroyed) { + err = new Error(prefix + ' after being destroyed.'); + err.code = 'PROTOCOL_ENQUEUE_AFTER_DESTROY'; + } else if ((this._handshake || this._handshaked) && sequence.constructor === Sequences.Handshake) { + err = new Error(prefix + ' after already enqueuing a Handshake.'); + err.code = 'PROTOCOL_ENQUEUE_HANDSHAKE_TWICE'; + } else { + return true; + } + + var self = this; + err.fatal = false; + + // add error handler + sequence.on('error', function (err) { + self._delegateError(err, sequence); + }); + + process.nextTick(function () { + sequence.end(err); + }); + + return false; +}; + +Protocol.prototype._parsePacket = function() { + var sequence = this._queue[0]; + + if (!sequence) { + var err = new Error('Received packet with no active sequence.'); + err.code = 'PROTOCOL_STRAY_PACKET'; + err.fatal = true; + + this._delegateError(err); + return; + } + + var Packet = this._determinePacket(sequence); + var packet = new Packet({protocol41: this._config.protocol41}); + var packetName = Packet.name; + + // Special case: Faster dispatch, and parsing done inside sequence + if (Packet === Packets.RowDataPacket) { + sequence.RowDataPacket(packet, this._parser, this._connection); + + if (this._config.debug) { + this._debugPacket(true, packet); + } + + return; + } + + if (this._config.debug) { + this._parsePacketDebug(packet); + } else { + packet.parse(this._parser); + } + + if (Packet === Packets.HandshakeInitializationPacket) { + this._handshakeInitializationPacket = packet; + } + + sequence._timer.active(); + + if (!sequence[packetName]) { + var err = new Error('Received packet in the wrong sequence.'); + err.code = 'PROTOCOL_INCORRECT_PACKET_SEQUENCE'; + err.fatal = true; + + this._delegateError(err); + return; + } + + sequence[packetName](packet); +}; + +Protocol.prototype._parsePacketDebug = function _parsePacketDebug(packet) { + try { + packet.parse(this._parser); + } finally { + this._debugPacket(true, packet); + } +}; + +Protocol.prototype._emitPacket = function(packet) { + var packetWriter = new PacketWriter(); + packet.write(packetWriter); + this.emit('data', packetWriter.toBuffer(this._parser)); + + if (this._config.debug) { + this._debugPacket(false, packet); + } +}; + +Protocol.prototype._determinePacket = function(sequence) { + var firstByte = this._parser.peak(); + + if (sequence.determinePacket) { + var Packet = sequence.determinePacket(firstByte, this._parser); + if (Packet) { + return Packet; + } + } + + switch (firstByte) { + case 0x00: + if (!this._handshaked) { + this._handshaked = true; + this.emit('handshake', this._handshakeInitializationPacket); + } + return Packets.OkPacket; + case 0xfe: return Packets.EofPacket; + case 0xff: return Packets.ErrorPacket; + } + + throw new Error('Could not determine packet, firstByte = ' + firstByte); +}; + +Protocol.prototype._dequeue = function(sequence) { + sequence._timer.stop(); + + // No point in advancing the queue, we are dead + if (this._fatalError) { + return; + } + + this._queue.shift(); + + var sequence = this._queue[0]; + if (!sequence) { + this.emit('drain'); + return; + } + + this._parser.resetPacketNumber(); + + this._startSequence(sequence); +}; + +Protocol.prototype._startSequence = function(sequence) { + if (sequence._timeout > 0 && isFinite(sequence._timeout)) { + sequence._timer.start(sequence._timeout); + } + + if (sequence.constructor === Sequences.ChangeUser) { + sequence.start(this._handshakeInitializationPacket); + } else { + sequence.start(); + } +}; + +Protocol.prototype.handleNetworkError = function(err) { + err.fatal = true; + + var sequence = this._queue[0]; + if (sequence) { + sequence.end(err); + } else { + this._delegateError(err); + } +}; + +Protocol.prototype.handleParserError = function handleParserError(err) { + var sequence = this._queue[0]; + if (sequence) { + sequence.end(err); + } else { + this._delegateError(err); + } +}; + +Protocol.prototype._delegateError = function(err, sequence) { + // Stop delegating errors after the first fatal error + if (this._fatalError) { + return; + } + + if (err.fatal) { + this._fatalError = err; + } + + if (this._shouldErrorBubbleUp(err, sequence)) { + // Can't use regular 'error' event here as that always destroys the pipe + // between socket and protocol which is not what we want (unless the + // exception was fatal). + this.emit('unhandledError', err); + } else if (err.fatal) { + // Send fatal error to all sequences in the queue + var queue = this._queue; + process.nextTick(function () { + queue.forEach(function (sequence) { + sequence.end(err); + }); + queue.length = 0; + }); + } + + // Make sure the stream we are piping to is getting closed + if (err.fatal) { + this.emit('end', err); + } +}; + +Protocol.prototype._shouldErrorBubbleUp = function(err, sequence) { + if (sequence) { + if (sequence.hasErrorHandler()) { + return false; + } else if (!err.fatal) { + return true; + } + } + + return (err.fatal && !this._hasPendingErrorHandlers()); +}; + +Protocol.prototype._hasPendingErrorHandlers = function() { + return this._queue.some(function(sequence) { + return sequence.hasErrorHandler(); + }); +}; + +Protocol.prototype.destroy = function() { + this._destroyed = true; + this._parser.pause(); + + if (this._connection.state !== 'disconnected') { + if (!this._ended) { + this.end(); + } + } +}; + +Protocol.prototype._debugPacket = function(incoming, packet) { + var connection = this._connection; + var headline = incoming + ? '<-- ' + : '--> '; + + if (connection && connection.threadId !== null) { + headline += '(' + connection.threadId + ') '; + } + + headline += packet.constructor.name; + + // check for debug packet restriction + if (Array.isArray(this._config.debug) && this._config.debug.indexOf(packet.constructor.name) === -1) { + return; + } + + console.log(headline); + console.log(packet); + console.log(''); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/ResultSet.js b/html/RentForCamp/node_modules/mysql/lib/protocol/ResultSet.js new file mode 100644 index 0000000..f58d74f --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/ResultSet.js @@ -0,0 +1,7 @@ +module.exports = ResultSet; +function ResultSet(resultSetHeaderPacket) { + this.resultSetHeaderPacket = resultSetHeaderPacket; + this.fieldPackets = []; + this.eofPackets = []; + this.rows = []; +} diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/SqlString.js b/html/RentForCamp/node_modules/mysql/lib/protocol/SqlString.js new file mode 100644 index 0000000..30c63d8 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/SqlString.js @@ -0,0 +1 @@ +module.exports = require('sqlstring'); diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/Timer.js b/html/RentForCamp/node_modules/mysql/lib/protocol/Timer.js new file mode 100644 index 0000000..45ed029 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/Timer.js @@ -0,0 +1,33 @@ +var Timers = require('timers'); + +module.exports = Timer; +function Timer(object) { + this._object = object; + this._timeout = null; +} + +Timer.prototype.active = function active() { + if (this._timeout) { + if (this._timeout.refresh) { + this._timeout.refresh(); + } else { + Timers.active(this._timeout); + } + } +}; + +Timer.prototype.start = function start(msecs) { + this.stop(); + this._timeout = Timers.setTimeout(this._onTimeout.bind(this), msecs); +}; + +Timer.prototype.stop = function stop() { + if (this._timeout) { + Timers.clearTimeout(this._timeout); + this._timeout = null; + } +}; + +Timer.prototype._onTimeout = function _onTimeout() { + return this._object._onTimeout(); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/constants/charsets.js b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/charsets.js new file mode 100644 index 0000000..98b88ea --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/charsets.js @@ -0,0 +1,262 @@ +exports.BIG5_CHINESE_CI = 1; +exports.LATIN2_CZECH_CS = 2; +exports.DEC8_SWEDISH_CI = 3; +exports.CP850_GENERAL_CI = 4; +exports.LATIN1_GERMAN1_CI = 5; +exports.HP8_ENGLISH_CI = 6; +exports.KOI8R_GENERAL_CI = 7; +exports.LATIN1_SWEDISH_CI = 8; +exports.LATIN2_GENERAL_CI = 9; +exports.SWE7_SWEDISH_CI = 10; +exports.ASCII_GENERAL_CI = 11; +exports.UJIS_JAPANESE_CI = 12; +exports.SJIS_JAPANESE_CI = 13; +exports.CP1251_BULGARIAN_CI = 14; +exports.LATIN1_DANISH_CI = 15; +exports.HEBREW_GENERAL_CI = 16; +exports.TIS620_THAI_CI = 18; +exports.EUCKR_KOREAN_CI = 19; +exports.LATIN7_ESTONIAN_CS = 20; +exports.LATIN2_HUNGARIAN_CI = 21; +exports.KOI8U_GENERAL_CI = 22; +exports.CP1251_UKRAINIAN_CI = 23; +exports.GB2312_CHINESE_CI = 24; +exports.GREEK_GENERAL_CI = 25; +exports.CP1250_GENERAL_CI = 26; +exports.LATIN2_CROATIAN_CI = 27; +exports.GBK_CHINESE_CI = 28; +exports.CP1257_LITHUANIAN_CI = 29; +exports.LATIN5_TURKISH_CI = 30; +exports.LATIN1_GERMAN2_CI = 31; +exports.ARMSCII8_GENERAL_CI = 32; +exports.UTF8_GENERAL_CI = 33; +exports.CP1250_CZECH_CS = 34; +exports.UCS2_GENERAL_CI = 35; +exports.CP866_GENERAL_CI = 36; +exports.KEYBCS2_GENERAL_CI = 37; +exports.MACCE_GENERAL_CI = 38; +exports.MACROMAN_GENERAL_CI = 39; +exports.CP852_GENERAL_CI = 40; +exports.LATIN7_GENERAL_CI = 41; +exports.LATIN7_GENERAL_CS = 42; +exports.MACCE_BIN = 43; +exports.CP1250_CROATIAN_CI = 44; +exports.UTF8MB4_GENERAL_CI = 45; +exports.UTF8MB4_BIN = 46; +exports.LATIN1_BIN = 47; +exports.LATIN1_GENERAL_CI = 48; +exports.LATIN1_GENERAL_CS = 49; +exports.CP1251_BIN = 50; +exports.CP1251_GENERAL_CI = 51; +exports.CP1251_GENERAL_CS = 52; +exports.MACROMAN_BIN = 53; +exports.UTF16_GENERAL_CI = 54; +exports.UTF16_BIN = 55; +exports.UTF16LE_GENERAL_CI = 56; +exports.CP1256_GENERAL_CI = 57; +exports.CP1257_BIN = 58; +exports.CP1257_GENERAL_CI = 59; +exports.UTF32_GENERAL_CI = 60; +exports.UTF32_BIN = 61; +exports.UTF16LE_BIN = 62; +exports.BINARY = 63; +exports.ARMSCII8_BIN = 64; +exports.ASCII_BIN = 65; +exports.CP1250_BIN = 66; +exports.CP1256_BIN = 67; +exports.CP866_BIN = 68; +exports.DEC8_BIN = 69; +exports.GREEK_BIN = 70; +exports.HEBREW_BIN = 71; +exports.HP8_BIN = 72; +exports.KEYBCS2_BIN = 73; +exports.KOI8R_BIN = 74; +exports.KOI8U_BIN = 75; +exports.LATIN2_BIN = 77; +exports.LATIN5_BIN = 78; +exports.LATIN7_BIN = 79; +exports.CP850_BIN = 80; +exports.CP852_BIN = 81; +exports.SWE7_BIN = 82; +exports.UTF8_BIN = 83; +exports.BIG5_BIN = 84; +exports.EUCKR_BIN = 85; +exports.GB2312_BIN = 86; +exports.GBK_BIN = 87; +exports.SJIS_BIN = 88; +exports.TIS620_BIN = 89; +exports.UCS2_BIN = 90; +exports.UJIS_BIN = 91; +exports.GEOSTD8_GENERAL_CI = 92; +exports.GEOSTD8_BIN = 93; +exports.LATIN1_SPANISH_CI = 94; +exports.CP932_JAPANESE_CI = 95; +exports.CP932_BIN = 96; +exports.EUCJPMS_JAPANESE_CI = 97; +exports.EUCJPMS_BIN = 98; +exports.CP1250_POLISH_CI = 99; +exports.UTF16_UNICODE_CI = 101; +exports.UTF16_ICELANDIC_CI = 102; +exports.UTF16_LATVIAN_CI = 103; +exports.UTF16_ROMANIAN_CI = 104; +exports.UTF16_SLOVENIAN_CI = 105; +exports.UTF16_POLISH_CI = 106; +exports.UTF16_ESTONIAN_CI = 107; +exports.UTF16_SPANISH_CI = 108; +exports.UTF16_SWEDISH_CI = 109; +exports.UTF16_TURKISH_CI = 110; +exports.UTF16_CZECH_CI = 111; +exports.UTF16_DANISH_CI = 112; +exports.UTF16_LITHUANIAN_CI = 113; +exports.UTF16_SLOVAK_CI = 114; +exports.UTF16_SPANISH2_CI = 115; +exports.UTF16_ROMAN_CI = 116; +exports.UTF16_PERSIAN_CI = 117; +exports.UTF16_ESPERANTO_CI = 118; +exports.UTF16_HUNGARIAN_CI = 119; +exports.UTF16_SINHALA_CI = 120; +exports.UTF16_GERMAN2_CI = 121; +exports.UTF16_CROATIAN_MYSQL561_CI = 122; +exports.UTF16_UNICODE_520_CI = 123; +exports.UTF16_VIETNAMESE_CI = 124; +exports.UCS2_UNICODE_CI = 128; +exports.UCS2_ICELANDIC_CI = 129; +exports.UCS2_LATVIAN_CI = 130; +exports.UCS2_ROMANIAN_CI = 131; +exports.UCS2_SLOVENIAN_CI = 132; +exports.UCS2_POLISH_CI = 133; +exports.UCS2_ESTONIAN_CI = 134; +exports.UCS2_SPANISH_CI = 135; +exports.UCS2_SWEDISH_CI = 136; +exports.UCS2_TURKISH_CI = 137; +exports.UCS2_CZECH_CI = 138; +exports.UCS2_DANISH_CI = 139; +exports.UCS2_LITHUANIAN_CI = 140; +exports.UCS2_SLOVAK_CI = 141; +exports.UCS2_SPANISH2_CI = 142; +exports.UCS2_ROMAN_CI = 143; +exports.UCS2_PERSIAN_CI = 144; +exports.UCS2_ESPERANTO_CI = 145; +exports.UCS2_HUNGARIAN_CI = 146; +exports.UCS2_SINHALA_CI = 147; +exports.UCS2_GERMAN2_CI = 148; +exports.UCS2_CROATIAN_MYSQL561_CI = 149; +exports.UCS2_UNICODE_520_CI = 150; +exports.UCS2_VIETNAMESE_CI = 151; +exports.UCS2_GENERAL_MYSQL500_CI = 159; +exports.UTF32_UNICODE_CI = 160; +exports.UTF32_ICELANDIC_CI = 161; +exports.UTF32_LATVIAN_CI = 162; +exports.UTF32_ROMANIAN_CI = 163; +exports.UTF32_SLOVENIAN_CI = 164; +exports.UTF32_POLISH_CI = 165; +exports.UTF32_ESTONIAN_CI = 166; +exports.UTF32_SPANISH_CI = 167; +exports.UTF32_SWEDISH_CI = 168; +exports.UTF32_TURKISH_CI = 169; +exports.UTF32_CZECH_CI = 170; +exports.UTF32_DANISH_CI = 171; +exports.UTF32_LITHUANIAN_CI = 172; +exports.UTF32_SLOVAK_CI = 173; +exports.UTF32_SPANISH2_CI = 174; +exports.UTF32_ROMAN_CI = 175; +exports.UTF32_PERSIAN_CI = 176; +exports.UTF32_ESPERANTO_CI = 177; +exports.UTF32_HUNGARIAN_CI = 178; +exports.UTF32_SINHALA_CI = 179; +exports.UTF32_GERMAN2_CI = 180; +exports.UTF32_CROATIAN_MYSQL561_CI = 181; +exports.UTF32_UNICODE_520_CI = 182; +exports.UTF32_VIETNAMESE_CI = 183; +exports.UTF8_UNICODE_CI = 192; +exports.UTF8_ICELANDIC_CI = 193; +exports.UTF8_LATVIAN_CI = 194; +exports.UTF8_ROMANIAN_CI = 195; +exports.UTF8_SLOVENIAN_CI = 196; +exports.UTF8_POLISH_CI = 197; +exports.UTF8_ESTONIAN_CI = 198; +exports.UTF8_SPANISH_CI = 199; +exports.UTF8_SWEDISH_CI = 200; +exports.UTF8_TURKISH_CI = 201; +exports.UTF8_CZECH_CI = 202; +exports.UTF8_DANISH_CI = 203; +exports.UTF8_LITHUANIAN_CI = 204; +exports.UTF8_SLOVAK_CI = 205; +exports.UTF8_SPANISH2_CI = 206; +exports.UTF8_ROMAN_CI = 207; +exports.UTF8_PERSIAN_CI = 208; +exports.UTF8_ESPERANTO_CI = 209; +exports.UTF8_HUNGARIAN_CI = 210; +exports.UTF8_SINHALA_CI = 211; +exports.UTF8_GERMAN2_CI = 212; +exports.UTF8_CROATIAN_MYSQL561_CI = 213; +exports.UTF8_UNICODE_520_CI = 214; +exports.UTF8_VIETNAMESE_CI = 215; +exports.UTF8_GENERAL_MYSQL500_CI = 223; +exports.UTF8MB4_UNICODE_CI = 224; +exports.UTF8MB4_ICELANDIC_CI = 225; +exports.UTF8MB4_LATVIAN_CI = 226; +exports.UTF8MB4_ROMANIAN_CI = 227; +exports.UTF8MB4_SLOVENIAN_CI = 228; +exports.UTF8MB4_POLISH_CI = 229; +exports.UTF8MB4_ESTONIAN_CI = 230; +exports.UTF8MB4_SPANISH_CI = 231; +exports.UTF8MB4_SWEDISH_CI = 232; +exports.UTF8MB4_TURKISH_CI = 233; +exports.UTF8MB4_CZECH_CI = 234; +exports.UTF8MB4_DANISH_CI = 235; +exports.UTF8MB4_LITHUANIAN_CI = 236; +exports.UTF8MB4_SLOVAK_CI = 237; +exports.UTF8MB4_SPANISH2_CI = 238; +exports.UTF8MB4_ROMAN_CI = 239; +exports.UTF8MB4_PERSIAN_CI = 240; +exports.UTF8MB4_ESPERANTO_CI = 241; +exports.UTF8MB4_HUNGARIAN_CI = 242; +exports.UTF8MB4_SINHALA_CI = 243; +exports.UTF8MB4_GERMAN2_CI = 244; +exports.UTF8MB4_CROATIAN_MYSQL561_CI = 245; +exports.UTF8MB4_UNICODE_520_CI = 246; +exports.UTF8MB4_VIETNAMESE_CI = 247; +exports.UTF8_GENERAL50_CI = 253; + +// short aliases +exports.ARMSCII8 = exports.ARMSCII8_GENERAL_CI; +exports.ASCII = exports.ASCII_GENERAL_CI; +exports.BIG5 = exports.BIG5_CHINESE_CI; +exports.BINARY = exports.BINARY; +exports.CP1250 = exports.CP1250_GENERAL_CI; +exports.CP1251 = exports.CP1251_GENERAL_CI; +exports.CP1256 = exports.CP1256_GENERAL_CI; +exports.CP1257 = exports.CP1257_GENERAL_CI; +exports.CP866 = exports.CP866_GENERAL_CI; +exports.CP850 = exports.CP850_GENERAL_CI; +exports.CP852 = exports.CP852_GENERAL_CI; +exports.CP932 = exports.CP932_JAPANESE_CI; +exports.DEC8 = exports.DEC8_SWEDISH_CI; +exports.EUCJPMS = exports.EUCJPMS_JAPANESE_CI; +exports.EUCKR = exports.EUCKR_KOREAN_CI; +exports.GB2312 = exports.GB2312_CHINESE_CI; +exports.GBK = exports.GBK_CHINESE_CI; +exports.GEOSTD8 = exports.GEOSTD8_GENERAL_CI; +exports.GREEK = exports.GREEK_GENERAL_CI; +exports.HEBREW = exports.HEBREW_GENERAL_CI; +exports.HP8 = exports.HP8_ENGLISH_CI; +exports.KEYBCS2 = exports.KEYBCS2_GENERAL_CI; +exports.KOI8R = exports.KOI8R_GENERAL_CI; +exports.KOI8U = exports.KOI8U_GENERAL_CI; +exports.LATIN1 = exports.LATIN1_SWEDISH_CI; +exports.LATIN2 = exports.LATIN2_GENERAL_CI; +exports.LATIN5 = exports.LATIN5_TURKISH_CI; +exports.LATIN7 = exports.LATIN7_GENERAL_CI; +exports.MACCE = exports.MACCE_GENERAL_CI; +exports.MACROMAN = exports.MACROMAN_GENERAL_CI; +exports.SJIS = exports.SJIS_JAPANESE_CI; +exports.SWE7 = exports.SWE7_SWEDISH_CI; +exports.TIS620 = exports.TIS620_THAI_CI; +exports.UCS2 = exports.UCS2_GENERAL_CI; +exports.UJIS = exports.UJIS_JAPANESE_CI; +exports.UTF16 = exports.UTF16_GENERAL_CI; +exports.UTF16LE = exports.UTF16LE_GENERAL_CI; +exports.UTF8 = exports.UTF8_GENERAL_CI; +exports.UTF8MB4 = exports.UTF8MB4_GENERAL_CI; +exports.UTF32 = exports.UTF32_GENERAL_CI; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/constants/client.js b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/client.js new file mode 100644 index 0000000..59aadc6 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/client.js @@ -0,0 +1,26 @@ +// Manually extracted from mysql-5.5.23/include/mysql_com.h +exports.CLIENT_LONG_PASSWORD = 1; /* new more secure passwords */ +exports.CLIENT_FOUND_ROWS = 2; /* Found instead of affected rows */ +exports.CLIENT_LONG_FLAG = 4; /* Get all column flags */ +exports.CLIENT_CONNECT_WITH_DB = 8; /* One can specify db on connect */ +exports.CLIENT_NO_SCHEMA = 16; /* Don't allow database.table.column */ +exports.CLIENT_COMPRESS = 32; /* Can use compression protocol */ +exports.CLIENT_ODBC = 64; /* Odbc client */ +exports.CLIENT_LOCAL_FILES = 128; /* Can use LOAD DATA LOCAL */ +exports.CLIENT_IGNORE_SPACE = 256; /* Ignore spaces before '(' */ +exports.CLIENT_PROTOCOL_41 = 512; /* New 4.1 protocol */ +exports.CLIENT_INTERACTIVE = 1024; /* This is an interactive client */ +exports.CLIENT_SSL = 2048; /* Switch to SSL after handshake */ +exports.CLIENT_IGNORE_SIGPIPE = 4096; /* IGNORE sigpipes */ +exports.CLIENT_TRANSACTIONS = 8192; /* Client knows about transactions */ +exports.CLIENT_RESERVED = 16384; /* Old flag for 4.1 protocol */ +exports.CLIENT_SECURE_CONNECTION = 32768; /* New 4.1 authentication */ + +exports.CLIENT_MULTI_STATEMENTS = 65536; /* Enable/disable multi-stmt support */ +exports.CLIENT_MULTI_RESULTS = 131072; /* Enable/disable multi-results */ +exports.CLIENT_PS_MULTI_RESULTS = 262144; /* Multi-results in PS-protocol */ + +exports.CLIENT_PLUGIN_AUTH = 524288; /* Client supports plugin authentication */ + +exports.CLIENT_SSL_VERIFY_SERVER_CERT = 1073741824; +exports.CLIENT_REMEMBER_OPTIONS = 2147483648; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/constants/errors.js b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/errors.js new file mode 100644 index 0000000..9bc0f53 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/errors.js @@ -0,0 +1,2416 @@ +/** + * MySQL error constants + * + * Extracted from version 5.7.21 + * + * !! Generated by generate-error-constants.js, do not modify by hand !! + */ + +exports.EE_CANTCREATEFILE = 1; +exports.EE_READ = 2; +exports.EE_WRITE = 3; +exports.EE_BADCLOSE = 4; +exports.EE_OUTOFMEMORY = 5; +exports.EE_DELETE = 6; +exports.EE_LINK = 7; +exports.EE_EOFERR = 9; +exports.EE_CANTLOCK = 10; +exports.EE_CANTUNLOCK = 11; +exports.EE_DIR = 12; +exports.EE_STAT = 13; +exports.EE_CANT_CHSIZE = 14; +exports.EE_CANT_OPEN_STREAM = 15; +exports.EE_GETWD = 16; +exports.EE_SETWD = 17; +exports.EE_LINK_WARNING = 18; +exports.EE_OPEN_WARNING = 19; +exports.EE_DISK_FULL = 20; +exports.EE_CANT_MKDIR = 21; +exports.EE_UNKNOWN_CHARSET = 22; +exports.EE_OUT_OF_FILERESOURCES = 23; +exports.EE_CANT_READLINK = 24; +exports.EE_CANT_SYMLINK = 25; +exports.EE_REALPATH = 26; +exports.EE_SYNC = 27; +exports.EE_UNKNOWN_COLLATION = 28; +exports.EE_FILENOTFOUND = 29; +exports.EE_FILE_NOT_CLOSED = 30; +exports.EE_CHANGE_OWNERSHIP = 31; +exports.EE_CHANGE_PERMISSIONS = 32; +exports.EE_CANT_SEEK = 33; +exports.EE_CAPACITY_EXCEEDED = 34; +exports.HA_ERR_KEY_NOT_FOUND = 120; +exports.HA_ERR_FOUND_DUPP_KEY = 121; +exports.HA_ERR_INTERNAL_ERROR = 122; +exports.HA_ERR_RECORD_CHANGED = 123; +exports.HA_ERR_WRONG_INDEX = 124; +exports.HA_ERR_CRASHED = 126; +exports.HA_ERR_WRONG_IN_RECORD = 127; +exports.HA_ERR_OUT_OF_MEM = 128; +exports.HA_ERR_NOT_A_TABLE = 130; +exports.HA_ERR_WRONG_COMMAND = 131; +exports.HA_ERR_OLD_FILE = 132; +exports.HA_ERR_NO_ACTIVE_RECORD = 133; +exports.HA_ERR_RECORD_DELETED = 134; +exports.HA_ERR_RECORD_FILE_FULL = 135; +exports.HA_ERR_INDEX_FILE_FULL = 136; +exports.HA_ERR_END_OF_FILE = 137; +exports.HA_ERR_UNSUPPORTED = 138; +exports.HA_ERR_TOO_BIG_ROW = 139; +exports.HA_WRONG_CREATE_OPTION = 140; +exports.HA_ERR_FOUND_DUPP_UNIQUE = 141; +exports.HA_ERR_UNKNOWN_CHARSET = 142; +exports.HA_ERR_WRONG_MRG_TABLE_DEF = 143; +exports.HA_ERR_CRASHED_ON_REPAIR = 144; +exports.HA_ERR_CRASHED_ON_USAGE = 145; +exports.HA_ERR_LOCK_WAIT_TIMEOUT = 146; +exports.HA_ERR_LOCK_TABLE_FULL = 147; +exports.HA_ERR_READ_ONLY_TRANSACTION = 148; +exports.HA_ERR_LOCK_DEADLOCK = 149; +exports.HA_ERR_CANNOT_ADD_FOREIGN = 150; +exports.HA_ERR_NO_REFERENCED_ROW = 151; +exports.HA_ERR_ROW_IS_REFERENCED = 152; +exports.HA_ERR_NO_SAVEPOINT = 153; +exports.HA_ERR_NON_UNIQUE_BLOCK_SIZE = 154; +exports.HA_ERR_NO_SUCH_TABLE = 155; +exports.HA_ERR_TABLE_EXIST = 156; +exports.HA_ERR_NO_CONNECTION = 157; +exports.HA_ERR_NULL_IN_SPATIAL = 158; +exports.HA_ERR_TABLE_DEF_CHANGED = 159; +exports.HA_ERR_NO_PARTITION_FOUND = 160; +exports.HA_ERR_RBR_LOGGING_FAILED = 161; +exports.HA_ERR_DROP_INDEX_FK = 162; +exports.HA_ERR_FOREIGN_DUPLICATE_KEY = 163; +exports.HA_ERR_TABLE_NEEDS_UPGRADE = 164; +exports.HA_ERR_TABLE_READONLY = 165; +exports.HA_ERR_AUTOINC_READ_FAILED = 166; +exports.HA_ERR_AUTOINC_ERANGE = 167; +exports.HA_ERR_GENERIC = 168; +exports.HA_ERR_RECORD_IS_THE_SAME = 169; +exports.HA_ERR_LOGGING_IMPOSSIBLE = 170; +exports.HA_ERR_CORRUPT_EVENT = 171; +exports.HA_ERR_NEW_FILE = 172; +exports.HA_ERR_ROWS_EVENT_APPLY = 173; +exports.HA_ERR_INITIALIZATION = 174; +exports.HA_ERR_FILE_TOO_SHORT = 175; +exports.HA_ERR_WRONG_CRC = 176; +exports.HA_ERR_TOO_MANY_CONCURRENT_TRXS = 177; +exports.HA_ERR_NOT_IN_LOCK_PARTITIONS = 178; +exports.HA_ERR_INDEX_COL_TOO_LONG = 179; +exports.HA_ERR_INDEX_CORRUPT = 180; +exports.HA_ERR_UNDO_REC_TOO_BIG = 181; +exports.HA_FTS_INVALID_DOCID = 182; +exports.HA_ERR_TABLE_IN_FK_CHECK = 183; +exports.HA_ERR_TABLESPACE_EXISTS = 184; +exports.HA_ERR_TOO_MANY_FIELDS = 185; +exports.HA_ERR_ROW_IN_WRONG_PARTITION = 186; +exports.HA_ERR_INNODB_READ_ONLY = 187; +exports.HA_ERR_FTS_EXCEED_RESULT_CACHE_LIMIT = 188; +exports.HA_ERR_TEMP_FILE_WRITE_FAILURE = 189; +exports.HA_ERR_INNODB_FORCED_RECOVERY = 190; +exports.HA_ERR_FTS_TOO_MANY_WORDS_IN_PHRASE = 191; +exports.HA_ERR_FK_DEPTH_EXCEEDED = 192; +exports.HA_MISSING_CREATE_OPTION = 193; +exports.HA_ERR_SE_OUT_OF_MEMORY = 194; +exports.HA_ERR_TABLE_CORRUPT = 195; +exports.HA_ERR_QUERY_INTERRUPTED = 196; +exports.HA_ERR_TABLESPACE_MISSING = 197; +exports.HA_ERR_TABLESPACE_IS_NOT_EMPTY = 198; +exports.HA_ERR_WRONG_FILE_NAME = 199; +exports.HA_ERR_NOT_ALLOWED_COMMAND = 200; +exports.HA_ERR_COMPUTE_FAILED = 201; +exports.ER_HASHCHK = 1000; +exports.ER_NISAMCHK = 1001; +exports.ER_NO = 1002; +exports.ER_YES = 1003; +exports.ER_CANT_CREATE_FILE = 1004; +exports.ER_CANT_CREATE_TABLE = 1005; +exports.ER_CANT_CREATE_DB = 1006; +exports.ER_DB_CREATE_EXISTS = 1007; +exports.ER_DB_DROP_EXISTS = 1008; +exports.ER_DB_DROP_DELETE = 1009; +exports.ER_DB_DROP_RMDIR = 1010; +exports.ER_CANT_DELETE_FILE = 1011; +exports.ER_CANT_FIND_SYSTEM_REC = 1012; +exports.ER_CANT_GET_STAT = 1013; +exports.ER_CANT_GET_WD = 1014; +exports.ER_CANT_LOCK = 1015; +exports.ER_CANT_OPEN_FILE = 1016; +exports.ER_FILE_NOT_FOUND = 1017; +exports.ER_CANT_READ_DIR = 1018; +exports.ER_CANT_SET_WD = 1019; +exports.ER_CHECKREAD = 1020; +exports.ER_DISK_FULL = 1021; +exports.ER_DUP_KEY = 1022; +exports.ER_ERROR_ON_CLOSE = 1023; +exports.ER_ERROR_ON_READ = 1024; +exports.ER_ERROR_ON_RENAME = 1025; +exports.ER_ERROR_ON_WRITE = 1026; +exports.ER_FILE_USED = 1027; +exports.ER_FILSORT_ABORT = 1028; +exports.ER_FORM_NOT_FOUND = 1029; +exports.ER_GET_ERRNO = 1030; +exports.ER_ILLEGAL_HA = 1031; +exports.ER_KEY_NOT_FOUND = 1032; +exports.ER_NOT_FORM_FILE = 1033; +exports.ER_NOT_KEYFILE = 1034; +exports.ER_OLD_KEYFILE = 1035; +exports.ER_OPEN_AS_READONLY = 1036; +exports.ER_OUTOFMEMORY = 1037; +exports.ER_OUT_OF_SORTMEMORY = 1038; +exports.ER_UNEXPECTED_EOF = 1039; +exports.ER_CON_COUNT_ERROR = 1040; +exports.ER_OUT_OF_RESOURCES = 1041; +exports.ER_BAD_HOST_ERROR = 1042; +exports.ER_HANDSHAKE_ERROR = 1043; +exports.ER_DBACCESS_DENIED_ERROR = 1044; +exports.ER_ACCESS_DENIED_ERROR = 1045; +exports.ER_NO_DB_ERROR = 1046; +exports.ER_UNKNOWN_COM_ERROR = 1047; +exports.ER_BAD_NULL_ERROR = 1048; +exports.ER_BAD_DB_ERROR = 1049; +exports.ER_TABLE_EXISTS_ERROR = 1050; +exports.ER_BAD_TABLE_ERROR = 1051; +exports.ER_NON_UNIQ_ERROR = 1052; +exports.ER_SERVER_SHUTDOWN = 1053; +exports.ER_BAD_FIELD_ERROR = 1054; +exports.ER_WRONG_FIELD_WITH_GROUP = 1055; +exports.ER_WRONG_GROUP_FIELD = 1056; +exports.ER_WRONG_SUM_SELECT = 1057; +exports.ER_WRONG_VALUE_COUNT = 1058; +exports.ER_TOO_LONG_IDENT = 1059; +exports.ER_DUP_FIELDNAME = 1060; +exports.ER_DUP_KEYNAME = 1061; +exports.ER_DUP_ENTRY = 1062; +exports.ER_WRONG_FIELD_SPEC = 1063; +exports.ER_PARSE_ERROR = 1064; +exports.ER_EMPTY_QUERY = 1065; +exports.ER_NONUNIQ_TABLE = 1066; +exports.ER_INVALID_DEFAULT = 1067; +exports.ER_MULTIPLE_PRI_KEY = 1068; +exports.ER_TOO_MANY_KEYS = 1069; +exports.ER_TOO_MANY_KEY_PARTS = 1070; +exports.ER_TOO_LONG_KEY = 1071; +exports.ER_KEY_COLUMN_DOES_NOT_EXITS = 1072; +exports.ER_BLOB_USED_AS_KEY = 1073; +exports.ER_TOO_BIG_FIELDLENGTH = 1074; +exports.ER_WRONG_AUTO_KEY = 1075; +exports.ER_READY = 1076; +exports.ER_NORMAL_SHUTDOWN = 1077; +exports.ER_GOT_SIGNAL = 1078; +exports.ER_SHUTDOWN_COMPLETE = 1079; +exports.ER_FORCING_CLOSE = 1080; +exports.ER_IPSOCK_ERROR = 1081; +exports.ER_NO_SUCH_INDEX = 1082; +exports.ER_WRONG_FIELD_TERMINATORS = 1083; +exports.ER_BLOBS_AND_NO_TERMINATED = 1084; +exports.ER_TEXTFILE_NOT_READABLE = 1085; +exports.ER_FILE_EXISTS_ERROR = 1086; +exports.ER_LOAD_INFO = 1087; +exports.ER_ALTER_INFO = 1088; +exports.ER_WRONG_SUB_KEY = 1089; +exports.ER_CANT_REMOVE_ALL_FIELDS = 1090; +exports.ER_CANT_DROP_FIELD_OR_KEY = 1091; +exports.ER_INSERT_INFO = 1092; +exports.ER_UPDATE_TABLE_USED = 1093; +exports.ER_NO_SUCH_THREAD = 1094; +exports.ER_KILL_DENIED_ERROR = 1095; +exports.ER_NO_TABLES_USED = 1096; +exports.ER_TOO_BIG_SET = 1097; +exports.ER_NO_UNIQUE_LOGFILE = 1098; +exports.ER_TABLE_NOT_LOCKED_FOR_WRITE = 1099; +exports.ER_TABLE_NOT_LOCKED = 1100; +exports.ER_BLOB_CANT_HAVE_DEFAULT = 1101; +exports.ER_WRONG_DB_NAME = 1102; +exports.ER_WRONG_TABLE_NAME = 1103; +exports.ER_TOO_BIG_SELECT = 1104; +exports.ER_UNKNOWN_ERROR = 1105; +exports.ER_UNKNOWN_PROCEDURE = 1106; +exports.ER_WRONG_PARAMCOUNT_TO_PROCEDURE = 1107; +exports.ER_WRONG_PARAMETERS_TO_PROCEDURE = 1108; +exports.ER_UNKNOWN_TABLE = 1109; +exports.ER_FIELD_SPECIFIED_TWICE = 1110; +exports.ER_INVALID_GROUP_FUNC_USE = 1111; +exports.ER_UNSUPPORTED_EXTENSION = 1112; +exports.ER_TABLE_MUST_HAVE_COLUMNS = 1113; +exports.ER_RECORD_FILE_FULL = 1114; +exports.ER_UNKNOWN_CHARACTER_SET = 1115; +exports.ER_TOO_MANY_TABLES = 1116; +exports.ER_TOO_MANY_FIELDS = 1117; +exports.ER_TOO_BIG_ROWSIZE = 1118; +exports.ER_STACK_OVERRUN = 1119; +exports.ER_WRONG_OUTER_JOIN = 1120; +exports.ER_NULL_COLUMN_IN_INDEX = 1121; +exports.ER_CANT_FIND_UDF = 1122; +exports.ER_CANT_INITIALIZE_UDF = 1123; +exports.ER_UDF_NO_PATHS = 1124; +exports.ER_UDF_EXISTS = 1125; +exports.ER_CANT_OPEN_LIBRARY = 1126; +exports.ER_CANT_FIND_DL_ENTRY = 1127; +exports.ER_FUNCTION_NOT_DEFINED = 1128; +exports.ER_HOST_IS_BLOCKED = 1129; +exports.ER_HOST_NOT_PRIVILEGED = 1130; +exports.ER_PASSWORD_ANONYMOUS_USER = 1131; +exports.ER_PASSWORD_NOT_ALLOWED = 1132; +exports.ER_PASSWORD_NO_MATCH = 1133; +exports.ER_UPDATE_INFO = 1134; +exports.ER_CANT_CREATE_THREAD = 1135; +exports.ER_WRONG_VALUE_COUNT_ON_ROW = 1136; +exports.ER_CANT_REOPEN_TABLE = 1137; +exports.ER_INVALID_USE_OF_NULL = 1138; +exports.ER_REGEXP_ERROR = 1139; +exports.ER_MIX_OF_GROUP_FUNC_AND_FIELDS = 1140; +exports.ER_NONEXISTING_GRANT = 1141; +exports.ER_TABLEACCESS_DENIED_ERROR = 1142; +exports.ER_COLUMNACCESS_DENIED_ERROR = 1143; +exports.ER_ILLEGAL_GRANT_FOR_TABLE = 1144; +exports.ER_GRANT_WRONG_HOST_OR_USER = 1145; +exports.ER_NO_SUCH_TABLE = 1146; +exports.ER_NONEXISTING_TABLE_GRANT = 1147; +exports.ER_NOT_ALLOWED_COMMAND = 1148; +exports.ER_SYNTAX_ERROR = 1149; +exports.ER_DELAYED_CANT_CHANGE_LOCK = 1150; +exports.ER_TOO_MANY_DELAYED_THREADS = 1151; +exports.ER_ABORTING_CONNECTION = 1152; +exports.ER_NET_PACKET_TOO_LARGE = 1153; +exports.ER_NET_READ_ERROR_FROM_PIPE = 1154; +exports.ER_NET_FCNTL_ERROR = 1155; +exports.ER_NET_PACKETS_OUT_OF_ORDER = 1156; +exports.ER_NET_UNCOMPRESS_ERROR = 1157; +exports.ER_NET_READ_ERROR = 1158; +exports.ER_NET_READ_INTERRUPTED = 1159; +exports.ER_NET_ERROR_ON_WRITE = 1160; +exports.ER_NET_WRITE_INTERRUPTED = 1161; +exports.ER_TOO_LONG_STRING = 1162; +exports.ER_TABLE_CANT_HANDLE_BLOB = 1163; +exports.ER_TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164; +exports.ER_DELAYED_INSERT_TABLE_LOCKED = 1165; +exports.ER_WRONG_COLUMN_NAME = 1166; +exports.ER_WRONG_KEY_COLUMN = 1167; +exports.ER_WRONG_MRG_TABLE = 1168; +exports.ER_DUP_UNIQUE = 1169; +exports.ER_BLOB_KEY_WITHOUT_LENGTH = 1170; +exports.ER_PRIMARY_CANT_HAVE_NULL = 1171; +exports.ER_TOO_MANY_ROWS = 1172; +exports.ER_REQUIRES_PRIMARY_KEY = 1173; +exports.ER_NO_RAID_COMPILED = 1174; +exports.ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175; +exports.ER_KEY_DOES_NOT_EXITS = 1176; +exports.ER_CHECK_NO_SUCH_TABLE = 1177; +exports.ER_CHECK_NOT_IMPLEMENTED = 1178; +exports.ER_CANT_DO_THIS_DURING_AN_TRANSACTION = 1179; +exports.ER_ERROR_DURING_COMMIT = 1180; +exports.ER_ERROR_DURING_ROLLBACK = 1181; +exports.ER_ERROR_DURING_FLUSH_LOGS = 1182; +exports.ER_ERROR_DURING_CHECKPOINT = 1183; +exports.ER_NEW_ABORTING_CONNECTION = 1184; +exports.ER_DUMP_NOT_IMPLEMENTED = 1185; +exports.ER_FLUSH_MASTER_BINLOG_CLOSED = 1186; +exports.ER_INDEX_REBUILD = 1187; +exports.ER_MASTER = 1188; +exports.ER_MASTER_NET_READ = 1189; +exports.ER_MASTER_NET_WRITE = 1190; +exports.ER_FT_MATCHING_KEY_NOT_FOUND = 1191; +exports.ER_LOCK_OR_ACTIVE_TRANSACTION = 1192; +exports.ER_UNKNOWN_SYSTEM_VARIABLE = 1193; +exports.ER_CRASHED_ON_USAGE = 1194; +exports.ER_CRASHED_ON_REPAIR = 1195; +exports.ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196; +exports.ER_TRANS_CACHE_FULL = 1197; +exports.ER_SLAVE_MUST_STOP = 1198; +exports.ER_SLAVE_NOT_RUNNING = 1199; +exports.ER_BAD_SLAVE = 1200; +exports.ER_MASTER_INFO = 1201; +exports.ER_SLAVE_THREAD = 1202; +exports.ER_TOO_MANY_USER_CONNECTIONS = 1203; +exports.ER_SET_CONSTANTS_ONLY = 1204; +exports.ER_LOCK_WAIT_TIMEOUT = 1205; +exports.ER_LOCK_TABLE_FULL = 1206; +exports.ER_READ_ONLY_TRANSACTION = 1207; +exports.ER_DROP_DB_WITH_READ_LOCK = 1208; +exports.ER_CREATE_DB_WITH_READ_LOCK = 1209; +exports.ER_WRONG_ARGUMENTS = 1210; +exports.ER_NO_PERMISSION_TO_CREATE_USER = 1211; +exports.ER_UNION_TABLES_IN_DIFFERENT_DIR = 1212; +exports.ER_LOCK_DEADLOCK = 1213; +exports.ER_TABLE_CANT_HANDLE_FT = 1214; +exports.ER_CANNOT_ADD_FOREIGN = 1215; +exports.ER_NO_REFERENCED_ROW = 1216; +exports.ER_ROW_IS_REFERENCED = 1217; +exports.ER_CONNECT_TO_MASTER = 1218; +exports.ER_QUERY_ON_MASTER = 1219; +exports.ER_ERROR_WHEN_EXECUTING_COMMAND = 1220; +exports.ER_WRONG_USAGE = 1221; +exports.ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222; +exports.ER_CANT_UPDATE_WITH_READLOCK = 1223; +exports.ER_MIXING_NOT_ALLOWED = 1224; +exports.ER_DUP_ARGUMENT = 1225; +exports.ER_USER_LIMIT_REACHED = 1226; +exports.ER_SPECIFIC_ACCESS_DENIED_ERROR = 1227; +exports.ER_LOCAL_VARIABLE = 1228; +exports.ER_GLOBAL_VARIABLE = 1229; +exports.ER_NO_DEFAULT = 1230; +exports.ER_WRONG_VALUE_FOR_VAR = 1231; +exports.ER_WRONG_TYPE_FOR_VAR = 1232; +exports.ER_VAR_CANT_BE_READ = 1233; +exports.ER_CANT_USE_OPTION_HERE = 1234; +exports.ER_NOT_SUPPORTED_YET = 1235; +exports.ER_MASTER_FATAL_ERROR_READING_BINLOG = 1236; +exports.ER_SLAVE_IGNORED_TABLE = 1237; +exports.ER_INCORRECT_GLOBAL_LOCAL_VAR = 1238; +exports.ER_WRONG_FK_DEF = 1239; +exports.ER_KEY_REF_DO_NOT_MATCH_TABLE_REF = 1240; +exports.ER_OPERAND_COLUMNS = 1241; +exports.ER_SUBQUERY_NO_1_ROW = 1242; +exports.ER_UNKNOWN_STMT_HANDLER = 1243; +exports.ER_CORRUPT_HELP_DB = 1244; +exports.ER_CYCLIC_REFERENCE = 1245; +exports.ER_AUTO_CONVERT = 1246; +exports.ER_ILLEGAL_REFERENCE = 1247; +exports.ER_DERIVED_MUST_HAVE_ALIAS = 1248; +exports.ER_SELECT_REDUCED = 1249; +exports.ER_TABLENAME_NOT_ALLOWED_HERE = 1250; +exports.ER_NOT_SUPPORTED_AUTH_MODE = 1251; +exports.ER_SPATIAL_CANT_HAVE_NULL = 1252; +exports.ER_COLLATION_CHARSET_MISMATCH = 1253; +exports.ER_SLAVE_WAS_RUNNING = 1254; +exports.ER_SLAVE_WAS_NOT_RUNNING = 1255; +exports.ER_TOO_BIG_FOR_UNCOMPRESS = 1256; +exports.ER_ZLIB_Z_MEM_ERROR = 1257; +exports.ER_ZLIB_Z_BUF_ERROR = 1258; +exports.ER_ZLIB_Z_DATA_ERROR = 1259; +exports.ER_CUT_VALUE_GROUP_CONCAT = 1260; +exports.ER_WARN_TOO_FEW_RECORDS = 1261; +exports.ER_WARN_TOO_MANY_RECORDS = 1262; +exports.ER_WARN_NULL_TO_NOTNULL = 1263; +exports.ER_WARN_DATA_OUT_OF_RANGE = 1264; +exports.WARN_DATA_TRUNCATED = 1265; +exports.ER_WARN_USING_OTHER_HANDLER = 1266; +exports.ER_CANT_AGGREGATE_2COLLATIONS = 1267; +exports.ER_DROP_USER = 1268; +exports.ER_REVOKE_GRANTS = 1269; +exports.ER_CANT_AGGREGATE_3COLLATIONS = 1270; +exports.ER_CANT_AGGREGATE_NCOLLATIONS = 1271; +exports.ER_VARIABLE_IS_NOT_STRUCT = 1272; +exports.ER_UNKNOWN_COLLATION = 1273; +exports.ER_SLAVE_IGNORED_SSL_PARAMS = 1274; +exports.ER_SERVER_IS_IN_SECURE_AUTH_MODE = 1275; +exports.ER_WARN_FIELD_RESOLVED = 1276; +exports.ER_BAD_SLAVE_UNTIL_COND = 1277; +exports.ER_MISSING_SKIP_SLAVE = 1278; +exports.ER_UNTIL_COND_IGNORED = 1279; +exports.ER_WRONG_NAME_FOR_INDEX = 1280; +exports.ER_WRONG_NAME_FOR_CATALOG = 1281; +exports.ER_WARN_QC_RESIZE = 1282; +exports.ER_BAD_FT_COLUMN = 1283; +exports.ER_UNKNOWN_KEY_CACHE = 1284; +exports.ER_WARN_HOSTNAME_WONT_WORK = 1285; +exports.ER_UNKNOWN_STORAGE_ENGINE = 1286; +exports.ER_WARN_DEPRECATED_SYNTAX = 1287; +exports.ER_NON_UPDATABLE_TABLE = 1288; +exports.ER_FEATURE_DISABLED = 1289; +exports.ER_OPTION_PREVENTS_STATEMENT = 1290; +exports.ER_DUPLICATED_VALUE_IN_TYPE = 1291; +exports.ER_TRUNCATED_WRONG_VALUE = 1292; +exports.ER_TOO_MUCH_AUTO_TIMESTAMP_COLS = 1293; +exports.ER_INVALID_ON_UPDATE = 1294; +exports.ER_UNSUPPORTED_PS = 1295; +exports.ER_GET_ERRMSG = 1296; +exports.ER_GET_TEMPORARY_ERRMSG = 1297; +exports.ER_UNKNOWN_TIME_ZONE = 1298; +exports.ER_WARN_INVALID_TIMESTAMP = 1299; +exports.ER_INVALID_CHARACTER_STRING = 1300; +exports.ER_WARN_ALLOWED_PACKET_OVERFLOWED = 1301; +exports.ER_CONFLICTING_DECLARATIONS = 1302; +exports.ER_SP_NO_RECURSIVE_CREATE = 1303; +exports.ER_SP_ALREADY_EXISTS = 1304; +exports.ER_SP_DOES_NOT_EXIST = 1305; +exports.ER_SP_DROP_FAILED = 1306; +exports.ER_SP_STORE_FAILED = 1307; +exports.ER_SP_LILABEL_MISMATCH = 1308; +exports.ER_SP_LABEL_REDEFINE = 1309; +exports.ER_SP_LABEL_MISMATCH = 1310; +exports.ER_SP_UNINIT_VAR = 1311; +exports.ER_SP_BADSELECT = 1312; +exports.ER_SP_BADRETURN = 1313; +exports.ER_SP_BADSTATEMENT = 1314; +exports.ER_UPDATE_LOG_DEPRECATED_IGNORED = 1315; +exports.ER_UPDATE_LOG_DEPRECATED_TRANSLATED = 1316; +exports.ER_QUERY_INTERRUPTED = 1317; +exports.ER_SP_WRONG_NO_OF_ARGS = 1318; +exports.ER_SP_COND_MISMATCH = 1319; +exports.ER_SP_NORETURN = 1320; +exports.ER_SP_NORETURNEND = 1321; +exports.ER_SP_BAD_CURSOR_QUERY = 1322; +exports.ER_SP_BAD_CURSOR_SELECT = 1323; +exports.ER_SP_CURSOR_MISMATCH = 1324; +exports.ER_SP_CURSOR_ALREADY_OPEN = 1325; +exports.ER_SP_CURSOR_NOT_OPEN = 1326; +exports.ER_SP_UNDECLARED_VAR = 1327; +exports.ER_SP_WRONG_NO_OF_FETCH_ARGS = 1328; +exports.ER_SP_FETCH_NO_DATA = 1329; +exports.ER_SP_DUP_PARAM = 1330; +exports.ER_SP_DUP_VAR = 1331; +exports.ER_SP_DUP_COND = 1332; +exports.ER_SP_DUP_CURS = 1333; +exports.ER_SP_CANT_ALTER = 1334; +exports.ER_SP_SUBSELECT_NYI = 1335; +exports.ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG = 1336; +exports.ER_SP_VARCOND_AFTER_CURSHNDLR = 1337; +exports.ER_SP_CURSOR_AFTER_HANDLER = 1338; +exports.ER_SP_CASE_NOT_FOUND = 1339; +exports.ER_FPARSER_TOO_BIG_FILE = 1340; +exports.ER_FPARSER_BAD_HEADER = 1341; +exports.ER_FPARSER_EOF_IN_COMMENT = 1342; +exports.ER_FPARSER_ERROR_IN_PARAMETER = 1343; +exports.ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344; +exports.ER_VIEW_NO_EXPLAIN = 1345; +exports.ER_FRM_UNKNOWN_TYPE = 1346; +exports.ER_WRONG_OBJECT = 1347; +exports.ER_NONUPDATEABLE_COLUMN = 1348; +exports.ER_VIEW_SELECT_DERIVED = 1349; +exports.ER_VIEW_SELECT_CLAUSE = 1350; +exports.ER_VIEW_SELECT_VARIABLE = 1351; +exports.ER_VIEW_SELECT_TMPTABLE = 1352; +exports.ER_VIEW_WRONG_LIST = 1353; +exports.ER_WARN_VIEW_MERGE = 1354; +exports.ER_WARN_VIEW_WITHOUT_KEY = 1355; +exports.ER_VIEW_INVALID = 1356; +exports.ER_SP_NO_DROP_SP = 1357; +exports.ER_SP_GOTO_IN_HNDLR = 1358; +exports.ER_TRG_ALREADY_EXISTS = 1359; +exports.ER_TRG_DOES_NOT_EXIST = 1360; +exports.ER_TRG_ON_VIEW_OR_TEMP_TABLE = 1361; +exports.ER_TRG_CANT_CHANGE_ROW = 1362; +exports.ER_TRG_NO_SUCH_ROW_IN_TRG = 1363; +exports.ER_NO_DEFAULT_FOR_FIELD = 1364; +exports.ER_DIVISION_BY_ZERO = 1365; +exports.ER_TRUNCATED_WRONG_VALUE_FOR_FIELD = 1366; +exports.ER_ILLEGAL_VALUE_FOR_TYPE = 1367; +exports.ER_VIEW_NONUPD_CHECK = 1368; +exports.ER_VIEW_CHECK_FAILED = 1369; +exports.ER_PROCACCESS_DENIED_ERROR = 1370; +exports.ER_RELAY_LOG_FAIL = 1371; +exports.ER_PASSWD_LENGTH = 1372; +exports.ER_UNKNOWN_TARGET_BINLOG = 1373; +exports.ER_IO_ERR_LOG_INDEX_READ = 1374; +exports.ER_BINLOG_PURGE_PROHIBITED = 1375; +exports.ER_FSEEK_FAIL = 1376; +exports.ER_BINLOG_PURGE_FATAL_ERR = 1377; +exports.ER_LOG_IN_USE = 1378; +exports.ER_LOG_PURGE_UNKNOWN_ERR = 1379; +exports.ER_RELAY_LOG_INIT = 1380; +exports.ER_NO_BINARY_LOGGING = 1381; +exports.ER_RESERVED_SYNTAX = 1382; +exports.ER_WSAS_FAILED = 1383; +exports.ER_DIFF_GROUPS_PROC = 1384; +exports.ER_NO_GROUP_FOR_PROC = 1385; +exports.ER_ORDER_WITH_PROC = 1386; +exports.ER_LOGGING_PROHIBIT_CHANGING_OF = 1387; +exports.ER_NO_FILE_MAPPING = 1388; +exports.ER_WRONG_MAGIC = 1389; +exports.ER_PS_MANY_PARAM = 1390; +exports.ER_KEY_PART_0 = 1391; +exports.ER_VIEW_CHECKSUM = 1392; +exports.ER_VIEW_MULTIUPDATE = 1393; +exports.ER_VIEW_NO_INSERT_FIELD_LIST = 1394; +exports.ER_VIEW_DELETE_MERGE_VIEW = 1395; +exports.ER_CANNOT_USER = 1396; +exports.ER_XAER_NOTA = 1397; +exports.ER_XAER_INVAL = 1398; +exports.ER_XAER_RMFAIL = 1399; +exports.ER_XAER_OUTSIDE = 1400; +exports.ER_XAER_RMERR = 1401; +exports.ER_XA_RBROLLBACK = 1402; +exports.ER_NONEXISTING_PROC_GRANT = 1403; +exports.ER_PROC_AUTO_GRANT_FAIL = 1404; +exports.ER_PROC_AUTO_REVOKE_FAIL = 1405; +exports.ER_DATA_TOO_LONG = 1406; +exports.ER_SP_BAD_SQLSTATE = 1407; +exports.ER_STARTUP = 1408; +exports.ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR = 1409; +exports.ER_CANT_CREATE_USER_WITH_GRANT = 1410; +exports.ER_WRONG_VALUE_FOR_TYPE = 1411; +exports.ER_TABLE_DEF_CHANGED = 1412; +exports.ER_SP_DUP_HANDLER = 1413; +exports.ER_SP_NOT_VAR_ARG = 1414; +exports.ER_SP_NO_RETSET = 1415; +exports.ER_CANT_CREATE_GEOMETRY_OBJECT = 1416; +exports.ER_FAILED_ROUTINE_BREAK_BINLOG = 1417; +exports.ER_BINLOG_UNSAFE_ROUTINE = 1418; +exports.ER_BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419; +exports.ER_EXEC_STMT_WITH_OPEN_CURSOR = 1420; +exports.ER_STMT_HAS_NO_OPEN_CURSOR = 1421; +exports.ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422; +exports.ER_NO_DEFAULT_FOR_VIEW_FIELD = 1423; +exports.ER_SP_NO_RECURSION = 1424; +exports.ER_TOO_BIG_SCALE = 1425; +exports.ER_TOO_BIG_PRECISION = 1426; +exports.ER_M_BIGGER_THAN_D = 1427; +exports.ER_WRONG_LOCK_OF_SYSTEM_TABLE = 1428; +exports.ER_CONNECT_TO_FOREIGN_DATA_SOURCE = 1429; +exports.ER_QUERY_ON_FOREIGN_DATA_SOURCE = 1430; +exports.ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431; +exports.ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432; +exports.ER_FOREIGN_DATA_STRING_INVALID = 1433; +exports.ER_CANT_CREATE_FEDERATED_TABLE = 1434; +exports.ER_TRG_IN_WRONG_SCHEMA = 1435; +exports.ER_STACK_OVERRUN_NEED_MORE = 1436; +exports.ER_TOO_LONG_BODY = 1437; +exports.ER_WARN_CANT_DROP_DEFAULT_KEYCACHE = 1438; +exports.ER_TOO_BIG_DISPLAYWIDTH = 1439; +exports.ER_XAER_DUPID = 1440; +exports.ER_DATETIME_FUNCTION_OVERFLOW = 1441; +exports.ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG = 1442; +exports.ER_VIEW_PREVENT_UPDATE = 1443; +exports.ER_PS_NO_RECURSION = 1444; +exports.ER_SP_CANT_SET_AUTOCOMMIT = 1445; +exports.ER_MALFORMED_DEFINER = 1446; +exports.ER_VIEW_FRM_NO_USER = 1447; +exports.ER_VIEW_OTHER_USER = 1448; +exports.ER_NO_SUCH_USER = 1449; +exports.ER_FORBID_SCHEMA_CHANGE = 1450; +exports.ER_ROW_IS_REFERENCED_2 = 1451; +exports.ER_NO_REFERENCED_ROW_2 = 1452; +exports.ER_SP_BAD_VAR_SHADOW = 1453; +exports.ER_TRG_NO_DEFINER = 1454; +exports.ER_OLD_FILE_FORMAT = 1455; +exports.ER_SP_RECURSION_LIMIT = 1456; +exports.ER_SP_PROC_TABLE_CORRUPT = 1457; +exports.ER_SP_WRONG_NAME = 1458; +exports.ER_TABLE_NEEDS_UPGRADE = 1459; +exports.ER_SP_NO_AGGREGATE = 1460; +exports.ER_MAX_PREPARED_STMT_COUNT_REACHED = 1461; +exports.ER_VIEW_RECURSIVE = 1462; +exports.ER_NON_GROUPING_FIELD_USED = 1463; +exports.ER_TABLE_CANT_HANDLE_SPKEYS = 1464; +exports.ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA = 1465; +exports.ER_REMOVED_SPACES = 1466; +exports.ER_AUTOINC_READ_FAILED = 1467; +exports.ER_USERNAME = 1468; +exports.ER_HOSTNAME = 1469; +exports.ER_WRONG_STRING_LENGTH = 1470; +exports.ER_NON_INSERTABLE_TABLE = 1471; +exports.ER_ADMIN_WRONG_MRG_TABLE = 1472; +exports.ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT = 1473; +exports.ER_NAME_BECOMES_EMPTY = 1474; +exports.ER_AMBIGUOUS_FIELD_TERM = 1475; +exports.ER_FOREIGN_SERVER_EXISTS = 1476; +exports.ER_FOREIGN_SERVER_DOESNT_EXIST = 1477; +exports.ER_ILLEGAL_HA_CREATE_OPTION = 1478; +exports.ER_PARTITION_REQUIRES_VALUES_ERROR = 1479; +exports.ER_PARTITION_WRONG_VALUES_ERROR = 1480; +exports.ER_PARTITION_MAXVALUE_ERROR = 1481; +exports.ER_PARTITION_SUBPARTITION_ERROR = 1482; +exports.ER_PARTITION_SUBPART_MIX_ERROR = 1483; +exports.ER_PARTITION_WRONG_NO_PART_ERROR = 1484; +exports.ER_PARTITION_WRONG_NO_SUBPART_ERROR = 1485; +exports.ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR = 1486; +exports.ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR = 1487; +exports.ER_FIELD_NOT_FOUND_PART_ERROR = 1488; +exports.ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR = 1489; +exports.ER_INCONSISTENT_PARTITION_INFO_ERROR = 1490; +exports.ER_PARTITION_FUNC_NOT_ALLOWED_ERROR = 1491; +exports.ER_PARTITIONS_MUST_BE_DEFINED_ERROR = 1492; +exports.ER_RANGE_NOT_INCREASING_ERROR = 1493; +exports.ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR = 1494; +exports.ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR = 1495; +exports.ER_PARTITION_ENTRY_ERROR = 1496; +exports.ER_MIX_HANDLER_ERROR = 1497; +exports.ER_PARTITION_NOT_DEFINED_ERROR = 1498; +exports.ER_TOO_MANY_PARTITIONS_ERROR = 1499; +exports.ER_SUBPARTITION_ERROR = 1500; +exports.ER_CANT_CREATE_HANDLER_FILE = 1501; +exports.ER_BLOB_FIELD_IN_PART_FUNC_ERROR = 1502; +exports.ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF = 1503; +exports.ER_NO_PARTS_ERROR = 1504; +exports.ER_PARTITION_MGMT_ON_NONPARTITIONED = 1505; +exports.ER_FOREIGN_KEY_ON_PARTITIONED = 1506; +exports.ER_DROP_PARTITION_NON_EXISTENT = 1507; +exports.ER_DROP_LAST_PARTITION = 1508; +exports.ER_COALESCE_ONLY_ON_HASH_PARTITION = 1509; +exports.ER_REORG_HASH_ONLY_ON_SAME_NO = 1510; +exports.ER_REORG_NO_PARAM_ERROR = 1511; +exports.ER_ONLY_ON_RANGE_LIST_PARTITION = 1512; +exports.ER_ADD_PARTITION_SUBPART_ERROR = 1513; +exports.ER_ADD_PARTITION_NO_NEW_PARTITION = 1514; +exports.ER_COALESCE_PARTITION_NO_PARTITION = 1515; +exports.ER_REORG_PARTITION_NOT_EXIST = 1516; +exports.ER_SAME_NAME_PARTITION = 1517; +exports.ER_NO_BINLOG_ERROR = 1518; +exports.ER_CONSECUTIVE_REORG_PARTITIONS = 1519; +exports.ER_REORG_OUTSIDE_RANGE = 1520; +exports.ER_PARTITION_FUNCTION_FAILURE = 1521; +exports.ER_PART_STATE_ERROR = 1522; +exports.ER_LIMITED_PART_RANGE = 1523; +exports.ER_PLUGIN_IS_NOT_LOADED = 1524; +exports.ER_WRONG_VALUE = 1525; +exports.ER_NO_PARTITION_FOR_GIVEN_VALUE = 1526; +exports.ER_FILEGROUP_OPTION_ONLY_ONCE = 1527; +exports.ER_CREATE_FILEGROUP_FAILED = 1528; +exports.ER_DROP_FILEGROUP_FAILED = 1529; +exports.ER_TABLESPACE_AUTO_EXTEND_ERROR = 1530; +exports.ER_WRONG_SIZE_NUMBER = 1531; +exports.ER_SIZE_OVERFLOW_ERROR = 1532; +exports.ER_ALTER_FILEGROUP_FAILED = 1533; +exports.ER_BINLOG_ROW_LOGGING_FAILED = 1534; +exports.ER_BINLOG_ROW_WRONG_TABLE_DEF = 1535; +exports.ER_BINLOG_ROW_RBR_TO_SBR = 1536; +exports.ER_EVENT_ALREADY_EXISTS = 1537; +exports.ER_EVENT_STORE_FAILED = 1538; +exports.ER_EVENT_DOES_NOT_EXIST = 1539; +exports.ER_EVENT_CANT_ALTER = 1540; +exports.ER_EVENT_DROP_FAILED = 1541; +exports.ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG = 1542; +exports.ER_EVENT_ENDS_BEFORE_STARTS = 1543; +exports.ER_EVENT_EXEC_TIME_IN_THE_PAST = 1544; +exports.ER_EVENT_OPEN_TABLE_FAILED = 1545; +exports.ER_EVENT_NEITHER_M_EXPR_NOR_M_AT = 1546; +exports.ER_COL_COUNT_DOESNT_MATCH_CORRUPTED = 1547; +exports.ER_CANNOT_LOAD_FROM_TABLE = 1548; +exports.ER_EVENT_CANNOT_DELETE = 1549; +exports.ER_EVENT_COMPILE_ERROR = 1550; +exports.ER_EVENT_SAME_NAME = 1551; +exports.ER_EVENT_DATA_TOO_LONG = 1552; +exports.ER_DROP_INDEX_FK = 1553; +exports.ER_WARN_DEPRECATED_SYNTAX_WITH_VER = 1554; +exports.ER_CANT_WRITE_LOCK_LOG_TABLE = 1555; +exports.ER_CANT_LOCK_LOG_TABLE = 1556; +exports.ER_FOREIGN_DUPLICATE_KEY = 1557; +exports.ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE = 1558; +exports.ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR = 1559; +exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1560; +exports.ER_NDB_CANT_SWITCH_BINLOG_FORMAT = 1561; +exports.ER_PARTITION_NO_TEMPORARY = 1562; +exports.ER_PARTITION_CONST_DOMAIN_ERROR = 1563; +exports.ER_PARTITION_FUNCTION_IS_NOT_ALLOWED = 1564; +exports.ER_DDL_LOG_ERROR = 1565; +exports.ER_NULL_IN_VALUES_LESS_THAN = 1566; +exports.ER_WRONG_PARTITION_NAME = 1567; +exports.ER_CANT_CHANGE_TX_CHARACTERISTICS = 1568; +exports.ER_DUP_ENTRY_AUTOINCREMENT_CASE = 1569; +exports.ER_EVENT_MODIFY_QUEUE_ERROR = 1570; +exports.ER_EVENT_SET_VAR_ERROR = 1571; +exports.ER_PARTITION_MERGE_ERROR = 1572; +exports.ER_CANT_ACTIVATE_LOG = 1573; +exports.ER_RBR_NOT_AVAILABLE = 1574; +exports.ER_BASE64_DECODE_ERROR = 1575; +exports.ER_EVENT_RECURSION_FORBIDDEN = 1576; +exports.ER_EVENTS_DB_ERROR = 1577; +exports.ER_ONLY_INTEGERS_ALLOWED = 1578; +exports.ER_UNSUPORTED_LOG_ENGINE = 1579; +exports.ER_BAD_LOG_STATEMENT = 1580; +exports.ER_CANT_RENAME_LOG_TABLE = 1581; +exports.ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT = 1582; +exports.ER_WRONG_PARAMETERS_TO_NATIVE_FCT = 1583; +exports.ER_WRONG_PARAMETERS_TO_STORED_FCT = 1584; +exports.ER_NATIVE_FCT_NAME_COLLISION = 1585; +exports.ER_DUP_ENTRY_WITH_KEY_NAME = 1586; +exports.ER_BINLOG_PURGE_EMFILE = 1587; +exports.ER_EVENT_CANNOT_CREATE_IN_THE_PAST = 1588; +exports.ER_EVENT_CANNOT_ALTER_IN_THE_PAST = 1589; +exports.ER_SLAVE_INCIDENT = 1590; +exports.ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT = 1591; +exports.ER_BINLOG_UNSAFE_STATEMENT = 1592; +exports.ER_SLAVE_FATAL_ERROR = 1593; +exports.ER_SLAVE_RELAY_LOG_READ_FAILURE = 1594; +exports.ER_SLAVE_RELAY_LOG_WRITE_FAILURE = 1595; +exports.ER_SLAVE_CREATE_EVENT_FAILURE = 1596; +exports.ER_SLAVE_MASTER_COM_FAILURE = 1597; +exports.ER_BINLOG_LOGGING_IMPOSSIBLE = 1598; +exports.ER_VIEW_NO_CREATION_CTX = 1599; +exports.ER_VIEW_INVALID_CREATION_CTX = 1600; +exports.ER_SR_INVALID_CREATION_CTX = 1601; +exports.ER_TRG_CORRUPTED_FILE = 1602; +exports.ER_TRG_NO_CREATION_CTX = 1603; +exports.ER_TRG_INVALID_CREATION_CTX = 1604; +exports.ER_EVENT_INVALID_CREATION_CTX = 1605; +exports.ER_TRG_CANT_OPEN_TABLE = 1606; +exports.ER_CANT_CREATE_SROUTINE = 1607; +exports.ER_NEVER_USED = 1608; +exports.ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT = 1609; +exports.ER_SLAVE_CORRUPT_EVENT = 1610; +exports.ER_LOAD_DATA_INVALID_COLUMN = 1611; +exports.ER_LOG_PURGE_NO_FILE = 1612; +exports.ER_XA_RBTIMEOUT = 1613; +exports.ER_XA_RBDEADLOCK = 1614; +exports.ER_NEED_REPREPARE = 1615; +exports.ER_DELAYED_NOT_SUPPORTED = 1616; +exports.WARN_NO_MASTER_INFO = 1617; +exports.WARN_OPTION_IGNORED = 1618; +exports.ER_PLUGIN_DELETE_BUILTIN = 1619; +exports.WARN_PLUGIN_BUSY = 1620; +exports.ER_VARIABLE_IS_READONLY = 1621; +exports.ER_WARN_ENGINE_TRANSACTION_ROLLBACK = 1622; +exports.ER_SLAVE_HEARTBEAT_FAILURE = 1623; +exports.ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE = 1624; +exports.ER_NDB_REPLICATION_SCHEMA_ERROR = 1625; +exports.ER_CONFLICT_FN_PARSE_ERROR = 1626; +exports.ER_EXCEPTIONS_WRITE_ERROR = 1627; +exports.ER_TOO_LONG_TABLE_COMMENT = 1628; +exports.ER_TOO_LONG_FIELD_COMMENT = 1629; +exports.ER_FUNC_INEXISTENT_NAME_COLLISION = 1630; +exports.ER_DATABASE_NAME = 1631; +exports.ER_TABLE_NAME = 1632; +exports.ER_PARTITION_NAME = 1633; +exports.ER_SUBPARTITION_NAME = 1634; +exports.ER_TEMPORARY_NAME = 1635; +exports.ER_RENAMED_NAME = 1636; +exports.ER_TOO_MANY_CONCURRENT_TRXS = 1637; +exports.WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED = 1638; +exports.ER_DEBUG_SYNC_TIMEOUT = 1639; +exports.ER_DEBUG_SYNC_HIT_LIMIT = 1640; +exports.ER_DUP_SIGNAL_SET = 1641; +exports.ER_SIGNAL_WARN = 1642; +exports.ER_SIGNAL_NOT_FOUND = 1643; +exports.ER_SIGNAL_EXCEPTION = 1644; +exports.ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER = 1645; +exports.ER_SIGNAL_BAD_CONDITION_TYPE = 1646; +exports.WARN_COND_ITEM_TRUNCATED = 1647; +exports.ER_COND_ITEM_TOO_LONG = 1648; +exports.ER_UNKNOWN_LOCALE = 1649; +exports.ER_SLAVE_IGNORE_SERVER_IDS = 1650; +exports.ER_QUERY_CACHE_DISABLED = 1651; +exports.ER_SAME_NAME_PARTITION_FIELD = 1652; +exports.ER_PARTITION_COLUMN_LIST_ERROR = 1653; +exports.ER_WRONG_TYPE_COLUMN_VALUE_ERROR = 1654; +exports.ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR = 1655; +exports.ER_MAXVALUE_IN_VALUES_IN = 1656; +exports.ER_TOO_MANY_VALUES_ERROR = 1657; +exports.ER_ROW_SINGLE_PARTITION_FIELD_ERROR = 1658; +exports.ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD = 1659; +exports.ER_PARTITION_FIELDS_TOO_LONG = 1660; +exports.ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE = 1661; +exports.ER_BINLOG_ROW_MODE_AND_STMT_ENGINE = 1662; +exports.ER_BINLOG_UNSAFE_AND_STMT_ENGINE = 1663; +exports.ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE = 1664; +exports.ER_BINLOG_STMT_MODE_AND_ROW_ENGINE = 1665; +exports.ER_BINLOG_ROW_INJECTION_AND_STMT_MODE = 1666; +exports.ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1667; +exports.ER_BINLOG_UNSAFE_LIMIT = 1668; +exports.ER_BINLOG_UNSAFE_INSERT_DELAYED = 1669; +exports.ER_BINLOG_UNSAFE_SYSTEM_TABLE = 1670; +exports.ER_BINLOG_UNSAFE_AUTOINC_COLUMNS = 1671; +exports.ER_BINLOG_UNSAFE_UDF = 1672; +exports.ER_BINLOG_UNSAFE_SYSTEM_VARIABLE = 1673; +exports.ER_BINLOG_UNSAFE_SYSTEM_FUNCTION = 1674; +exports.ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS = 1675; +exports.ER_MESSAGE_AND_STATEMENT = 1676; +exports.ER_SLAVE_CONVERSION_FAILED = 1677; +exports.ER_SLAVE_CANT_CREATE_CONVERSION = 1678; +exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1679; +exports.ER_PATH_LENGTH = 1680; +exports.ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT = 1681; +exports.ER_WRONG_NATIVE_TABLE_STRUCTURE = 1682; +exports.ER_WRONG_PERFSCHEMA_USAGE = 1683; +exports.ER_WARN_I_S_SKIPPED_TABLE = 1684; +exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1685; +exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1686; +exports.ER_SPATIAL_MUST_HAVE_GEOM_COL = 1687; +exports.ER_TOO_LONG_INDEX_COMMENT = 1688; +exports.ER_LOCK_ABORTED = 1689; +exports.ER_DATA_OUT_OF_RANGE = 1690; +exports.ER_WRONG_SPVAR_TYPE_IN_LIMIT = 1691; +exports.ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1692; +exports.ER_BINLOG_UNSAFE_MIXED_STATEMENT = 1693; +exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1694; +exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1695; +exports.ER_FAILED_READ_FROM_PAR_FILE = 1696; +exports.ER_VALUES_IS_NOT_INT_TYPE_ERROR = 1697; +exports.ER_ACCESS_DENIED_NO_PASSWORD_ERROR = 1698; +exports.ER_SET_PASSWORD_AUTH_PLUGIN = 1699; +exports.ER_GRANT_PLUGIN_USER_EXISTS = 1700; +exports.ER_TRUNCATE_ILLEGAL_FK = 1701; +exports.ER_PLUGIN_IS_PERMANENT = 1702; +exports.ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN = 1703; +exports.ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX = 1704; +exports.ER_STMT_CACHE_FULL = 1705; +exports.ER_MULTI_UPDATE_KEY_CONFLICT = 1706; +exports.ER_TABLE_NEEDS_REBUILD = 1707; +exports.WARN_OPTION_BELOW_LIMIT = 1708; +exports.ER_INDEX_COLUMN_TOO_LONG = 1709; +exports.ER_ERROR_IN_TRIGGER_BODY = 1710; +exports.ER_ERROR_IN_UNKNOWN_TRIGGER_BODY = 1711; +exports.ER_INDEX_CORRUPT = 1712; +exports.ER_UNDO_RECORD_TOO_BIG = 1713; +exports.ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT = 1714; +exports.ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE = 1715; +exports.ER_BINLOG_UNSAFE_REPLACE_SELECT = 1716; +exports.ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT = 1717; +exports.ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT = 1718; +exports.ER_BINLOG_UNSAFE_UPDATE_IGNORE = 1719; +exports.ER_PLUGIN_NO_UNINSTALL = 1720; +exports.ER_PLUGIN_NO_INSTALL = 1721; +exports.ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT = 1722; +exports.ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC = 1723; +exports.ER_BINLOG_UNSAFE_INSERT_TWO_KEYS = 1724; +exports.ER_TABLE_IN_FK_CHECK = 1725; +exports.ER_UNSUPPORTED_ENGINE = 1726; +exports.ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST = 1727; +exports.ER_CANNOT_LOAD_FROM_TABLE_V2 = 1728; +exports.ER_MASTER_DELAY_VALUE_OUT_OF_RANGE = 1729; +exports.ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT = 1730; +exports.ER_PARTITION_EXCHANGE_DIFFERENT_OPTION = 1731; +exports.ER_PARTITION_EXCHANGE_PART_TABLE = 1732; +exports.ER_PARTITION_EXCHANGE_TEMP_TABLE = 1733; +exports.ER_PARTITION_INSTEAD_OF_SUBPARTITION = 1734; +exports.ER_UNKNOWN_PARTITION = 1735; +exports.ER_TABLES_DIFFERENT_METADATA = 1736; +exports.ER_ROW_DOES_NOT_MATCH_PARTITION = 1737; +exports.ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX = 1738; +exports.ER_WARN_INDEX_NOT_APPLICABLE = 1739; +exports.ER_PARTITION_EXCHANGE_FOREIGN_KEY = 1740; +exports.ER_NO_SUCH_KEY_VALUE = 1741; +exports.ER_RPL_INFO_DATA_TOO_LONG = 1742; +exports.ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE = 1743; +exports.ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE = 1744; +exports.ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX = 1745; +exports.ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT = 1746; +exports.ER_PARTITION_CLAUSE_ON_NONPARTITIONED = 1747; +exports.ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET = 1748; +exports.ER_NO_SUCH_PARTITION = 1749; +exports.ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE = 1750; +exports.ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE = 1751; +exports.ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE = 1752; +exports.ER_MTS_FEATURE_IS_NOT_SUPPORTED = 1753; +exports.ER_MTS_UPDATED_DBS_GREATER_MAX = 1754; +exports.ER_MTS_CANT_PARALLEL = 1755; +exports.ER_MTS_INCONSISTENT_DATA = 1756; +exports.ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING = 1757; +exports.ER_DA_INVALID_CONDITION_NUMBER = 1758; +exports.ER_INSECURE_PLAIN_TEXT = 1759; +exports.ER_INSECURE_CHANGE_MASTER = 1760; +exports.ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO = 1761; +exports.ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO = 1762; +exports.ER_SQLTHREAD_WITH_SECURE_SLAVE = 1763; +exports.ER_TABLE_HAS_NO_FT = 1764; +exports.ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER = 1765; +exports.ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION = 1766; +exports.ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST = 1767; +exports.ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION = 1768; +exports.ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION = 1769; +exports.ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL = 1770; +exports.ER_SKIPPING_LOGGED_TRANSACTION = 1771; +exports.ER_MALFORMED_GTID_SET_SPECIFICATION = 1772; +exports.ER_MALFORMED_GTID_SET_ENCODING = 1773; +exports.ER_MALFORMED_GTID_SPECIFICATION = 1774; +exports.ER_GNO_EXHAUSTED = 1775; +exports.ER_BAD_SLAVE_AUTO_POSITION = 1776; +exports.ER_AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF = 1777; +exports.ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET = 1778; +exports.ER_GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON = 1779; +exports.ER_GTID_MODE_REQUIRES_BINLOG = 1780; +exports.ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF = 1781; +exports.ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON = 1782; +exports.ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF = 1783; +exports.ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF = 1784; +exports.ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE = 1785; +exports.ER_GTID_UNSAFE_CREATE_SELECT = 1786; +exports.ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION = 1787; +exports.ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME = 1788; +exports.ER_MASTER_HAS_PURGED_REQUIRED_GTIDS = 1789; +exports.ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID = 1790; +exports.ER_UNKNOWN_EXPLAIN_FORMAT = 1791; +exports.ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION = 1792; +exports.ER_TOO_LONG_TABLE_PARTITION_COMMENT = 1793; +exports.ER_SLAVE_CONFIGURATION = 1794; +exports.ER_INNODB_FT_LIMIT = 1795; +exports.ER_INNODB_NO_FT_TEMP_TABLE = 1796; +exports.ER_INNODB_FT_WRONG_DOCID_COLUMN = 1797; +exports.ER_INNODB_FT_WRONG_DOCID_INDEX = 1798; +exports.ER_INNODB_ONLINE_LOG_TOO_BIG = 1799; +exports.ER_UNKNOWN_ALTER_ALGORITHM = 1800; +exports.ER_UNKNOWN_ALTER_LOCK = 1801; +exports.ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS = 1802; +exports.ER_MTS_RECOVERY_FAILURE = 1803; +exports.ER_MTS_RESET_WORKERS = 1804; +exports.ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 = 1805; +exports.ER_SLAVE_SILENT_RETRY_TRANSACTION = 1806; +exports.ER_DISCARD_FK_CHECKS_RUNNING = 1807; +exports.ER_TABLE_SCHEMA_MISMATCH = 1808; +exports.ER_TABLE_IN_SYSTEM_TABLESPACE = 1809; +exports.ER_IO_READ_ERROR = 1810; +exports.ER_IO_WRITE_ERROR = 1811; +exports.ER_TABLESPACE_MISSING = 1812; +exports.ER_TABLESPACE_EXISTS = 1813; +exports.ER_TABLESPACE_DISCARDED = 1814; +exports.ER_INTERNAL_ERROR = 1815; +exports.ER_INNODB_IMPORT_ERROR = 1816; +exports.ER_INNODB_INDEX_CORRUPT = 1817; +exports.ER_INVALID_YEAR_COLUMN_LENGTH = 1818; +exports.ER_NOT_VALID_PASSWORD = 1819; +exports.ER_MUST_CHANGE_PASSWORD = 1820; +exports.ER_FK_NO_INDEX_CHILD = 1821; +exports.ER_FK_NO_INDEX_PARENT = 1822; +exports.ER_FK_FAIL_ADD_SYSTEM = 1823; +exports.ER_FK_CANNOT_OPEN_PARENT = 1824; +exports.ER_FK_INCORRECT_OPTION = 1825; +exports.ER_FK_DUP_NAME = 1826; +exports.ER_PASSWORD_FORMAT = 1827; +exports.ER_FK_COLUMN_CANNOT_DROP = 1828; +exports.ER_FK_COLUMN_CANNOT_DROP_CHILD = 1829; +exports.ER_FK_COLUMN_NOT_NULL = 1830; +exports.ER_DUP_INDEX = 1831; +exports.ER_FK_COLUMN_CANNOT_CHANGE = 1832; +exports.ER_FK_COLUMN_CANNOT_CHANGE_CHILD = 1833; +exports.ER_FK_CANNOT_DELETE_PARENT = 1834; +exports.ER_MALFORMED_PACKET = 1835; +exports.ER_READ_ONLY_MODE = 1836; +exports.ER_GTID_NEXT_TYPE_UNDEFINED_GROUP = 1837; +exports.ER_VARIABLE_NOT_SETTABLE_IN_SP = 1838; +exports.ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF = 1839; +exports.ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY = 1840; +exports.ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY = 1841; +exports.ER_GTID_PURGED_WAS_CHANGED = 1842; +exports.ER_GTID_EXECUTED_WAS_CHANGED = 1843; +exports.ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES = 1844; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED = 1845; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON = 1846; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY = 1847; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION = 1848; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME = 1849; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE = 1850; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK = 1851; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE = 1852; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK = 1853; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC = 1854; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS = 1855; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS = 1856; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS = 1857; +exports.ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE = 1858; +exports.ER_DUP_UNKNOWN_IN_INDEX = 1859; +exports.ER_IDENT_CAUSES_TOO_LONG_PATH = 1860; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL = 1861; +exports.ER_MUST_CHANGE_PASSWORD_LOGIN = 1862; +exports.ER_ROW_IN_WRONG_PARTITION = 1863; +exports.ER_MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX = 1864; +exports.ER_INNODB_NO_FT_USES_PARSER = 1865; +exports.ER_BINLOG_LOGICAL_CORRUPTION = 1866; +exports.ER_WARN_PURGE_LOG_IN_USE = 1867; +exports.ER_WARN_PURGE_LOG_IS_ACTIVE = 1868; +exports.ER_AUTO_INCREMENT_CONFLICT = 1869; +exports.WARN_ON_BLOCKHOLE_IN_RBR = 1870; +exports.ER_SLAVE_MI_INIT_REPOSITORY = 1871; +exports.ER_SLAVE_RLI_INIT_REPOSITORY = 1872; +exports.ER_ACCESS_DENIED_CHANGE_USER_ERROR = 1873; +exports.ER_INNODB_READ_ONLY = 1874; +exports.ER_STOP_SLAVE_SQL_THREAD_TIMEOUT = 1875; +exports.ER_STOP_SLAVE_IO_THREAD_TIMEOUT = 1876; +exports.ER_TABLE_CORRUPT = 1877; +exports.ER_TEMP_FILE_WRITE_FAILURE = 1878; +exports.ER_INNODB_FT_AUX_NOT_HEX_ID = 1879; +exports.ER_OLD_TEMPORALS_UPGRADED = 1880; +exports.ER_INNODB_FORCED_RECOVERY = 1881; +exports.ER_AES_INVALID_IV = 1882; +exports.ER_PLUGIN_CANNOT_BE_UNINSTALLED = 1883; +exports.ER_GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_GTID_GROUP = 1884; +exports.ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER = 1885; +exports.ER_FILE_CORRUPT = 3000; +exports.ER_ERROR_ON_MASTER = 3001; +exports.ER_INCONSISTENT_ERROR = 3002; +exports.ER_STORAGE_ENGINE_NOT_LOADED = 3003; +exports.ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER = 3004; +exports.ER_WARN_LEGACY_SYNTAX_CONVERTED = 3005; +exports.ER_BINLOG_UNSAFE_FULLTEXT_PLUGIN = 3006; +exports.ER_CANNOT_DISCARD_TEMPORARY_TABLE = 3007; +exports.ER_FK_DEPTH_EXCEEDED = 3008; +exports.ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2 = 3009; +exports.ER_WARN_TRIGGER_DOESNT_HAVE_CREATED = 3010; +exports.ER_REFERENCED_TRG_DOES_NOT_EXIST = 3011; +exports.ER_EXPLAIN_NOT_SUPPORTED = 3012; +exports.ER_INVALID_FIELD_SIZE = 3013; +exports.ER_MISSING_HA_CREATE_OPTION = 3014; +exports.ER_ENGINE_OUT_OF_MEMORY = 3015; +exports.ER_PASSWORD_EXPIRE_ANONYMOUS_USER = 3016; +exports.ER_SLAVE_SQL_THREAD_MUST_STOP = 3017; +exports.ER_NO_FT_MATERIALIZED_SUBQUERY = 3018; +exports.ER_INNODB_UNDO_LOG_FULL = 3019; +exports.ER_INVALID_ARGUMENT_FOR_LOGARITHM = 3020; +exports.ER_SLAVE_CHANNEL_IO_THREAD_MUST_STOP = 3021; +exports.ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO = 3022; +exports.ER_WARN_ONLY_MASTER_LOG_FILE_NO_POS = 3023; +exports.ER_QUERY_TIMEOUT = 3024; +exports.ER_NON_RO_SELECT_DISABLE_TIMER = 3025; +exports.ER_DUP_LIST_ENTRY = 3026; +exports.ER_SQL_MODE_NO_EFFECT = 3027; +exports.ER_AGGREGATE_ORDER_FOR_UNION = 3028; +exports.ER_AGGREGATE_ORDER_NON_AGG_QUERY = 3029; +exports.ER_SLAVE_WORKER_STOPPED_PREVIOUS_THD_ERROR = 3030; +exports.ER_DONT_SUPPORT_SLAVE_PRESERVE_COMMIT_ORDER = 3031; +exports.ER_SERVER_OFFLINE_MODE = 3032; +exports.ER_GIS_DIFFERENT_SRIDS = 3033; +exports.ER_GIS_UNSUPPORTED_ARGUMENT = 3034; +exports.ER_GIS_UNKNOWN_ERROR = 3035; +exports.ER_GIS_UNKNOWN_EXCEPTION = 3036; +exports.ER_GIS_INVALID_DATA = 3037; +exports.ER_BOOST_GEOMETRY_EMPTY_INPUT_EXCEPTION = 3038; +exports.ER_BOOST_GEOMETRY_CENTROID_EXCEPTION = 3039; +exports.ER_BOOST_GEOMETRY_OVERLAY_INVALID_INPUT_EXCEPTION = 3040; +exports.ER_BOOST_GEOMETRY_TURN_INFO_EXCEPTION = 3041; +exports.ER_BOOST_GEOMETRY_SELF_INTERSECTION_POINT_EXCEPTION = 3042; +exports.ER_BOOST_GEOMETRY_UNKNOWN_EXCEPTION = 3043; +exports.ER_STD_BAD_ALLOC_ERROR = 3044; +exports.ER_STD_DOMAIN_ERROR = 3045; +exports.ER_STD_LENGTH_ERROR = 3046; +exports.ER_STD_INVALID_ARGUMENT = 3047; +exports.ER_STD_OUT_OF_RANGE_ERROR = 3048; +exports.ER_STD_OVERFLOW_ERROR = 3049; +exports.ER_STD_RANGE_ERROR = 3050; +exports.ER_STD_UNDERFLOW_ERROR = 3051; +exports.ER_STD_LOGIC_ERROR = 3052; +exports.ER_STD_RUNTIME_ERROR = 3053; +exports.ER_STD_UNKNOWN_EXCEPTION = 3054; +exports.ER_GIS_DATA_WRONG_ENDIANESS = 3055; +exports.ER_CHANGE_MASTER_PASSWORD_LENGTH = 3056; +exports.ER_USER_LOCK_WRONG_NAME = 3057; +exports.ER_USER_LOCK_DEADLOCK = 3058; +exports.ER_REPLACE_INACCESSIBLE_ROWS = 3059; +exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_GIS = 3060; +exports.ER_ILLEGAL_USER_VAR = 3061; +exports.ER_GTID_MODE_OFF = 3062; +exports.ER_UNSUPPORTED_BY_REPLICATION_THREAD = 3063; +exports.ER_INCORRECT_TYPE = 3064; +exports.ER_FIELD_IN_ORDER_NOT_SELECT = 3065; +exports.ER_AGGREGATE_IN_ORDER_NOT_SELECT = 3066; +exports.ER_INVALID_RPL_WILD_TABLE_FILTER_PATTERN = 3067; +exports.ER_NET_OK_PACKET_TOO_LARGE = 3068; +exports.ER_INVALID_JSON_DATA = 3069; +exports.ER_INVALID_GEOJSON_MISSING_MEMBER = 3070; +exports.ER_INVALID_GEOJSON_WRONG_TYPE = 3071; +exports.ER_INVALID_GEOJSON_UNSPECIFIED = 3072; +exports.ER_DIMENSION_UNSUPPORTED = 3073; +exports.ER_SLAVE_CHANNEL_DOES_NOT_EXIST = 3074; +exports.ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT = 3075; +exports.ER_SLAVE_CHANNEL_NAME_INVALID_OR_TOO_LONG = 3076; +exports.ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORY = 3077; +exports.ER_SLAVE_CHANNEL_DELETE = 3078; +exports.ER_SLAVE_MULTIPLE_CHANNELS_CMD = 3079; +exports.ER_SLAVE_MAX_CHANNELS_EXCEEDED = 3080; +exports.ER_SLAVE_CHANNEL_MUST_STOP = 3081; +exports.ER_SLAVE_CHANNEL_NOT_RUNNING = 3082; +exports.ER_SLAVE_CHANNEL_WAS_RUNNING = 3083; +exports.ER_SLAVE_CHANNEL_WAS_NOT_RUNNING = 3084; +exports.ER_SLAVE_CHANNEL_SQL_THREAD_MUST_STOP = 3085; +exports.ER_SLAVE_CHANNEL_SQL_SKIP_COUNTER = 3086; +exports.ER_WRONG_FIELD_WITH_GROUP_V2 = 3087; +exports.ER_MIX_OF_GROUP_FUNC_AND_FIELDS_V2 = 3088; +exports.ER_WARN_DEPRECATED_SYSVAR_UPDATE = 3089; +exports.ER_WARN_DEPRECATED_SQLMODE = 3090; +exports.ER_CANNOT_LOG_PARTIAL_DROP_DATABASE_WITH_GTID = 3091; +exports.ER_GROUP_REPLICATION_CONFIGURATION = 3092; +exports.ER_GROUP_REPLICATION_RUNNING = 3093; +exports.ER_GROUP_REPLICATION_APPLIER_INIT_ERROR = 3094; +exports.ER_GROUP_REPLICATION_STOP_APPLIER_THREAD_TIMEOUT = 3095; +exports.ER_GROUP_REPLICATION_COMMUNICATION_LAYER_SESSION_ERROR = 3096; +exports.ER_GROUP_REPLICATION_COMMUNICATION_LAYER_JOIN_ERROR = 3097; +exports.ER_BEFORE_DML_VALIDATION_ERROR = 3098; +exports.ER_PREVENTS_VARIABLE_WITHOUT_RBR = 3099; +exports.ER_RUN_HOOK_ERROR = 3100; +exports.ER_TRANSACTION_ROLLBACK_DURING_COMMIT = 3101; +exports.ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED = 3102; +exports.ER_UNSUPPORTED_ALTER_INPLACE_ON_VIRTUAL_COLUMN = 3103; +exports.ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN = 3104; +exports.ER_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN = 3105; +exports.ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN = 3106; +exports.ER_GENERATED_COLUMN_NON_PRIOR = 3107; +exports.ER_DEPENDENT_BY_GENERATED_COLUMN = 3108; +exports.ER_GENERATED_COLUMN_REF_AUTO_INC = 3109; +exports.ER_FEATURE_NOT_AVAILABLE = 3110; +exports.ER_CANT_SET_GTID_MODE = 3111; +exports.ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF = 3112; +exports.ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION = 3113; +exports.ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON = 3114; +exports.ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF = 3115; +exports.ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS = 3116; +exports.ER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS = 3117; +exports.ER_ACCOUNT_HAS_BEEN_LOCKED = 3118; +exports.ER_WRONG_TABLESPACE_NAME = 3119; +exports.ER_TABLESPACE_IS_NOT_EMPTY = 3120; +exports.ER_WRONG_FILE_NAME = 3121; +exports.ER_BOOST_GEOMETRY_INCONSISTENT_TURNS_EXCEPTION = 3122; +exports.ER_WARN_OPTIMIZER_HINT_SYNTAX_ERROR = 3123; +exports.ER_WARN_BAD_MAX_EXECUTION_TIME = 3124; +exports.ER_WARN_UNSUPPORTED_MAX_EXECUTION_TIME = 3125; +exports.ER_WARN_CONFLICTING_HINT = 3126; +exports.ER_WARN_UNKNOWN_QB_NAME = 3127; +exports.ER_UNRESOLVED_HINT_NAME = 3128; +exports.ER_WARN_ON_MODIFYING_GTID_EXECUTED_TABLE = 3129; +exports.ER_PLUGGABLE_PROTOCOL_COMMAND_NOT_SUPPORTED = 3130; +exports.ER_LOCKING_SERVICE_WRONG_NAME = 3131; +exports.ER_LOCKING_SERVICE_DEADLOCK = 3132; +exports.ER_LOCKING_SERVICE_TIMEOUT = 3133; +exports.ER_GIS_MAX_POINTS_IN_GEOMETRY_OVERFLOWED = 3134; +exports.ER_SQL_MODE_MERGED = 3135; +exports.ER_VTOKEN_PLUGIN_TOKEN_MISMATCH = 3136; +exports.ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND = 3137; +exports.ER_CANT_SET_VARIABLE_WHEN_OWNING_GTID = 3138; +exports.ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED = 3139; +exports.ER_INVALID_JSON_TEXT = 3140; +exports.ER_INVALID_JSON_TEXT_IN_PARAM = 3141; +exports.ER_INVALID_JSON_BINARY_DATA = 3142; +exports.ER_INVALID_JSON_PATH = 3143; +exports.ER_INVALID_JSON_CHARSET = 3144; +exports.ER_INVALID_JSON_CHARSET_IN_FUNCTION = 3145; +exports.ER_INVALID_TYPE_FOR_JSON = 3146; +exports.ER_INVALID_CAST_TO_JSON = 3147; +exports.ER_INVALID_JSON_PATH_CHARSET = 3148; +exports.ER_INVALID_JSON_PATH_WILDCARD = 3149; +exports.ER_JSON_VALUE_TOO_BIG = 3150; +exports.ER_JSON_KEY_TOO_BIG = 3151; +exports.ER_JSON_USED_AS_KEY = 3152; +exports.ER_JSON_VACUOUS_PATH = 3153; +exports.ER_JSON_BAD_ONE_OR_ALL_ARG = 3154; +exports.ER_NUMERIC_JSON_VALUE_OUT_OF_RANGE = 3155; +exports.ER_INVALID_JSON_VALUE_FOR_CAST = 3156; +exports.ER_JSON_DOCUMENT_TOO_DEEP = 3157; +exports.ER_JSON_DOCUMENT_NULL_KEY = 3158; +exports.ER_SECURE_TRANSPORT_REQUIRED = 3159; +exports.ER_NO_SECURE_TRANSPORTS_CONFIGURED = 3160; +exports.ER_DISABLED_STORAGE_ENGINE = 3161; +exports.ER_USER_DOES_NOT_EXIST = 3162; +exports.ER_USER_ALREADY_EXISTS = 3163; +exports.ER_AUDIT_API_ABORT = 3164; +exports.ER_INVALID_JSON_PATH_ARRAY_CELL = 3165; +exports.ER_BUFPOOL_RESIZE_INPROGRESS = 3166; +exports.ER_FEATURE_DISABLED_SEE_DOC = 3167; +exports.ER_SERVER_ISNT_AVAILABLE = 3168; +exports.ER_SESSION_WAS_KILLED = 3169; +exports.ER_CAPACITY_EXCEEDED = 3170; +exports.ER_CAPACITY_EXCEEDED_IN_RANGE_OPTIMIZER = 3171; +exports.ER_TABLE_NEEDS_UPG_PART = 3172; +exports.ER_CANT_WAIT_FOR_EXECUTED_GTID_SET_WHILE_OWNING_A_GTID = 3173; +exports.ER_CANNOT_ADD_FOREIGN_BASE_COL_VIRTUAL = 3174; +exports.ER_CANNOT_CREATE_VIRTUAL_INDEX_CONSTRAINT = 3175; +exports.ER_ERROR_ON_MODIFYING_GTID_EXECUTED_TABLE = 3176; +exports.ER_LOCK_REFUSED_BY_ENGINE = 3177; +exports.ER_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN = 3178; +exports.ER_MASTER_KEY_ROTATION_NOT_SUPPORTED_BY_SE = 3179; +exports.ER_MASTER_KEY_ROTATION_ERROR_BY_SE = 3180; +exports.ER_MASTER_KEY_ROTATION_BINLOG_FAILED = 3181; +exports.ER_MASTER_KEY_ROTATION_SE_UNAVAILABLE = 3182; +exports.ER_TABLESPACE_CANNOT_ENCRYPT = 3183; +exports.ER_INVALID_ENCRYPTION_OPTION = 3184; +exports.ER_CANNOT_FIND_KEY_IN_KEYRING = 3185; +exports.ER_CAPACITY_EXCEEDED_IN_PARSER = 3186; +exports.ER_UNSUPPORTED_ALTER_ENCRYPTION_INPLACE = 3187; +exports.ER_KEYRING_UDF_KEYRING_SERVICE_ERROR = 3188; +exports.ER_USER_COLUMN_OLD_LENGTH = 3189; +exports.ER_CANT_RESET_MASTER = 3190; +exports.ER_GROUP_REPLICATION_MAX_GROUP_SIZE = 3191; +exports.ER_CANNOT_ADD_FOREIGN_BASE_COL_STORED = 3192; +exports.ER_TABLE_REFERENCED = 3193; +exports.ER_PARTITION_ENGINE_DEPRECATED_FOR_TABLE = 3194; +exports.ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO = 3195; +exports.ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID = 3196; +exports.ER_XA_RETRY = 3197; +exports.ER_KEYRING_AWS_UDF_AWS_KMS_ERROR = 3198; +exports.ER_BINLOG_UNSAFE_XA = 3199; +exports.ER_UDF_ERROR = 3200; +exports.ER_KEYRING_MIGRATION_FAILURE = 3201; +exports.ER_KEYRING_ACCESS_DENIED_ERROR = 3202; +exports.ER_KEYRING_MIGRATION_STATUS = 3203; + +// Lookup-by-number table +exports[1] = 'EE_CANTCREATEFILE'; +exports[2] = 'EE_READ'; +exports[3] = 'EE_WRITE'; +exports[4] = 'EE_BADCLOSE'; +exports[5] = 'EE_OUTOFMEMORY'; +exports[6] = 'EE_DELETE'; +exports[7] = 'EE_LINK'; +exports[9] = 'EE_EOFERR'; +exports[10] = 'EE_CANTLOCK'; +exports[11] = 'EE_CANTUNLOCK'; +exports[12] = 'EE_DIR'; +exports[13] = 'EE_STAT'; +exports[14] = 'EE_CANT_CHSIZE'; +exports[15] = 'EE_CANT_OPEN_STREAM'; +exports[16] = 'EE_GETWD'; +exports[17] = 'EE_SETWD'; +exports[18] = 'EE_LINK_WARNING'; +exports[19] = 'EE_OPEN_WARNING'; +exports[20] = 'EE_DISK_FULL'; +exports[21] = 'EE_CANT_MKDIR'; +exports[22] = 'EE_UNKNOWN_CHARSET'; +exports[23] = 'EE_OUT_OF_FILERESOURCES'; +exports[24] = 'EE_CANT_READLINK'; +exports[25] = 'EE_CANT_SYMLINK'; +exports[26] = 'EE_REALPATH'; +exports[27] = 'EE_SYNC'; +exports[28] = 'EE_UNKNOWN_COLLATION'; +exports[29] = 'EE_FILENOTFOUND'; +exports[30] = 'EE_FILE_NOT_CLOSED'; +exports[31] = 'EE_CHANGE_OWNERSHIP'; +exports[32] = 'EE_CHANGE_PERMISSIONS'; +exports[33] = 'EE_CANT_SEEK'; +exports[34] = 'EE_CAPACITY_EXCEEDED'; +exports[120] = 'HA_ERR_KEY_NOT_FOUND'; +exports[121] = 'HA_ERR_FOUND_DUPP_KEY'; +exports[122] = 'HA_ERR_INTERNAL_ERROR'; +exports[123] = 'HA_ERR_RECORD_CHANGED'; +exports[124] = 'HA_ERR_WRONG_INDEX'; +exports[126] = 'HA_ERR_CRASHED'; +exports[127] = 'HA_ERR_WRONG_IN_RECORD'; +exports[128] = 'HA_ERR_OUT_OF_MEM'; +exports[130] = 'HA_ERR_NOT_A_TABLE'; +exports[131] = 'HA_ERR_WRONG_COMMAND'; +exports[132] = 'HA_ERR_OLD_FILE'; +exports[133] = 'HA_ERR_NO_ACTIVE_RECORD'; +exports[134] = 'HA_ERR_RECORD_DELETED'; +exports[135] = 'HA_ERR_RECORD_FILE_FULL'; +exports[136] = 'HA_ERR_INDEX_FILE_FULL'; +exports[137] = 'HA_ERR_END_OF_FILE'; +exports[138] = 'HA_ERR_UNSUPPORTED'; +exports[139] = 'HA_ERR_TOO_BIG_ROW'; +exports[140] = 'HA_WRONG_CREATE_OPTION'; +exports[141] = 'HA_ERR_FOUND_DUPP_UNIQUE'; +exports[142] = 'HA_ERR_UNKNOWN_CHARSET'; +exports[143] = 'HA_ERR_WRONG_MRG_TABLE_DEF'; +exports[144] = 'HA_ERR_CRASHED_ON_REPAIR'; +exports[145] = 'HA_ERR_CRASHED_ON_USAGE'; +exports[146] = 'HA_ERR_LOCK_WAIT_TIMEOUT'; +exports[147] = 'HA_ERR_LOCK_TABLE_FULL'; +exports[148] = 'HA_ERR_READ_ONLY_TRANSACTION'; +exports[149] = 'HA_ERR_LOCK_DEADLOCK'; +exports[150] = 'HA_ERR_CANNOT_ADD_FOREIGN'; +exports[151] = 'HA_ERR_NO_REFERENCED_ROW'; +exports[152] = 'HA_ERR_ROW_IS_REFERENCED'; +exports[153] = 'HA_ERR_NO_SAVEPOINT'; +exports[154] = 'HA_ERR_NON_UNIQUE_BLOCK_SIZE'; +exports[155] = 'HA_ERR_NO_SUCH_TABLE'; +exports[156] = 'HA_ERR_TABLE_EXIST'; +exports[157] = 'HA_ERR_NO_CONNECTION'; +exports[158] = 'HA_ERR_NULL_IN_SPATIAL'; +exports[159] = 'HA_ERR_TABLE_DEF_CHANGED'; +exports[160] = 'HA_ERR_NO_PARTITION_FOUND'; +exports[161] = 'HA_ERR_RBR_LOGGING_FAILED'; +exports[162] = 'HA_ERR_DROP_INDEX_FK'; +exports[163] = 'HA_ERR_FOREIGN_DUPLICATE_KEY'; +exports[164] = 'HA_ERR_TABLE_NEEDS_UPGRADE'; +exports[165] = 'HA_ERR_TABLE_READONLY'; +exports[166] = 'HA_ERR_AUTOINC_READ_FAILED'; +exports[167] = 'HA_ERR_AUTOINC_ERANGE'; +exports[168] = 'HA_ERR_GENERIC'; +exports[169] = 'HA_ERR_RECORD_IS_THE_SAME'; +exports[170] = 'HA_ERR_LOGGING_IMPOSSIBLE'; +exports[171] = 'HA_ERR_CORRUPT_EVENT'; +exports[172] = 'HA_ERR_NEW_FILE'; +exports[173] = 'HA_ERR_ROWS_EVENT_APPLY'; +exports[174] = 'HA_ERR_INITIALIZATION'; +exports[175] = 'HA_ERR_FILE_TOO_SHORT'; +exports[176] = 'HA_ERR_WRONG_CRC'; +exports[177] = 'HA_ERR_TOO_MANY_CONCURRENT_TRXS'; +exports[178] = 'HA_ERR_NOT_IN_LOCK_PARTITIONS'; +exports[179] = 'HA_ERR_INDEX_COL_TOO_LONG'; +exports[180] = 'HA_ERR_INDEX_CORRUPT'; +exports[181] = 'HA_ERR_UNDO_REC_TOO_BIG'; +exports[182] = 'HA_FTS_INVALID_DOCID'; +exports[183] = 'HA_ERR_TABLE_IN_FK_CHECK'; +exports[184] = 'HA_ERR_TABLESPACE_EXISTS'; +exports[185] = 'HA_ERR_TOO_MANY_FIELDS'; +exports[186] = 'HA_ERR_ROW_IN_WRONG_PARTITION'; +exports[187] = 'HA_ERR_INNODB_READ_ONLY'; +exports[188] = 'HA_ERR_FTS_EXCEED_RESULT_CACHE_LIMIT'; +exports[189] = 'HA_ERR_TEMP_FILE_WRITE_FAILURE'; +exports[190] = 'HA_ERR_INNODB_FORCED_RECOVERY'; +exports[191] = 'HA_ERR_FTS_TOO_MANY_WORDS_IN_PHRASE'; +exports[192] = 'HA_ERR_FK_DEPTH_EXCEEDED'; +exports[193] = 'HA_MISSING_CREATE_OPTION'; +exports[194] = 'HA_ERR_SE_OUT_OF_MEMORY'; +exports[195] = 'HA_ERR_TABLE_CORRUPT'; +exports[196] = 'HA_ERR_QUERY_INTERRUPTED'; +exports[197] = 'HA_ERR_TABLESPACE_MISSING'; +exports[198] = 'HA_ERR_TABLESPACE_IS_NOT_EMPTY'; +exports[199] = 'HA_ERR_WRONG_FILE_NAME'; +exports[200] = 'HA_ERR_NOT_ALLOWED_COMMAND'; +exports[201] = 'HA_ERR_COMPUTE_FAILED'; +exports[1000] = 'ER_HASHCHK'; +exports[1001] = 'ER_NISAMCHK'; +exports[1002] = 'ER_NO'; +exports[1003] = 'ER_YES'; +exports[1004] = 'ER_CANT_CREATE_FILE'; +exports[1005] = 'ER_CANT_CREATE_TABLE'; +exports[1006] = 'ER_CANT_CREATE_DB'; +exports[1007] = 'ER_DB_CREATE_EXISTS'; +exports[1008] = 'ER_DB_DROP_EXISTS'; +exports[1009] = 'ER_DB_DROP_DELETE'; +exports[1010] = 'ER_DB_DROP_RMDIR'; +exports[1011] = 'ER_CANT_DELETE_FILE'; +exports[1012] = 'ER_CANT_FIND_SYSTEM_REC'; +exports[1013] = 'ER_CANT_GET_STAT'; +exports[1014] = 'ER_CANT_GET_WD'; +exports[1015] = 'ER_CANT_LOCK'; +exports[1016] = 'ER_CANT_OPEN_FILE'; +exports[1017] = 'ER_FILE_NOT_FOUND'; +exports[1018] = 'ER_CANT_READ_DIR'; +exports[1019] = 'ER_CANT_SET_WD'; +exports[1020] = 'ER_CHECKREAD'; +exports[1021] = 'ER_DISK_FULL'; +exports[1022] = 'ER_DUP_KEY'; +exports[1023] = 'ER_ERROR_ON_CLOSE'; +exports[1024] = 'ER_ERROR_ON_READ'; +exports[1025] = 'ER_ERROR_ON_RENAME'; +exports[1026] = 'ER_ERROR_ON_WRITE'; +exports[1027] = 'ER_FILE_USED'; +exports[1028] = 'ER_FILSORT_ABORT'; +exports[1029] = 'ER_FORM_NOT_FOUND'; +exports[1030] = 'ER_GET_ERRNO'; +exports[1031] = 'ER_ILLEGAL_HA'; +exports[1032] = 'ER_KEY_NOT_FOUND'; +exports[1033] = 'ER_NOT_FORM_FILE'; +exports[1034] = 'ER_NOT_KEYFILE'; +exports[1035] = 'ER_OLD_KEYFILE'; +exports[1036] = 'ER_OPEN_AS_READONLY'; +exports[1037] = 'ER_OUTOFMEMORY'; +exports[1038] = 'ER_OUT_OF_SORTMEMORY'; +exports[1039] = 'ER_UNEXPECTED_EOF'; +exports[1040] = 'ER_CON_COUNT_ERROR'; +exports[1041] = 'ER_OUT_OF_RESOURCES'; +exports[1042] = 'ER_BAD_HOST_ERROR'; +exports[1043] = 'ER_HANDSHAKE_ERROR'; +exports[1044] = 'ER_DBACCESS_DENIED_ERROR'; +exports[1045] = 'ER_ACCESS_DENIED_ERROR'; +exports[1046] = 'ER_NO_DB_ERROR'; +exports[1047] = 'ER_UNKNOWN_COM_ERROR'; +exports[1048] = 'ER_BAD_NULL_ERROR'; +exports[1049] = 'ER_BAD_DB_ERROR'; +exports[1050] = 'ER_TABLE_EXISTS_ERROR'; +exports[1051] = 'ER_BAD_TABLE_ERROR'; +exports[1052] = 'ER_NON_UNIQ_ERROR'; +exports[1053] = 'ER_SERVER_SHUTDOWN'; +exports[1054] = 'ER_BAD_FIELD_ERROR'; +exports[1055] = 'ER_WRONG_FIELD_WITH_GROUP'; +exports[1056] = 'ER_WRONG_GROUP_FIELD'; +exports[1057] = 'ER_WRONG_SUM_SELECT'; +exports[1058] = 'ER_WRONG_VALUE_COUNT'; +exports[1059] = 'ER_TOO_LONG_IDENT'; +exports[1060] = 'ER_DUP_FIELDNAME'; +exports[1061] = 'ER_DUP_KEYNAME'; +exports[1062] = 'ER_DUP_ENTRY'; +exports[1063] = 'ER_WRONG_FIELD_SPEC'; +exports[1064] = 'ER_PARSE_ERROR'; +exports[1065] = 'ER_EMPTY_QUERY'; +exports[1066] = 'ER_NONUNIQ_TABLE'; +exports[1067] = 'ER_INVALID_DEFAULT'; +exports[1068] = 'ER_MULTIPLE_PRI_KEY'; +exports[1069] = 'ER_TOO_MANY_KEYS'; +exports[1070] = 'ER_TOO_MANY_KEY_PARTS'; +exports[1071] = 'ER_TOO_LONG_KEY'; +exports[1072] = 'ER_KEY_COLUMN_DOES_NOT_EXITS'; +exports[1073] = 'ER_BLOB_USED_AS_KEY'; +exports[1074] = 'ER_TOO_BIG_FIELDLENGTH'; +exports[1075] = 'ER_WRONG_AUTO_KEY'; +exports[1076] = 'ER_READY'; +exports[1077] = 'ER_NORMAL_SHUTDOWN'; +exports[1078] = 'ER_GOT_SIGNAL'; +exports[1079] = 'ER_SHUTDOWN_COMPLETE'; +exports[1080] = 'ER_FORCING_CLOSE'; +exports[1081] = 'ER_IPSOCK_ERROR'; +exports[1082] = 'ER_NO_SUCH_INDEX'; +exports[1083] = 'ER_WRONG_FIELD_TERMINATORS'; +exports[1084] = 'ER_BLOBS_AND_NO_TERMINATED'; +exports[1085] = 'ER_TEXTFILE_NOT_READABLE'; +exports[1086] = 'ER_FILE_EXISTS_ERROR'; +exports[1087] = 'ER_LOAD_INFO'; +exports[1088] = 'ER_ALTER_INFO'; +exports[1089] = 'ER_WRONG_SUB_KEY'; +exports[1090] = 'ER_CANT_REMOVE_ALL_FIELDS'; +exports[1091] = 'ER_CANT_DROP_FIELD_OR_KEY'; +exports[1092] = 'ER_INSERT_INFO'; +exports[1093] = 'ER_UPDATE_TABLE_USED'; +exports[1094] = 'ER_NO_SUCH_THREAD'; +exports[1095] = 'ER_KILL_DENIED_ERROR'; +exports[1096] = 'ER_NO_TABLES_USED'; +exports[1097] = 'ER_TOO_BIG_SET'; +exports[1098] = 'ER_NO_UNIQUE_LOGFILE'; +exports[1099] = 'ER_TABLE_NOT_LOCKED_FOR_WRITE'; +exports[1100] = 'ER_TABLE_NOT_LOCKED'; +exports[1101] = 'ER_BLOB_CANT_HAVE_DEFAULT'; +exports[1102] = 'ER_WRONG_DB_NAME'; +exports[1103] = 'ER_WRONG_TABLE_NAME'; +exports[1104] = 'ER_TOO_BIG_SELECT'; +exports[1105] = 'ER_UNKNOWN_ERROR'; +exports[1106] = 'ER_UNKNOWN_PROCEDURE'; +exports[1107] = 'ER_WRONG_PARAMCOUNT_TO_PROCEDURE'; +exports[1108] = 'ER_WRONG_PARAMETERS_TO_PROCEDURE'; +exports[1109] = 'ER_UNKNOWN_TABLE'; +exports[1110] = 'ER_FIELD_SPECIFIED_TWICE'; +exports[1111] = 'ER_INVALID_GROUP_FUNC_USE'; +exports[1112] = 'ER_UNSUPPORTED_EXTENSION'; +exports[1113] = 'ER_TABLE_MUST_HAVE_COLUMNS'; +exports[1114] = 'ER_RECORD_FILE_FULL'; +exports[1115] = 'ER_UNKNOWN_CHARACTER_SET'; +exports[1116] = 'ER_TOO_MANY_TABLES'; +exports[1117] = 'ER_TOO_MANY_FIELDS'; +exports[1118] = 'ER_TOO_BIG_ROWSIZE'; +exports[1119] = 'ER_STACK_OVERRUN'; +exports[1120] = 'ER_WRONG_OUTER_JOIN'; +exports[1121] = 'ER_NULL_COLUMN_IN_INDEX'; +exports[1122] = 'ER_CANT_FIND_UDF'; +exports[1123] = 'ER_CANT_INITIALIZE_UDF'; +exports[1124] = 'ER_UDF_NO_PATHS'; +exports[1125] = 'ER_UDF_EXISTS'; +exports[1126] = 'ER_CANT_OPEN_LIBRARY'; +exports[1127] = 'ER_CANT_FIND_DL_ENTRY'; +exports[1128] = 'ER_FUNCTION_NOT_DEFINED'; +exports[1129] = 'ER_HOST_IS_BLOCKED'; +exports[1130] = 'ER_HOST_NOT_PRIVILEGED'; +exports[1131] = 'ER_PASSWORD_ANONYMOUS_USER'; +exports[1132] = 'ER_PASSWORD_NOT_ALLOWED'; +exports[1133] = 'ER_PASSWORD_NO_MATCH'; +exports[1134] = 'ER_UPDATE_INFO'; +exports[1135] = 'ER_CANT_CREATE_THREAD'; +exports[1136] = 'ER_WRONG_VALUE_COUNT_ON_ROW'; +exports[1137] = 'ER_CANT_REOPEN_TABLE'; +exports[1138] = 'ER_INVALID_USE_OF_NULL'; +exports[1139] = 'ER_REGEXP_ERROR'; +exports[1140] = 'ER_MIX_OF_GROUP_FUNC_AND_FIELDS'; +exports[1141] = 'ER_NONEXISTING_GRANT'; +exports[1142] = 'ER_TABLEACCESS_DENIED_ERROR'; +exports[1143] = 'ER_COLUMNACCESS_DENIED_ERROR'; +exports[1144] = 'ER_ILLEGAL_GRANT_FOR_TABLE'; +exports[1145] = 'ER_GRANT_WRONG_HOST_OR_USER'; +exports[1146] = 'ER_NO_SUCH_TABLE'; +exports[1147] = 'ER_NONEXISTING_TABLE_GRANT'; +exports[1148] = 'ER_NOT_ALLOWED_COMMAND'; +exports[1149] = 'ER_SYNTAX_ERROR'; +exports[1150] = 'ER_DELAYED_CANT_CHANGE_LOCK'; +exports[1151] = 'ER_TOO_MANY_DELAYED_THREADS'; +exports[1152] = 'ER_ABORTING_CONNECTION'; +exports[1153] = 'ER_NET_PACKET_TOO_LARGE'; +exports[1154] = 'ER_NET_READ_ERROR_FROM_PIPE'; +exports[1155] = 'ER_NET_FCNTL_ERROR'; +exports[1156] = 'ER_NET_PACKETS_OUT_OF_ORDER'; +exports[1157] = 'ER_NET_UNCOMPRESS_ERROR'; +exports[1158] = 'ER_NET_READ_ERROR'; +exports[1159] = 'ER_NET_READ_INTERRUPTED'; +exports[1160] = 'ER_NET_ERROR_ON_WRITE'; +exports[1161] = 'ER_NET_WRITE_INTERRUPTED'; +exports[1162] = 'ER_TOO_LONG_STRING'; +exports[1163] = 'ER_TABLE_CANT_HANDLE_BLOB'; +exports[1164] = 'ER_TABLE_CANT_HANDLE_AUTO_INCREMENT'; +exports[1165] = 'ER_DELAYED_INSERT_TABLE_LOCKED'; +exports[1166] = 'ER_WRONG_COLUMN_NAME'; +exports[1167] = 'ER_WRONG_KEY_COLUMN'; +exports[1168] = 'ER_WRONG_MRG_TABLE'; +exports[1169] = 'ER_DUP_UNIQUE'; +exports[1170] = 'ER_BLOB_KEY_WITHOUT_LENGTH'; +exports[1171] = 'ER_PRIMARY_CANT_HAVE_NULL'; +exports[1172] = 'ER_TOO_MANY_ROWS'; +exports[1173] = 'ER_REQUIRES_PRIMARY_KEY'; +exports[1174] = 'ER_NO_RAID_COMPILED'; +exports[1175] = 'ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE'; +exports[1176] = 'ER_KEY_DOES_NOT_EXITS'; +exports[1177] = 'ER_CHECK_NO_SUCH_TABLE'; +exports[1178] = 'ER_CHECK_NOT_IMPLEMENTED'; +exports[1179] = 'ER_CANT_DO_THIS_DURING_AN_TRANSACTION'; +exports[1180] = 'ER_ERROR_DURING_COMMIT'; +exports[1181] = 'ER_ERROR_DURING_ROLLBACK'; +exports[1182] = 'ER_ERROR_DURING_FLUSH_LOGS'; +exports[1183] = 'ER_ERROR_DURING_CHECKPOINT'; +exports[1184] = 'ER_NEW_ABORTING_CONNECTION'; +exports[1185] = 'ER_DUMP_NOT_IMPLEMENTED'; +exports[1186] = 'ER_FLUSH_MASTER_BINLOG_CLOSED'; +exports[1187] = 'ER_INDEX_REBUILD'; +exports[1188] = 'ER_MASTER'; +exports[1189] = 'ER_MASTER_NET_READ'; +exports[1190] = 'ER_MASTER_NET_WRITE'; +exports[1191] = 'ER_FT_MATCHING_KEY_NOT_FOUND'; +exports[1192] = 'ER_LOCK_OR_ACTIVE_TRANSACTION'; +exports[1193] = 'ER_UNKNOWN_SYSTEM_VARIABLE'; +exports[1194] = 'ER_CRASHED_ON_USAGE'; +exports[1195] = 'ER_CRASHED_ON_REPAIR'; +exports[1196] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK'; +exports[1197] = 'ER_TRANS_CACHE_FULL'; +exports[1198] = 'ER_SLAVE_MUST_STOP'; +exports[1199] = 'ER_SLAVE_NOT_RUNNING'; +exports[1200] = 'ER_BAD_SLAVE'; +exports[1201] = 'ER_MASTER_INFO'; +exports[1202] = 'ER_SLAVE_THREAD'; +exports[1203] = 'ER_TOO_MANY_USER_CONNECTIONS'; +exports[1204] = 'ER_SET_CONSTANTS_ONLY'; +exports[1205] = 'ER_LOCK_WAIT_TIMEOUT'; +exports[1206] = 'ER_LOCK_TABLE_FULL'; +exports[1207] = 'ER_READ_ONLY_TRANSACTION'; +exports[1208] = 'ER_DROP_DB_WITH_READ_LOCK'; +exports[1209] = 'ER_CREATE_DB_WITH_READ_LOCK'; +exports[1210] = 'ER_WRONG_ARGUMENTS'; +exports[1211] = 'ER_NO_PERMISSION_TO_CREATE_USER'; +exports[1212] = 'ER_UNION_TABLES_IN_DIFFERENT_DIR'; +exports[1213] = 'ER_LOCK_DEADLOCK'; +exports[1214] = 'ER_TABLE_CANT_HANDLE_FT'; +exports[1215] = 'ER_CANNOT_ADD_FOREIGN'; +exports[1216] = 'ER_NO_REFERENCED_ROW'; +exports[1217] = 'ER_ROW_IS_REFERENCED'; +exports[1218] = 'ER_CONNECT_TO_MASTER'; +exports[1219] = 'ER_QUERY_ON_MASTER'; +exports[1220] = 'ER_ERROR_WHEN_EXECUTING_COMMAND'; +exports[1221] = 'ER_WRONG_USAGE'; +exports[1222] = 'ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT'; +exports[1223] = 'ER_CANT_UPDATE_WITH_READLOCK'; +exports[1224] = 'ER_MIXING_NOT_ALLOWED'; +exports[1225] = 'ER_DUP_ARGUMENT'; +exports[1226] = 'ER_USER_LIMIT_REACHED'; +exports[1227] = 'ER_SPECIFIC_ACCESS_DENIED_ERROR'; +exports[1228] = 'ER_LOCAL_VARIABLE'; +exports[1229] = 'ER_GLOBAL_VARIABLE'; +exports[1230] = 'ER_NO_DEFAULT'; +exports[1231] = 'ER_WRONG_VALUE_FOR_VAR'; +exports[1232] = 'ER_WRONG_TYPE_FOR_VAR'; +exports[1233] = 'ER_VAR_CANT_BE_READ'; +exports[1234] = 'ER_CANT_USE_OPTION_HERE'; +exports[1235] = 'ER_NOT_SUPPORTED_YET'; +exports[1236] = 'ER_MASTER_FATAL_ERROR_READING_BINLOG'; +exports[1237] = 'ER_SLAVE_IGNORED_TABLE'; +exports[1238] = 'ER_INCORRECT_GLOBAL_LOCAL_VAR'; +exports[1239] = 'ER_WRONG_FK_DEF'; +exports[1240] = 'ER_KEY_REF_DO_NOT_MATCH_TABLE_REF'; +exports[1241] = 'ER_OPERAND_COLUMNS'; +exports[1242] = 'ER_SUBQUERY_NO_1_ROW'; +exports[1243] = 'ER_UNKNOWN_STMT_HANDLER'; +exports[1244] = 'ER_CORRUPT_HELP_DB'; +exports[1245] = 'ER_CYCLIC_REFERENCE'; +exports[1246] = 'ER_AUTO_CONVERT'; +exports[1247] = 'ER_ILLEGAL_REFERENCE'; +exports[1248] = 'ER_DERIVED_MUST_HAVE_ALIAS'; +exports[1249] = 'ER_SELECT_REDUCED'; +exports[1250] = 'ER_TABLENAME_NOT_ALLOWED_HERE'; +exports[1251] = 'ER_NOT_SUPPORTED_AUTH_MODE'; +exports[1252] = 'ER_SPATIAL_CANT_HAVE_NULL'; +exports[1253] = 'ER_COLLATION_CHARSET_MISMATCH'; +exports[1254] = 'ER_SLAVE_WAS_RUNNING'; +exports[1255] = 'ER_SLAVE_WAS_NOT_RUNNING'; +exports[1256] = 'ER_TOO_BIG_FOR_UNCOMPRESS'; +exports[1257] = 'ER_ZLIB_Z_MEM_ERROR'; +exports[1258] = 'ER_ZLIB_Z_BUF_ERROR'; +exports[1259] = 'ER_ZLIB_Z_DATA_ERROR'; +exports[1260] = 'ER_CUT_VALUE_GROUP_CONCAT'; +exports[1261] = 'ER_WARN_TOO_FEW_RECORDS'; +exports[1262] = 'ER_WARN_TOO_MANY_RECORDS'; +exports[1263] = 'ER_WARN_NULL_TO_NOTNULL'; +exports[1264] = 'ER_WARN_DATA_OUT_OF_RANGE'; +exports[1265] = 'WARN_DATA_TRUNCATED'; +exports[1266] = 'ER_WARN_USING_OTHER_HANDLER'; +exports[1267] = 'ER_CANT_AGGREGATE_2COLLATIONS'; +exports[1268] = 'ER_DROP_USER'; +exports[1269] = 'ER_REVOKE_GRANTS'; +exports[1270] = 'ER_CANT_AGGREGATE_3COLLATIONS'; +exports[1271] = 'ER_CANT_AGGREGATE_NCOLLATIONS'; +exports[1272] = 'ER_VARIABLE_IS_NOT_STRUCT'; +exports[1273] = 'ER_UNKNOWN_COLLATION'; +exports[1274] = 'ER_SLAVE_IGNORED_SSL_PARAMS'; +exports[1275] = 'ER_SERVER_IS_IN_SECURE_AUTH_MODE'; +exports[1276] = 'ER_WARN_FIELD_RESOLVED'; +exports[1277] = 'ER_BAD_SLAVE_UNTIL_COND'; +exports[1278] = 'ER_MISSING_SKIP_SLAVE'; +exports[1279] = 'ER_UNTIL_COND_IGNORED'; +exports[1280] = 'ER_WRONG_NAME_FOR_INDEX'; +exports[1281] = 'ER_WRONG_NAME_FOR_CATALOG'; +exports[1282] = 'ER_WARN_QC_RESIZE'; +exports[1283] = 'ER_BAD_FT_COLUMN'; +exports[1284] = 'ER_UNKNOWN_KEY_CACHE'; +exports[1285] = 'ER_WARN_HOSTNAME_WONT_WORK'; +exports[1286] = 'ER_UNKNOWN_STORAGE_ENGINE'; +exports[1287] = 'ER_WARN_DEPRECATED_SYNTAX'; +exports[1288] = 'ER_NON_UPDATABLE_TABLE'; +exports[1289] = 'ER_FEATURE_DISABLED'; +exports[1290] = 'ER_OPTION_PREVENTS_STATEMENT'; +exports[1291] = 'ER_DUPLICATED_VALUE_IN_TYPE'; +exports[1292] = 'ER_TRUNCATED_WRONG_VALUE'; +exports[1293] = 'ER_TOO_MUCH_AUTO_TIMESTAMP_COLS'; +exports[1294] = 'ER_INVALID_ON_UPDATE'; +exports[1295] = 'ER_UNSUPPORTED_PS'; +exports[1296] = 'ER_GET_ERRMSG'; +exports[1297] = 'ER_GET_TEMPORARY_ERRMSG'; +exports[1298] = 'ER_UNKNOWN_TIME_ZONE'; +exports[1299] = 'ER_WARN_INVALID_TIMESTAMP'; +exports[1300] = 'ER_INVALID_CHARACTER_STRING'; +exports[1301] = 'ER_WARN_ALLOWED_PACKET_OVERFLOWED'; +exports[1302] = 'ER_CONFLICTING_DECLARATIONS'; +exports[1303] = 'ER_SP_NO_RECURSIVE_CREATE'; +exports[1304] = 'ER_SP_ALREADY_EXISTS'; +exports[1305] = 'ER_SP_DOES_NOT_EXIST'; +exports[1306] = 'ER_SP_DROP_FAILED'; +exports[1307] = 'ER_SP_STORE_FAILED'; +exports[1308] = 'ER_SP_LILABEL_MISMATCH'; +exports[1309] = 'ER_SP_LABEL_REDEFINE'; +exports[1310] = 'ER_SP_LABEL_MISMATCH'; +exports[1311] = 'ER_SP_UNINIT_VAR'; +exports[1312] = 'ER_SP_BADSELECT'; +exports[1313] = 'ER_SP_BADRETURN'; +exports[1314] = 'ER_SP_BADSTATEMENT'; +exports[1315] = 'ER_UPDATE_LOG_DEPRECATED_IGNORED'; +exports[1316] = 'ER_UPDATE_LOG_DEPRECATED_TRANSLATED'; +exports[1317] = 'ER_QUERY_INTERRUPTED'; +exports[1318] = 'ER_SP_WRONG_NO_OF_ARGS'; +exports[1319] = 'ER_SP_COND_MISMATCH'; +exports[1320] = 'ER_SP_NORETURN'; +exports[1321] = 'ER_SP_NORETURNEND'; +exports[1322] = 'ER_SP_BAD_CURSOR_QUERY'; +exports[1323] = 'ER_SP_BAD_CURSOR_SELECT'; +exports[1324] = 'ER_SP_CURSOR_MISMATCH'; +exports[1325] = 'ER_SP_CURSOR_ALREADY_OPEN'; +exports[1326] = 'ER_SP_CURSOR_NOT_OPEN'; +exports[1327] = 'ER_SP_UNDECLARED_VAR'; +exports[1328] = 'ER_SP_WRONG_NO_OF_FETCH_ARGS'; +exports[1329] = 'ER_SP_FETCH_NO_DATA'; +exports[1330] = 'ER_SP_DUP_PARAM'; +exports[1331] = 'ER_SP_DUP_VAR'; +exports[1332] = 'ER_SP_DUP_COND'; +exports[1333] = 'ER_SP_DUP_CURS'; +exports[1334] = 'ER_SP_CANT_ALTER'; +exports[1335] = 'ER_SP_SUBSELECT_NYI'; +exports[1336] = 'ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG'; +exports[1337] = 'ER_SP_VARCOND_AFTER_CURSHNDLR'; +exports[1338] = 'ER_SP_CURSOR_AFTER_HANDLER'; +exports[1339] = 'ER_SP_CASE_NOT_FOUND'; +exports[1340] = 'ER_FPARSER_TOO_BIG_FILE'; +exports[1341] = 'ER_FPARSER_BAD_HEADER'; +exports[1342] = 'ER_FPARSER_EOF_IN_COMMENT'; +exports[1343] = 'ER_FPARSER_ERROR_IN_PARAMETER'; +exports[1344] = 'ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER'; +exports[1345] = 'ER_VIEW_NO_EXPLAIN'; +exports[1346] = 'ER_FRM_UNKNOWN_TYPE'; +exports[1347] = 'ER_WRONG_OBJECT'; +exports[1348] = 'ER_NONUPDATEABLE_COLUMN'; +exports[1349] = 'ER_VIEW_SELECT_DERIVED'; +exports[1350] = 'ER_VIEW_SELECT_CLAUSE'; +exports[1351] = 'ER_VIEW_SELECT_VARIABLE'; +exports[1352] = 'ER_VIEW_SELECT_TMPTABLE'; +exports[1353] = 'ER_VIEW_WRONG_LIST'; +exports[1354] = 'ER_WARN_VIEW_MERGE'; +exports[1355] = 'ER_WARN_VIEW_WITHOUT_KEY'; +exports[1356] = 'ER_VIEW_INVALID'; +exports[1357] = 'ER_SP_NO_DROP_SP'; +exports[1358] = 'ER_SP_GOTO_IN_HNDLR'; +exports[1359] = 'ER_TRG_ALREADY_EXISTS'; +exports[1360] = 'ER_TRG_DOES_NOT_EXIST'; +exports[1361] = 'ER_TRG_ON_VIEW_OR_TEMP_TABLE'; +exports[1362] = 'ER_TRG_CANT_CHANGE_ROW'; +exports[1363] = 'ER_TRG_NO_SUCH_ROW_IN_TRG'; +exports[1364] = 'ER_NO_DEFAULT_FOR_FIELD'; +exports[1365] = 'ER_DIVISION_BY_ZERO'; +exports[1366] = 'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD'; +exports[1367] = 'ER_ILLEGAL_VALUE_FOR_TYPE'; +exports[1368] = 'ER_VIEW_NONUPD_CHECK'; +exports[1369] = 'ER_VIEW_CHECK_FAILED'; +exports[1370] = 'ER_PROCACCESS_DENIED_ERROR'; +exports[1371] = 'ER_RELAY_LOG_FAIL'; +exports[1372] = 'ER_PASSWD_LENGTH'; +exports[1373] = 'ER_UNKNOWN_TARGET_BINLOG'; +exports[1374] = 'ER_IO_ERR_LOG_INDEX_READ'; +exports[1375] = 'ER_BINLOG_PURGE_PROHIBITED'; +exports[1376] = 'ER_FSEEK_FAIL'; +exports[1377] = 'ER_BINLOG_PURGE_FATAL_ERR'; +exports[1378] = 'ER_LOG_IN_USE'; +exports[1379] = 'ER_LOG_PURGE_UNKNOWN_ERR'; +exports[1380] = 'ER_RELAY_LOG_INIT'; +exports[1381] = 'ER_NO_BINARY_LOGGING'; +exports[1382] = 'ER_RESERVED_SYNTAX'; +exports[1383] = 'ER_WSAS_FAILED'; +exports[1384] = 'ER_DIFF_GROUPS_PROC'; +exports[1385] = 'ER_NO_GROUP_FOR_PROC'; +exports[1386] = 'ER_ORDER_WITH_PROC'; +exports[1387] = 'ER_LOGGING_PROHIBIT_CHANGING_OF'; +exports[1388] = 'ER_NO_FILE_MAPPING'; +exports[1389] = 'ER_WRONG_MAGIC'; +exports[1390] = 'ER_PS_MANY_PARAM'; +exports[1391] = 'ER_KEY_PART_0'; +exports[1392] = 'ER_VIEW_CHECKSUM'; +exports[1393] = 'ER_VIEW_MULTIUPDATE'; +exports[1394] = 'ER_VIEW_NO_INSERT_FIELD_LIST'; +exports[1395] = 'ER_VIEW_DELETE_MERGE_VIEW'; +exports[1396] = 'ER_CANNOT_USER'; +exports[1397] = 'ER_XAER_NOTA'; +exports[1398] = 'ER_XAER_INVAL'; +exports[1399] = 'ER_XAER_RMFAIL'; +exports[1400] = 'ER_XAER_OUTSIDE'; +exports[1401] = 'ER_XAER_RMERR'; +exports[1402] = 'ER_XA_RBROLLBACK'; +exports[1403] = 'ER_NONEXISTING_PROC_GRANT'; +exports[1404] = 'ER_PROC_AUTO_GRANT_FAIL'; +exports[1405] = 'ER_PROC_AUTO_REVOKE_FAIL'; +exports[1406] = 'ER_DATA_TOO_LONG'; +exports[1407] = 'ER_SP_BAD_SQLSTATE'; +exports[1408] = 'ER_STARTUP'; +exports[1409] = 'ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR'; +exports[1410] = 'ER_CANT_CREATE_USER_WITH_GRANT'; +exports[1411] = 'ER_WRONG_VALUE_FOR_TYPE'; +exports[1412] = 'ER_TABLE_DEF_CHANGED'; +exports[1413] = 'ER_SP_DUP_HANDLER'; +exports[1414] = 'ER_SP_NOT_VAR_ARG'; +exports[1415] = 'ER_SP_NO_RETSET'; +exports[1416] = 'ER_CANT_CREATE_GEOMETRY_OBJECT'; +exports[1417] = 'ER_FAILED_ROUTINE_BREAK_BINLOG'; +exports[1418] = 'ER_BINLOG_UNSAFE_ROUTINE'; +exports[1419] = 'ER_BINLOG_CREATE_ROUTINE_NEED_SUPER'; +exports[1420] = 'ER_EXEC_STMT_WITH_OPEN_CURSOR'; +exports[1421] = 'ER_STMT_HAS_NO_OPEN_CURSOR'; +exports[1422] = 'ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG'; +exports[1423] = 'ER_NO_DEFAULT_FOR_VIEW_FIELD'; +exports[1424] = 'ER_SP_NO_RECURSION'; +exports[1425] = 'ER_TOO_BIG_SCALE'; +exports[1426] = 'ER_TOO_BIG_PRECISION'; +exports[1427] = 'ER_M_BIGGER_THAN_D'; +exports[1428] = 'ER_WRONG_LOCK_OF_SYSTEM_TABLE'; +exports[1429] = 'ER_CONNECT_TO_FOREIGN_DATA_SOURCE'; +exports[1430] = 'ER_QUERY_ON_FOREIGN_DATA_SOURCE'; +exports[1431] = 'ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST'; +exports[1432] = 'ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE'; +exports[1433] = 'ER_FOREIGN_DATA_STRING_INVALID'; +exports[1434] = 'ER_CANT_CREATE_FEDERATED_TABLE'; +exports[1435] = 'ER_TRG_IN_WRONG_SCHEMA'; +exports[1436] = 'ER_STACK_OVERRUN_NEED_MORE'; +exports[1437] = 'ER_TOO_LONG_BODY'; +exports[1438] = 'ER_WARN_CANT_DROP_DEFAULT_KEYCACHE'; +exports[1439] = 'ER_TOO_BIG_DISPLAYWIDTH'; +exports[1440] = 'ER_XAER_DUPID'; +exports[1441] = 'ER_DATETIME_FUNCTION_OVERFLOW'; +exports[1442] = 'ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG'; +exports[1443] = 'ER_VIEW_PREVENT_UPDATE'; +exports[1444] = 'ER_PS_NO_RECURSION'; +exports[1445] = 'ER_SP_CANT_SET_AUTOCOMMIT'; +exports[1446] = 'ER_MALFORMED_DEFINER'; +exports[1447] = 'ER_VIEW_FRM_NO_USER'; +exports[1448] = 'ER_VIEW_OTHER_USER'; +exports[1449] = 'ER_NO_SUCH_USER'; +exports[1450] = 'ER_FORBID_SCHEMA_CHANGE'; +exports[1451] = 'ER_ROW_IS_REFERENCED_2'; +exports[1452] = 'ER_NO_REFERENCED_ROW_2'; +exports[1453] = 'ER_SP_BAD_VAR_SHADOW'; +exports[1454] = 'ER_TRG_NO_DEFINER'; +exports[1455] = 'ER_OLD_FILE_FORMAT'; +exports[1456] = 'ER_SP_RECURSION_LIMIT'; +exports[1457] = 'ER_SP_PROC_TABLE_CORRUPT'; +exports[1458] = 'ER_SP_WRONG_NAME'; +exports[1459] = 'ER_TABLE_NEEDS_UPGRADE'; +exports[1460] = 'ER_SP_NO_AGGREGATE'; +exports[1461] = 'ER_MAX_PREPARED_STMT_COUNT_REACHED'; +exports[1462] = 'ER_VIEW_RECURSIVE'; +exports[1463] = 'ER_NON_GROUPING_FIELD_USED'; +exports[1464] = 'ER_TABLE_CANT_HANDLE_SPKEYS'; +exports[1465] = 'ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA'; +exports[1466] = 'ER_REMOVED_SPACES'; +exports[1467] = 'ER_AUTOINC_READ_FAILED'; +exports[1468] = 'ER_USERNAME'; +exports[1469] = 'ER_HOSTNAME'; +exports[1470] = 'ER_WRONG_STRING_LENGTH'; +exports[1471] = 'ER_NON_INSERTABLE_TABLE'; +exports[1472] = 'ER_ADMIN_WRONG_MRG_TABLE'; +exports[1473] = 'ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT'; +exports[1474] = 'ER_NAME_BECOMES_EMPTY'; +exports[1475] = 'ER_AMBIGUOUS_FIELD_TERM'; +exports[1476] = 'ER_FOREIGN_SERVER_EXISTS'; +exports[1477] = 'ER_FOREIGN_SERVER_DOESNT_EXIST'; +exports[1478] = 'ER_ILLEGAL_HA_CREATE_OPTION'; +exports[1479] = 'ER_PARTITION_REQUIRES_VALUES_ERROR'; +exports[1480] = 'ER_PARTITION_WRONG_VALUES_ERROR'; +exports[1481] = 'ER_PARTITION_MAXVALUE_ERROR'; +exports[1482] = 'ER_PARTITION_SUBPARTITION_ERROR'; +exports[1483] = 'ER_PARTITION_SUBPART_MIX_ERROR'; +exports[1484] = 'ER_PARTITION_WRONG_NO_PART_ERROR'; +exports[1485] = 'ER_PARTITION_WRONG_NO_SUBPART_ERROR'; +exports[1486] = 'ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR'; +exports[1487] = 'ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR'; +exports[1488] = 'ER_FIELD_NOT_FOUND_PART_ERROR'; +exports[1489] = 'ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR'; +exports[1490] = 'ER_INCONSISTENT_PARTITION_INFO_ERROR'; +exports[1491] = 'ER_PARTITION_FUNC_NOT_ALLOWED_ERROR'; +exports[1492] = 'ER_PARTITIONS_MUST_BE_DEFINED_ERROR'; +exports[1493] = 'ER_RANGE_NOT_INCREASING_ERROR'; +exports[1494] = 'ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR'; +exports[1495] = 'ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR'; +exports[1496] = 'ER_PARTITION_ENTRY_ERROR'; +exports[1497] = 'ER_MIX_HANDLER_ERROR'; +exports[1498] = 'ER_PARTITION_NOT_DEFINED_ERROR'; +exports[1499] = 'ER_TOO_MANY_PARTITIONS_ERROR'; +exports[1500] = 'ER_SUBPARTITION_ERROR'; +exports[1501] = 'ER_CANT_CREATE_HANDLER_FILE'; +exports[1502] = 'ER_BLOB_FIELD_IN_PART_FUNC_ERROR'; +exports[1503] = 'ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF'; +exports[1504] = 'ER_NO_PARTS_ERROR'; +exports[1505] = 'ER_PARTITION_MGMT_ON_NONPARTITIONED'; +exports[1506] = 'ER_FOREIGN_KEY_ON_PARTITIONED'; +exports[1507] = 'ER_DROP_PARTITION_NON_EXISTENT'; +exports[1508] = 'ER_DROP_LAST_PARTITION'; +exports[1509] = 'ER_COALESCE_ONLY_ON_HASH_PARTITION'; +exports[1510] = 'ER_REORG_HASH_ONLY_ON_SAME_NO'; +exports[1511] = 'ER_REORG_NO_PARAM_ERROR'; +exports[1512] = 'ER_ONLY_ON_RANGE_LIST_PARTITION'; +exports[1513] = 'ER_ADD_PARTITION_SUBPART_ERROR'; +exports[1514] = 'ER_ADD_PARTITION_NO_NEW_PARTITION'; +exports[1515] = 'ER_COALESCE_PARTITION_NO_PARTITION'; +exports[1516] = 'ER_REORG_PARTITION_NOT_EXIST'; +exports[1517] = 'ER_SAME_NAME_PARTITION'; +exports[1518] = 'ER_NO_BINLOG_ERROR'; +exports[1519] = 'ER_CONSECUTIVE_REORG_PARTITIONS'; +exports[1520] = 'ER_REORG_OUTSIDE_RANGE'; +exports[1521] = 'ER_PARTITION_FUNCTION_FAILURE'; +exports[1522] = 'ER_PART_STATE_ERROR'; +exports[1523] = 'ER_LIMITED_PART_RANGE'; +exports[1524] = 'ER_PLUGIN_IS_NOT_LOADED'; +exports[1525] = 'ER_WRONG_VALUE'; +exports[1526] = 'ER_NO_PARTITION_FOR_GIVEN_VALUE'; +exports[1527] = 'ER_FILEGROUP_OPTION_ONLY_ONCE'; +exports[1528] = 'ER_CREATE_FILEGROUP_FAILED'; +exports[1529] = 'ER_DROP_FILEGROUP_FAILED'; +exports[1530] = 'ER_TABLESPACE_AUTO_EXTEND_ERROR'; +exports[1531] = 'ER_WRONG_SIZE_NUMBER'; +exports[1532] = 'ER_SIZE_OVERFLOW_ERROR'; +exports[1533] = 'ER_ALTER_FILEGROUP_FAILED'; +exports[1534] = 'ER_BINLOG_ROW_LOGGING_FAILED'; +exports[1535] = 'ER_BINLOG_ROW_WRONG_TABLE_DEF'; +exports[1536] = 'ER_BINLOG_ROW_RBR_TO_SBR'; +exports[1537] = 'ER_EVENT_ALREADY_EXISTS'; +exports[1538] = 'ER_EVENT_STORE_FAILED'; +exports[1539] = 'ER_EVENT_DOES_NOT_EXIST'; +exports[1540] = 'ER_EVENT_CANT_ALTER'; +exports[1541] = 'ER_EVENT_DROP_FAILED'; +exports[1542] = 'ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG'; +exports[1543] = 'ER_EVENT_ENDS_BEFORE_STARTS'; +exports[1544] = 'ER_EVENT_EXEC_TIME_IN_THE_PAST'; +exports[1545] = 'ER_EVENT_OPEN_TABLE_FAILED'; +exports[1546] = 'ER_EVENT_NEITHER_M_EXPR_NOR_M_AT'; +exports[1547] = 'ER_COL_COUNT_DOESNT_MATCH_CORRUPTED'; +exports[1548] = 'ER_CANNOT_LOAD_FROM_TABLE'; +exports[1549] = 'ER_EVENT_CANNOT_DELETE'; +exports[1550] = 'ER_EVENT_COMPILE_ERROR'; +exports[1551] = 'ER_EVENT_SAME_NAME'; +exports[1552] = 'ER_EVENT_DATA_TOO_LONG'; +exports[1553] = 'ER_DROP_INDEX_FK'; +exports[1554] = 'ER_WARN_DEPRECATED_SYNTAX_WITH_VER'; +exports[1555] = 'ER_CANT_WRITE_LOCK_LOG_TABLE'; +exports[1556] = 'ER_CANT_LOCK_LOG_TABLE'; +exports[1557] = 'ER_FOREIGN_DUPLICATE_KEY'; +exports[1558] = 'ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE'; +exports[1559] = 'ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR'; +exports[1560] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT'; +exports[1561] = 'ER_NDB_CANT_SWITCH_BINLOG_FORMAT'; +exports[1562] = 'ER_PARTITION_NO_TEMPORARY'; +exports[1563] = 'ER_PARTITION_CONST_DOMAIN_ERROR'; +exports[1564] = 'ER_PARTITION_FUNCTION_IS_NOT_ALLOWED'; +exports[1565] = 'ER_DDL_LOG_ERROR'; +exports[1566] = 'ER_NULL_IN_VALUES_LESS_THAN'; +exports[1567] = 'ER_WRONG_PARTITION_NAME'; +exports[1568] = 'ER_CANT_CHANGE_TX_CHARACTERISTICS'; +exports[1569] = 'ER_DUP_ENTRY_AUTOINCREMENT_CASE'; +exports[1570] = 'ER_EVENT_MODIFY_QUEUE_ERROR'; +exports[1571] = 'ER_EVENT_SET_VAR_ERROR'; +exports[1572] = 'ER_PARTITION_MERGE_ERROR'; +exports[1573] = 'ER_CANT_ACTIVATE_LOG'; +exports[1574] = 'ER_RBR_NOT_AVAILABLE'; +exports[1575] = 'ER_BASE64_DECODE_ERROR'; +exports[1576] = 'ER_EVENT_RECURSION_FORBIDDEN'; +exports[1577] = 'ER_EVENTS_DB_ERROR'; +exports[1578] = 'ER_ONLY_INTEGERS_ALLOWED'; +exports[1579] = 'ER_UNSUPORTED_LOG_ENGINE'; +exports[1580] = 'ER_BAD_LOG_STATEMENT'; +exports[1581] = 'ER_CANT_RENAME_LOG_TABLE'; +exports[1582] = 'ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT'; +exports[1583] = 'ER_WRONG_PARAMETERS_TO_NATIVE_FCT'; +exports[1584] = 'ER_WRONG_PARAMETERS_TO_STORED_FCT'; +exports[1585] = 'ER_NATIVE_FCT_NAME_COLLISION'; +exports[1586] = 'ER_DUP_ENTRY_WITH_KEY_NAME'; +exports[1587] = 'ER_BINLOG_PURGE_EMFILE'; +exports[1588] = 'ER_EVENT_CANNOT_CREATE_IN_THE_PAST'; +exports[1589] = 'ER_EVENT_CANNOT_ALTER_IN_THE_PAST'; +exports[1590] = 'ER_SLAVE_INCIDENT'; +exports[1591] = 'ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT'; +exports[1592] = 'ER_BINLOG_UNSAFE_STATEMENT'; +exports[1593] = 'ER_SLAVE_FATAL_ERROR'; +exports[1594] = 'ER_SLAVE_RELAY_LOG_READ_FAILURE'; +exports[1595] = 'ER_SLAVE_RELAY_LOG_WRITE_FAILURE'; +exports[1596] = 'ER_SLAVE_CREATE_EVENT_FAILURE'; +exports[1597] = 'ER_SLAVE_MASTER_COM_FAILURE'; +exports[1598] = 'ER_BINLOG_LOGGING_IMPOSSIBLE'; +exports[1599] = 'ER_VIEW_NO_CREATION_CTX'; +exports[1600] = 'ER_VIEW_INVALID_CREATION_CTX'; +exports[1601] = 'ER_SR_INVALID_CREATION_CTX'; +exports[1602] = 'ER_TRG_CORRUPTED_FILE'; +exports[1603] = 'ER_TRG_NO_CREATION_CTX'; +exports[1604] = 'ER_TRG_INVALID_CREATION_CTX'; +exports[1605] = 'ER_EVENT_INVALID_CREATION_CTX'; +exports[1606] = 'ER_TRG_CANT_OPEN_TABLE'; +exports[1607] = 'ER_CANT_CREATE_SROUTINE'; +exports[1608] = 'ER_NEVER_USED'; +exports[1609] = 'ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT'; +exports[1610] = 'ER_SLAVE_CORRUPT_EVENT'; +exports[1611] = 'ER_LOAD_DATA_INVALID_COLUMN'; +exports[1612] = 'ER_LOG_PURGE_NO_FILE'; +exports[1613] = 'ER_XA_RBTIMEOUT'; +exports[1614] = 'ER_XA_RBDEADLOCK'; +exports[1615] = 'ER_NEED_REPREPARE'; +exports[1616] = 'ER_DELAYED_NOT_SUPPORTED'; +exports[1617] = 'WARN_NO_MASTER_INFO'; +exports[1618] = 'WARN_OPTION_IGNORED'; +exports[1619] = 'ER_PLUGIN_DELETE_BUILTIN'; +exports[1620] = 'WARN_PLUGIN_BUSY'; +exports[1621] = 'ER_VARIABLE_IS_READONLY'; +exports[1622] = 'ER_WARN_ENGINE_TRANSACTION_ROLLBACK'; +exports[1623] = 'ER_SLAVE_HEARTBEAT_FAILURE'; +exports[1624] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE'; +exports[1625] = 'ER_NDB_REPLICATION_SCHEMA_ERROR'; +exports[1626] = 'ER_CONFLICT_FN_PARSE_ERROR'; +exports[1627] = 'ER_EXCEPTIONS_WRITE_ERROR'; +exports[1628] = 'ER_TOO_LONG_TABLE_COMMENT'; +exports[1629] = 'ER_TOO_LONG_FIELD_COMMENT'; +exports[1630] = 'ER_FUNC_INEXISTENT_NAME_COLLISION'; +exports[1631] = 'ER_DATABASE_NAME'; +exports[1632] = 'ER_TABLE_NAME'; +exports[1633] = 'ER_PARTITION_NAME'; +exports[1634] = 'ER_SUBPARTITION_NAME'; +exports[1635] = 'ER_TEMPORARY_NAME'; +exports[1636] = 'ER_RENAMED_NAME'; +exports[1637] = 'ER_TOO_MANY_CONCURRENT_TRXS'; +exports[1638] = 'WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED'; +exports[1639] = 'ER_DEBUG_SYNC_TIMEOUT'; +exports[1640] = 'ER_DEBUG_SYNC_HIT_LIMIT'; +exports[1641] = 'ER_DUP_SIGNAL_SET'; +exports[1642] = 'ER_SIGNAL_WARN'; +exports[1643] = 'ER_SIGNAL_NOT_FOUND'; +exports[1644] = 'ER_SIGNAL_EXCEPTION'; +exports[1645] = 'ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER'; +exports[1646] = 'ER_SIGNAL_BAD_CONDITION_TYPE'; +exports[1647] = 'WARN_COND_ITEM_TRUNCATED'; +exports[1648] = 'ER_COND_ITEM_TOO_LONG'; +exports[1649] = 'ER_UNKNOWN_LOCALE'; +exports[1650] = 'ER_SLAVE_IGNORE_SERVER_IDS'; +exports[1651] = 'ER_QUERY_CACHE_DISABLED'; +exports[1652] = 'ER_SAME_NAME_PARTITION_FIELD'; +exports[1653] = 'ER_PARTITION_COLUMN_LIST_ERROR'; +exports[1654] = 'ER_WRONG_TYPE_COLUMN_VALUE_ERROR'; +exports[1655] = 'ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR'; +exports[1656] = 'ER_MAXVALUE_IN_VALUES_IN'; +exports[1657] = 'ER_TOO_MANY_VALUES_ERROR'; +exports[1658] = 'ER_ROW_SINGLE_PARTITION_FIELD_ERROR'; +exports[1659] = 'ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD'; +exports[1660] = 'ER_PARTITION_FIELDS_TOO_LONG'; +exports[1661] = 'ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE'; +exports[1662] = 'ER_BINLOG_ROW_MODE_AND_STMT_ENGINE'; +exports[1663] = 'ER_BINLOG_UNSAFE_AND_STMT_ENGINE'; +exports[1664] = 'ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE'; +exports[1665] = 'ER_BINLOG_STMT_MODE_AND_ROW_ENGINE'; +exports[1666] = 'ER_BINLOG_ROW_INJECTION_AND_STMT_MODE'; +exports[1667] = 'ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE'; +exports[1668] = 'ER_BINLOG_UNSAFE_LIMIT'; +exports[1669] = 'ER_BINLOG_UNSAFE_INSERT_DELAYED'; +exports[1670] = 'ER_BINLOG_UNSAFE_SYSTEM_TABLE'; +exports[1671] = 'ER_BINLOG_UNSAFE_AUTOINC_COLUMNS'; +exports[1672] = 'ER_BINLOG_UNSAFE_UDF'; +exports[1673] = 'ER_BINLOG_UNSAFE_SYSTEM_VARIABLE'; +exports[1674] = 'ER_BINLOG_UNSAFE_SYSTEM_FUNCTION'; +exports[1675] = 'ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS'; +exports[1676] = 'ER_MESSAGE_AND_STATEMENT'; +exports[1677] = 'ER_SLAVE_CONVERSION_FAILED'; +exports[1678] = 'ER_SLAVE_CANT_CREATE_CONVERSION'; +exports[1679] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT'; +exports[1680] = 'ER_PATH_LENGTH'; +exports[1681] = 'ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT'; +exports[1682] = 'ER_WRONG_NATIVE_TABLE_STRUCTURE'; +exports[1683] = 'ER_WRONG_PERFSCHEMA_USAGE'; +exports[1684] = 'ER_WARN_I_S_SKIPPED_TABLE'; +exports[1685] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT'; +exports[1686] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT'; +exports[1687] = 'ER_SPATIAL_MUST_HAVE_GEOM_COL'; +exports[1688] = 'ER_TOO_LONG_INDEX_COMMENT'; +exports[1689] = 'ER_LOCK_ABORTED'; +exports[1690] = 'ER_DATA_OUT_OF_RANGE'; +exports[1691] = 'ER_WRONG_SPVAR_TYPE_IN_LIMIT'; +exports[1692] = 'ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE'; +exports[1693] = 'ER_BINLOG_UNSAFE_MIXED_STATEMENT'; +exports[1694] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN'; +exports[1695] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN'; +exports[1696] = 'ER_FAILED_READ_FROM_PAR_FILE'; +exports[1697] = 'ER_VALUES_IS_NOT_INT_TYPE_ERROR'; +exports[1698] = 'ER_ACCESS_DENIED_NO_PASSWORD_ERROR'; +exports[1699] = 'ER_SET_PASSWORD_AUTH_PLUGIN'; +exports[1700] = 'ER_GRANT_PLUGIN_USER_EXISTS'; +exports[1701] = 'ER_TRUNCATE_ILLEGAL_FK'; +exports[1702] = 'ER_PLUGIN_IS_PERMANENT'; +exports[1703] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN'; +exports[1704] = 'ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX'; +exports[1705] = 'ER_STMT_CACHE_FULL'; +exports[1706] = 'ER_MULTI_UPDATE_KEY_CONFLICT'; +exports[1707] = 'ER_TABLE_NEEDS_REBUILD'; +exports[1708] = 'WARN_OPTION_BELOW_LIMIT'; +exports[1709] = 'ER_INDEX_COLUMN_TOO_LONG'; +exports[1710] = 'ER_ERROR_IN_TRIGGER_BODY'; +exports[1711] = 'ER_ERROR_IN_UNKNOWN_TRIGGER_BODY'; +exports[1712] = 'ER_INDEX_CORRUPT'; +exports[1713] = 'ER_UNDO_RECORD_TOO_BIG'; +exports[1714] = 'ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT'; +exports[1715] = 'ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE'; +exports[1716] = 'ER_BINLOG_UNSAFE_REPLACE_SELECT'; +exports[1717] = 'ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT'; +exports[1718] = 'ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT'; +exports[1719] = 'ER_BINLOG_UNSAFE_UPDATE_IGNORE'; +exports[1720] = 'ER_PLUGIN_NO_UNINSTALL'; +exports[1721] = 'ER_PLUGIN_NO_INSTALL'; +exports[1722] = 'ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT'; +exports[1723] = 'ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC'; +exports[1724] = 'ER_BINLOG_UNSAFE_INSERT_TWO_KEYS'; +exports[1725] = 'ER_TABLE_IN_FK_CHECK'; +exports[1726] = 'ER_UNSUPPORTED_ENGINE'; +exports[1727] = 'ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST'; +exports[1728] = 'ER_CANNOT_LOAD_FROM_TABLE_V2'; +exports[1729] = 'ER_MASTER_DELAY_VALUE_OUT_OF_RANGE'; +exports[1730] = 'ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT'; +exports[1731] = 'ER_PARTITION_EXCHANGE_DIFFERENT_OPTION'; +exports[1732] = 'ER_PARTITION_EXCHANGE_PART_TABLE'; +exports[1733] = 'ER_PARTITION_EXCHANGE_TEMP_TABLE'; +exports[1734] = 'ER_PARTITION_INSTEAD_OF_SUBPARTITION'; +exports[1735] = 'ER_UNKNOWN_PARTITION'; +exports[1736] = 'ER_TABLES_DIFFERENT_METADATA'; +exports[1737] = 'ER_ROW_DOES_NOT_MATCH_PARTITION'; +exports[1738] = 'ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX'; +exports[1739] = 'ER_WARN_INDEX_NOT_APPLICABLE'; +exports[1740] = 'ER_PARTITION_EXCHANGE_FOREIGN_KEY'; +exports[1741] = 'ER_NO_SUCH_KEY_VALUE'; +exports[1742] = 'ER_RPL_INFO_DATA_TOO_LONG'; +exports[1743] = 'ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE'; +exports[1744] = 'ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE'; +exports[1745] = 'ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX'; +exports[1746] = 'ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT'; +exports[1747] = 'ER_PARTITION_CLAUSE_ON_NONPARTITIONED'; +exports[1748] = 'ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET'; +exports[1749] = 'ER_NO_SUCH_PARTITION'; +exports[1750] = 'ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE'; +exports[1751] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE'; +exports[1752] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE'; +exports[1753] = 'ER_MTS_FEATURE_IS_NOT_SUPPORTED'; +exports[1754] = 'ER_MTS_UPDATED_DBS_GREATER_MAX'; +exports[1755] = 'ER_MTS_CANT_PARALLEL'; +exports[1756] = 'ER_MTS_INCONSISTENT_DATA'; +exports[1757] = 'ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING'; +exports[1758] = 'ER_DA_INVALID_CONDITION_NUMBER'; +exports[1759] = 'ER_INSECURE_PLAIN_TEXT'; +exports[1760] = 'ER_INSECURE_CHANGE_MASTER'; +exports[1761] = 'ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO'; +exports[1762] = 'ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO'; +exports[1763] = 'ER_SQLTHREAD_WITH_SECURE_SLAVE'; +exports[1764] = 'ER_TABLE_HAS_NO_FT'; +exports[1765] = 'ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER'; +exports[1766] = 'ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION'; +exports[1767] = 'ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST'; +exports[1768] = 'ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION'; +exports[1769] = 'ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION'; +exports[1770] = 'ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL'; +exports[1771] = 'ER_SKIPPING_LOGGED_TRANSACTION'; +exports[1772] = 'ER_MALFORMED_GTID_SET_SPECIFICATION'; +exports[1773] = 'ER_MALFORMED_GTID_SET_ENCODING'; +exports[1774] = 'ER_MALFORMED_GTID_SPECIFICATION'; +exports[1775] = 'ER_GNO_EXHAUSTED'; +exports[1776] = 'ER_BAD_SLAVE_AUTO_POSITION'; +exports[1777] = 'ER_AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF'; +exports[1778] = 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET'; +exports[1779] = 'ER_GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON'; +exports[1780] = 'ER_GTID_MODE_REQUIRES_BINLOG'; +exports[1781] = 'ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF'; +exports[1782] = 'ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON'; +exports[1783] = 'ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF'; +exports[1784] = 'ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF'; +exports[1785] = 'ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE'; +exports[1786] = 'ER_GTID_UNSAFE_CREATE_SELECT'; +exports[1787] = 'ER_GTID_UNSAFE_CREATE_DROP_TEMPORARY_TABLE_IN_TRANSACTION'; +exports[1788] = 'ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME'; +exports[1789] = 'ER_MASTER_HAS_PURGED_REQUIRED_GTIDS'; +exports[1790] = 'ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID'; +exports[1791] = 'ER_UNKNOWN_EXPLAIN_FORMAT'; +exports[1792] = 'ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION'; +exports[1793] = 'ER_TOO_LONG_TABLE_PARTITION_COMMENT'; +exports[1794] = 'ER_SLAVE_CONFIGURATION'; +exports[1795] = 'ER_INNODB_FT_LIMIT'; +exports[1796] = 'ER_INNODB_NO_FT_TEMP_TABLE'; +exports[1797] = 'ER_INNODB_FT_WRONG_DOCID_COLUMN'; +exports[1798] = 'ER_INNODB_FT_WRONG_DOCID_INDEX'; +exports[1799] = 'ER_INNODB_ONLINE_LOG_TOO_BIG'; +exports[1800] = 'ER_UNKNOWN_ALTER_ALGORITHM'; +exports[1801] = 'ER_UNKNOWN_ALTER_LOCK'; +exports[1802] = 'ER_MTS_CHANGE_MASTER_CANT_RUN_WITH_GAPS'; +exports[1803] = 'ER_MTS_RECOVERY_FAILURE'; +exports[1804] = 'ER_MTS_RESET_WORKERS'; +exports[1805] = 'ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2'; +exports[1806] = 'ER_SLAVE_SILENT_RETRY_TRANSACTION'; +exports[1807] = 'ER_DISCARD_FK_CHECKS_RUNNING'; +exports[1808] = 'ER_TABLE_SCHEMA_MISMATCH'; +exports[1809] = 'ER_TABLE_IN_SYSTEM_TABLESPACE'; +exports[1810] = 'ER_IO_READ_ERROR'; +exports[1811] = 'ER_IO_WRITE_ERROR'; +exports[1812] = 'ER_TABLESPACE_MISSING'; +exports[1813] = 'ER_TABLESPACE_EXISTS'; +exports[1814] = 'ER_TABLESPACE_DISCARDED'; +exports[1815] = 'ER_INTERNAL_ERROR'; +exports[1816] = 'ER_INNODB_IMPORT_ERROR'; +exports[1817] = 'ER_INNODB_INDEX_CORRUPT'; +exports[1818] = 'ER_INVALID_YEAR_COLUMN_LENGTH'; +exports[1819] = 'ER_NOT_VALID_PASSWORD'; +exports[1820] = 'ER_MUST_CHANGE_PASSWORD'; +exports[1821] = 'ER_FK_NO_INDEX_CHILD'; +exports[1822] = 'ER_FK_NO_INDEX_PARENT'; +exports[1823] = 'ER_FK_FAIL_ADD_SYSTEM'; +exports[1824] = 'ER_FK_CANNOT_OPEN_PARENT'; +exports[1825] = 'ER_FK_INCORRECT_OPTION'; +exports[1826] = 'ER_FK_DUP_NAME'; +exports[1827] = 'ER_PASSWORD_FORMAT'; +exports[1828] = 'ER_FK_COLUMN_CANNOT_DROP'; +exports[1829] = 'ER_FK_COLUMN_CANNOT_DROP_CHILD'; +exports[1830] = 'ER_FK_COLUMN_NOT_NULL'; +exports[1831] = 'ER_DUP_INDEX'; +exports[1832] = 'ER_FK_COLUMN_CANNOT_CHANGE'; +exports[1833] = 'ER_FK_COLUMN_CANNOT_CHANGE_CHILD'; +exports[1834] = 'ER_FK_CANNOT_DELETE_PARENT'; +exports[1835] = 'ER_MALFORMED_PACKET'; +exports[1836] = 'ER_READ_ONLY_MODE'; +exports[1837] = 'ER_GTID_NEXT_TYPE_UNDEFINED_GROUP'; +exports[1838] = 'ER_VARIABLE_NOT_SETTABLE_IN_SP'; +exports[1839] = 'ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF'; +exports[1840] = 'ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY'; +exports[1841] = 'ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY'; +exports[1842] = 'ER_GTID_PURGED_WAS_CHANGED'; +exports[1843] = 'ER_GTID_EXECUTED_WAS_CHANGED'; +exports[1844] = 'ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES'; +exports[1845] = 'ER_ALTER_OPERATION_NOT_SUPPORTED'; +exports[1846] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON'; +exports[1847] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY'; +exports[1848] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION'; +exports[1849] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME'; +exports[1850] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE'; +exports[1851] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK'; +exports[1852] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE'; +exports[1853] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK'; +exports[1854] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC'; +exports[1855] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS'; +exports[1856] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS'; +exports[1857] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS'; +exports[1858] = 'ER_SQL_SLAVE_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE'; +exports[1859] = 'ER_DUP_UNKNOWN_IN_INDEX'; +exports[1860] = 'ER_IDENT_CAUSES_TOO_LONG_PATH'; +exports[1861] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL'; +exports[1862] = 'ER_MUST_CHANGE_PASSWORD_LOGIN'; +exports[1863] = 'ER_ROW_IN_WRONG_PARTITION'; +exports[1864] = 'ER_MTS_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX'; +exports[1865] = 'ER_INNODB_NO_FT_USES_PARSER'; +exports[1866] = 'ER_BINLOG_LOGICAL_CORRUPTION'; +exports[1867] = 'ER_WARN_PURGE_LOG_IN_USE'; +exports[1868] = 'ER_WARN_PURGE_LOG_IS_ACTIVE'; +exports[1869] = 'ER_AUTO_INCREMENT_CONFLICT'; +exports[1870] = 'WARN_ON_BLOCKHOLE_IN_RBR'; +exports[1871] = 'ER_SLAVE_MI_INIT_REPOSITORY'; +exports[1872] = 'ER_SLAVE_RLI_INIT_REPOSITORY'; +exports[1873] = 'ER_ACCESS_DENIED_CHANGE_USER_ERROR'; +exports[1874] = 'ER_INNODB_READ_ONLY'; +exports[1875] = 'ER_STOP_SLAVE_SQL_THREAD_TIMEOUT'; +exports[1876] = 'ER_STOP_SLAVE_IO_THREAD_TIMEOUT'; +exports[1877] = 'ER_TABLE_CORRUPT'; +exports[1878] = 'ER_TEMP_FILE_WRITE_FAILURE'; +exports[1879] = 'ER_INNODB_FT_AUX_NOT_HEX_ID'; +exports[1880] = 'ER_OLD_TEMPORALS_UPGRADED'; +exports[1881] = 'ER_INNODB_FORCED_RECOVERY'; +exports[1882] = 'ER_AES_INVALID_IV'; +exports[1883] = 'ER_PLUGIN_CANNOT_BE_UNINSTALLED'; +exports[1884] = 'ER_GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_GTID_GROUP'; +exports[1885] = 'ER_SLAVE_HAS_MORE_GTIDS_THAN_MASTER'; +exports[3000] = 'ER_FILE_CORRUPT'; +exports[3001] = 'ER_ERROR_ON_MASTER'; +exports[3002] = 'ER_INCONSISTENT_ERROR'; +exports[3003] = 'ER_STORAGE_ENGINE_NOT_LOADED'; +exports[3004] = 'ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER'; +exports[3005] = 'ER_WARN_LEGACY_SYNTAX_CONVERTED'; +exports[3006] = 'ER_BINLOG_UNSAFE_FULLTEXT_PLUGIN'; +exports[3007] = 'ER_CANNOT_DISCARD_TEMPORARY_TABLE'; +exports[3008] = 'ER_FK_DEPTH_EXCEEDED'; +exports[3009] = 'ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2'; +exports[3010] = 'ER_WARN_TRIGGER_DOESNT_HAVE_CREATED'; +exports[3011] = 'ER_REFERENCED_TRG_DOES_NOT_EXIST'; +exports[3012] = 'ER_EXPLAIN_NOT_SUPPORTED'; +exports[3013] = 'ER_INVALID_FIELD_SIZE'; +exports[3014] = 'ER_MISSING_HA_CREATE_OPTION'; +exports[3015] = 'ER_ENGINE_OUT_OF_MEMORY'; +exports[3016] = 'ER_PASSWORD_EXPIRE_ANONYMOUS_USER'; +exports[3017] = 'ER_SLAVE_SQL_THREAD_MUST_STOP'; +exports[3018] = 'ER_NO_FT_MATERIALIZED_SUBQUERY'; +exports[3019] = 'ER_INNODB_UNDO_LOG_FULL'; +exports[3020] = 'ER_INVALID_ARGUMENT_FOR_LOGARITHM'; +exports[3021] = 'ER_SLAVE_CHANNEL_IO_THREAD_MUST_STOP'; +exports[3022] = 'ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO'; +exports[3023] = 'ER_WARN_ONLY_MASTER_LOG_FILE_NO_POS'; +exports[3024] = 'ER_QUERY_TIMEOUT'; +exports[3025] = 'ER_NON_RO_SELECT_DISABLE_TIMER'; +exports[3026] = 'ER_DUP_LIST_ENTRY'; +exports[3027] = 'ER_SQL_MODE_NO_EFFECT'; +exports[3028] = 'ER_AGGREGATE_ORDER_FOR_UNION'; +exports[3029] = 'ER_AGGREGATE_ORDER_NON_AGG_QUERY'; +exports[3030] = 'ER_SLAVE_WORKER_STOPPED_PREVIOUS_THD_ERROR'; +exports[3031] = 'ER_DONT_SUPPORT_SLAVE_PRESERVE_COMMIT_ORDER'; +exports[3032] = 'ER_SERVER_OFFLINE_MODE'; +exports[3033] = 'ER_GIS_DIFFERENT_SRIDS'; +exports[3034] = 'ER_GIS_UNSUPPORTED_ARGUMENT'; +exports[3035] = 'ER_GIS_UNKNOWN_ERROR'; +exports[3036] = 'ER_GIS_UNKNOWN_EXCEPTION'; +exports[3037] = 'ER_GIS_INVALID_DATA'; +exports[3038] = 'ER_BOOST_GEOMETRY_EMPTY_INPUT_EXCEPTION'; +exports[3039] = 'ER_BOOST_GEOMETRY_CENTROID_EXCEPTION'; +exports[3040] = 'ER_BOOST_GEOMETRY_OVERLAY_INVALID_INPUT_EXCEPTION'; +exports[3041] = 'ER_BOOST_GEOMETRY_TURN_INFO_EXCEPTION'; +exports[3042] = 'ER_BOOST_GEOMETRY_SELF_INTERSECTION_POINT_EXCEPTION'; +exports[3043] = 'ER_BOOST_GEOMETRY_UNKNOWN_EXCEPTION'; +exports[3044] = 'ER_STD_BAD_ALLOC_ERROR'; +exports[3045] = 'ER_STD_DOMAIN_ERROR'; +exports[3046] = 'ER_STD_LENGTH_ERROR'; +exports[3047] = 'ER_STD_INVALID_ARGUMENT'; +exports[3048] = 'ER_STD_OUT_OF_RANGE_ERROR'; +exports[3049] = 'ER_STD_OVERFLOW_ERROR'; +exports[3050] = 'ER_STD_RANGE_ERROR'; +exports[3051] = 'ER_STD_UNDERFLOW_ERROR'; +exports[3052] = 'ER_STD_LOGIC_ERROR'; +exports[3053] = 'ER_STD_RUNTIME_ERROR'; +exports[3054] = 'ER_STD_UNKNOWN_EXCEPTION'; +exports[3055] = 'ER_GIS_DATA_WRONG_ENDIANESS'; +exports[3056] = 'ER_CHANGE_MASTER_PASSWORD_LENGTH'; +exports[3057] = 'ER_USER_LOCK_WRONG_NAME'; +exports[3058] = 'ER_USER_LOCK_DEADLOCK'; +exports[3059] = 'ER_REPLACE_INACCESSIBLE_ROWS'; +exports[3060] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_GIS'; +exports[3061] = 'ER_ILLEGAL_USER_VAR'; +exports[3062] = 'ER_GTID_MODE_OFF'; +exports[3063] = 'ER_UNSUPPORTED_BY_REPLICATION_THREAD'; +exports[3064] = 'ER_INCORRECT_TYPE'; +exports[3065] = 'ER_FIELD_IN_ORDER_NOT_SELECT'; +exports[3066] = 'ER_AGGREGATE_IN_ORDER_NOT_SELECT'; +exports[3067] = 'ER_INVALID_RPL_WILD_TABLE_FILTER_PATTERN'; +exports[3068] = 'ER_NET_OK_PACKET_TOO_LARGE'; +exports[3069] = 'ER_INVALID_JSON_DATA'; +exports[3070] = 'ER_INVALID_GEOJSON_MISSING_MEMBER'; +exports[3071] = 'ER_INVALID_GEOJSON_WRONG_TYPE'; +exports[3072] = 'ER_INVALID_GEOJSON_UNSPECIFIED'; +exports[3073] = 'ER_DIMENSION_UNSUPPORTED'; +exports[3074] = 'ER_SLAVE_CHANNEL_DOES_NOT_EXIST'; +exports[3075] = 'ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT'; +exports[3076] = 'ER_SLAVE_CHANNEL_NAME_INVALID_OR_TOO_LONG'; +exports[3077] = 'ER_SLAVE_NEW_CHANNEL_WRONG_REPOSITORY'; +exports[3078] = 'ER_SLAVE_CHANNEL_DELETE'; +exports[3079] = 'ER_SLAVE_MULTIPLE_CHANNELS_CMD'; +exports[3080] = 'ER_SLAVE_MAX_CHANNELS_EXCEEDED'; +exports[3081] = 'ER_SLAVE_CHANNEL_MUST_STOP'; +exports[3082] = 'ER_SLAVE_CHANNEL_NOT_RUNNING'; +exports[3083] = 'ER_SLAVE_CHANNEL_WAS_RUNNING'; +exports[3084] = 'ER_SLAVE_CHANNEL_WAS_NOT_RUNNING'; +exports[3085] = 'ER_SLAVE_CHANNEL_SQL_THREAD_MUST_STOP'; +exports[3086] = 'ER_SLAVE_CHANNEL_SQL_SKIP_COUNTER'; +exports[3087] = 'ER_WRONG_FIELD_WITH_GROUP_V2'; +exports[3088] = 'ER_MIX_OF_GROUP_FUNC_AND_FIELDS_V2'; +exports[3089] = 'ER_WARN_DEPRECATED_SYSVAR_UPDATE'; +exports[3090] = 'ER_WARN_DEPRECATED_SQLMODE'; +exports[3091] = 'ER_CANNOT_LOG_PARTIAL_DROP_DATABASE_WITH_GTID'; +exports[3092] = 'ER_GROUP_REPLICATION_CONFIGURATION'; +exports[3093] = 'ER_GROUP_REPLICATION_RUNNING'; +exports[3094] = 'ER_GROUP_REPLICATION_APPLIER_INIT_ERROR'; +exports[3095] = 'ER_GROUP_REPLICATION_STOP_APPLIER_THREAD_TIMEOUT'; +exports[3096] = 'ER_GROUP_REPLICATION_COMMUNICATION_LAYER_SESSION_ERROR'; +exports[3097] = 'ER_GROUP_REPLICATION_COMMUNICATION_LAYER_JOIN_ERROR'; +exports[3098] = 'ER_BEFORE_DML_VALIDATION_ERROR'; +exports[3099] = 'ER_PREVENTS_VARIABLE_WITHOUT_RBR'; +exports[3100] = 'ER_RUN_HOOK_ERROR'; +exports[3101] = 'ER_TRANSACTION_ROLLBACK_DURING_COMMIT'; +exports[3102] = 'ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED'; +exports[3103] = 'ER_UNSUPPORTED_ALTER_INPLACE_ON_VIRTUAL_COLUMN'; +exports[3104] = 'ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN'; +exports[3105] = 'ER_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN'; +exports[3106] = 'ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN'; +exports[3107] = 'ER_GENERATED_COLUMN_NON_PRIOR'; +exports[3108] = 'ER_DEPENDENT_BY_GENERATED_COLUMN'; +exports[3109] = 'ER_GENERATED_COLUMN_REF_AUTO_INC'; +exports[3110] = 'ER_FEATURE_NOT_AVAILABLE'; +exports[3111] = 'ER_CANT_SET_GTID_MODE'; +exports[3112] = 'ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF'; +exports[3113] = 'ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION'; +exports[3114] = 'ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON'; +exports[3115] = 'ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF'; +exports[3116] = 'ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS'; +exports[3117] = 'ER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS'; +exports[3118] = 'ER_ACCOUNT_HAS_BEEN_LOCKED'; +exports[3119] = 'ER_WRONG_TABLESPACE_NAME'; +exports[3120] = 'ER_TABLESPACE_IS_NOT_EMPTY'; +exports[3121] = 'ER_WRONG_FILE_NAME'; +exports[3122] = 'ER_BOOST_GEOMETRY_INCONSISTENT_TURNS_EXCEPTION'; +exports[3123] = 'ER_WARN_OPTIMIZER_HINT_SYNTAX_ERROR'; +exports[3124] = 'ER_WARN_BAD_MAX_EXECUTION_TIME'; +exports[3125] = 'ER_WARN_UNSUPPORTED_MAX_EXECUTION_TIME'; +exports[3126] = 'ER_WARN_CONFLICTING_HINT'; +exports[3127] = 'ER_WARN_UNKNOWN_QB_NAME'; +exports[3128] = 'ER_UNRESOLVED_HINT_NAME'; +exports[3129] = 'ER_WARN_ON_MODIFYING_GTID_EXECUTED_TABLE'; +exports[3130] = 'ER_PLUGGABLE_PROTOCOL_COMMAND_NOT_SUPPORTED'; +exports[3131] = 'ER_LOCKING_SERVICE_WRONG_NAME'; +exports[3132] = 'ER_LOCKING_SERVICE_DEADLOCK'; +exports[3133] = 'ER_LOCKING_SERVICE_TIMEOUT'; +exports[3134] = 'ER_GIS_MAX_POINTS_IN_GEOMETRY_OVERFLOWED'; +exports[3135] = 'ER_SQL_MODE_MERGED'; +exports[3136] = 'ER_VTOKEN_PLUGIN_TOKEN_MISMATCH'; +exports[3137] = 'ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND'; +exports[3138] = 'ER_CANT_SET_VARIABLE_WHEN_OWNING_GTID'; +exports[3139] = 'ER_SLAVE_CHANNEL_OPERATION_NOT_ALLOWED'; +exports[3140] = 'ER_INVALID_JSON_TEXT'; +exports[3141] = 'ER_INVALID_JSON_TEXT_IN_PARAM'; +exports[3142] = 'ER_INVALID_JSON_BINARY_DATA'; +exports[3143] = 'ER_INVALID_JSON_PATH'; +exports[3144] = 'ER_INVALID_JSON_CHARSET'; +exports[3145] = 'ER_INVALID_JSON_CHARSET_IN_FUNCTION'; +exports[3146] = 'ER_INVALID_TYPE_FOR_JSON'; +exports[3147] = 'ER_INVALID_CAST_TO_JSON'; +exports[3148] = 'ER_INVALID_JSON_PATH_CHARSET'; +exports[3149] = 'ER_INVALID_JSON_PATH_WILDCARD'; +exports[3150] = 'ER_JSON_VALUE_TOO_BIG'; +exports[3151] = 'ER_JSON_KEY_TOO_BIG'; +exports[3152] = 'ER_JSON_USED_AS_KEY'; +exports[3153] = 'ER_JSON_VACUOUS_PATH'; +exports[3154] = 'ER_JSON_BAD_ONE_OR_ALL_ARG'; +exports[3155] = 'ER_NUMERIC_JSON_VALUE_OUT_OF_RANGE'; +exports[3156] = 'ER_INVALID_JSON_VALUE_FOR_CAST'; +exports[3157] = 'ER_JSON_DOCUMENT_TOO_DEEP'; +exports[3158] = 'ER_JSON_DOCUMENT_NULL_KEY'; +exports[3159] = 'ER_SECURE_TRANSPORT_REQUIRED'; +exports[3160] = 'ER_NO_SECURE_TRANSPORTS_CONFIGURED'; +exports[3161] = 'ER_DISABLED_STORAGE_ENGINE'; +exports[3162] = 'ER_USER_DOES_NOT_EXIST'; +exports[3163] = 'ER_USER_ALREADY_EXISTS'; +exports[3164] = 'ER_AUDIT_API_ABORT'; +exports[3165] = 'ER_INVALID_JSON_PATH_ARRAY_CELL'; +exports[3166] = 'ER_BUFPOOL_RESIZE_INPROGRESS'; +exports[3167] = 'ER_FEATURE_DISABLED_SEE_DOC'; +exports[3168] = 'ER_SERVER_ISNT_AVAILABLE'; +exports[3169] = 'ER_SESSION_WAS_KILLED'; +exports[3170] = 'ER_CAPACITY_EXCEEDED'; +exports[3171] = 'ER_CAPACITY_EXCEEDED_IN_RANGE_OPTIMIZER'; +exports[3172] = 'ER_TABLE_NEEDS_UPG_PART'; +exports[3173] = 'ER_CANT_WAIT_FOR_EXECUTED_GTID_SET_WHILE_OWNING_A_GTID'; +exports[3174] = 'ER_CANNOT_ADD_FOREIGN_BASE_COL_VIRTUAL'; +exports[3175] = 'ER_CANNOT_CREATE_VIRTUAL_INDEX_CONSTRAINT'; +exports[3176] = 'ER_ERROR_ON_MODIFYING_GTID_EXECUTED_TABLE'; +exports[3177] = 'ER_LOCK_REFUSED_BY_ENGINE'; +exports[3178] = 'ER_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN'; +exports[3179] = 'ER_MASTER_KEY_ROTATION_NOT_SUPPORTED_BY_SE'; +exports[3180] = 'ER_MASTER_KEY_ROTATION_ERROR_BY_SE'; +exports[3181] = 'ER_MASTER_KEY_ROTATION_BINLOG_FAILED'; +exports[3182] = 'ER_MASTER_KEY_ROTATION_SE_UNAVAILABLE'; +exports[3183] = 'ER_TABLESPACE_CANNOT_ENCRYPT'; +exports[3184] = 'ER_INVALID_ENCRYPTION_OPTION'; +exports[3185] = 'ER_CANNOT_FIND_KEY_IN_KEYRING'; +exports[3186] = 'ER_CAPACITY_EXCEEDED_IN_PARSER'; +exports[3187] = 'ER_UNSUPPORTED_ALTER_ENCRYPTION_INPLACE'; +exports[3188] = 'ER_KEYRING_UDF_KEYRING_SERVICE_ERROR'; +exports[3189] = 'ER_USER_COLUMN_OLD_LENGTH'; +exports[3190] = 'ER_CANT_RESET_MASTER'; +exports[3191] = 'ER_GROUP_REPLICATION_MAX_GROUP_SIZE'; +exports[3192] = 'ER_CANNOT_ADD_FOREIGN_BASE_COL_STORED'; +exports[3193] = 'ER_TABLE_REFERENCED'; +exports[3194] = 'ER_PARTITION_ENGINE_DEPRECATED_FOR_TABLE'; +exports[3195] = 'ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO'; +exports[3196] = 'ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID'; +exports[3197] = 'ER_XA_RETRY'; +exports[3198] = 'ER_KEYRING_AWS_UDF_AWS_KMS_ERROR'; +exports[3199] = 'ER_BINLOG_UNSAFE_XA'; +exports[3200] = 'ER_UDF_ERROR'; +exports[3201] = 'ER_KEYRING_MIGRATION_FAILURE'; +exports[3202] = 'ER_KEYRING_ACCESS_DENIED_ERROR'; +exports[3203] = 'ER_KEYRING_MIGRATION_STATUS'; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/constants/field_flags.js b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/field_flags.js new file mode 100644 index 0000000..c698da5 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/field_flags.js @@ -0,0 +1,18 @@ +// Manually extracted from mysql-5.5.23/include/mysql_com.h +exports.NOT_NULL_FLAG = 1; /* Field can't be NULL */ +exports.PRI_KEY_FLAG = 2; /* Field is part of a primary key */ +exports.UNIQUE_KEY_FLAG = 4; /* Field is part of a unique key */ +exports.MULTIPLE_KEY_FLAG = 8; /* Field is part of a key */ +exports.BLOB_FLAG = 16; /* Field is a blob */ +exports.UNSIGNED_FLAG = 32; /* Field is unsigned */ +exports.ZEROFILL_FLAG = 64; /* Field is zerofill */ +exports.BINARY_FLAG = 128; /* Field is binary */ + +/* The following are only sent to new clients */ +exports.ENUM_FLAG = 256; /* field is an enum */ +exports.AUTO_INCREMENT_FLAG = 512; /* field is a autoincrement field */ +exports.TIMESTAMP_FLAG = 1024; /* Field is a timestamp */ +exports.SET_FLAG = 2048; /* field is a set */ +exports.NO_DEFAULT_VALUE_FLAG = 4096; /* Field doesn't have default value */ +exports.ON_UPDATE_NOW_FLAG = 8192; /* Field is set to NOW on UPDATE */ +exports.NUM_FLAG = 32768; /* Field is num (for clients) */ diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/constants/server_status.js b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/server_status.js new file mode 100644 index 0000000..48880c3 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/server_status.js @@ -0,0 +1,39 @@ +// Manually extracted from mysql-5.5.23/include/mysql_com.h + +/** + Is raised when a multi-statement transaction + has been started, either explicitly, by means + of BEGIN or COMMIT AND CHAIN, or + implicitly, by the first transactional + statement, when autocommit=off. +*/ +exports.SERVER_STATUS_IN_TRANS = 1; +exports.SERVER_STATUS_AUTOCOMMIT = 2; /* Server in auto_commit mode */ +exports.SERVER_MORE_RESULTS_EXISTS = 8; /* Multi query - next query exists */ +exports.SERVER_QUERY_NO_GOOD_INDEX_USED = 16; +exports.SERVER_QUERY_NO_INDEX_USED = 32; +/** + The server was able to fulfill the clients request and opened a + read-only non-scrollable cursor for a query. This flag comes + in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands. +*/ +exports.SERVER_STATUS_CURSOR_EXISTS = 64; +/** + This flag is sent when a read-only cursor is exhausted, in reply to + COM_STMT_FETCH command. +*/ +exports.SERVER_STATUS_LAST_ROW_SENT = 128; +exports.SERVER_STATUS_DB_DROPPED = 256; /* A database was dropped */ +exports.SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512; +/** + Sent to the client if after a prepared statement reprepare + we discovered that the new statement returns a different + number of result set columns. +*/ +exports.SERVER_STATUS_METADATA_CHANGED = 1024; +exports.SERVER_QUERY_WAS_SLOW = 2048; + +/** + To mark ResultSet containing output parameter values. +*/ +exports.SERVER_PS_OUT_PARAMS = 4096; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/constants/ssl_profiles.js b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/ssl_profiles.js new file mode 100644 index 0000000..e76b954 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/ssl_profiles.js @@ -0,0 +1,740 @@ +// Certificates for Amazon RDS +exports['Amazon RDS'] = { + ca: [ + /** + * Amazon RDS global certificate 2010 to 2015 + * + * CN = aws.amazon.com/rds/ + * OU = RDS + * O = Amazon.com + * L = Seattle + * ST = Washington + * C = US + * P = 2010-04-05T22:44:31Z/2015-04-04T22:41:31Z + * F = 7F:09:8D:A5:7D:BB:A6:EF:7C:70:D8:CA:4E:49:11:55:7E:89:A7:D3 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIDQzCCAqygAwIBAgIJAOd1tlfiGoEoMA0GCSqGSIb3DQEBBQUAMHUxCzAJBgNV\n' + + 'BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdTZWF0dGxlMRMw\n' + + 'EQYDVQQKEwpBbWF6b24uY29tMQwwCgYDVQQLEwNSRFMxHDAaBgNVBAMTE2F3cy5h\n' + + 'bWF6b24uY29tL3Jkcy8wHhcNMTAwNDA1MjI0NDMxWhcNMTUwNDA0MjI0NDMxWjB1\n' + + 'MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHU2Vh\n' + + 'dHRsZTETMBEGA1UEChMKQW1hem9uLmNvbTEMMAoGA1UECxMDUkRTMRwwGgYDVQQD\n' + + 'ExNhd3MuYW1hem9uLmNvbS9yZHMvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n' + + 'gQDKhXGU7tizxUR5WaFoMTFcxNxa05PEjZaIOEN5ctkWrqYSRov0/nOMoZjqk8bC\n' + + 'med9vPFoQGD0OTakPs0jVe3wwmR735hyVwmKIPPsGlaBYj1O6llIpZeQVyupNx56\n' + + 'UzqtiLaDzh1KcmfqP3qP2dInzBfJQKjiRudo1FWnpPt33QIDAQABo4HaMIHXMB0G\n' + + 'A1UdDgQWBBT/H3x+cqSkR/ePSIinPtc4yWKe3DCBpwYDVR0jBIGfMIGcgBT/H3x+\n' + + 'cqSkR/ePSIinPtc4yWKe3KF5pHcwdTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh\n' + + 'c2hpbmd0b24xEDAOBgNVBAcTB1NlYXR0bGUxEzARBgNVBAoTCkFtYXpvbi5jb20x\n' + + 'DDAKBgNVBAsTA1JEUzEcMBoGA1UEAxMTYXdzLmFtYXpvbi5jb20vcmRzL4IJAOd1\n' + + 'tlfiGoEoMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAvguZy/BDT66x\n' + + 'GfgnJlyQwnFSeVLQm9u/FIvz4huGjbq9dqnD6h/Gm56QPFdyMEyDiZWaqY6V08lY\n' + + 'LTBNb4kcIc9/6pc0/ojKciP5QJRm6OiZ4vgG05nF4fYjhU7WClUx7cxq1fKjNc2J\n' + + 'UCmmYqgiVkAGWRETVo+byOSDZ4swb10=\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS global root CA 2015 to 2020 + * + * CN = Amazon RDS Root CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T09:11:31Z/2020-03-05T09:11:31Z + * F = E8:11:88:56:E7:A7:CE:3E:5E:DC:9A:31:25:1B:93:AC:DC:43:CE:B0 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID9DCCAtygAwIBAgIBQjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUwOTExMzFaFw0y\n' + + 'MDAzMDUwOTExMzFaMIGKMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEbMBkGA1UEAwwSQW1hem9uIFJE\n' + + 'UyBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuD8nrZ8V\n' + + 'u+VA8yVlUipCZIKPTDcOILYpUe8Tct0YeQQr0uyl018StdBsa3CjBgvwpDRq1HgF\n' + + 'Ji2N3+39+shCNspQeE6aYU+BHXhKhIIStt3r7gl/4NqYiDDMWKHxHq0nsGDFfArf\n' + + 'AOcjZdJagOMqb3fF46flc8k2E7THTm9Sz4L7RY1WdABMuurpICLFE3oHcGdapOb9\n' + + 'T53pQR+xpHW9atkcf3pf7gbO0rlKVSIoUenBlZipUlp1VZl/OD/E+TtRhDDNdI2J\n' + + 'P/DSMM3aEsq6ZQkfbz/Ilml+Lx3tJYXUDmp+ZjzMPLk/+3beT8EhrwtcG3VPpvwp\n' + + 'BIOqsqVVTvw/CwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw\n' + + 'AwEB/zAdBgNVHQ4EFgQUTgLurD72FchM7Sz1BcGPnIQISYMwHwYDVR0jBBgwFoAU\n' + + 'TgLurD72FchM7Sz1BcGPnIQISYMwDQYJKoZIhvcNAQEFBQADggEBAHZcgIio8pAm\n' + + 'MjHD5cl6wKjXxScXKtXygWH2BoDMYBJF9yfyKO2jEFxYKbHePpnXB1R04zJSWAw5\n' + + '2EUuDI1pSBh9BA82/5PkuNlNeSTB3dXDD2PEPdzVWbSKvUB8ZdooV+2vngL0Zm4r\n' + + '47QPyd18yPHrRIbtBtHR/6CwKevLZ394zgExqhnekYKIqqEX41xsUV0Gm6x4vpjf\n' + + '2u6O/+YE2U+qyyxHE5Wd5oqde0oo9UUpFETJPVb6Q2cEeQib8PBAyi0i6KnF+kIV\n' + + 'A9dY7IHSubtCK/i8wxMVqfd5GtbA8mmpeJFwnDvm9rBEsHybl08qlax9syEwsUYr\n' + + '/40NawZfTUU=\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-northeast-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS ap-northeast-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:06Z/2020-03-05T22:03:06Z + * F = 4B:2D:8A:E0:C1:A3:A9:AF:A7:BB:65:0C:5A:16:8A:39:3C:03:F2:C5 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEATCCAumgAwIBAgIBRDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMDZaFw0y\n' + + 'MDAzMDUyMjAzMDZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' + + 'UyBhcC1ub3J0aGVhc3QtMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' + + 'ggEBAMmM2B4PfTXCZjbZMWiDPyxvk/eeNwIRJAhfzesiGUiLozX6CRy3rwC1ZOPV\n' + + 'AcQf0LB+O8wY88C/cV+d4Q2nBDmnk+Vx7o2MyMh343r5rR3Na+4izd89tkQVt0WW\n' + + 'vO21KRH5i8EuBjinboOwAwu6IJ+HyiQiM0VjgjrmEr/YzFPL8MgHD/YUHehqjACn\n' + + 'C0+B7/gu7W4qJzBL2DOf7ub2qszGtwPE+qQzkCRDwE1A4AJmVE++/FLH2Zx78Egg\n' + + 'fV1sUxPtYgjGH76VyyO6GNKM6rAUMD/q5mnPASQVIXgKbupr618bnH+SWHFjBqZq\n' + + 'HvDGPMtiiWII41EmGUypyt5AbysCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' + + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFIiKM0Q6n1K4EmLxs3ZXxINbwEwR\n' + + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' + + 'A4IBAQBezGbE9Rw/k2e25iGjj5n8r+M3dlye8ORfCE/dijHtxqAKasXHgKX8I9Tw\n' + + 'JkBiGWiuzqn7gO5MJ0nMMro1+gq29qjZnYX1pDHPgsRjUX8R+juRhgJ3JSHijRbf\n' + + '4qNJrnwga7pj94MhcLq9u0f6dxH6dXbyMv21T4TZMTmcFduf1KgaiVx1PEyJjC6r\n' + + 'M+Ru+A0eM+jJ7uCjUoZKcpX8xkj4nmSnz9NMPog3wdOSB9cAW7XIc5mHa656wr7I\n' + + 'WJxVcYNHTXIjCcng2zMKd1aCcl2KSFfy56sRfT7J5Wp69QSr+jq8KM55gw8uqAwi\n' + + 'VPrXn2899T1rcTtFYFP16WXjGuc0\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-northeast-2 certificate CA 2015 to 2020 + * + * CN = Amazon RDS ap-northeast-2 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-11-06T00:05:46Z/2020-03-05T00:05:46Z + * F = 77:D9:33:4E:CE:56:FC:42:7B:29:57:8D:67:59:ED:29:4E:18:CB:6B + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEATCCAumgAwIBAgIBTDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTExMDYwMDA1NDZaFw0y\n' + + 'MDAzMDUwMDA1NDZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' + + 'UyBhcC1ub3J0aGVhc3QtMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' + + 'ggEBAKSwd+RVUzTRH0FgnbwoTK8TMm/zMT4+2BvALpAUe6YXbkisg2goycWuuWLg\n' + + 'jOpFBB3GtyvXZnkqi7MkDWUmj1a2kf8l2oLyoaZ+Hm9x/sV+IJzOqPvj1XVUGjP6\n' + + 'yYYnPJmUYqvZeI7fEkIGdFkP2m4/sgsSGsFvpD9FK1bL1Kx2UDpYX0kHTtr18Zm/\n' + + '1oN6irqWALSmXMDydb8hE0FB2A1VFyeKE6PnoDj/Y5cPHwPPdEi6/3gkDkSaOG30\n' + + 'rWeQfL3pOcKqzbHaWTxMphd0DSL/quZ64Nr+Ly65Q5PRcTrtr55ekOUziuqXwk+o\n' + + '9QpACMwcJ7ROqOznZTqTzSFVXFECAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' + + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFM6Nox/QWbhzWVvzoJ/y0kGpNPK+\n' + + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' + + 'A4IBAQCTkWBqNvyRf3Y/W21DwFx3oT/AIWrHt0BdGZO34tavummXemTH9LZ/mqv9\n' + + 'aljt6ZuDtf5DEQjdsAwXMsyo03ffnP7doWm8iaF1+Mui77ot0TmTsP/deyGwukvJ\n' + + 'tkxX8bZjDh+EaNauWKr+CYnniNxCQLfFtXYJsfOdVBzK3xNL+Z3ucOQRhr2helWc\n' + + 'CDQgwfhP1+3pRVKqHvWCPC4R3fT7RZHuRmZ38kndv476GxRntejh+ePffif78bFI\n' + + '3rIZCPBGobrrUMycafSbyXteoGca/kA+/IqrAPlk0pWQ4aEL0yTWN2h2dnjoD7oX\n' + + 'byIuL/g9AGRh97+ssn7D6bDRPTbW\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-southeast-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS ap-southeast-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:19Z/2020-03-05T22:03:19Z + * F = 0E:EC:5D:BD:F9:80:EE:A9:A0:8D:81:AC:37:D9:8D:34:1C:CD:27:D1 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEATCCAumgAwIBAgIBRTANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMTlaFw0y\n' + + 'MDAzMDUyMjAzMTlaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' + + 'UyBhcC1zb3V0aGVhc3QtMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' + + 'ggEBANaXElmSEYt/UtxHFsARFhSUahTf1KNJzR0Dmay6hqOXQuRVbKRwPd19u5vx\n' + + 'DdF1sLT7D69IK3VDnUiQScaCv2Dpu9foZt+rLx+cpx1qiQd1UHrvqq8xPzQOqCdC\n' + + 'RFStq6yVYZ69yfpfoI67AjclMOjl2Vph3ftVnqP0IgVKZdzeC7fd+umGgR9xY0Qr\n' + + 'Ubhd/lWdsbNvzK3f1TPWcfIKQnpvSt85PIEDJir6/nuJUKMtmJRwTymJf0i+JZ4x\n' + + '7dJa341p2kHKcHMgOPW7nJQklGBA70ytjUV6/qebS3yIugr/28mwReflg3TJzVDl\n' + + 'EOvi6pqbqNbkMuEwGDCmEQIVqgkCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' + + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAu93/4k5xbWOsgdCdn+/KdiRuit\n' + + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' + + 'A4IBAQBlcjSyscpPjf5+MgzMuAsCxByqUt+WFspwcMCpwdaBeHOPSQrXNqX2Sk6P\n' + + 'kth6oCivA64trWo8tFMvPYlUA1FYVD5WpN0kCK+P5pD4KHlaDsXhuhClJzp/OP8t\n' + + 'pOyUr5109RHLxqoKB5J5m1XA7rgcFjnMxwBSWFe3/4uMk/+4T53YfCVXuc6QV3i7\n' + + 'I/2LAJwFf//pTtt6fZenYfCsahnr2nvrNRNyAxcfvGZ/4Opn/mJtR6R/AjvQZHiR\n' + + 'bkRNKF2GW0ueK5W4FkZVZVhhX9xh1Aj2Ollb+lbOqADaVj+AT3PoJPZ3MPQHKCXm\n' + + 'xwG0LOLlRr/TfD6li1AfOVTAJXv9\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-southeast-2 certificate CA 2015 to 2020 + * + * CN = Amazon RDS ap-southeast-2 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:24Z/2020-03-05T22:03:24Z + * F = 20:D9:A8:82:23:AB:B9:E5:C5:24:10:D3:4D:0F:3D:B1:31:DF:E5:14 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEATCCAumgAwIBAgIBRjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMjRaFw0y\n' + + 'MDAzMDUyMjAzMjRaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' + + 'UyBhcC1zb3V0aGVhc3QtMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' + + 'ggEBAJqBAJutz69hFOh3BtLHZTbwE8eejGGKayn9hu98YMDPzWzGXWCmW+ZYWELA\n' + + 'cY3cNWNF8K4FqKXFr2ssorBYim1UtYFX8yhydT2hMD5zgQ2sCGUpuidijuPA6zaq\n' + + 'Z3tdhVR94f0q8mpwpv2zqR9PcqaGDx2VR1x773FupRPRo7mEW1vC3IptHCQlP/zE\n' + + '7jQiLl28bDIH2567xg7e7E9WnZToRnhlYdTaDaJsHTzi5mwILi4cihSok7Shv/ME\n' + + 'hnukvxeSPUpaVtFaBhfBqq055ePq9I+Ns4KGreTKMhU0O9fkkaBaBmPaFgmeX/XO\n' + + 'n2AX7gMouo3mtv34iDTZ0h6YCGkCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' + + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFIlQnY0KHYWn1jYumSdJYfwj/Nfw\n' + + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' + + 'A4IBAQA0wVU6/l41cTzHc4azc4CDYY2Wd90DFWiH9C/mw0SgToYfCJ/5Cfi0NT/Y\n' + + 'PRnk3GchychCJgoPA/k9d0//IhYEAIiIDjyFVgjbTkKV3sh4RbdldKVOUB9kumz/\n' + + 'ZpShplsGt3z4QQiVnKfrAgqxWDjR0I0pQKkxXa6Sjkicos9LQxVtJ0XA4ieG1E7z\n' + + 'zJr+6t80wmzxvkInSaWP3xNJK9azVRTrgQZQlvkbpDbExl4mNTG66VD3bAp6t3Wa\n' + + 'B49//uDdfZmPkqqbX+hsxp160OH0rxJppwO3Bh869PkDnaPEd/Pxw7PawC+li0gi\n' + + 'NRV8iCEx85aFxcyOhqn0WZOasxee\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS eu-central-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS eu-central-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:31Z/2020-03-05T22:03:31Z + * F = 94:B4:DF:B9:6D:7E:F7:C3:B7:BF:51:E9:A6:B7:44:A0:D0:82:11:84 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/zCCAuegAwIBAgIBRzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMzFaFw0y\n' + + 'MDAzMDUyMjAzMzFaMIGSMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEjMCEGA1UEAwwaQW1hem9uIFJE\n' + + 'UyBldS1jZW50cmFsLTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\n' + + 'AQDFtP2dhSLuaPOI4ZrrPWsK4OY9ocQBp3yApH1KJYmI9wpQKZG/KCH2E6Oo7JAw\n' + + 'QORU519r033T+FO2Z7pFPlmz1yrxGXyHpJs8ySx3Yo5S8ncDCdZJCLmtPiq/hahg\n' + + '5/0ffexMFUCQaYicFZsrJ/cStdxUV+tSw2JQLD7UxS9J97LQWUPyyG+ZrjYVTVq+\n' + + 'zudnFmNSe4QoecXMhAFTGJFQXxP7nhSL9Ao5FGgdXy7/JWeWdQIAj8ku6cBDKPa6\n' + + 'Y6kP+ak+In+Lye8z9qsCD/afUozfWjPR2aA4JoIZVF8dNRShIMo8l0XfgfM2q0+n\n' + + 'ApZWZ+BjhIO5XuoUgHS3D2YFAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNV\n' + + 'HRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBRm4GsWIA/M6q+tK8WGHWDGh2gcyTAf\n' + + 'BgNVHSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOC\n' + + 'AQEAHpMmeVQNqcxgfQdbDIi5UIy+E7zZykmtAygN1XQrvga9nXTis4kOTN6g5/+g\n' + + 'HCx7jIXeNJzAbvg8XFqBN84Quqgpl/tQkbpco9Jh1HDs558D5NnZQxNqH5qXQ3Mm\n' + + 'uPgCw0pYcPOa7bhs07i+MdVwPBsX27CFDtsgAIru8HvKxY1oTZrWnyIRo93tt/pk\n' + + 'WuItVMVHjaQZVfTCow0aDUbte6Vlw82KjUFq+n2NMSCJDiDKsDDHT6BJc4AJHIq3\n' + + '/4Z52MSC9KMr0yAaaoWfW/yMEj9LliQauAgwVjArF4q78rxpfKTG9Rfd8U1BZANP\n' + + '7FrFMN0ThjfA1IvmOYcgskY5bQ==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS eu-west-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS eu-west-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:35Z/2020-03-05T22:03:35Z + * F = 1A:95:F0:43:82:D2:5D:A6:AD:F5:13:27:0B:40:8A:72:D9:92:F3:E0 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBSDANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzMzVaFw0y\n' + + 'MDAzMDUyMjAzMzVaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyBldS13ZXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx\n' + + 'PdbqQ0HKRj79Pmocxvjc+P6i4Ux24kgFIl+ckiir1vzkmesc3a58gjrMlCksEObt\n' + + 'Yihs5IhzEq1ePT0gbfS9GYFp34Uj/MtPwlrfCBWG4d2TcrsKRHr1/EXUYhWqmdrb\n' + + 'RhX8XqoRhVkbF/auzFSBhTzcGGvZpQ2KIaxRcQfcXlMVhj/pxxAjh8U4F350Fb0h\n' + + 'nX1jw4/KvEreBL0Xb2lnlGTkwVxaKGSgXEnOgIyOFdOQc61vdome0+eeZsP4jqeR\n' + + 'TGYJA9izJsRbe2YJxHuazD+548hsPlM3vFzKKEVURCha466rAaYAHy3rKur3HYQx\n' + + 'Yt+SoKcEz9PXuSGj96ejAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBTebg//h2oeXbZjQ4uuoiuLYzuiPDAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' + + 'TikPaGeZasTPw+4RBemlsyPAjtFFQLo7ddaFdORLgdEysVf8aBqndvbA6MT/v4lj\n' + + 'GtEtUdF59ZcbWOrVm+fBZ2h/jYJ59dYF/xzb09nyRbdMSzB9+mkSsnOMqluq5y8o\n' + + 'DY/PfP2vGhEg/2ZncRC7nlQU1Dm8F4lFWEiQ2fi7O1cW852Vmbq61RIfcYsH/9Ma\n' + + 'kpgk10VZ75b8m3UhmpZ/2uRY+JEHImH5WpcTJ7wNiPNJsciZMznGtrgOnPzYco8L\n' + + 'cDleOASIZifNMQi9PKOJKvi0ITz0B/imr8KBsW0YjZVJ54HMa7W1lwugSM7aMAs+\n' + + 'E3Sd5lS+SHwWaOCHwhOEVA==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS sa-east-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS sa-east-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:40Z/2020-03-05T22:03:40Z + * F = 32:10:3D:FA:6D:42:F5:35:98:40:15:F4:4C:74:74:27:CB:CE:D4:B5 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBSTANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNDBaFw0y\n' + + 'MDAzMDUyMjAzNDBaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyBzYS1lYXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCU\n' + + 'X4OBnQ5xA6TLJAiFEI6l7bUWjoVJBa/VbMdCCSs2i2dOKmqUaXu2ix2zcPILj3lZ\n' + + 'GMk3d/2zvTK/cKhcFrewHUBamTeVHdEmynhMQamqNmkM4ptYzFcvEUw1TGxHT4pV\n' + + 'Q6gSN7+/AJewQvyHexHo8D0+LDN0/Wa9mRm4ixCYH2CyYYJNKaZt9+EZfNu+PPS4\n' + + '8iB0TWH0DgQkbWMBfCRgolLLitAZklZ4dvdlEBS7evN1/7ttBxUK6SvkeeSx3zBl\n' + + 'ww3BlXqc3bvTQL0A+RRysaVyFbvtp9domFaDKZCpMmDFAN/ntx215xmQdrSt+K3F\n' + + 'cXdGQYHx5q410CAclGnbAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBT6iVWnm/uakS+tEX2mzIfw+8JL0zAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' + + 'FmDD+QuDklXn2EgShwQxV13+txPRuVdOSrutHhoCgMwFWCMtPPtBAKs6KPY7Guvw\n' + + 'DpJoZSehDiOfsgMirjOWjvfkeWSNvKfjWTVneX7pZD9W5WPnsDBvTbCGezm+v87z\n' + + 'b+ZM2ZMo98m/wkMcIEAgdSKilR2fuw8rLkAjhYFfs0A7tDgZ9noKwgHvoE4dsrI0\n' + + 'KZYco6DlP/brASfHTPa2puBLN9McK3v+h0JaSqqm5Ro2Bh56tZkQh8AWy/miuDuK\n' + + '3+hNEVdxosxlkM1TPa1DGj0EzzK0yoeerXuH2HX7LlCrrxf6/wdKnjR12PMrLQ4A\n' + + 'pCqkcWw894z6bV9MAvKe6A==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS us-east-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS us-east-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T21:54:04Z/2020-03-05T21:54:04Z + * F = 34:47:8A:90:8A:83:AE:45:DC:B6:16:76:D2:35:EC:E9:75:C6:2C:63 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBQzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMTU0MDRaFw0y\n' + + 'MDAzMDUyMTU0MDRaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyB1cy1lYXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDI\n' + + 'UIuwh8NusKHk1SqPXcP7OqxY3S/M2ZyQWD3w7Bfihpyyy/fc1w0/suIpX3kbMhAV\n' + + '2ESwged2/2zSx4pVnjp/493r4luhSqQYzru78TuPt9bhJIJ51WXunZW2SWkisSaf\n' + + 'USYUzVN9ezR/bjXTumSUQaLIouJt3OHLX49s+3NAbUyOI8EdvgBQWD68H1epsC0n\n' + + 'CI5s+pIktyOZ59c4DCDLQcXErQ+tNbDC++oct1ANd/q8p9URonYwGCGOBy7sbCYq\n' + + '9eVHh1Iy2M+SNXddVOGw5EuruvHoCIQyOz5Lz4zSuZA9dRbrfztNOpezCNYu6NKM\n' + + 'n+hzcvdiyxv77uNm8EaxAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBQSQG3TmMe6Sa3KufaPBa72v4QFDzAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' + + 'L/mOZfB3187xTmjOHMqN2G2oSKHBKiQLM9uv8+97qT+XR+TVsBT6b3yoPpMAGhHA\n' + + 'Pc7nxAF5gPpuzatx0OTLPcmYucFmfqT/1qA5WlgCnMNtczyNMH97lKFTNV7Njtek\n' + + 'jWEzAEQSyEWrkNpNlC4j6kMYyPzVXQeXUeZTgJ9FNnVZqmvfjip2N22tawMjrCn5\n' + + '7KN/zN65EwY2oO9XsaTwwWmBu3NrDdMbzJnbxoWcFWj4RBwanR1XjQOVNhDwmCOl\n' + + '/1Et13b8CPyj69PC8BOVU6cfTSx8WUVy0qvYOKHNY9Bqa5BDnIL3IVmUkeTlM1mt\n' + + 'enRpyBj+Bk9rh/ICdiRKmA==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS us-west-1 certificate CA 2015 to 2020 + * + * CN = Amazon RDS us-west-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:45Z/2020-03-05T22:03:45Z + * F = EF:94:2F:E3:58:0E:09:D6:79:C2:16:97:91:FB:37:EA:D7:70:A8:4B + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBSjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNDVaFw0y\n' + + 'MDAzMDUyMjAzNDVaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyB1cy13ZXN0LTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDE\n' + + 'Dhw+uw/ycaiIhhyu2pXFRimq0DlB8cNtIe8hdqndH8TV/TFrljNgR8QdzOgZtZ9C\n' + + 'zzQ2GRpInN/qJF6slEd6wO+6TaDBQkPY+07TXNt52POFUhdVkhJXHpE2BS7Xn6J7\n' + + '7RFAOeG1IZmc2DDt+sR1BgXzUqHslQGfFYNS0/MBO4P+ya6W7IhruB1qfa4HiYQS\n' + + 'dbe4MvGWnv0UzwAqdR7OF8+8/5c58YXZIXCO9riYF2ql6KNSL5cyDPcYK5VK0+Q9\n' + + 'VI6vuJHSMYcF7wLePw8jtBktqAFE/wbdZiIHhZvNyiNWPPNTGUmQbaJ+TzQEHDs5\n' + + '8en+/W7JKnPyBOkxxENbAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBS0nw/tFR9bCjgqWTPJkyy4oOD8bzAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' + + 'CXGAY3feAak6lHdqj6+YWjy6yyUnLK37bRxZDsyDVXrPRQaXRzPTzx79jvDwEb/H\n' + + 'Q/bdQ7zQRWqJcbivQlwhuPJ4kWPUZgSt3JUUuqkMsDzsvj/bwIjlrEFDOdHGh0mi\n' + + 'eVIngFEjUXjMh+5aHPEF9BlQnB8LfVtKj18e15UDTXFa+xJPFxUR7wDzCfo4WI1m\n' + + 'sUMG4q1FkGAZgsoyFPZfF8IVvgCuGdR8z30VWKklFxttlK0eGLlPAyIO0CQxPQlo\n' + + 'saNJrHf4tLOgZIWk+LpDhNd9Et5EzvJ3aURUsKY4pISPPF5WdvM9OE59bERwUErd\n' + + 'nuOuQWQeeadMceZnauRzJQ==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS us-west-2 certificate CA 2015 to 2020 + * + * CN = Amazon RDS us-west-2 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2015-02-05T22:03:50Z/2020-03-05T22:03:50Z + * F = 94:2C:A8:B0:23:48:17:F0:CD:2F:19:7F:C1:E0:21:7C:65:79:13:3A + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBSzANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNTAyMDUyMjAzNTBaFw0y\n' + + 'MDAzMDUyMjAzNTBaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyB1cy13ZXN0LTIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDM\n' + + 'H58SR48U6jyERC1vYTnub34smf5EQVXyzaTmspWGWGzT31NLNZGSDFaa7yef9kdO\n' + + 'mzJsgebR5tXq6LdwlIoWkKYQ7ycUaadtVKVYdI40QcI3cHn0qLFlg2iBXmWp/B+i\n' + + 'Z34VuVlCh31Uj5WmhaBoz8t/GRqh1V/aCsf3Wc6jCezH3QfuCjBpzxdOOHN6Ie2v\n' + + 'xX09O5qmZTvMoRBAvPkxdaPg/Mi7fxueWTbEVk78kuFbF1jHYw8U1BLILIAhcqlq\n' + + 'x4u8nl73t3O3l/soNUcIwUDK0/S+Kfqhwn9yQyPlhb4Wy3pfnZLJdkyHldktnQav\n' + + '9TB9u7KH5Lk0aAYslMLxAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBT8roM4lRnlFHWMPWRz0zkwFZog1jAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQUFAAOCAQEA\n' + + 'JwrxwgwmPtcdaU7O7WDdYa4hprpOMamI49NDzmE0s10oGrqmLwZygcWU0jT+fJ+Y\n' + + 'pJe1w0CVfKaeLYNsOBVW3X4ZPmffYfWBheZiaiEflq/P6t7/Eg81gaKYnZ/x1Dfa\n' + + 'sUYkzPvCkXe9wEz5zdUTOCptDt89rBR9CstL9vE7WYUgiVVmBJffWbHQLtfjv6OF\n' + + 'NMb0QME981kGRzc2WhgP71YS2hHd1kXtsoYP1yTu4vThSKsoN4bkiHsaC1cRkLoy\n' + + '0fFA4wpB3WloMEvCDaUvvH1LZlBXTNlwi9KtcwD4tDxkkBt4tQczKLGpQ/nF/W9n\n' + + '8YDWk3IIc1sd0bkZqoau2Q==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-south-1 certificate CA 2016 to 2020 + * + * CN = Amazon RDS ap-south-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2016-05-03T21:29:22Z/2020-03-05T21:29:22Z + * F = F3:A3:C2:52:D9:82:20:AC:8C:62:31:2A:8C:AD:5D:7B:1C:31:F1:DD + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/TCCAuWgAwIBAgIBTTANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjA1MDMyMTI5MjJaFw0y\n' + + 'MDAzMDUyMTI5MjJaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEhMB8GA1UEAwwYQW1hem9uIFJE\n' + + 'UyBhcC1zb3V0aC0xIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n' + + '06eWGLE0TeqL9kyWOLkS8q0fXO97z+xyBV3DKSB2lg2GkgBz3B98MkmkeB0SZy3G\n' + + 'Ce4uCpCPbFKiFEdiUclOlhZsrBuCeaimxLM3Ig2wuenElO/7TqgaYHYUbT3d+VQW\n' + + 'GUbLn5GRZJZe1OAClYdOWm7A1CKpuo+cVV1vxbY2nGUQSJPpVn2sT9gnwvjdE60U\n' + + 'JGYU/RLCTm8zmZBvlWaNIeKDnreIc4rKn6gUnJ2cQn1ryCVleEeyc3xjYDSrjgdn\n' + + 'FLYGcp9mphqVT0byeQMOk0c7RHpxrCSA0V5V6/CreFV2LteK50qcDQzDSM18vWP/\n' + + 'p09FoN8O7QrtOeZJzH/lmwIDAQABo2YwZDAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0T\n' + + 'AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU2i83QHuEl/d0keXF+69HNJph7cMwHwYD\n' + + 'VR0jBBgwFoAUTgLurD72FchM7Sz1BcGPnIQISYMwDQYJKoZIhvcNAQELBQADggEB\n' + + 'ACqnH2VjApoDqoSQOky52QBwsGaj+xWYHW5Gm7EvCqvQuhWMkeBuD6YJmMvNyA9G\n' + + 'I2lh6/o+sUk/RIsbYbxPRdhNPTOgDR9zsNRw6qxaHztq/CEC+mxDCLa3O1hHBaDV\n' + + 'BmB3nCZb93BvO0EQSEk7aytKq/f+sjyxqOcs385gintdHGU9uM7gTZHnU9vByJsm\n' + + '/TL07Miq67X0NlhIoo3jAk+xHaeKJdxdKATQp0448P5cY20q4b8aMk1twcNaMvCP\n' + + 'dG4M5doaoUA8OQ/0ukLLae/LBxLeTw04q1/a2SyFaVUX2Twbb1S3xVWwLA8vsyGr\n' + + 'igXx7B5GgP+IHb6DTjPJAi0=\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS us-east-2 certificate CA 2016 to 2020 + * + * CN = Amazon RDS us-east-2 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2016-08-11T19:58:45Z/2020-03-05T19:58:45Z + * F = 9B:78:E3:64:7F:74:BC:B2:52:18:CF:13:C3:62:B8:35:9D:3D:5F:B6 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBTjANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjA4MTExOTU4NDVaFw0y\n' + + 'MDAzMDUxOTU4NDVaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyB1cy1lYXN0LTIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCp\n' + + 'WnnUX7wM0zzstccX+4iXKJa9GR0a2PpvB1paEX4QRCgfhEdQWDaSqyrWNgdVCKkt\n' + + '1aQkWu5j6VAC2XIG7kKoonm1ZdBVyBLqW5lXNywlaiU9yhJkwo8BR+/OqgE+PLt/\n' + + 'EO1mlN0PQudja/XkExCXTO29TG2j7F/O7hox6vTyHNHc0H88zS21uPuBE+jivViS\n' + + 'yzj/BkyoQ85hnkues3f9R6gCGdc+J51JbZnmgzUkvXjAEuKhAm9JksVOxcOKUYe5\n' + + 'ERhn0U9zjzpfbAITIkul97VVa5IxskFFTHIPJbvRKHJkiF6wTJww/tc9wm+fSCJ1\n' + + '+DbQTGZgkQ3bJrqRN29/AgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBSAHQzUYYZbepwKEMvGdHp8wzHnfDAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOCAQEA\n' + + 'MbaEzSYZ+aZeTBxf8yi0ta8K4RdwEJsEmP6IhFFQHYUtva2Cynl4Q9tZg3RMsybT\n' + + '9mlnSQQlbN/wqIIXbkrcgFcHoXG9Odm/bDtUwwwDaiEhXVfeQom3G77QHOWMTCGK\n' + + 'qadwuh5msrb17JdXZoXr4PYHDKP7j0ONfAyFNER2+uecblHfRSpVq5UeF3L6ZJb8\n' + + 'fSw/GtAV6an+/0r+Qm+PiI2H5XuZ4GmRJYnGMhqWhBYrY7p3jtVnKcsh39wgfUnW\n' + + 'AvZEZG/yhFyAZW0Essa39LiL5VSq14Y1DOj0wgnhSY/9WHxaAo1HB1T9OeZknYbD\n' + + 'fl/EGSZ0TEvZkENrXcPlVA==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ca-central-1 certificate CA 2016 to 2020 + * + * CN = Amazon RDS ca-central-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2016-09-15T00:10:11Z/2020-03-05T00:10:11Z + * F = D7:E0:16:AB:8A:0B:63:9F:67:1F:16:87:42:F4:0A:EE:73:A6:FC:04 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/zCCAuegAwIBAgIBTzANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjA5MTUwMDEwMTFaFw0y\n' + + 'MDAzMDUwMDEwMTFaMIGSMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEjMCEGA1UEAwwaQW1hem9uIFJE\n' + + 'UyBjYS1jZW50cmFsLTEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\n' + + 'AQCZYI/iQ6DrS3ny3t1EwX1wAD+3LMgh7Fd01EW5LIuaK2kYIIQpsVKhxLCit/V5\n' + + 'AGc/1qiJS1Qz9ODLTh0Na6bZW6EakRzuHJLe32KJtoFYPC7Z09UqzXrpA/XL+1hM\n' + + 'P0ZmCWsU7Nn/EmvfBp9zX3dZp6P6ATrvDuYaVFr+SA7aT3FXpBroqBS1fyzUPs+W\n' + + 'c6zTR6+yc4zkHX0XQxC5RH6xjgpeRkoOajA/sNo7AQF7KlWmKHbdVF44cvvAhRKZ\n' + + 'XaoVs/C4GjkaAEPTCbopYdhzg+KLx9eB2BQnYLRrIOQZtRfbQI2Nbj7p3VsRuOW1\n' + + 'tlcks2w1Gb0YC6w6SuIMFkl1AgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNV\n' + + 'HRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBToYWxE1lawl6Ks6NsvpbHQ3GKEtzAf\n' + + 'BgNVHSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOC\n' + + 'AQEAG/8tQ0ooi3hoQpa5EJz0/E5VYBsAz3YxA2HoIonn0jJyG16bzB4yZt4vNQMA\n' + + 'KsNlQ1uwDWYL1nz63axieUUFIxqxl1KmwfhsmLgZ0Hd2mnTPIl2Hw3uj5+wdgGBg\n' + + 'agnAZ0bajsBYgD2VGQbqjdk2Qn7Fjy3LEWIvGZx4KyZ99OJ2QxB7JOPdauURAtWA\n' + + 'DKYkP4LLJxtj07DSzG8kuRWb9B47uqUD+eKDIyjfjbnzGtd9HqqzYFau7EX3HVD9\n' + + '9Qhnjl7bTZ6YfAEZ3nH2t3Vc0z76XfGh47rd0pNRhMV+xpok75asKf/lNh5mcUrr\n' + + 'VKwflyMkQpSbDCmcdJ90N2xEXQ==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS eu-west-2 certificate CA 2016 to 2020 + * + * CN = Amazon RDS eu-west-2 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2016-10-10T17:44:42Z/2020-03-05T17:44:42Z + * F = 47:79:51:9F:FF:07:D3:F4:27:D3:AB:64:56:7F:00:45:BB:84:C1:71 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBUDANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNjEwMTAxNzQ0NDJaFw0y\n' + + 'MDAzMDUxNzQ0NDJaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyBldS13ZXN0LTIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDO\n' + + 'cttLJfubB4XMMIGWNfJISkIdCMGJyOzLiMJaiWB5GYoXKhEl7YGotpy0qklwW3BQ\n' + + 'a0fmVdcCLX+dIuVQ9iFK+ZcK7zwm7HtdDTCHOCKeOh2IcnU4c/VIokFi6Gn8udM6\n' + + 'N/Zi5M5OGpVwLVALQU7Yctsn3c95el6MdVx6mJiIPVu7tCVZn88Z2koBQ2gq9P4O\n' + + 'Sb249SHFqOb03lYDsaqy1NDsznEOhaRBw7DPJFpvmw1lA3/Y6qrExRI06H2VYR2i\n' + + '7qxwDV50N58fs10n7Ye1IOxTVJsgEA7X6EkRRXqYaM39Z76R894548WHfwXWjUsi\n' + + 'MEX0RS0/t1GmnUQjvevDAgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBQBxmcuRSxERYCtNnSr5xNfySokHjAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOCAQEA\n' + + 'UyCUQjsF3nUAABjfEZmpksTuUo07aT3KGYt+EMMFdejnBQ0+2lJJFGtT+CDAk1SD\n' + + 'RSgfEBon5vvKEtlnTf9a3pv8WXOAkhfxnryr9FH6NiB8obISHNQNPHn0ljT2/T+I\n' + + 'Y6ytfRvKHa0cu3V0NXbJm2B4KEOt4QCDiFxUIX9z6eB4Kditwu05OgQh6KcogOiP\n' + + 'JesWxBMXXGoDC1rIYTFO7szwDyOHlCcVXJDNsTJhc32oDWYdeIbW7o/5I+aQsrXZ\n' + + 'C96HykZcgWzz6sElrQxUaT3IoMw/5nmw4uWKKnZnxgI9bY4fpQwMeBZ96iHfFxvH\n' + + 'mqfEEuC7uUoPofXdBp2ObQ==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS us-gov-west-1 CA 2017 to 2022 + * + * CN = Amazon RDS us-gov-west-1 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2017-05-19T22:31:19Z/2022-05-18T12:00:00Z + * F = 77:55:8C:C4:5E:71:1F:1B:57:E3:DA:6E:5B:74:27:12:4E:E8:69:E8 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIECjCCAvKgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZMxCzAJBgNVBAYTAlVT\n' + + 'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' + + 'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' + + 'MSQwIgYDVQQDDBtBbWF6b24gUkRTIEdvdkNsb3VkIFJvb3QgQ0EwHhcNMTcwNTE5\n' + + 'MjIzMTE5WhcNMjIwNTE4MTIwMDAwWjCBkzELMAkGA1UEBhMCVVMxEzARBgNVBAgM\n' + + 'Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoMGUFtYXpvbiBX\n' + + 'ZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxJDAiBgNVBAMM\n' + + 'G0FtYXpvbiBSRFMgdXMtZ292LXdlc3QtMSBDQTCCASIwDQYJKoZIhvcNAQEBBQAD\n' + + 'ggEPADCCAQoCggEBAM8YZLKAzzOdNnoi7Klih26Zkj+OCpDfwx4ZYB6f8L8UoQi5\n' + + '8z9ZtIwMjiJ/kO08P1yl4gfc7YZcNFvhGruQZNat3YNpxwUpQcr4mszjuffbL4uz\n' + + '+/8FBxALdqCVOJ5Q0EVSfz3d9Bd1pUPL7ARtSpy7bn/tUPyQeI+lODYO906C0TQ3\n' + + 'b9bjOsgAdBKkHfjLdsknsOZYYIzYWOJyFJJa0B11XjDUNBy/3IuC0KvDl6At0V5b\n' + + '8M6cWcKhte2hgjwTYepV+/GTadeube1z5z6mWsN5arOAQUtYDLH6Aztq9mCJzLHm\n' + + 'RccBugnGl3fRLJ2VjioN8PoGoN9l9hFBy5fnFgsCAwEAAaNmMGQwDgYDVR0PAQH/\n' + + 'BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFEG7+br8KkvwPd5g\n' + + '71Rvh2stclJbMB8GA1UdIwQYMBaAFEkQz6S4NS5lOYKcDjBSuCcVpdzjMA0GCSqG\n' + + 'SIb3DQEBCwUAA4IBAQBMA327u5ABmhX+aPxljoIbxnydmAFWxW6wNp5+rZrvPig8\n' + + 'zDRqGQWWr7wWOIjfcWugSElYtf/m9KZHG/Z6+NG7nAoUrdcd1h/IQhb+lFQ2b5g9\n' + + 'sVzQv/H2JNkfZA8fL/Ko/Tm/f9tcqe0zrGCtT+5u0Nvz35Wl8CEUKLloS5xEb3k5\n' + + '7D9IhG3fsE3vHWlWrGCk1cKry3j12wdPG5cUsug0vt34u6rdhP+FsM0tHI15Kjch\n' + + 'RuUCvyQecy2ZFNAa3jmd5ycNdL63RWe8oayRBpQBxPPCbHfILxGZEdJbCH9aJ2D/\n' + + 'l8oHIDnvOLdv7/cBjyYuvmprgPtu3QEkbre5Hln/\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS eu-west-3 certificate CA 2017 to 2020 + * + * CN = Amazon RDS eu-west-3 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2017-08-25T21:39:26Z/2020-03-05T21:39:26Z + * F = FD:35:A7:84:60:68:98:00:12:54:ED:34:26:8C:66:0F:72:DD:B2:F4 + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIID/DCCAuSgAwIBAgIBUTANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNzA4MjUyMTM5MjZaFw0y\n' + + 'MDAzMDUyMTM5MjZaMIGPMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJE\n' + + 'UyBldS13ZXN0LTMgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+\n' + + 'xmlEC/3a4cJH+UPwXCE02lC7Zq5NHd0dn6peMeLN8agb6jW4VfSY0NydjRj2DJZ8\n' + + 'K7wV6sub5NUGT1NuFmvSmdbNR2T59KX0p2dVvxmXHHtIpQ9Y8Aq3ZfhmC5q5Bqgw\n' + + 'tMA1xayDi7HmoPX3R8kk9ktAZQf6lDeksCvok8idjTu9tiSpDiMwds5BjMsWfyjZ\n' + + 'd13PTGGNHYVdP692BSyXzSP1Vj84nJKnciW8tAqwIiadreJt5oXyrCXi8ekUMs80\n' + + 'cUTuGm3aA3Q7PB5ljJMPqz0eVddaiIvmTJ9O3Ez3Du/HpImyMzXjkFaf+oNXf/Hx\n' + + '/EW5jCRR6vEiXJcDRDS7AgMBAAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB\n' + + 'Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRZ9mRtS5fHk3ZKhG20Oack4cAqMTAfBgNV\n' + + 'HSMEGDAWgBROAu6sPvYVyEztLPUFwY+chAhJgzANBgkqhkiG9w0BAQsFAAOCAQEA\n' + + 'F/u/9L6ExQwD73F/bhCw7PWcwwqsK1mypIdrjdIsu0JSgwWwGCXmrIspA3n3Dqxq\n' + + 'sMhAJD88s9Em7337t+naar2VyLO63MGwjj+vA4mtvQRKq8ScIpiEc7xN6g8HUMsd\n' + + 'gPG9lBGfNjuAZsrGJflrko4HyuSM7zHExMjXLH+CXcv/m3lWOZwnIvlVMa4x0Tz0\n' + + 'A4fklaawryngzeEjuW6zOiYCzjZtPlP8Fw0SpzppJ8VpQfrZ751RDo4yudmPqoPK\n' + + '5EUe36L8U+oYBXnC5TlYs9bpVv9o5wJQI5qA9oQE2eFWxF1E0AyZ4V5sgGUBStaX\n' + + 'BjDDWul0wSo7rt1Tq7XpnA==\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS ap-northeast-3 certificate CA 2017 to 2020 + * + * CN = Amazon RDS ap-northeast-3 CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2017-12-01T00:55:42Z/2020-03-05T00:55:42Z + * F = C0:C7:D4:B3:91:40:A0:77:43:28:BF:AF:77:57:DF:FD:98:FB:10:3F + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEATCCAumgAwIBAgIBTjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCVVMx\n' + + 'EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoM\n' + + 'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' + + 'GzAZBgNVBAMMEkFtYXpvbiBSRFMgUm9vdCBDQTAeFw0xNzEyMDEwMDU1NDJaFw0y\n' + + 'MDAzMDUwMDU1NDJaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n' + + 'bjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' + + 'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJE\n' + + 'UyBhcC1ub3J0aGVhc3QtMyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\n' + + 'ggEBAMZtQNnm/XT19mTa10ftHLzg5UhajoI65JHv4TQNdGXdsv+CQdGYU49BJ9Eu\n' + + '3bYgiEtTzR2lQe9zGMvtuJobLhOWuavzp7IixoIQcHkFHN6wJ1CvqrxgvJfBq6Hy\n' + + 'EuCDCiU+PPDLUNA6XM6Qx3IpHd1wrJkjRB80dhmMSpxmRmx849uFafhN+P1QybsM\n' + + 'TI0o48VON2+vj+mNuQTyLMMP8D4odSQHjaoG+zyJfJGZeAyqQyoOUOFEyQaHC3TT\n' + + '3IDSNCQlpxb9LerbCoKu79WFBBq3CS5cYpg8/fsnV2CniRBFFUumBt5z4dhw9RJU\n' + + 'qlUXXO1ZyzpGd+c5v6FtrfXtnIUCAwEAAaNmMGQwDgYDVR0PAQH/BAQDAgEGMBIG\n' + + 'A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFETv7ELNplYy/xTeIOInl6nzeiHg\n' + + 'MB8GA1UdIwQYMBaAFE4C7qw+9hXITO0s9QXBj5yECEmDMA0GCSqGSIb3DQEBBQUA\n' + + 'A4IBAQCpKxOQcd0tEKb3OtsOY8q/MPwTyustGk2Rt7t9G68idADp8IytB7M0SDRo\n' + + 'wWZqynEq7orQVKdVOanhEWksNDzGp0+FPAf/KpVvdYCd7ru3+iI+V4ZEp2JFdjuZ\n' + + 'Zz0PIjS6AgsZqE5Ri1J+NmfmjGZCPhsHnGZiBaenX6K5VRwwwmLN6xtoqrrfR5zL\n' + + 'QfBeeZNJG6KiM3R/DxJ5rAa6Fz+acrhJ60L7HprhB7SFtj1RCijau3+ZwiGmUOMr\n' + + 'yKlMv+VgmzSw7o4Hbxy1WVrA6zQsTHHSGf+vkQn2PHvnFMUEu/ZLbTDYFNmTLK91\n' + + 'K6o4nMsEvhBKgo4z7H1EqqxXhvN2\n' + + '-----END CERTIFICATE-----\n', + + /** + * Amazon RDS GovCloud Root CA 2017 to 2022 + * + * CN = Amazon RDS GovCloud Root CA + * OU = Amazon RDS + * O = Amazon Web Services, Inc. + * L = Seattle + * ST = Washington + * C = US + * P = 2017-05-19T22:29:11Z/2022-05-18T22:29:11Z + * F = A3:61:F9:C9:A2:5B:91:FE:73:A6:52:E3:59:14:8E:CE:35:12:0F:FD + */ + '-----BEGIN CERTIFICATE-----\n' + + 'MIIEDjCCAvagAwIBAgIJAMM61RQn3/kdMA0GCSqGSIb3DQEBCwUAMIGTMQswCQYD\n' + + 'VQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\n' + + 'MCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\n' + + 'em9uIFJEUzEkMCIGA1UEAwwbQW1hem9uIFJEUyBHb3ZDbG91ZCBSb290IENBMB4X\n' + + 'DTE3MDUxOTIyMjkxMVoXDTIyMDUxODIyMjkxMVowgZMxCzAJBgNVBAYTAlVTMRAw\n' + + 'DgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQKDBlB\n' + + 'bWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMSQw\n' + + 'IgYDVQQDDBtBbWF6b24gUkRTIEdvdkNsb3VkIFJvb3QgQ0EwggEiMA0GCSqGSIb3\n' + + 'DQEBAQUAA4IBDwAwggEKAoIBAQDGS9bh1FGiJPT+GRb3C5aKypJVDC1H2gbh6n3u\n' + + 'j8cUiyMXfmm+ak402zdLpSYMaxiQ7oL/B3wEmumIpRDAsQrSp3B/qEeY7ipQGOfh\n' + + 'q2TXjXGIUjiJ/FaoGqkymHRLG+XkNNBtb7MRItsjlMVNELXECwSiMa3nJL2/YyHW\n' + + 'nTr1+11/weeZEKgVbCUrOugFkMXnfZIBSn40j6EnRlO2u/NFU5ksK5ak2+j8raZ7\n' + + 'xW7VXp9S1Tgf1IsWHjGZZZguwCkkh1tHOlHC9gVA3p63WecjrIzcrR/V27atul4m\n' + + 'tn56s5NwFvYPUIx1dbC8IajLUrepVm6XOwdQCfd02DmOyjWJAgMBAAGjYzBhMA4G\n' + + 'A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRJEM+kuDUu\n' + + 'ZTmCnA4wUrgnFaXc4zAfBgNVHSMEGDAWgBRJEM+kuDUuZTmCnA4wUrgnFaXc4zAN\n' + + 'BgkqhkiG9w0BAQsFAAOCAQEAcfA7uirXsNZyI2j4AJFVtOTKOZlQwqbyNducnmlg\n' + + '/5nug9fAkwM4AgvF5bBOD1Hw6khdsccMwIj+1S7wpL+EYb/nSc8G0qe1p/9lZ/mZ\n' + + 'ff5g4JOa26lLuCrZDqAk4TzYnt6sQKfa5ZXVUUn0BK3okhiXS0i+NloMyaBCL7vk\n' + + 'kDwkHwEqflRKfZ9/oFTcCfoiHPA7AdBtaPVr0/Kj9L7k+ouz122huqG5KqX0Zpo8\n' + + 'S0IGvcd2FZjNSNPttNAK7YuBVsZ0m2nIH1SLp//00v7yAHIgytQwwB17PBcp4NXD\n' + + 'pCfTa27ng9mMMC2YLqWQpW4TkqjDin2ZC+5X/mbrjzTvVg==\n' + + '-----END CERTIFICATE-----\n' + ] +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/constants/types.js b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/types.js new file mode 100644 index 0000000..19943e8 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/constants/types.js @@ -0,0 +1,33 @@ +// Manually extracted from mysql-5.7.9/include/mysql.h.pp +// some more info here: http://dev.mysql.com/doc/refman/5.5/en/c-api-prepared-statement-type-codes.html +exports.DECIMAL = 0x00; // aka DECIMAL (http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html) +exports.TINY = 0x01; // aka TINYINT, 1 byte +exports.SHORT = 0x02; // aka SMALLINT, 2 bytes +exports.LONG = 0x03; // aka INT, 4 bytes +exports.FLOAT = 0x04; // aka FLOAT, 4-8 bytes +exports.DOUBLE = 0x05; // aka DOUBLE, 8 bytes +exports.NULL = 0x06; // NULL (used for prepared statements, I think) +exports.TIMESTAMP = 0x07; // aka TIMESTAMP +exports.LONGLONG = 0x08; // aka BIGINT, 8 bytes +exports.INT24 = 0x09; // aka MEDIUMINT, 3 bytes +exports.DATE = 0x0a; // aka DATE +exports.TIME = 0x0b; // aka TIME +exports.DATETIME = 0x0c; // aka DATETIME +exports.YEAR = 0x0d; // aka YEAR, 1 byte (don't ask) +exports.NEWDATE = 0x0e; // aka ? +exports.VARCHAR = 0x0f; // aka VARCHAR (?) +exports.BIT = 0x10; // aka BIT, 1-8 byte +exports.TIMESTAMP2 = 0x11; // aka TIMESTAMP with fractional seconds +exports.DATETIME2 = 0x12; // aka DATETIME with fractional seconds +exports.TIME2 = 0x13; // aka TIME with fractional seconds +exports.JSON = 0xf5; // aka JSON +exports.NEWDECIMAL = 0xf6; // aka DECIMAL +exports.ENUM = 0xf7; // aka ENUM +exports.SET = 0xf8; // aka SET +exports.TINY_BLOB = 0xf9; // aka TINYBLOB, TINYTEXT +exports.MEDIUM_BLOB = 0xfa; // aka MEDIUMBLOB, MEDIUMTEXT +exports.LONG_BLOB = 0xfb; // aka LONGBLOG, LONGTEXT +exports.BLOB = 0xfc; // aka BLOB, TEXT +exports.VAR_STRING = 0xfd; // aka VARCHAR, VARBINARY +exports.STRING = 0xfe; // aka CHAR, BINARY +exports.GEOMETRY = 0xff; // aka GEOMETRY diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/AuthSwitchRequestPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/AuthSwitchRequestPacket.js new file mode 100644 index 0000000..c74e6ec --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/AuthSwitchRequestPacket.js @@ -0,0 +1,20 @@ +module.exports = AuthSwitchRequestPacket; +function AuthSwitchRequestPacket(options) { + options = options || {}; + + this.status = 0xfe; + this.authMethodName = options.authMethodName; + this.authMethodData = options.authMethodData; +} + +AuthSwitchRequestPacket.prototype.parse = function parse(parser) { + this.status = parser.parseUnsignedNumber(1); + this.authMethodName = parser.parseNullTerminatedString(); + this.authMethodData = parser.parsePacketTerminatedBuffer(); +}; + +AuthSwitchRequestPacket.prototype.write = function write(writer) { + writer.writeUnsignedNumber(1, this.status); + writer.writeNullTerminatedString(this.authMethodName); + writer.writeBuffer(this.authMethodData); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/AuthSwitchResponsePacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/AuthSwitchResponsePacket.js new file mode 100644 index 0000000..488abbd --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/AuthSwitchResponsePacket.js @@ -0,0 +1,14 @@ +module.exports = AuthSwitchResponsePacket; +function AuthSwitchResponsePacket(options) { + options = options || {}; + + this.data = options.data; +} + +AuthSwitchResponsePacket.prototype.parse = function parse(parser) { + this.data = parser.parsePacketTerminatedBuffer(); +}; + +AuthSwitchResponsePacket.prototype.write = function write(writer) { + writer.writeBuffer(this.data); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ClientAuthenticationPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ClientAuthenticationPacket.js new file mode 100644 index 0000000..595db77 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ClientAuthenticationPacket.js @@ -0,0 +1,54 @@ +var Buffer = require('safe-buffer').Buffer; + +module.exports = ClientAuthenticationPacket; +function ClientAuthenticationPacket(options) { + options = options || {}; + + this.clientFlags = options.clientFlags; + this.maxPacketSize = options.maxPacketSize; + this.charsetNumber = options.charsetNumber; + this.filler = undefined; + this.user = options.user; + this.scrambleBuff = options.scrambleBuff; + this.database = options.database; + this.protocol41 = options.protocol41; +} + +ClientAuthenticationPacket.prototype.parse = function(parser) { + if (this.protocol41) { + this.clientFlags = parser.parseUnsignedNumber(4); + this.maxPacketSize = parser.parseUnsignedNumber(4); + this.charsetNumber = parser.parseUnsignedNumber(1); + this.filler = parser.parseFiller(23); + this.user = parser.parseNullTerminatedString(); + this.scrambleBuff = parser.parseLengthCodedBuffer(); + this.database = parser.parseNullTerminatedString(); + } else { + this.clientFlags = parser.parseUnsignedNumber(2); + this.maxPacketSize = parser.parseUnsignedNumber(3); + this.user = parser.parseNullTerminatedString(); + this.scrambleBuff = parser.parseBuffer(8); + this.database = parser.parseLengthCodedBuffer(); + } +}; + +ClientAuthenticationPacket.prototype.write = function(writer) { + if (this.protocol41) { + writer.writeUnsignedNumber(4, this.clientFlags); + writer.writeUnsignedNumber(4, this.maxPacketSize); + writer.writeUnsignedNumber(1, this.charsetNumber); + writer.writeFiller(23); + writer.writeNullTerminatedString(this.user); + writer.writeLengthCodedBuffer(this.scrambleBuff); + writer.writeNullTerminatedString(this.database); + } else { + writer.writeUnsignedNumber(2, this.clientFlags); + writer.writeUnsignedNumber(3, this.maxPacketSize); + writer.writeNullTerminatedString(this.user); + writer.writeBuffer(this.scrambleBuff); + if (this.database && this.database.length) { + writer.writeFiller(1); + writer.writeBuffer(Buffer.from(this.database)); + } + } +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComChangeUserPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComChangeUserPacket.js new file mode 100644 index 0000000..3278842 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComChangeUserPacket.js @@ -0,0 +1,26 @@ +module.exports = ComChangeUserPacket; +function ComChangeUserPacket(options) { + options = options || {}; + + this.command = 0x11; + this.user = options.user; + this.scrambleBuff = options.scrambleBuff; + this.database = options.database; + this.charsetNumber = options.charsetNumber; +} + +ComChangeUserPacket.prototype.parse = function(parser) { + this.command = parser.parseUnsignedNumber(1); + this.user = parser.parseNullTerminatedString(); + this.scrambleBuff = parser.parseLengthCodedBuffer(); + this.database = parser.parseNullTerminatedString(); + this.charsetNumber = parser.parseUnsignedNumber(1); +}; + +ComChangeUserPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.command); + writer.writeNullTerminatedString(this.user); + writer.writeLengthCodedBuffer(this.scrambleBuff); + writer.writeNullTerminatedString(this.database); + writer.writeUnsignedNumber(2, this.charsetNumber); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComPingPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComPingPacket.js new file mode 100644 index 0000000..dd332c9 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComPingPacket.js @@ -0,0 +1,12 @@ +module.exports = ComPingPacket; +function ComPingPacket() { + this.command = 0x0e; +} + +ComPingPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.command); +}; + +ComPingPacket.prototype.parse = function(parser) { + this.command = parser.parseUnsignedNumber(1); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComQueryPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComQueryPacket.js new file mode 100644 index 0000000..7ac191f --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComQueryPacket.js @@ -0,0 +1,15 @@ +module.exports = ComQueryPacket; +function ComQueryPacket(sql) { + this.command = 0x03; + this.sql = sql; +} + +ComQueryPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.command); + writer.writeString(this.sql); +}; + +ComQueryPacket.prototype.parse = function(parser) { + this.command = parser.parseUnsignedNumber(1); + this.sql = parser.parsePacketTerminatedString(); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComQuitPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComQuitPacket.js new file mode 100644 index 0000000..1104061 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComQuitPacket.js @@ -0,0 +1,12 @@ +module.exports = ComQuitPacket; +function ComQuitPacket() { + this.command = 0x01; +} + +ComQuitPacket.prototype.parse = function parse(parser) { + this.command = parser.parseUnsignedNumber(1); +}; + +ComQuitPacket.prototype.write = function write(writer) { + writer.writeUnsignedNumber(1, this.command); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComStatisticsPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComStatisticsPacket.js new file mode 100644 index 0000000..5e3913e --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ComStatisticsPacket.js @@ -0,0 +1,12 @@ +module.exports = ComStatisticsPacket; +function ComStatisticsPacket() { + this.command = 0x09; +} + +ComStatisticsPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.command); +}; + +ComStatisticsPacket.prototype.parse = function(parser) { + this.command = parser.parseUnsignedNumber(1); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/EmptyPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/EmptyPacket.js new file mode 100644 index 0000000..3d34106 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/EmptyPacket.js @@ -0,0 +1,6 @@ +module.exports = EmptyPacket; +function EmptyPacket() { +} + +EmptyPacket.prototype.write = function write() { +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/EofPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/EofPacket.js new file mode 100644 index 0000000..b80ca5e --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/EofPacket.js @@ -0,0 +1,25 @@ +module.exports = EofPacket; +function EofPacket(options) { + options = options || {}; + + this.fieldCount = undefined; + this.warningCount = options.warningCount; + this.serverStatus = options.serverStatus; + this.protocol41 = options.protocol41; +} + +EofPacket.prototype.parse = function(parser) { + this.fieldCount = parser.parseUnsignedNumber(1); + if (this.protocol41) { + this.warningCount = parser.parseUnsignedNumber(2); + this.serverStatus = parser.parseUnsignedNumber(2); + } +}; + +EofPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, 0xfe); + if (this.protocol41) { + writer.writeUnsignedNumber(2, this.warningCount); + writer.writeUnsignedNumber(2, this.serverStatus); + } +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ErrorPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ErrorPacket.js new file mode 100644 index 0000000..e03de00 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ErrorPacket.js @@ -0,0 +1,35 @@ +module.exports = ErrorPacket; +function ErrorPacket(options) { + options = options || {}; + + this.fieldCount = options.fieldCount; + this.errno = options.errno; + this.sqlStateMarker = options.sqlStateMarker; + this.sqlState = options.sqlState; + this.message = options.message; +} + +ErrorPacket.prototype.parse = function(parser) { + this.fieldCount = parser.parseUnsignedNumber(1); + this.errno = parser.parseUnsignedNumber(2); + + // sqlStateMarker ('#' = 0x23) indicates error packet format + if (parser.peak() === 0x23) { + this.sqlStateMarker = parser.parseString(1); + this.sqlState = parser.parseString(5); + } + + this.message = parser.parsePacketTerminatedString(); +}; + +ErrorPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, 0xff); + writer.writeUnsignedNumber(2, this.errno); + + if (this.sqlStateMarker) { + writer.writeString(this.sqlStateMarker); + writer.writeString(this.sqlState); + } + + writer.writeString(this.message); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/Field.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/Field.js new file mode 100644 index 0000000..bb6336c --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/Field.js @@ -0,0 +1,34 @@ +var Types = require('../constants/types'); + +module.exports = Field; +function Field(options) { + options = options || {}; + + this.parser = options.parser; + this.packet = options.packet; + this.db = options.packet.db; + this.table = options.packet.table; + this.name = options.packet.name; + this.type = typeToString(options.packet.type); + this.length = options.packet.length; +} + +Field.prototype.string = function () { + return this.parser.parseLengthCodedString(); +}; + +Field.prototype.buffer = function () { + return this.parser.parseLengthCodedBuffer(); +}; + +Field.prototype.geometry = function () { + return this.parser.parseGeometryValue(); +}; + +function typeToString(t) { + for (var k in Types) { + if (Types[k] === t) return k; + } + + return undefined; +} diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/FieldPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/FieldPacket.js new file mode 100644 index 0000000..12cfed1 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/FieldPacket.js @@ -0,0 +1,93 @@ +module.exports = FieldPacket; +function FieldPacket(options) { + options = options || {}; + + this.catalog = options.catalog; + this.db = options.db; + this.table = options.table; + this.orgTable = options.orgTable; + this.name = options.name; + this.orgName = options.orgName; + this.charsetNr = options.charsetNr; + this.length = options.length; + this.type = options.type; + this.flags = options.flags; + this.decimals = options.decimals; + this.default = options.default; + this.zeroFill = options.zeroFill; + this.protocol41 = options.protocol41; +} + +FieldPacket.prototype.parse = function(parser) { + if (this.protocol41) { + this.catalog = parser.parseLengthCodedString(); + this.db = parser.parseLengthCodedString(); + this.table = parser.parseLengthCodedString(); + this.orgTable = parser.parseLengthCodedString(); + this.name = parser.parseLengthCodedString(); + this.orgName = parser.parseLengthCodedString(); + + if (parser.parseLengthCodedNumber() !== 0x0c) { + var err = new TypeError('Received invalid field length'); + err.code = 'PARSER_INVALID_FIELD_LENGTH'; + throw err; + } + + this.charsetNr = parser.parseUnsignedNumber(2); + this.length = parser.parseUnsignedNumber(4); + this.type = parser.parseUnsignedNumber(1); + this.flags = parser.parseUnsignedNumber(2); + this.decimals = parser.parseUnsignedNumber(1); + + var filler = parser.parseBuffer(2); + if (filler[0] !== 0x0 || filler[1] !== 0x0) { + var err = new TypeError('Received invalid filler'); + err.code = 'PARSER_INVALID_FILLER'; + throw err; + } + + // parsed flags + this.zeroFill = (this.flags & 0x0040 ? true : false); + + if (parser.reachedPacketEnd()) { + return; + } + + this.default = parser.parseLengthCodedString(); + } else { + this.table = parser.parseLengthCodedString(); + this.name = parser.parseLengthCodedString(); + this.length = parser.parseUnsignedNumber(parser.parseUnsignedNumber(1)); + this.type = parser.parseUnsignedNumber(parser.parseUnsignedNumber(1)); + } +}; + +FieldPacket.prototype.write = function(writer) { + if (this.protocol41) { + writer.writeLengthCodedString(this.catalog); + writer.writeLengthCodedString(this.db); + writer.writeLengthCodedString(this.table); + writer.writeLengthCodedString(this.orgTable); + writer.writeLengthCodedString(this.name); + writer.writeLengthCodedString(this.orgName); + + writer.writeLengthCodedNumber(0x0c); + writer.writeUnsignedNumber(2, this.charsetNr || 0); + writer.writeUnsignedNumber(4, this.length || 0); + writer.writeUnsignedNumber(1, this.type || 0); + writer.writeUnsignedNumber(2, this.flags || 0); + writer.writeUnsignedNumber(1, this.decimals || 0); + writer.writeFiller(2); + + if (this.default !== undefined) { + writer.writeLengthCodedString(this.default); + } + } else { + writer.writeLengthCodedString(this.table); + writer.writeLengthCodedString(this.name); + writer.writeUnsignedNumber(1, 0x01); + writer.writeUnsignedNumber(1, this.length); + writer.writeUnsignedNumber(1, 0x01); + writer.writeUnsignedNumber(1, this.type); + } +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/HandshakeInitializationPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/HandshakeInitializationPacket.js new file mode 100644 index 0000000..b251063 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/HandshakeInitializationPacket.js @@ -0,0 +1,103 @@ +var Buffer = require('safe-buffer').Buffer; +var Client = require('../constants/client'); + +module.exports = HandshakeInitializationPacket; +function HandshakeInitializationPacket(options) { + options = options || {}; + + this.protocolVersion = options.protocolVersion; + this.serverVersion = options.serverVersion; + this.threadId = options.threadId; + this.scrambleBuff1 = options.scrambleBuff1; + this.filler1 = options.filler1; + this.serverCapabilities1 = options.serverCapabilities1; + this.serverLanguage = options.serverLanguage; + this.serverStatus = options.serverStatus; + this.serverCapabilities2 = options.serverCapabilities2; + this.scrambleLength = options.scrambleLength; + this.filler2 = options.filler2; + this.scrambleBuff2 = options.scrambleBuff2; + this.filler3 = options.filler3; + this.pluginData = options.pluginData; + this.protocol41 = options.protocol41; + + if (this.protocol41) { + // force set the bit in serverCapabilities1 + this.serverCapabilities1 |= Client.CLIENT_PROTOCOL_41; + } +} + +HandshakeInitializationPacket.prototype.parse = function(parser) { + this.protocolVersion = parser.parseUnsignedNumber(1); + this.serverVersion = parser.parseNullTerminatedString(); + this.threadId = parser.parseUnsignedNumber(4); + this.scrambleBuff1 = parser.parseBuffer(8); + this.filler1 = parser.parseFiller(1); + this.serverCapabilities1 = parser.parseUnsignedNumber(2); + this.serverLanguage = parser.parseUnsignedNumber(1); + this.serverStatus = parser.parseUnsignedNumber(2); + + this.protocol41 = (this.serverCapabilities1 & (1 << 9)) > 0; + + if (this.protocol41) { + this.serverCapabilities2 = parser.parseUnsignedNumber(2); + this.scrambleLength = parser.parseUnsignedNumber(1); + this.filler2 = parser.parseFiller(10); + // scrambleBuff2 should be 0x00 terminated, but sphinx does not do this + // so we assume scrambleBuff2 to be 12 byte and treat the next byte as a + // filler byte. + this.scrambleBuff2 = parser.parseBuffer(12); + this.filler3 = parser.parseFiller(1); + } else { + this.filler2 = parser.parseFiller(13); + } + + if (parser.reachedPacketEnd()) { + return; + } + + // According to the docs this should be 0x00 terminated, but MariaDB does + // not do this, so we assume this string to be packet terminated. + this.pluginData = parser.parsePacketTerminatedString(); + + // However, if there is a trailing '\0', strip it + var lastChar = this.pluginData.length - 1; + if (this.pluginData[lastChar] === '\0') { + this.pluginData = this.pluginData.substr(0, lastChar); + } +}; + +HandshakeInitializationPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.protocolVersion); + writer.writeNullTerminatedString(this.serverVersion); + writer.writeUnsignedNumber(4, this.threadId); + writer.writeBuffer(this.scrambleBuff1); + writer.writeFiller(1); + writer.writeUnsignedNumber(2, this.serverCapabilities1); + writer.writeUnsignedNumber(1, this.serverLanguage); + writer.writeUnsignedNumber(2, this.serverStatus); + if (this.protocol41) { + writer.writeUnsignedNumber(2, this.serverCapabilities2); + writer.writeUnsignedNumber(1, this.scrambleLength); + writer.writeFiller(10); + } + writer.writeNullTerminatedBuffer(this.scrambleBuff2); + + if (this.pluginData !== undefined) { + writer.writeNullTerminatedString(this.pluginData); + } +}; + +HandshakeInitializationPacket.prototype.scrambleBuff = function() { + var buffer = null; + + if (typeof this.scrambleBuff2 === 'undefined') { + buffer = Buffer.from(this.scrambleBuff1); + } else { + buffer = Buffer.allocUnsafe(this.scrambleBuff1.length + this.scrambleBuff2.length); + this.scrambleBuff1.copy(buffer, 0); + this.scrambleBuff2.copy(buffer, this.scrambleBuff1.length); + } + + return buffer; +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/LocalDataFilePacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/LocalDataFilePacket.js new file mode 100644 index 0000000..af7aaa0 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/LocalDataFilePacket.js @@ -0,0 +1,15 @@ +module.exports = LocalDataFilePacket; + +/** + * Create a new LocalDataFilePacket + * @constructor + * @param {Buffer} data The data contents of the packet + * @public + */ +function LocalDataFilePacket(data) { + this.data = data; +} + +LocalDataFilePacket.prototype.write = function(writer) { + writer.writeBuffer(this.data); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/OkPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/OkPacket.js new file mode 100644 index 0000000..7caf3b0 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/OkPacket.js @@ -0,0 +1,44 @@ + +// Language-neutral expression to match ER_UPDATE_INFO +var ER_UPDATE_INFO_REGEXP = /^[^:0-9]+: [0-9]+[^:0-9]+: ([0-9]+)[^:0-9]+: [0-9]+[^:0-9]*$/; + +module.exports = OkPacket; +function OkPacket(options) { + options = options || {}; + + this.fieldCount = undefined; + this.affectedRows = undefined; + this.insertId = undefined; + this.serverStatus = undefined; + this.warningCount = undefined; + this.message = undefined; + this.protocol41 = options.protocol41; +} + +OkPacket.prototype.parse = function(parser) { + this.fieldCount = parser.parseUnsignedNumber(1); + this.affectedRows = parser.parseLengthCodedNumber(); + this.insertId = parser.parseLengthCodedNumber(); + if (this.protocol41) { + this.serverStatus = parser.parseUnsignedNumber(2); + this.warningCount = parser.parseUnsignedNumber(2); + } + this.message = parser.parsePacketTerminatedString(); + this.changedRows = 0; + + var m = ER_UPDATE_INFO_REGEXP.exec(this.message); + if (m !== null) { + this.changedRows = parseInt(m[1], 10); + } +}; + +OkPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, 0x00); + writer.writeLengthCodedNumber(this.affectedRows || 0); + writer.writeLengthCodedNumber(this.insertId || 0); + if (this.protocol41) { + writer.writeUnsignedNumber(2, this.serverStatus || 0); + writer.writeUnsignedNumber(2, this.warningCount || 0); + } + writer.writeString(this.message); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/OldPasswordPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/OldPasswordPacket.js new file mode 100644 index 0000000..1ff78ec --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/OldPasswordPacket.js @@ -0,0 +1,15 @@ +module.exports = OldPasswordPacket; +function OldPasswordPacket(options) { + options = options || {}; + + this.scrambleBuff = options.scrambleBuff; +} + +OldPasswordPacket.prototype.parse = function(parser) { + this.scrambleBuff = parser.parseNullTerminatedBuffer(); +}; + +OldPasswordPacket.prototype.write = function(writer) { + writer.writeBuffer(this.scrambleBuff); + writer.writeFiller(1); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ResultSetHeaderPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ResultSetHeaderPacket.js new file mode 100644 index 0000000..25b8002 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/ResultSetHeaderPacket.js @@ -0,0 +1,25 @@ +module.exports = ResultSetHeaderPacket; +function ResultSetHeaderPacket(options) { + options = options || {}; + + this.fieldCount = options.fieldCount; + this.extra = options.extra; +} + +ResultSetHeaderPacket.prototype.parse = function(parser) { + this.fieldCount = parser.parseLengthCodedNumber(); + + if (parser.reachedPacketEnd()) return; + + this.extra = (this.fieldCount === null) + ? parser.parsePacketTerminatedString() + : parser.parseLengthCodedNumber(); +}; + +ResultSetHeaderPacket.prototype.write = function(writer) { + writer.writeLengthCodedNumber(this.fieldCount); + + if (this.extra !== undefined) { + writer.writeLengthCodedNumber(this.extra); + } +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/RowDataPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/RowDataPacket.js new file mode 100644 index 0000000..8313f87 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/RowDataPacket.js @@ -0,0 +1,133 @@ +var Types = require('../constants/types'); +var Charsets = require('../constants/charsets'); +var Field = require('./Field'); +var IEEE_754_BINARY_64_PRECISION = Math.pow(2, 53); + +module.exports = RowDataPacket; +function RowDataPacket() { +} + +Object.defineProperty(RowDataPacket.prototype, 'parse', { + configurable : true, + enumerable : false, + value : parse +}); + +Object.defineProperty(RowDataPacket.prototype, '_typeCast', { + configurable : true, + enumerable : false, + value : typeCast +}); + +function parse(parser, fieldPackets, typeCast, nestTables, connection) { + var self = this; + var next = function () { + return self._typeCast(fieldPacket, parser, connection.config.timezone, connection.config.supportBigNumbers, connection.config.bigNumberStrings, connection.config.dateStrings); + }; + + for (var i = 0; i < fieldPackets.length; i++) { + var fieldPacket = fieldPackets[i]; + var value; + + if (typeof typeCast === 'function') { + value = typeCast.apply(connection, [ new Field({ packet: fieldPacket, parser: parser }), next ]); + } else { + value = (typeCast) + ? this._typeCast(fieldPacket, parser, connection.config.timezone, connection.config.supportBigNumbers, connection.config.bigNumberStrings, connection.config.dateStrings) + : ( (fieldPacket.charsetNr === Charsets.BINARY) + ? parser.parseLengthCodedBuffer() + : parser.parseLengthCodedString() ); + } + + if (typeof nestTables === 'string' && nestTables.length) { + this[fieldPacket.table + nestTables + fieldPacket.name] = value; + } else if (nestTables) { + this[fieldPacket.table] = this[fieldPacket.table] || {}; + this[fieldPacket.table][fieldPacket.name] = value; + } else { + this[fieldPacket.name] = value; + } + } +} + +function typeCast(field, parser, timeZone, supportBigNumbers, bigNumberStrings, dateStrings) { + var numberString; + + switch (field.type) { + case Types.TIMESTAMP: + case Types.TIMESTAMP2: + case Types.DATE: + case Types.DATETIME: + case Types.DATETIME2: + case Types.NEWDATE: + var dateString = parser.parseLengthCodedString(); + + if (typeMatch(field.type, dateStrings)) { + return dateString; + } + + if (dateString === null) { + return null; + } + + var originalString = dateString; + if (field.type === Types.DATE) { + dateString += ' 00:00:00'; + } + + if (timeZone !== 'local') { + dateString += ' ' + timeZone; + } + + var dt = new Date(dateString); + if (isNaN(dt.getTime())) { + return originalString; + } + + return dt; + case Types.TINY: + case Types.SHORT: + case Types.LONG: + case Types.INT24: + case Types.YEAR: + case Types.FLOAT: + case Types.DOUBLE: + numberString = parser.parseLengthCodedString(); + return (numberString === null || (field.zeroFill && numberString[0] === '0')) + ? numberString : Number(numberString); + case Types.NEWDECIMAL: + case Types.LONGLONG: + numberString = parser.parseLengthCodedString(); + return (numberString === null || (field.zeroFill && numberString[0] === '0')) + ? numberString + : ((supportBigNumbers && (bigNumberStrings || (Number(numberString) >= IEEE_754_BINARY_64_PRECISION) || Number(numberString) <= -IEEE_754_BINARY_64_PRECISION)) + ? numberString + : Number(numberString)); + case Types.BIT: + return parser.parseLengthCodedBuffer(); + case Types.STRING: + case Types.VAR_STRING: + case Types.TINY_BLOB: + case Types.MEDIUM_BLOB: + case Types.LONG_BLOB: + case Types.BLOB: + return (field.charsetNr === Charsets.BINARY) + ? parser.parseLengthCodedBuffer() + : parser.parseLengthCodedString(); + case Types.GEOMETRY: + return parser.parseGeometryValue(); + default: + return parser.parseLengthCodedString(); + } +} + +function typeMatch(type, list) { + if (Array.isArray(list)) { + for (var i = 0; i < list.length; i++) { + if (Types[list[i]] === type) return true; + } + return false; + } else { + return Boolean(list); + } +} diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/SSLRequestPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/SSLRequestPacket.js new file mode 100644 index 0000000..a57cfc1 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/SSLRequestPacket.js @@ -0,0 +1,27 @@ +// http://dev.mysql.com/doc/internals/en/ssl.html +// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest + +var ClientConstants = require('../constants/client'); + +module.exports = SSLRequestPacket; + +function SSLRequestPacket(options) { + options = options || {}; + this.clientFlags = options.clientFlags | ClientConstants.CLIENT_SSL; + this.maxPacketSize = options.maxPacketSize; + this.charsetNumber = options.charsetNumber; +} + +SSLRequestPacket.prototype.parse = function(parser) { + // TODO: check SSLRequest packet v41 vs pre v41 + this.clientFlags = parser.parseUnsignedNumber(4); + this.maxPacketSize = parser.parseUnsignedNumber(4); + this.charsetNumber = parser.parseUnsignedNumber(1); +}; + +SSLRequestPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(4, this.clientFlags); + writer.writeUnsignedNumber(4, this.maxPacketSize); + writer.writeUnsignedNumber(1, this.charsetNumber); + writer.writeFiller(23); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/StatisticsPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/StatisticsPacket.js new file mode 100644 index 0000000..5f70b3b --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/StatisticsPacket.js @@ -0,0 +1,20 @@ +module.exports = StatisticsPacket; +function StatisticsPacket() { + this.message = undefined; +} + +StatisticsPacket.prototype.parse = function(parser) { + this.message = parser.parsePacketTerminatedString(); + + var items = this.message.split(/\s\s/); + for (var i = 0; i < items.length; i++) { + var m = items[i].match(/^(.+)\:\s+(.+)$/); + if (m !== null) { + this[m[1].toLowerCase().replace(/\s/g, '_')] = Number(m[2]); + } + } +}; + +StatisticsPacket.prototype.write = function(writer) { + writer.writeString(this.message); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/UseOldPasswordPacket.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/UseOldPasswordPacket.js new file mode 100644 index 0000000..d73bf44 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/UseOldPasswordPacket.js @@ -0,0 +1,14 @@ +module.exports = UseOldPasswordPacket; +function UseOldPasswordPacket(options) { + options = options || {}; + + this.firstByte = options.firstByte || 0xfe; +} + +UseOldPasswordPacket.prototype.parse = function(parser) { + this.firstByte = parser.parseUnsignedNumber(1); +}; + +UseOldPasswordPacket.prototype.write = function(writer) { + writer.writeUnsignedNumber(1, this.firstByte); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/packets/index.js b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/index.js new file mode 100644 index 0000000..f36b87b --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/packets/index.js @@ -0,0 +1,22 @@ +exports.AuthSwitchRequestPacket = require('./AuthSwitchRequestPacket'); +exports.AuthSwitchResponsePacket = require('./AuthSwitchResponsePacket'); +exports.ClientAuthenticationPacket = require('./ClientAuthenticationPacket'); +exports.ComChangeUserPacket = require('./ComChangeUserPacket'); +exports.ComPingPacket = require('./ComPingPacket'); +exports.ComQueryPacket = require('./ComQueryPacket'); +exports.ComQuitPacket = require('./ComQuitPacket'); +exports.ComStatisticsPacket = require('./ComStatisticsPacket'); +exports.EmptyPacket = require('./EmptyPacket'); +exports.EofPacket = require('./EofPacket'); +exports.ErrorPacket = require('./ErrorPacket'); +exports.Field = require('./Field'); +exports.FieldPacket = require('./FieldPacket'); +exports.HandshakeInitializationPacket = require('./HandshakeInitializationPacket'); +exports.LocalDataFilePacket = require('./LocalDataFilePacket'); +exports.OkPacket = require('./OkPacket'); +exports.OldPasswordPacket = require('./OldPasswordPacket'); +exports.ResultSetHeaderPacket = require('./ResultSetHeaderPacket'); +exports.RowDataPacket = require('./RowDataPacket'); +exports.SSLRequestPacket = require('./SSLRequestPacket'); +exports.StatisticsPacket = require('./StatisticsPacket'); +exports.UseOldPasswordPacket = require('./UseOldPasswordPacket'); diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/ChangeUser.js b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/ChangeUser.js new file mode 100644 index 0000000..26be6db --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/ChangeUser.js @@ -0,0 +1,41 @@ +var Sequence = require('./Sequence'); +var Util = require('util'); +var Packets = require('../packets'); +var Auth = require('../Auth'); + +module.exports = ChangeUser; +Util.inherits(ChangeUser, Sequence); +function ChangeUser(options, callback) { + Sequence.call(this, options, callback); + + this._user = options.user; + this._password = options.password; + this._database = options.database; + this._charsetNumber = options.charsetNumber; + this._currentConfig = options.currentConfig; +} + +ChangeUser.prototype.start = function(handshakeInitializationPacket) { + var scrambleBuff = handshakeInitializationPacket.scrambleBuff(); + scrambleBuff = Auth.token(this._password, scrambleBuff); + + var packet = new Packets.ComChangeUserPacket({ + user : this._user, + scrambleBuff : scrambleBuff, + database : this._database, + charsetNumber : this._charsetNumber + }); + + this._currentConfig.user = this._user; + this._currentConfig.password = this._password; + this._currentConfig.database = this._database; + this._currentConfig.charsetNumber = this._charsetNumber; + + this.emit('packet', packet); +}; + +ChangeUser.prototype['ErrorPacket'] = function(packet) { + var err = this._packetToError(packet); + err.fatal = true; + this.end(err); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Handshake.js b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Handshake.js new file mode 100644 index 0000000..2881be8 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Handshake.js @@ -0,0 +1,127 @@ +var Sequence = require('./Sequence'); +var Util = require('util'); +var Packets = require('../packets'); +var Auth = require('../Auth'); +var ClientConstants = require('../constants/client'); + +module.exports = Handshake; +Util.inherits(Handshake, Sequence); +function Handshake(options, callback) { + Sequence.call(this, options, callback); + + options = options || {}; + + this._config = options.config; + this._handshakeInitializationPacket = null; +} + +Handshake.prototype.determinePacket = function determinePacket(firstByte, parser) { + if (firstByte === 0xff) { + return Packets.ErrorPacket; + } + + if (!this._handshakeInitializationPacket) { + return Packets.HandshakeInitializationPacket; + } + + if (firstByte === 0xfe) { + return (parser.packetLength() === 1) + ? Packets.UseOldPasswordPacket + : Packets.AuthSwitchRequestPacket; + } + + return undefined; +}; + +Handshake.prototype['AuthSwitchRequestPacket'] = function (packet) { + if (packet.authMethodName === 'mysql_native_password') { + var challenge = packet.authMethodData.slice(0, 20); + + this.emit('packet', new Packets.AuthSwitchResponsePacket({ + data: Auth.token(this._config.password, challenge) + })); + } else { + var err = new Error( + 'MySQL is requesting the ' + packet.authMethodName + ' authentication method, which is not supported.' + ); + + err.code = 'UNSUPPORTED_AUTH_METHOD'; + err.fatal = true; + + this.end(err); + } +}; + +Handshake.prototype['HandshakeInitializationPacket'] = function(packet) { + this._handshakeInitializationPacket = packet; + + this._config.protocol41 = packet.protocol41; + + var serverSSLSupport = packet.serverCapabilities1 & ClientConstants.CLIENT_SSL; + + if (this._config.ssl) { + if (!serverSSLSupport) { + var err = new Error('Server does not support secure connection'); + + err.code = 'HANDSHAKE_NO_SSL_SUPPORT'; + err.fatal = true; + + this.end(err); + return; + } + + this._config.clientFlags |= ClientConstants.CLIENT_SSL; + this.emit('packet', new Packets.SSLRequestPacket({ + clientFlags : this._config.clientFlags, + maxPacketSize : this._config.maxPacketSize, + charsetNumber : this._config.charsetNumber + })); + this.emit('start-tls'); + } else { + this._sendCredentials(); + } +}; + +Handshake.prototype._tlsUpgradeCompleteHandler = function() { + this._sendCredentials(); +}; + +Handshake.prototype._sendCredentials = function() { + var packet = this._handshakeInitializationPacket; + this.emit('packet', new Packets.ClientAuthenticationPacket({ + clientFlags : this._config.clientFlags, + maxPacketSize : this._config.maxPacketSize, + charsetNumber : this._config.charsetNumber, + user : this._config.user, + database : this._config.database, + protocol41 : packet.protocol41, + scrambleBuff : (packet.protocol41) + ? Auth.token(this._config.password, packet.scrambleBuff()) + : Auth.scramble323(packet.scrambleBuff(), this._config.password) + })); +}; + +Handshake.prototype['UseOldPasswordPacket'] = function() { + if (!this._config.insecureAuth) { + var err = new Error( + 'MySQL server is requesting the old and insecure pre-4.1 auth mechanism. ' + + 'Upgrade the user password or use the {insecureAuth: true} option.' + ); + + err.code = 'HANDSHAKE_INSECURE_AUTH'; + err.fatal = true; + + this.end(err); + return; + } + + this.emit('packet', new Packets.OldPasswordPacket({ + scrambleBuff: Auth.scramble323(this._handshakeInitializationPacket.scrambleBuff(), this._config.password) + })); +}; + +Handshake.prototype['ErrorPacket'] = function(packet) { + var err = this._packetToError(packet, true); + err.fatal = true; + this.end(err); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Ping.js b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Ping.js new file mode 100644 index 0000000..230f3c1 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Ping.js @@ -0,0 +1,19 @@ +var Sequence = require('./Sequence'); +var Util = require('util'); +var Packets = require('../packets'); + +module.exports = Ping; +Util.inherits(Ping, Sequence); + +function Ping(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + Sequence.call(this, options, callback); +} + +Ping.prototype.start = function() { + this.emit('packet', new Packets.ComPingPacket()); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Query.js b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Query.js new file mode 100644 index 0000000..dd340ab --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Query.js @@ -0,0 +1,218 @@ +var Sequence = require('./Sequence'); +var Util = require('util'); +var Packets = require('../packets'); +var ResultSet = require('../ResultSet'); +var ServerStatus = require('../constants/server_status'); +var fs = require('fs'); +var Readable = require('readable-stream'); + +module.exports = Query; +Util.inherits(Query, Sequence); +function Query(options, callback) { + Sequence.call(this, options, callback); + + this.sql = options.sql; + this.values = options.values; + this.typeCast = (options.typeCast === undefined) + ? true + : options.typeCast; + this.nestTables = options.nestTables || false; + + this._resultSet = null; + this._results = []; + this._fields = []; + this._index = 0; + this._loadError = null; +} + +Query.prototype.start = function() { + this.emit('packet', new Packets.ComQueryPacket(this.sql)); +}; + +Query.prototype.determinePacket = function determinePacket(byte, parser) { + var resultSet = this._resultSet; + + if (!resultSet) { + switch (byte) { + case 0x00: return Packets.OkPacket; + case 0xff: return Packets.ErrorPacket; + default: return Packets.ResultSetHeaderPacket; + } + } + + if (resultSet.eofPackets.length === 0) { + return (resultSet.fieldPackets.length < resultSet.resultSetHeaderPacket.fieldCount) + ? Packets.FieldPacket + : Packets.EofPacket; + } + + if (byte === 0xff) { + return Packets.ErrorPacket; + } + + if (byte === 0xfe && parser.packetLength() < 9) { + return Packets.EofPacket; + } + + return Packets.RowDataPacket; +}; + +Query.prototype['OkPacket'] = function(packet) { + // try...finally for exception safety + try { + if (!this._callback) { + this.emit('result', packet, this._index); + } else { + this._results.push(packet); + this._fields.push(undefined); + } + } finally { + this._index++; + this._resultSet = null; + this._handleFinalResultPacket(packet); + } +}; + +Query.prototype['ErrorPacket'] = function(packet) { + var err = this._packetToError(packet); + + var results = (this._results.length > 0) + ? this._results + : undefined; + + var fields = (this._fields.length > 0) + ? this._fields + : undefined; + + err.index = this._index; + err.sql = this.sql; + + this.end(err, results, fields); +}; + +Query.prototype['ResultSetHeaderPacket'] = function(packet) { + if (packet.fieldCount === null) { + this._sendLocalDataFile(packet.extra); + } else { + this._resultSet = new ResultSet(packet); + } +}; + +Query.prototype['FieldPacket'] = function(packet) { + this._resultSet.fieldPackets.push(packet); +}; + +Query.prototype['EofPacket'] = function(packet) { + this._resultSet.eofPackets.push(packet); + + if (this._resultSet.eofPackets.length === 1 && !this._callback) { + this.emit('fields', this._resultSet.fieldPackets, this._index); + } + + if (this._resultSet.eofPackets.length !== 2) { + return; + } + + if (this._callback) { + this._results.push(this._resultSet.rows); + this._fields.push(this._resultSet.fieldPackets); + } + + this._index++; + this._resultSet = null; + this._handleFinalResultPacket(packet); +}; + +Query.prototype._handleFinalResultPacket = function(packet) { + if (packet.serverStatus & ServerStatus.SERVER_MORE_RESULTS_EXISTS) { + return; + } + + var results = (this._results.length > 1) + ? this._results + : this._results[0]; + + var fields = (this._fields.length > 1) + ? this._fields + : this._fields[0]; + + this.end(this._loadError, results, fields); +}; + +Query.prototype['RowDataPacket'] = function(packet, parser, connection) { + packet.parse(parser, this._resultSet.fieldPackets, this.typeCast, this.nestTables, connection); + + if (this._callback) { + this._resultSet.rows.push(packet); + } else { + this.emit('result', packet, this._index); + } +}; + +Query.prototype._sendLocalDataFile = function(path) { + var self = this; + var localStream = fs.createReadStream(path, { + flag : 'r', + encoding : null, + autoClose : true + }); + + this.on('pause', function () { + localStream.pause(); + }); + + this.on('resume', function () { + localStream.resume(); + }); + + localStream.on('data', function (data) { + self.emit('packet', new Packets.LocalDataFilePacket(data)); + }); + + localStream.on('error', function (err) { + self._loadError = err; + localStream.emit('end'); + }); + + localStream.on('end', function () { + self.emit('packet', new Packets.EmptyPacket()); + }); +}; + +Query.prototype.stream = function(options) { + var self = this; + + options = options || {}; + options.objectMode = true; + + var stream = new Readable(options); + + stream._read = function() { + self._connection && self._connection.resume(); + }; + + stream.once('end', function() { + process.nextTick(function () { + stream.emit('close'); + }); + }); + + this.on('result', function(row, i) { + if (!stream.push(row)) self._connection.pause(); + stream.emit('result', row, i); // replicate old emitter + }); + + this.on('error', function(err) { + stream.emit('error', err); // Pass on any errors + }); + + this.on('end', function() { + stream.push(null); // pushing null, indicating EOF + }); + + this.on('fields', function(fields, i) { + stream.emit('fields', fields, i); // replicate old emitter + }); + + return stream; +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Quit.js b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Quit.js new file mode 100644 index 0000000..3c34c58 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Quit.js @@ -0,0 +1,40 @@ +var Sequence = require('./Sequence'); +var Util = require('util'); +var Packets = require('../packets'); + +module.exports = Quit; +Util.inherits(Quit, Sequence); +function Quit(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + Sequence.call(this, options, callback); + + this._started = false; +} + +Quit.prototype.end = function end(err) { + if (this._ended) { + return; + } + + if (!this._started) { + Sequence.prototype.end.call(this, err); + return; + } + + if (err && err.code === 'ECONNRESET' && err.syscall === 'read') { + // Ignore read errors after packet sent + Sequence.prototype.end.call(this); + return; + } + + Sequence.prototype.end.call(this, err); +}; + +Quit.prototype.start = function() { + this._started = true; + this.emit('packet', new Packets.ComQuitPacket()); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Sequence.js b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Sequence.js new file mode 100644 index 0000000..de82dc2 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Sequence.js @@ -0,0 +1,125 @@ +var Util = require('util'); +var EventEmitter = require('events').EventEmitter; +var Packets = require('../packets'); +var ErrorConstants = require('../constants/errors'); +var Timer = require('../Timer'); + +// istanbul ignore next: Node.js < 0.10 not covered +var listenerCount = EventEmitter.listenerCount + || function(emitter, type){ return emitter.listeners(type).length; }; + +var LONG_STACK_DELIMITER = '\n --------------------\n'; + +module.exports = Sequence; +Util.inherits(Sequence, EventEmitter); +function Sequence(options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + EventEmitter.call(this); + + options = options || {}; + + this._callback = callback; + this._callSite = null; + this._ended = false; + this._timeout = options.timeout; + this._timer = new Timer(this); +} + +Sequence.determinePacket = function(byte) { + switch (byte) { + case 0x00: return Packets.OkPacket; + case 0xfe: return Packets.EofPacket; + case 0xff: return Packets.ErrorPacket; + default: return undefined; + } +}; + +Sequence.prototype.hasErrorHandler = function() { + return Boolean(this._callback) || listenerCount(this, 'error') > 1; +}; + +Sequence.prototype._packetToError = function(packet) { + var code = ErrorConstants[packet.errno] || 'UNKNOWN_CODE_PLEASE_REPORT'; + var err = new Error(code + ': ' + packet.message); + err.code = code; + err.errno = packet.errno; + + err.sqlMessage = packet.message; + err.sqlState = packet.sqlState; + + return err; +}; + +Sequence.prototype.end = function(err) { + if (this._ended) { + return; + } + + this._ended = true; + + if (err) { + this._addLongStackTrace(err); + } + + // Without this we are leaking memory. This problem was introduced in + // 8189925374e7ce3819bbe88b64c7b15abac96b16. I suspect that the error object + // causes a cyclic reference that the GC does not detect properly, but I was + // unable to produce a standalone version of this leak. This would be a great + // challenge for somebody interested in difficult problems : )! + this._callSite = null; + + // try...finally for exception safety + try { + if (err) { + this.emit('error', err); + } + } finally { + try { + if (this._callback) { + this._callback.apply(this, arguments); + } + } finally { + this.emit('end'); + } + } +}; + +Sequence.prototype['OkPacket'] = function(packet) { + this.end(null, packet); +}; + +Sequence.prototype['ErrorPacket'] = function(packet) { + this.end(this._packetToError(packet)); +}; + +// Implemented by child classes +Sequence.prototype.start = function() {}; + +Sequence.prototype._addLongStackTrace = function _addLongStackTrace(err) { + var callSiteStack = this._callSite && this._callSite.stack; + + if (!callSiteStack || typeof callSiteStack !== 'string') { + // No recorded call site + return; + } + + if (err.stack.indexOf(LONG_STACK_DELIMITER) !== -1) { + // Error stack already looks long + return; + } + + var index = callSiteStack.indexOf('\n'); + + if (index !== -1) { + // Append recorded call site + err.stack += LONG_STACK_DELIMITER + callSiteStack.substr(index + 1); + } +}; + +Sequence.prototype._onTimeout = function _onTimeout() { + this.emit('timeout'); +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Statistics.js b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Statistics.js new file mode 100644 index 0000000..c75b5d9 --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/Statistics.js @@ -0,0 +1,30 @@ +var Sequence = require('./Sequence'); +var Util = require('util'); +var Packets = require('../packets'); + +module.exports = Statistics; +Util.inherits(Statistics, Sequence); +function Statistics(options, callback) { + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + Sequence.call(this, options, callback); +} + +Statistics.prototype.start = function() { + this.emit('packet', new Packets.ComStatisticsPacket()); +}; + +Statistics.prototype['StatisticsPacket'] = function (packet) { + this.end(null, packet); +}; + +Statistics.prototype.determinePacket = function determinePacket(firstByte) { + if (firstByte === 0x55) { + return Packets.StatisticsPacket; + } + + return undefined; +}; diff --git a/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/index.js b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/index.js new file mode 100644 index 0000000..0eae5ce --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/lib/protocol/sequences/index.js @@ -0,0 +1,7 @@ +exports.ChangeUser = require('./ChangeUser'); +exports.Handshake = require('./Handshake'); +exports.Ping = require('./Ping'); +exports.Query = require('./Query'); +exports.Quit = require('./Quit'); +exports.Sequence = require('./Sequence'); +exports.Statistics = require('./Statistics'); diff --git a/html/RentForCamp/node_modules/mysql/package.json b/html/RentForCamp/node_modules/mysql/package.json new file mode 100644 index 0000000..c6a9dbe --- /dev/null +++ b/html/RentForCamp/node_modules/mysql/package.json @@ -0,0 +1,150 @@ +{ + "_args": [ + [ + { + "raw": "mysql", + "scope": null, + "escapedName": "mysql", + "name": "mysql", + "rawSpec": "", + "spec": "latest", + "type": "tag" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp" + ] + ], + "_from": "mysql@latest", + "_id": "mysql@2.16.0", + "_inCache": true, + "_location": "/mysql", + "_nodeVersion": "8.11.3", + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/mysql_2.16.0_1531890486268_0.9096892717002003" + }, + "_npmUser": { + "name": "dougwilson", + "email": "doug@somethingdoug.com" + }, + "_npmVersion": "5.6.0", + "_phantomChildren": {}, + "_requested": { + "raw": "mysql", + "scope": null, + "escapedName": "mysql", + "name": "mysql", + "rawSpec": "", + "spec": "latest", + "type": "tag" + }, + "_requiredBy": [ + "#USER", + "/" + ], + "_resolved": "https://registry.npmjs.org/mysql/-/mysql-2.16.0.tgz", + "_shasum": "b23b22ab5de44fc2d5d32bd4f5af6653fc45e2ba", + "_shrinkwrap": null, + "_spec": "mysql", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp", + "author": { + "name": "Felix Geisendörfer", + "email": "felix@debuggable.com", + "url": "http://debuggable.com/" + }, + "bugs": { + "url": "https://github.com/mysqljs/mysql/issues" + }, + "contributors": [ + { + "name": "Andrey Sidorov", + "email": "sidorares@yandex.ru" + }, + { + "name": "Bradley Grainger", + "email": "bgrainger@gmail.com" + }, + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "Diogo Resende", + "email": "dresende@thinkdigital.pt" + }, + { + "name": "Nathan Woltman", + "email": "nwoltman@outlook.com" + } + ], + "dependencies": { + "bignumber.js": "4.1.0", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "description": "A node.js driver for mysql. It is written in JavaScript, does not require compiling, and is 100% MIT licensed.", + "devDependencies": { + "after": "0.8.2", + "eslint": "4.19.1", + "nyc": "10.3.2", + "seedrandom": "2.4.3", + "timezone-mock": "0.0.7", + "urun": "0.0.8", + "utest": "0.0.8" + }, + "directories": {}, + "dist": { + "integrity": "sha512-dPbN2LHonQp7D5ja5DJXNbCLe/HRdu+f3v61aguzNRQIrmZLOeRoymBYyeThrR6ug+FqzDL95Gc9maqZUJS+Gw==", + "shasum": "b23b22ab5de44fc2d5d32bd4f5af6653fc45e2ba", + "tarball": "https://registry.npmjs.org/mysql/-/mysql-2.16.0.tgz", + "fileCount": 60, + "unpackedSize": 428222, + "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbTss2CRA9TVsSAnZWagAAEPYQAJDy7TmIPBatRNcx7dl1\nalHuAbLL5R86v3L5dJ0Y4Lq8oNSh1LKXa0q26osrkFRUpRBqt9wSIEvZR3os\nUzSJFaYGMdJYSDOwd8Hv/Z8KOrzjaguTgl2cZ8/8rW9IBUVaJ6xtNklgpgYz\n6sI6iUrCU/+68XtkHJ7CUh4XPMKPMyKmZoWBpAVN9kp7Yzsovo4HCxm6FCVP\nQ/A+FIXwRlhxQ6CnYxGRQrECgTH2D6kpNem//LiTTa2Egzua3mxwLZcwKxfw\nr4oH27o6KNmCjCfpkcBi0g71XphlKsrOgTsYMT8GRPN55Gpq0JD+Mn22GipM\nEeX1zC4Q15fvLeAKQpZW8yQrTHCqTUeVZ1HTqOSVV/b14ZD2gQ3AAH2Orrv2\nKpVNpAoGBuqXm6FgdD90dIdLYBNJlwOO0TpLQGWEWcavK9JsG9HNaaZzyaEP\nkTdF7QAm7x7a7vrOcF1rZZHrtrG1tszGVbnGmr5HJl9uk5lUu052DdehhJzr\neB2egsnMzpSjuqNFs1vbImy27FvvcYpnAFk7qiEr7gHDLPMFUHs73GDRhhYs\nvrpmyr74OTjybtzfcd3Yzlp35+mgSmGZ8ZfHjniwdE6q3O03N8hBhCcqWQhj\ngnJKWoSrz8tKmhXddgfC/4yQeMeN6RM8XcwCDAnI93zVOKCSnphViBTFSua9\nVFZC\r\n=oi2l\r\n-----END PGP SIGNATURE-----\r\n" + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "lib/", + "Changes.md", + "License", + "Readme.md", + "index.js" + ], + "gitHead": "cf5d1e396a343ffa0fba23b3791d2dd5da20f30e", + "homepage": "https://github.com/mysqljs/mysql#readme", + "license": "MIT", + "maintainers": [ + { + "name": "dougwilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "felixge", + "email": "felix@debuggable.com" + }, + { + "name": "nate.lillich", + "email": "natalie@lifewanted.com" + }, + { + "name": "sidorares", + "email": "sidorares@yandex.com" + } + ], + "name": "mysql", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/mysqljs/mysql.git" + }, + "scripts": { + "lint": "eslint .", + "test": "node test/run.js", + "test-ci": "nyc --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test", + "version": "node tool/version-changes.js && git add Changes.md" + }, + "version": "2.16.0" +} diff --git a/html/RentForCamp/node_modules/nomnom/.npmignore b/html/RentForCamp/node_modules/nomnom/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/html/RentForCamp/node_modules/nomnom/LICENSE b/html/RentForCamp/node_modules/nomnom/LICENSE new file mode 100644 index 0000000..8092929 --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2010 Heather Arthur + +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/html/RentForCamp/node_modules/nomnom/README.md b/html/RentForCamp/node_modules/nomnom/README.md new file mode 100644 index 0000000..5864a09 --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/README.md @@ -0,0 +1,325 @@ +# nomnom +nomnom is an option parser for node. It noms your args and gives them back to you in a hash. + +```javascript +var opts = require("nomnom") + .option('debug', { + abbr: 'd', + flag: true, + help: 'Print debugging info' + }) + .option('config', { + abbr: 'c', + default: 'config.json', + help: 'JSON file with tests to run' + }) + .option('version', { + flag: true, + help: 'print version and exit', + callback: function() { + return "version 1.2.4"; + } + }) + .parse(); + +if (opts.debug) + // do stuff +``` + +You don't have to specify anything if you don't want to: + +```javascript +var opts = require("nomnom").parse(); + +var url = opts[0]; // get the first positional arg +var file = opts.file // see if --file was specified +var verbose = opts.v // see if -v was specified +var extras = opts._ // get an array of the unmatched, positional args +``` + +# Install +for [node.js](http://nodejs.org/) and [npm](http://github.com/isaacs/npm): + + npm install nomnom + +# More Details +Nomnom supports args like `-d`, `--debug`, `--no-debug`, `--file=test.txt`, `--file test.txt`, `-f test.txt`, `-xvf`, and positionals. Positionals are arguments that don't fit the `-a` or `--atomic` format and aren't attached to an option. + +Values are JSON parsed, so `--debug=true --count=3 --file=log.txt` would give you: + +``` +{ + "debug": true, + "count": 3, + "file": "log.txt" +} +``` + +# Commands +Nomnom supports command-based interfaces (e.g. with git: `git add -p` and `git rebase -i` where `add` and `rebase` are the commands): + +```javascript +var parser = require("nomnom"); + +parser.command('browser') + .callback(function(opts) { + runBrowser(opts.url); + }) + .help("run browser tests"); + +parser.command('sanity') + .option('outfile', { + abbr: 'o', + help: "file to write results to" + }) + .option('config', { + abbr: 'c', + default: 'config.json', + help: "json manifest of tests to run" + }) + .callback(function(opts) { + runSanity(opts.filename); + }) + .help("run the sanity tests") + +parser.parse(); +``` + +Each command generates its own usage message when `-h` or `--help` is specified with the command. + +# Usage +Nomnom prints out a usage message if `--help` or `-h` is an argument. Usage for these options in `test.js`: + +```javascript +var opts = require("nomnom") + .script("runtests") + .options({ + path: { + position: 0, + help: "Test file to run", + list: true + }, + config: { + abbr: 'c', + metavar: 'FILE', + help: "Config file with tests to run" + }, + debug: { + abbr: 'd', + flag: true, + help: "Print debugging info" + } + }).parse(); +``` + +...would look like this: + + usage: runtests ... [options] + + path Test file to run + + options: + -c FILE, --config FILE Config file with tests to run + -d, --debug Print debugging info + +# Options +You can either add a specification for an option with `nomnom.option('name', spec)` or pass the specifications to `nomnom.options()` as a hash keyed on option name. Each option specification can have the following fields: + +#### abbr and full +`abbr` is the single character string to match to this option, `full` is the full-length string (defaults to the name of the option). + +This option matches `-d` and `--debug` on the command line: + +```javascript +nomnom.option('debug', { + abbr: 'd' +}) +``` + +This option matches `-n 3`, `--num-lines 12` on the command line: + +```javascript +nomnom.option('numLines', { + abbr: 'n', + full: 'num-lines' +}) +``` + +#### flag + +If this is set to true, the option acts as a flag and doesn't swallow the next value on the command line. Default is `false`, so normally if you had a command line `--config test.js`, `config` would get a value of `test.js` in the options hash. Whereas if you specify: + +```javascript +nomnom.option('config', { + flag: true +}) +``` + +`config` would get a value of `true` in the options hash, and `test.js` would be a free positional arg. + +#### metavar + +`metavar` is used in the usage printout e.g. `"PATH"` in `"-f PATH, --file PATH"`. + +#### string + +A shorthand for `abbr`, `full`, and `metavar`. For example, to attach an option to `-c` and `--config` use a `string: "-c FILE, --config=FILE"` + +#### help + +A string description of the option for the usage printout. + +#### default + +The value to give the option if it's not specified in the arguments. + +#### type + +If you don't want the option JSON-parsed, specify type `"string"`. + +#### callback + +A callback that will be executed as soon as the option is encountered. If the callback returns a string it will print the string and exit: + +```javascript +nomnom.option('count', { + callback: function(count) { + if (count != parseInt(count)) { + return "count must be an integer"; + } + } +}) +``` + +#### position + +The position of the option if it's a positional argument. If the option should be matched to the first positional arg use position `0`, etc. + +#### list + +Specifies that the option is a list. Appending can be achieved by specifying the arg more than once on the command line: + + node test.js --file=test1.js --file=test2.js + +If the option has a `position` and `list` is `true`, all positional args including and after `position` will be appended to the array. + +#### required + +If this is set to `true` and the option isn't in the args, a message will be printed and the program will exit. + +#### choices + +A list of the possible values for the option (e.g. `['run', 'test', 'open']`). If the parsed value isn't in the list a message will be printed and the program will exit. + +#### transform + +A function that takes the value of the option as entered and returns a new value that will be seen as the value of the option. + +```javascript +nomnom.option('date', { + abbr: 'd', + transform: function(timestamp) { + return new Date(timestamp); + } +}) +``` + +#### hidden + +Option won't be printed in the usage + + +# Parser interface +`require("nomnom")` will give you the option parser. You can also make an instance of a parser with `require("nomnom")()`. You can chain any of these functions off of a parser: + +#### option + +Add an option specification with the given name: + +```javascript +nomnom.option('debug', { + abbr: 'd', + flag: true, + help: "Print debugging info" +}) +``` + +#### options + +Add options as a hash keyed by option name, good for a cli with tons of options like [this example](http://github.com/harthur/replace/blob/master/bin/replace.js): + +```javascript +nomnom.options({ + debug: { + abbr: 'd', + flag: true, + help: "Print debugging info" + }, + fruit: { + help: "Fruit to buy" + } +}) +``` + +#### usage + +The string that will override the default generated usage message. + +#### help + +A string that is appended to the usage. + +#### script + +Nomnom can't detect the alias used to run your script. You can use `script` to provide the correct name for the usage printout instead of e.g. `node test.js`. + +#### printer + +Overrides the usage printing function. + +#### command + +Takes a command name and gives you a command object on which you can chain command options. + +#### nocommand + +Gives a command object that will be used when no command is called. + +#### nocolors + +Disables coloring of the usage message. + +#### parse + +Parses node's `process.argv` and returns the parsed options hash. You can also provide argv: + +```javascript +var opts = nomnom.parse(["-xvf", "--atomic=true"]) +``` + +#### nom + +The same as `parse()`. + +# Command interface +A command is specified with `nomnom.command('name')`. All these functions can be chained on a command: + +#### option + +Add an option specifically for this command. + +#### options + +Add options for this command as a hash of options keyed by name. + +#### callback + +A callback that will be called with the parsed options when the command is used. + +#### help + +A help string describing the function of this command. + +#### usage + +Override the default generated usage string for this command. diff --git a/html/RentForCamp/node_modules/nomnom/nomnom.js b/html/RentForCamp/node_modules/nomnom/nomnom.js new file mode 100644 index 0000000..3155974 --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/nomnom.js @@ -0,0 +1,584 @@ +var _ = require("underscore"), chalk = require('chalk'); + + +function ArgParser() { + this.commands = {}; // expected commands + this.specs = {}; // option specifications +} + +ArgParser.prototype = { + /* Add a command to the expected commands */ + command : function(name) { + var command; + if (name) { + command = this.commands[name] = { + name: name, + specs: {} + }; + } + else { + command = this.fallback = { + specs: {} + }; + } + + // facilitates command('name').options().cb().help() + var chain = { + options : function(specs) { + command.specs = specs; + return chain; + }, + opts : function(specs) { + // old API + return this.options(specs); + }, + option : function(name, spec) { + command.specs[name] = spec; + return chain; + }, + callback : function(cb) { + command.cb = cb; + return chain; + }, + help : function(help) { + command.help = help; + return chain; + }, + usage : function(usage) { + command._usage = usage; + return chain; + } + }; + return chain; + }, + + nocommand : function() { + return this.command(); + }, + + options : function(specs) { + this.specs = specs; + return this; + }, + + opts : function(specs) { + // old API + return this.options(specs); + }, + + globalOpts : function(specs) { + // old API + return this.options(specs); + }, + + option : function(name, spec) { + this.specs[name] = spec; + return this; + }, + + usage : function(usage) { + this._usage = usage; + return this; + }, + + printer : function(print) { + this.print = print; + return this; + }, + + script : function(script) { + this._script = script; + return this; + }, + + scriptName : function(script) { + // old API + return this.script(script); + }, + + help : function(help) { + this._help = help; + return this; + }, + + colors: function() { + // deprecated - colors are on by default now + return this; + }, + + nocolors : function() { + this._nocolors = true; + return this; + }, + + parseArgs : function(argv) { + // old API + return this.parse(argv); + }, + + nom : function(argv) { + return this.parse(argv); + }, + + parse : function(argv) { + this.print = this.print || function(str, code) { + console.log(str); + process.exit(code || 0); + }; + this._help = this._help || ""; + this._script = this._script || process.argv[0] + " " + + require('path').basename(process.argv[1]); + this.specs = this.specs || {}; + + var argv = argv || process.argv.slice(2); + + var arg = Arg(argv[0]).isValue && argv[0], + command = arg && this.commands[arg], + commandExpected = !_(this.commands).isEmpty(); + + if (commandExpected) { + if (command) { + _(this.specs).extend(command.specs); + this._script += " " + command.name; + if (command.help) { + this._help = command.help; + } + this.command = command; + } + else if (arg) { + return this.print(this._script + ": no such command '" + arg + "'", 1); + } + else { + // no command but command expected e.g. 'git -v' + var helpStringBuilder = { + list : function() { + return 'one of: ' + _(this.commands).keys().join(", "); + }, + twoColumn : function() { + // find the longest command name to ensure horizontal alignment + var maxLength = _(this.commands).max(function (cmd) { + return cmd.name.length; + }).name.length; + + // create the two column text strings + var cmdHelp = _.map(this.commands, function(cmd, name) { + var diff = maxLength - name.length; + var pad = new Array(diff + 4).join(" "); + return " " + [ name, pad, cmd.help ].join(" "); + }); + return "\n" + cmdHelp.join("\n"); + } + }; + + // if there are a small number of commands and all have help strings, + // display them in a two column table; otherwise use the brief version. + // The arbitrary choice of "20" comes from the number commands git + // displays as "common commands" + var helpType = 'list'; + if (_(this.commands).size() <= 20) { + if (_(this.commands).every(function (cmd) { return cmd.help; })) { + helpType = 'twoColumn'; + } + } + + this.specs.command = { + position: 0, + help: helpStringBuilder[helpType].call(this) + } + + if (this.fallback) { + _(this.specs).extend(this.fallback.specs); + this._help = this.fallback.help; + } else { + this.specs.command.required = true; + } + } + } + + if (this.specs.length === undefined) { + // specs is a hash not an array + this.specs = _(this.specs).map(function(opt, name) { + opt.name = name; + return opt; + }); + } + this.specs = this.specs.map(function(opt) { + return Opt(opt); + }); + + if (argv.indexOf("--help") >= 0 || argv.indexOf("-h") >= 0) { + return this.print(this.getUsage()); + } + + var options = {}; + var args = argv.map(function(arg) { + return Arg(arg); + }) + .concat(Arg()); + + var positionals = []; + + /* parse the args */ + var that = this; + args.reduce(function(arg, val) { + /* positional */ + if (arg.isValue) { + positionals.push(arg.value); + } + else if (arg.chars) { + var last = arg.chars.pop(); + + /* -cfv */ + (arg.chars).forEach(function(ch) { + that.setOption(options, ch, true); + }); + + /* -v key */ + if (!that.opt(last).flag) { + if (val.isValue) { + that.setOption(options, last, val.value); + return Arg(); // skip next turn - swallow arg + } + else { + that.print("'-" + (that.opt(last).name || last) + "'" + + " expects a value\n\n" + that.getUsage(), 1); + } + } + else { + /* -v */ + that.setOption(options, last, true); + } + + } + else if (arg.full) { + var value = arg.value; + + /* --key */ + if (value === undefined) { + /* --key value */ + if (!that.opt(arg.full).flag) { + if (val.isValue) { + that.setOption(options, arg.full, val.value); + return Arg(); + } + else { + that.print("'--" + (that.opt(arg.full).name || arg.full) + "'" + + " expects a value\n\n" + that.getUsage(), 1); + } + } + else { + /* --flag */ + value = true; + } + } + that.setOption(options, arg.full, value); + } + return val; + }); + + positionals.forEach(function(pos, index) { + this.setOption(options, index, pos); + }, this); + + options._ = positionals; + + this.specs.forEach(function(opt) { + if (opt.default !== undefined && options[opt.name] === undefined) { + options[opt.name] = opt.default; + } + }, this); + + // exit if required arg isn't present + this.specs.forEach(function(opt) { + if (opt.required && options[opt.name] === undefined) { + var msg = opt.name + " argument is required"; + msg = this._nocolors ? msg : chalk.red(msg); + + this.print("\n" + msg + "\n" + this.getUsage(), 1); + } + }, this); + + if (command && command.cb) { + command.cb(options); + } + else if (this.fallback && this.fallback.cb) { + this.fallback.cb(options); + } + + return options; + }, + + getUsage : function() { + if (this.command && this.command._usage) { + return this.command._usage; + } + else if (this.fallback && this.fallback._usage) { + return this.fallback._usage; + } + if (this._usage) { + return this._usage; + } + + // todo: use a template + var str = "\n" + if (!this._nocolors) { + str += chalk.bold("Usage:"); + } + else { + str += "Usage:"; + } + str += " " + this._script; + + var positionals = _(this.specs).select(function(opt) { + return opt.position != undefined; + }) + positionals = _(positionals).sortBy(function(opt) { + return opt.position; + }); + var options = _(this.specs).select(function(opt) { + return opt.position === undefined; + }); + + // assume there are no gaps in the specified pos. args + positionals.forEach(function(pos) { + str += " "; + var posStr = pos.string; + if (!posStr) { + posStr = pos.name || "arg" + pos.position; + if (pos.required) { + posStr = "<" + posStr + ">"; + } else { + posStr = "[" + posStr + "]"; + } + if (pos.list) { + posStr += "..."; + } + } + str += posStr; + }); + + if (options.length) { + if (!this._nocolors) { + // must be a better way to do this + str += chalk.blue(" [options]"); + } + else { + str += " [options]"; + } + } + + if (options.length || positionals.length) { + str += "\n\n"; + } + + function spaces(length) { + var spaces = ""; + for (var i = 0; i < length; i++) { + spaces += " "; + } + return spaces; + } + var longest = positionals.reduce(function(max, pos) { + return pos.name.length > max ? pos.name.length : max; + }, 0); + + positionals.forEach(function(pos) { + var posStr = pos.string || pos.name; + str += posStr + spaces(longest - posStr.length) + " "; + if (!this._nocolors) { + str += chalk.grey(pos.help || "") + } + else { + str += (pos.help || "") + } + str += "\n"; + }, this); + if (positionals.length && options.length) { + str += "\n"; + } + + if (options.length) { + if (!this._nocolors) { + str += chalk.blue("Options:"); + } + else { + str += "Options:"; + } + str += "\n" + + var longest = options.reduce(function(max, opt) { + return opt.string.length > max && !opt.hidden ? opt.string.length : max; + }, 0); + + options.forEach(function(opt) { + if (!opt.hidden) { + str += " " + opt.string + spaces(longest - opt.string.length) + " "; + + var defaults = (opt.default != null ? " [" + opt.default + "]" : ""); + var help = opt.help ? opt.help + defaults : ""; + str += this._nocolors ? help: chalk.grey(help); + + str += "\n"; + } + }, this); + } + + if (this._help) { + str += "\n" + this._help; + } + return str; + } +}; + +ArgParser.prototype.opt = function(arg) { + // get the specified opt for this parsed arg + var match = Opt({}); + this.specs.forEach(function(opt) { + if (opt.matches(arg)) { + match = opt; + } + }); + return match; +}; + +ArgParser.prototype.setOption = function(options, arg, value) { + var option = this.opt(arg); + if (option.callback) { + var message = option.callback(value); + + if (typeof message == "string") { + this.print(message, 1); + } + } + + if (option.type != "string") { + try { + // infer type by JSON parsing the string + value = JSON.parse(value) + } + catch(e) {} + } + + if (option.transform) { + value = option.transform(value); + } + + var name = option.name || arg; + if (option.choices && option.choices.indexOf(value) == -1) { + this.print(name + " must be one of: " + option.choices.join(", "), 1); + } + + if (option.list) { + if (!options[name]) { + options[name] = [value]; + } + else { + options[name].push(value); + } + } + else { + options[name] = value; + } +}; + + +/* an arg is an item that's actually parsed from the command line + e.g. "-l", "log.txt", or "--logfile=log.txt" */ +var Arg = function(str) { + var abbrRegex = /^\-(\w+?)$/, + fullRegex = /^\-\-(no\-)?(.+?)(?:=(.+))?$/, + valRegex = /^[^\-].*/; + + var charMatch = abbrRegex.exec(str), + chars = charMatch && charMatch[1].split(""); + + var fullMatch = fullRegex.exec(str), + full = fullMatch && fullMatch[2]; + + var isValue = str !== undefined && (str === "" || valRegex.test(str)); + var value; + if (isValue) { + value = str; + } + else if (full) { + value = fullMatch[1] ? false : fullMatch[3]; + } + + return { + str: str, + chars: chars, + full: full, + value: value, + isValue: isValue + } +} + + +/* an opt is what's specified by the user in opts hash */ +var Opt = function(opt) { + var strings = (opt.string || "").split(","), + abbr, full, metavar; + for (var i = 0; i < strings.length; i++) { + var string = strings[i].trim(), + matches; + if (matches = string.match(/^\-([^-])(?:\s+(.*))?$/)) { + abbr = matches[1]; + metavar = matches[2]; + } + else if (matches = string.match(/^\-\-(.+?)(?:[=\s]+(.+))?$/)) { + full = matches[1]; + metavar = metavar || matches[2]; + } + } + + matches = matches || []; + var abbr = opt.abbr || abbr, // e.g. v from -v + full = opt.full || full, // e.g. verbose from --verbose + metavar = opt.metavar || metavar; // e.g. PATH from '--config=PATH' + + var string; + if (opt.string) { + string = opt.string; + } + else if (opt.position === undefined) { + string = ""; + if (abbr) { + string += "-" + abbr; + if (metavar) + string += " " + metavar + string += ", "; + } + string += "--" + (full || opt.name); + if (metavar) { + string += " " + metavar; + } + } + + opt = _(opt).extend({ + name: opt.name || full || abbr, + string: string, + abbr: abbr, + full: full, + metavar: metavar, + matches: function(arg) { + return opt.full == arg || opt.abbr == arg || opt.position == arg + || opt.name == arg || (opt.list && arg >= opt.position); + } + }); + return opt; +} + + +var createParser = function() { + return new ArgParser(); +} + +var nomnom = createParser(); + +for (var i in nomnom) { + if (typeof nomnom[i] == "function") { + createParser[i] = _(nomnom[i]).bind(nomnom); + } +} + +module.exports = createParser; diff --git a/html/RentForCamp/node_modules/nomnom/num-vals-fix.diff b/html/RentForCamp/node_modules/nomnom/num-vals-fix.diff new file mode 100644 index 0000000..3c4f167 --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/num-vals-fix.diff @@ -0,0 +1,31 @@ +diff --git a/test/values.js b/test/values.js +index efad789..7fa1078 100644 +--- a/test/values.js ++++ b/test/values.js +@@ -26,6 +26,12 @@ var opts = { + }, + def2: { + default: "val1" ++ }, ++ "2d": { ++ flag: true ++ }, ++ "3d": { ++ abbr: "3" + } + } + +@@ -80,8 +86,12 @@ exports.testDash = function(test) { + }; + + exports.testNumbers = function(test) { +- var options = parser.parseArgs(['sum', '-1', '2.5', '-3.5', '4']); ++ var options = parser.parseArgs(['sum', '-1', '2.5', '-3.5', '4', '--2d', '-3', 'test']); + + test.deepEqual(options.list3, ['-1', '2.5', '-3.5', '4']); ++ test.strictEqual(options['2d'], true); ++ test.strictEqual(options['3d'], "test") + test.done(); + }; ++ ++ diff --git a/html/RentForCamp/node_modules/nomnom/package.json b/html/RentForCamp/node_modules/nomnom/package.json new file mode 100644 index 0000000..fdef8cc --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/package.json @@ -0,0 +1,90 @@ +{ + "_args": [ + [ + { + "raw": "nomnom@^1.5.x", + "scope": null, + "escapedName": "nomnom", + "name": "nomnom", + "rawSpec": "^1.5.x", + "spec": ">=1.5.0 <2.0.0", + "type": "range" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/jsonlint" + ] + ], + "_from": "nomnom@>=1.5.0 <2.0.0", + "_id": "nomnom@1.8.1", + "_inCache": true, + "_location": "/nomnom", + "_npmUser": { + "name": "harth", + "email": "fayearthur@gmail.com" + }, + "_npmVersion": "1.4.3", + "_phantomChildren": {}, + "_requested": { + "raw": "nomnom@^1.5.x", + "scope": null, + "escapedName": "nomnom", + "name": "nomnom", + "rawSpec": "^1.5.x", + "spec": ">=1.5.0 <2.0.0", + "type": "range" + }, + "_requiredBy": [ + "/jsonlint" + ], + "_resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "_shasum": "2151f722472ba79e50a76fc125bb8c8f2e4dc2a7", + "_shrinkwrap": null, + "_spec": "nomnom@^1.5.x", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/jsonlint", + "author": { + "name": "Heather Arthur", + "email": "fayearthur@gmail.com" + }, + "bugs": { + "url": "https://github.com/harthur/nomnom/issues" + }, + "dependencies": { + "chalk": "~0.4.0", + "underscore": "~1.6.0" + }, + "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.", + "description": "Option parser with generated usage and commands", + "devDependencies": { + "nodeunit": "~0.7.4" + }, + "directories": {}, + "dist": { + "shasum": "2151f722472ba79e50a76fc125bb8c8f2e4dc2a7", + "tarball": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz" + }, + "homepage": "https://github.com/harthur/nomnom", + "keywords": [ + "arguments", + "option parser", + "command line", + "options", + "parser" + ], + "main": "./nomnom", + "maintainers": [ + { + "name": "harth", + "email": "fayearthur@gmail.com" + } + ], + "name": "nomnom", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/harthur/nomnom.git" + }, + "scripts": { + "test": "nodeunit test/*.js" + }, + "version": "1.8.1" +} diff --git a/html/RentForCamp/node_modules/nomnom/test.js b/html/RentForCamp/node_modules/nomnom/test.js new file mode 100644 index 0000000..db99a1e --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/test.js @@ -0,0 +1,23 @@ +var opts = require("./nomnom") + .option('debug', { + abbr: 'd', + flag: true, + help: 'Print debugging info' + }) + .option('config', { + abbr: 'c', + default: 'config.json', + help: 'JSON file with tests to run' + }) + .option('version', { + flag: true, + help: 'print version and exit', + callback: function() { + return "version 1.2.4"; + } + }) + .parse(); + +if (opts.debug) { + console.log("debug") +} diff --git a/html/RentForCamp/node_modules/nomnom/test/callback.js b/html/RentForCamp/node_modules/nomnom/test/callback.js new file mode 100644 index 0000000..3d512db --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/test/callback.js @@ -0,0 +1,33 @@ +var nomnom = require("../nomnom"); + +exports.testVersion = function(test) { + test.expect(1); + + nomnom().options({ + date: { + callback: function(date) { + test.equal(date, "2010-02-03", "date should match value") + } + } + }).parse(["--date=2010-02-03"]); + + test.done(); +} + +exports.testReturnString = function(test) { + test.expect(1); + + nomnom().options({ + version: { + flag: true, + callback: function() { + return "v0.3"; + } + } + }) + .printer(function(string) { + test.equal(0, string.indexOf("v0.3")) + test.done(); + }) + .parse(["--version"]); +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/nomnom/test/commands.js b/html/RentForCamp/node_modules/nomnom/test/commands.js new file mode 100644 index 0000000..1fbb60f --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/test/commands.js @@ -0,0 +1,120 @@ +var nomnom = require("../nomnom"); + +function strip(str) { + return str.replace(/\s+/g, ''); +} + +exports.testCallback = function(test) { + test.expect(1); + + var parser = nomnom(); + parser.command('run').callback(function(options) { + test.equal(options.v, 3); + }); + parser.command('other').callback(function() { + test.ok(false, "callback for other command shouldn't be called"); + }); + + parser.parse(["run","-v", "3"]); + test.done(); +} + +exports.testMissingCommand = function(test) { + test.expect(1); + + var parser = nomnom().scriptName("test"); + + parser.command('run'); + + parser.printer(function(string) { + test.equal(string, "test: no such command 'other'"); + test.done(); + }); + + parser.parse(["other"]); +} + +exports.testNoCommand = function(test) { + test.expect(2); + + var parser = nomnom(); + + parser.nocommand() + .options({ + version: { + flag: true + } + }) + .callback(function(options) { + test.strictEqual(options.version, true); + }) + .usage("fallback usage"); + + parser.command('run'); + + var options = parser.parse(["--version"]); + + test.strictEqual(options.version, true); + test.done(); +} + +function createParser() { + var parser = nomnom().scriptName("test") + .options({ + debug: { + flag: true + } + }); + + parser.command('run') + .options({ + file: { + help: 'file to run' + } + }) + .help("run all"); + + parser.command('test').usage("test usage"); + + parser.nocommand() + .options({ + verbose: { + flag: true + } + }) + .help("nocommand"); + + return parser; +} + +exports.testUsage = function(test) { + test.expect(4); + + var parser = createParser(); + parser.printer(function(string) { + test.equal(strip(string), "testusage"); + }); + parser.parse(["test", "-h"]); + + parser = createParser().nocolors(); + parser.printer(function(string) { + test.equal(strip(string), "Usage:testrun[options]Options:--debug--filefiletorunrunall"); + }); + parser.parse(["run", "-h"]); + + parser = createParser().nocolors(); + parser.printer(function(string) { + test.equal(strip(string), "Usage:test[command][options]commandoneof:run,testOptions:--debug--verbosenocommand"); + }); + parser.parse(["-h"]); + + parser = createParser().nocolors(); + parser.nocommand() + .usage("fallback"); + parser.printer(function(string) { + test.equal(strip(string), "fallback"); + }); + parser.parse(["-h"]); + + test.done(); +} diff --git a/html/RentForCamp/node_modules/nomnom/test/expected.js b/html/RentForCamp/node_modules/nomnom/test/expected.js new file mode 100644 index 0000000..f52bd57 --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/test/expected.js @@ -0,0 +1,60 @@ +var nomnom = require("../nomnom"); + +var opts = { + file: { + position: 0, + required: true + } +} + +var parser = nomnom().options(opts); + +exports.testFlag = function(test) { + test.expect(1); + + nomnom().options({ + file: { + position: 0, + } + }) + .printer(function(string) { + test.equal(0, string.indexOf("'--key1' expects a value")) + test.done(); + }) + .parse(["--key1"]); +} + +exports.testRequired = function(test) { + test.expect(1); + + nomnom().options({ + file: { + required: true + } + }) + .printer(function(string) { + test.equal(0, string.trim().indexOf("file argument is required")) + test.done(); + }) + .nocolors() + .parse([]); +} + +exports.testChoices = function(test) { + test.expect(2); + + var parser = nomnom().options({ + color: { + choices: ['green', 'blue'] + } + }) + .printer(function(string) { + test.equal(0, string.indexOf("color must be one of: green, blue")) + }); + + parser.parse(['--color', 'red']); + + var options = parser.parse(['--color', 'green']); + test.equal(options.color, 'green'); + test.done(); +} diff --git a/html/RentForCamp/node_modules/nomnom/test/matching.js b/html/RentForCamp/node_modules/nomnom/test/matching.js new file mode 100644 index 0000000..8d347eb --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/test/matching.js @@ -0,0 +1,70 @@ +var nomnom = require("../nomnom"); + +var opts = { + pos1: { + position: 0 + }, + pos2: { + position: 1 + }, + flag1: { + flag: true + }, + debug: { + abbr: 'd' + }, + numLines: { + abbr: 'n', + full: 'num-lines' + }, + version: { + string: '-v, --version' + }, + config: { + string: '-c FILE, --config=FILE' + }, + skey : { + string: '-k val' + }, + skey2: { + string: '-k2 val2, --key2 val2' + }, + skey3: { + string: '--key3=val' + }, + skey4: { + string: '--key4=val, -y val' + } +} + +var parser = nomnom().options(opts); + +exports.testPositional = function(test) { + var options = parser.parse(["--flag1", "val1", "--config", "file", "val2"]); + + test.equal(options.pos1, "val1"); + test.equal(options.pos2, "val2"); + test.deepEqual(options._, ["val1", "val2"]) + test.done(); +} + +exports.testAbbr = function(test) { + var options = parser.parse(["-d", "yes", "--num-lines", "3"]); + + test.equal(options.debug, "yes") + test.equal(options.numLines, 3) + test.done(); +} + +exports.testString = function(test) { + var options = parser.parse(["-k", "val", "--config=test.js", + "--key2", "val2", "--key3", "val3", "--key4=val4", "-v", "v0.3"]); + + test.equal(options.version, "v0.3") + test.equal(options.config, "test.js") + test.equal(options.skey, "val") + test.equal(options.skey2, "val2") + test.equal(options.skey3, "val3") + test.equal(options.skey4, "val4") + test.done(); +} diff --git a/html/RentForCamp/node_modules/nomnom/test/option.js b/html/RentForCamp/node_modules/nomnom/test/option.js new file mode 100644 index 0000000..e3934d7 --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/test/option.js @@ -0,0 +1,44 @@ +var nomnom = require("../nomnom"); + +var parser = nomnom() + .option('debug', { + abbr: 'x', + flag: true, + help: 'Print debugging info' + }) + .option('config', { + abbr: 'c', + default: 'config.json', + help: 'JSON file with tests to run' + }) + .option('version', { + flag: true, + help: 'print version and exit', + callback: function() { + return "version 1.2.4"; + } + }); + + +exports.testOption = function(test) { + var opts = parser.parse(["-x", "--no-verbose"]); + + test.strictEqual(opts.debug, true); + test.equal(opts.config, "config.json"); + test.done(); +} + + +exports.testCommandOption = function(test) { + var parser = nomnom() + parser.command('test') + .option('fruit', { + abbr: 'f', + flag: true + }) + + var opts = parser.parse(["test", "-f"]); + + test.strictEqual(opts.fruit, true); + test.done(); +} diff --git a/html/RentForCamp/node_modules/nomnom/test/transform.js b/html/RentForCamp/node_modules/nomnom/test/transform.js new file mode 100644 index 0000000..666a6a2 --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/test/transform.js @@ -0,0 +1,65 @@ +var nomnom = require("../nomnom"); + +var parser = nomnom() + .option("addr", { + abbr: "a", + help: "host:port address", + transform: function(value) { + var parts = value.split(":"); + return {host: parts[0], port: Number(parts[1])}; + } + }) + .option("string", { + abbr: "s", + help: "always a string", + transform: function(value) { + return value.toString(); + } + }); + + +exports.testTransformComplexValue = function(test) { + var opts = parser.parse(["-a", "localhost:1234"]); + + test.strictEqual(opts.addr.host, "localhost"); + test.strictEqual(opts.addr.port, 1234); + test.done(); +}; + + +exports.testTransformString = function(test) { + var opts = parser.parse(["-s", "3"]); + + test.strictEqual(opts.string, "3"); + test.done(); +}; + + +exports.testTransformCommand = function(test) { + test.expect(1); + + var parser = nomnom().scriptName("test") + .options({ + addr: { + transform: function(value) { + var parts = value.split(":"); + return {host: parts[0], port: Number(parts[1])}; + } + } + }); + + parser.command("run") + .options({ + string: { + transform: function(value) { + return value.toString(); + } + } + }) + .callback(function(options) { + test.strictEqual(options.string, "true"); + }); + + parser.parse(["run", "--string=true"]); + test.done(); +}; diff --git a/html/RentForCamp/node_modules/nomnom/test/usage.js b/html/RentForCamp/node_modules/nomnom/test/usage.js new file mode 100644 index 0000000..9a08179 --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/test/usage.js @@ -0,0 +1,121 @@ +var nomnom = require("../nomnom"); + +function strip(str) { + return str.replace(/\s+/g, ''); +}; + +var opts = { + apple: { + abbr: 'a', + help: 'how many apples' + }, + + banana: { + full: "b-nana" + }, + + carrot: { + string: '-c NUM, --carrots=NUM' + }, + + dill: { + metavar: 'PICKLE' + }, + + egg: { + position: 0, + help: 'robin' + } +} + +var parser = nomnom().options(opts).help("all the best foods").scriptName("test").nocolors(); + +var expected = "Usage:test[egg][options]eggrobinOptions:-a,--applehowmanyapples--b-nana-cNUM,--carrots=NUM--dillPICKLEallthebestfoods" + +exports.testH = function(test) { + test.expect(1); + + parser.printer(function(string) { + test.equal(strip(string), expected) + test.done(); + }) + .nocolors() + .parse(["-h"]); +} + +exports.testHelp = function(test) { + test.expect(1); + + parser.printer(function(string) { + test.equal(strip(string), expected) + test.done(); + }) + .nocolors() + .parse(["--help"]); +} + +exports.testScriptName = function(test) { + test.expect(1); + + nomnom() + .script("test") + .printer(function(string) { + test.equal(strip(string),"Usage:test") + test.done(); + }) + .nocolors() + .parse(["-h"]); +} + +exports.testUsage = function(test) { + test.expect(1); + + parser + .usage("test usage") + .printer(function(string) { + test.equal(string, "test usage") + test.done(); + }) + .nocolors() + .parse(["--help"]); +} + +exports.testHidden = function(test) { + test.expect(1); + + nomnom().options({ + file: { + hidden: true + } + }) + .scriptName("test") + .printer(function(string) { + test.equal(strip("Usage:test[options]Options:"), strip(string)) + test.done(); + }) + .nocolors() + .parse(["-h"]); +} + +exports.testRequiredOptional = function(test) { + test.expect(1); + + nomnom().options({ + foo: { + position: 0, + required: true, + help: 'The foo' + }, + bar: { + position: 1, + help: 'The bar' + } + }) + .scriptName("test") + .printer(function(string) { + test.equal(strip("Usage:test[bar]fooThefoobarThebar"), strip(string)) + test.done(); + }) + .nocolors() + .parse(["-h"]); +} diff --git a/html/RentForCamp/node_modules/nomnom/test/values.js b/html/RentForCamp/node_modules/nomnom/test/values.js new file mode 100644 index 0000000..797807e --- /dev/null +++ b/html/RentForCamp/node_modules/nomnom/test/values.js @@ -0,0 +1,75 @@ +var nomnom = require("../nomnom"); + +var opts = { + debug: { + flag: true + }, + verbose: { + flag: true, + default: true + }, + list1: { + list: true + }, + list2: { + list: true + }, + list3: { + position: 1, + list: true + }, + num1: { + type: "string" + }, + def1: { + default: "val1" + }, + def2: { + default: "val1" + } +} + +var parser = nomnom().options(opts); + +exports.testFlag = function(test) { + var options = parser.parse(["--debug", "pos0", "--no-verbose"]); + + test.strictEqual(options.debug, true); + test.strictEqual(options.verbose, false); + test.equal(options[0], "pos0"); + test.equal(options._[0], "pos0"); + test.done(); +} + +exports.testList = function(test) { + var options = parser.parse(["pos0", "pos1", "--list1=val0", "--list2", "val1", + "--list2", "val2", "pos2"]); + + test.deepEqual(options.list1, ["val0"]); + test.deepEqual(options.list2, ["val1", "val2"]); + test.deepEqual(options.list3, ["pos1", "pos2"]); + test.done(); +} + +exports.testDefault = function(test) { + var options = parser.parse(["--def2", "val2", "--def3", "val3"]); + + test.strictEqual(options.def1, "val1"); + test.strictEqual(options.def2, "val2"); + test.strictEqual(options.def3, "val3"); + test.done(); +} + +exports.testTypes = function(test) { + var options = parser.parseArgs(["", "-x", "3.14", "-w", "true", "-q", "120", + "--num1", "4"]); + + test.strictEqual(options[0], ""); + test.strictEqual(options.x, 3.14); + test.strictEqual(options.w, true); + test.strictEqual(options.q, 120); + test.strictEqual(options.num1, "4"); + test.done(); +} + + diff --git a/html/RentForCamp/node_modules/process-nextick-args/index.js b/html/RentForCamp/node_modules/process-nextick-args/index.js new file mode 100644 index 0000000..5f585e8 --- /dev/null +++ b/html/RentForCamp/node_modules/process-nextick-args/index.js @@ -0,0 +1,44 @@ +'use strict'; + +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = { nextTick: nextTick }; +} else { + module.exports = process +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} + diff --git a/html/RentForCamp/node_modules/process-nextick-args/license.md b/html/RentForCamp/node_modules/process-nextick-args/license.md new file mode 100644 index 0000000..c67e353 --- /dev/null +++ b/html/RentForCamp/node_modules/process-nextick-args/license.md @@ -0,0 +1,19 @@ +# Copyright (c) 2015 Calvin Metcalf + +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/html/RentForCamp/node_modules/process-nextick-args/package.json b/html/RentForCamp/node_modules/process-nextick-args/package.json new file mode 100644 index 0000000..4eca565 --- /dev/null +++ b/html/RentForCamp/node_modules/process-nextick-args/package.json @@ -0,0 +1,87 @@ +{ + "_args": [ + [ + { + "raw": "process-nextick-args@~2.0.0", + "scope": null, + "escapedName": "process-nextick-args", + "name": "process-nextick-args", + "rawSpec": "~2.0.0", + "spec": ">=2.0.0 <2.1.0", + "type": "range" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/readable-stream" + ] + ], + "_from": "process-nextick-args@>=2.0.0 <2.1.0", + "_id": "process-nextick-args@2.0.0", + "_inCache": true, + "_location": "/process-nextick-args", + "_nodeVersion": "8.6.0", + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/process-nextick-args-2.0.0.tgz_1513027423688_0.4807069287635386" + }, + "_npmUser": { + "name": "cwmma", + "email": "calvin.metcalf@gmail.com" + }, + "_npmVersion": "5.5.1", + "_phantomChildren": {}, + "_requested": { + "raw": "process-nextick-args@~2.0.0", + "scope": null, + "escapedName": "process-nextick-args", + "name": "process-nextick-args", + "rawSpec": "~2.0.0", + "spec": ">=2.0.0 <2.1.0", + "type": "range" + }, + "_requiredBy": [ + "/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "_shasum": "a37d732f4271b4ab1ad070d35508e8290788ffaa", + "_shrinkwrap": null, + "_spec": "process-nextick-args@~2.0.0", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/readable-stream", + "author": "", + "bugs": { + "url": "https://github.com/calvinmetcalf/process-nextick-args/issues" + }, + "dependencies": {}, + "description": "process.nextTick but always with args", + "devDependencies": { + "tap": "~0.2.6" + }, + "directories": {}, + "dist": { + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "shasum": "a37d732f4271b4ab1ad070d35508e8290788ffaa", + "tarball": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz" + }, + "files": [ + "index.js" + ], + "gitHead": "8407900951af3e7651fca50f127f0e4ddc01ad55", + "homepage": "https://github.com/calvinmetcalf/process-nextick-args", + "license": "MIT", + "main": "index.js", + "maintainers": [ + { + "name": "cwmma", + "email": "calvin.metcalf@gmail.com" + } + ], + "name": "process-nextick-args", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/calvinmetcalf/process-nextick-args.git" + }, + "scripts": { + "test": "node test.js" + }, + "version": "2.0.0" +} diff --git a/html/RentForCamp/node_modules/process-nextick-args/readme.md b/html/RentForCamp/node_modules/process-nextick-args/readme.md new file mode 100644 index 0000000..ecb432c --- /dev/null +++ b/html/RentForCamp/node_modules/process-nextick-args/readme.md @@ -0,0 +1,18 @@ +process-nextick-args +===== + +[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args) + +```bash +npm install --save process-nextick-args +``` + +Always be able to pass arguments to process.nextTick, no matter the platform + +```js +var pna = require('process-nextick-args'); + +pna.nextTick(function (a, b, c) { + console.log(a, b, c); +}, 'step', 3, 'profit'); +``` diff --git a/html/RentForCamp/node_modules/readable-stream/.travis.yml b/html/RentForCamp/node_modules/readable-stream/.travis.yml new file mode 100644 index 0000000..4099255 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/.travis.yml @@ -0,0 +1,55 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/html/RentForCamp/node_modules/readable-stream/CONTRIBUTING.md b/html/RentForCamp/node_modules/readable-stream/CONTRIBUTING.md new file mode 100644 index 0000000..f478d58 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/CONTRIBUTING.md @@ -0,0 +1,38 @@ +# Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +* (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +* (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +* (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +* (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Moderation Policy + +The [Node.js Moderation Policy] applies to this WG. + +## Code of Conduct + +The [Node.js Code of Conduct][] applies to this WG. + +[Node.js Code of Conduct]: +https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md +[Node.js Moderation Policy]: +https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/html/RentForCamp/node_modules/readable-stream/GOVERNANCE.md b/html/RentForCamp/node_modules/readable-stream/GOVERNANCE.md new file mode 100644 index 0000000..16ffb93 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/GOVERNANCE.md @@ -0,0 +1,136 @@ +### Streams Working Group + +The Node.js Streams is jointly governed by a Working Group +(WG) +that is responsible for high-level guidance of the project. + +The WG has final authority over this project including: + +* Technical direction +* Project governance and process (including this policy) +* Contribution policy +* GitHub repository hosting +* Conduct guidelines +* Maintaining the list of additional Collaborators + +For the current list of WG members, see the project +[README.md](./README.md#current-project-team-members). + +### Collaborators + +The readable-stream GitHub repository is +maintained by the WG and additional Collaborators who are added by the +WG on an ongoing basis. + +Individuals making significant and valuable contributions are made +Collaborators and given commit-access to the project. These +individuals are identified by the WG and their addition as +Collaborators is discussed during the WG meeting. + +_Note:_ If you make a significant contribution and are not considered +for commit-access log an issue or contact a WG member directly and it +will be brought up in the next WG meeting. + +Modifications of the contents of the readable-stream repository are +made on +a collaborative basis. Anybody with a GitHub account may propose a +modification via pull request and it will be considered by the project +Collaborators. All pull requests must be reviewed and accepted by a +Collaborator with sufficient expertise who is able to take full +responsibility for the change. In the case of pull requests proposed +by an existing Collaborator, an additional Collaborator is required +for sign-off. Consensus should be sought if additional Collaborators +participate and there is disagreement around a particular +modification. See _Consensus Seeking Process_ below for further detail +on the consensus model used for governance. + +Collaborators may opt to elevate significant or controversial +modifications, or modifications that have not found consensus to the +WG for discussion by assigning the ***WG-agenda*** tag to a pull +request or issue. The WG should serve as the final arbiter where +required. + +For the current list of Collaborators, see the project +[README.md](./README.md#members). + +### WG Membership + +WG seats are not time-limited. There is no fixed size of the WG. +However, the expected target is between 6 and 12, to ensure adequate +coverage of important areas of expertise, balanced with the ability to +make decisions efficiently. + +There is no specific set of requirements or qualifications for WG +membership beyond these rules. + +The WG may add additional members to the WG by unanimous consensus. + +A WG member may be removed from the WG by voluntary resignation, or by +unanimous consensus of all other WG members. + +Changes to WG membership should be posted in the agenda, and may be +suggested as any other agenda item (see "WG Meetings" below). + +If an addition or removal is proposed during a meeting, and the full +WG is not in attendance to participate, then the addition or removal +is added to the agenda for the subsequent meeting. This is to ensure +that all members are given the opportunity to participate in all +membership decisions. If a WG member is unable to attend a meeting +where a planned membership decision is being made, then their consent +is assumed. + +No more than 1/3 of the WG members may be affiliated with the same +employer. If removal or resignation of a WG member, or a change of +employment by a WG member, creates a situation where more than 1/3 of +the WG membership shares an employer, then the situation must be +immediately remedied by the resignation or removal of one or more WG +members affiliated with the over-represented employer(s). + +### WG Meetings + +The WG meets occasionally on a Google Hangout On Air. A designated moderator +approved by the WG runs the meeting. Each meeting should be +published to YouTube. + +Items are added to the WG agenda that are considered contentious or +are modifications of governance, contribution policy, WG membership, +or release process. + +The intention of the agenda is not to approve or review all patches; +that should happen continuously on GitHub and be handled by the larger +group of Collaborators. + +Any community member or contributor can ask that something be added to +the next meeting's agenda by logging a GitHub Issue. Any Collaborator, +WG member or the moderator can add the item to the agenda by adding +the ***WG-agenda*** tag to the issue. + +Prior to each WG meeting the moderator will share the Agenda with +members of the WG. WG members can add any items they like to the +agenda at the beginning of each meeting. The moderator and the WG +cannot veto or remove items. + +The WG may invite persons or representatives from certain projects to +participate in a non-voting capacity. + +The moderator is responsible for summarizing the discussion of each +agenda item and sends it as a pull request after the meeting. + +### Consensus Seeking Process + +The WG follows a +[Consensus +Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) +decision-making model. + +When an agenda item has appeared to reach a consensus the moderator +will ask "Does anyone object?" as a final call for dissent from the +consensus. + +If an agenda item cannot reach a consensus a WG member can call for +either a closing vote or a vote to table the issue to the next +meeting. The call for a vote must be seconded by a majority of the WG +or else the discussion will continue. Simple majority wins. + +Note that changes to WG membership require a majority consensus. See +"WG Membership" above. diff --git a/html/RentForCamp/node_modules/readable-stream/LICENSE b/html/RentForCamp/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000..2873b3b --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/LICENSE @@ -0,0 +1,47 @@ +Node.js is licensed for use as follows: + +""" +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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node 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/html/RentForCamp/node_modules/readable-stream/README.md b/html/RentForCamp/node_modules/readable-stream/README.md new file mode 100644 index 0000000..23fe3f3 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/README.md @@ -0,0 +1,58 @@ +# readable-stream + +***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams Working Group + +`readable-stream` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + + +## Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> +* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> + - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E +* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/html/RentForCamp/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/html/RentForCamp/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 0000000..83275f1 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state†+* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state†+* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data†approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/html/RentForCamp/node_modules/readable-stream/duplex-browser.js b/html/RentForCamp/node_modules/readable-stream/duplex-browser.js new file mode 100644 index 0000000..f8b2db8 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/duplex-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_duplex.js'); diff --git a/html/RentForCamp/node_modules/readable-stream/duplex.js b/html/RentForCamp/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000..46924cb --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require('./readable').Duplex diff --git a/html/RentForCamp/node_modules/readable-stream/lib/_stream_duplex.js b/html/RentForCamp/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000..a1ca813 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,131 @@ +// 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. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; \ No newline at end of file diff --git a/html/RentForCamp/node_modules/readable-stream/lib/_stream_passthrough.js b/html/RentForCamp/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000..a9c8358 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,47 @@ +// 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. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; \ No newline at end of file diff --git a/html/RentForCamp/node_modules/readable-stream/lib/_stream_readable.js b/html/RentForCamp/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000..bf34ac6 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,1019 @@ +// 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. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/readable-stream/lib/_stream_transform.js b/html/RentForCamp/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000..5d1f8b8 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,214 @@ +// 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. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/readable-stream/lib/_stream_writable.js b/html/RentForCamp/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000..b3f4e85 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,687 @@ +// 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. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; \ No newline at end of file diff --git a/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/BufferList.js b/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 0000000..aefc68b --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,79 @@ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/destroy.js b/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/destroy.js new file mode 100644 index 0000000..5a0a0d8 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/destroy.js @@ -0,0 +1,74 @@ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; \ No newline at end of file diff --git a/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/stream-browser.js new file mode 100644 index 0000000..9332a3f --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/stream-browser.js @@ -0,0 +1 @@ +module.exports = require('events').EventEmitter; diff --git a/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/stream.js b/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/stream.js new file mode 100644 index 0000000..ce2ad5b --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/lib/internal/streams/stream.js @@ -0,0 +1 @@ +module.exports = require('stream'); diff --git a/html/RentForCamp/node_modules/readable-stream/package.json b/html/RentForCamp/node_modules/readable-stream/package.json new file mode 100644 index 0000000..ecfaf61 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/package.json @@ -0,0 +1,140 @@ +{ + "_args": [ + [ + { + "raw": "readable-stream@2.3.6", + "scope": null, + "escapedName": "readable-stream", + "name": "readable-stream", + "rawSpec": "2.3.6", + "spec": "2.3.6", + "type": "version" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/mysql" + ] + ], + "_from": "readable-stream@2.3.6", + "_hasShrinkwrap": false, + "_id": "readable-stream@2.3.6", + "_inCache": true, + "_location": "/readable-stream", + "_nodeVersion": "8.10.0", + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/readable-stream_2.3.6_1522856414086_0.18438932255173968" + }, + "_npmUser": { + "name": "matteo.collina", + "email": "hello@matteocollina.com" + }, + "_npmVersion": "5.8.0", + "_phantomChildren": {}, + "_requested": { + "raw": "readable-stream@2.3.6", + "scope": null, + "escapedName": "readable-stream", + "name": "readable-stream", + "rawSpec": "2.3.6", + "spec": "2.3.6", + "type": "version" + }, + "_requiredBy": [ + "/mysql" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "_shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "_shrinkwrap": null, + "_spec": "readable-stream@2.3.6", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/mysql", + "browser": { + "util": false, + "./readable.js": "./readable-browser.js", + "./writable.js": "./writable-browser.js", + "./duplex.js": "./duplex-browser.js", + "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "^1.4.0", + "babel-polyfill": "^6.9.1", + "buffer": "^4.9.0", + "lolex": "^2.3.2", + "nyc": "^6.4.0", + "tap": "^0.7.0", + "tape": "^4.8.0" + }, + "directories": {}, + "dist": { + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "shasum": "b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf", + "tarball": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "fileCount": 24, + "unpackedSize": 87961 + }, + "gitHead": "b3cf9b1f46eaa1865930ae03b96d7a4a570746f0", + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "maintainers": [ + { + "name": "cwmma", + "email": "calvin.metcalf@gmail.com" + }, + { + "name": "isaacs", + "email": "i@izs.me" + }, + { + "name": "matteo.collina", + "email": "hello@matteocollina.com" + }, + { + "name": "nodejs-foundation", + "email": "build@iojs.org" + }, + { + "name": "rvagg", + "email": "r@va.gg" + }, + { + "name": "tootallnate", + "email": "nathan@tootallnate.net" + } + ], + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "cover": "nyc npm test", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" + }, + "version": "2.3.6" +} diff --git a/html/RentForCamp/node_modules/readable-stream/passthrough.js b/html/RentForCamp/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000..ffd791d --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require('./readable').PassThrough diff --git a/html/RentForCamp/node_modules/readable-stream/readable-browser.js b/html/RentForCamp/node_modules/readable-stream/readable-browser.js new file mode 100644 index 0000000..e503725 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/readable-browser.js @@ -0,0 +1,7 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/html/RentForCamp/node_modules/readable-stream/readable.js b/html/RentForCamp/node_modules/readable-stream/readable.js new file mode 100644 index 0000000..ec89ec5 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/readable.js @@ -0,0 +1,19 @@ +var Stream = require('stream'); +if (process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; + exports = module.exports = Stream.Readable; + exports.Readable = Stream.Readable; + exports.Writable = Stream.Writable; + exports.Duplex = Stream.Duplex; + exports.Transform = Stream.Transform; + exports.PassThrough = Stream.PassThrough; + exports.Stream = Stream; +} else { + exports = module.exports = require('./lib/_stream_readable.js'); + exports.Stream = Stream || exports; + exports.Readable = exports; + exports.Writable = require('./lib/_stream_writable.js'); + exports.Duplex = require('./lib/_stream_duplex.js'); + exports.Transform = require('./lib/_stream_transform.js'); + exports.PassThrough = require('./lib/_stream_passthrough.js'); +} diff --git a/html/RentForCamp/node_modules/readable-stream/transform.js b/html/RentForCamp/node_modules/readable-stream/transform.js new file mode 100644 index 0000000..b1baba2 --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require('./readable').Transform diff --git a/html/RentForCamp/node_modules/readable-stream/writable-browser.js b/html/RentForCamp/node_modules/readable-stream/writable-browser.js new file mode 100644 index 0000000..ebdde6a --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/writable-browser.js @@ -0,0 +1 @@ +module.exports = require('./lib/_stream_writable.js'); diff --git a/html/RentForCamp/node_modules/readable-stream/writable.js b/html/RentForCamp/node_modules/readable-stream/writable.js new file mode 100644 index 0000000..3211a6f --- /dev/null +++ b/html/RentForCamp/node_modules/readable-stream/writable.js @@ -0,0 +1,8 @@ +var Stream = require("stream") +var Writable = require("./lib/_stream_writable.js") + +if (process.env.READABLE_STREAM === 'disable') { + module.exports = Stream && Stream.Writable || Writable +} else { + module.exports = Writable +} diff --git a/html/RentForCamp/node_modules/sqlstring/HISTORY.md b/html/RentForCamp/node_modules/sqlstring/HISTORY.md new file mode 100644 index 0000000..e2c7e51 --- /dev/null +++ b/html/RentForCamp/node_modules/sqlstring/HISTORY.md @@ -0,0 +1,43 @@ +2.3.1 / 2018-02-24 +================== + + * Fix incorrectly replacing non-placeholders in SQL + +2.3.0 / 2017-10-01 +================== + + * Add `.toSqlString()` escape overriding + * Add `raw` method to wrap raw strings for escape overriding + * Small performance improvement on `escapeId` + +2.2.0 / 2016-11-01 +================== + + * Escape invalid `Date` objects as `NULL` + +2.1.0 / 2016-09-26 +================== + + * Accept numbers and other value types in `escapeId` + * Run `buffer.toString()` through escaping + +2.0.1 / 2016-06-06 +================== + + * Fix npm package to include missing `lib/` directory + +2.0.0 / 2016-06-06 +================== + + * Bring repository up-to-date with `mysql` module changes + * Support Node.js 0.6.x + +1.0.0 / 2014-11-09 +================== + + * Support Node.js 0.8.x + +0.0.1 / 2014-02-25 +================== + + * Initial release diff --git a/html/RentForCamp/node_modules/sqlstring/LICENSE b/html/RentForCamp/node_modules/sqlstring/LICENSE new file mode 100644 index 0000000..c7ff12a --- /dev/null +++ b/html/RentForCamp/node_modules/sqlstring/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and 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. diff --git a/html/RentForCamp/node_modules/sqlstring/README.md b/html/RentForCamp/node_modules/sqlstring/README.md new file mode 100644 index 0000000..fafe6f4 --- /dev/null +++ b/html/RentForCamp/node_modules/sqlstring/README.md @@ -0,0 +1,206 @@ +# sqlstring + +[![NPM Version][npm-version-image]][npm-url] +[![NPM Downloads][npm-downloads-image]][npm-url] +[![Node.js Version][node-image]][node-url] +[![Build Status][travis-image]][travis-url] +[![Coverage Status][coveralls-image]][coveralls-url] + +Simple SQL escape and format for MySQL + +## Install + +```sh +$ npm install sqlstring +``` + +## Usage + + + +```js +var SqlString = require('sqlstring'); +``` + +### Escaping query values + +**Caution** These methods of escaping values only works when the +[NO_BACKSLASH_ESCAPES](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_backslash_escapes) +SQL mode is disabled (which is the default state for MySQL servers). + +In order to avoid SQL Injection attacks, you should always escape any user +provided data before using it inside a SQL query. You can do so using the +`SqlString.escape()` method: + +```js +var userId = 'some user provided value'; +var sql = 'SELECT * FROM users WHERE id = ' + SqlString.escape(userId); +console.log(sql); // SELECT * FROM users WHERE id = 'some user provided value' +``` + +Alternatively, you can use `?` characters as placeholders for values you would +like to have escaped like this: + +```js +var userId = 1; +var sql = SqlString.format('SELECT * FROM users WHERE id = ?', [userId]); +console.log(sql); // SELECT * FROM users WHERE id = 1 +``` + +Multiple placeholders are mapped to values in the same order as passed. For example, +in the following query `foo` equals `a`, `bar` equals `b`, `baz` equals `c`, and +`id` will be `userId`: + +```js +var userId = 1; +var sql = SqlString.format('UPDATE users SET foo = ?, bar = ?, baz = ? WHERE id = ?', + ['a', 'b', 'c', userId]); +console.log(sql); // UPDATE users SET foo = 'a', bar = 'b', baz = 'c' WHERE id = 1 +``` + +This looks similar to prepared statements in MySQL, however it really just uses +the same `SqlString.escape()` method internally. + +**Caution** This also differs from prepared statements in that all `?` are +replaced, even those contained in comments and strings. + +Different value types are escaped differently, here is how: + +* Numbers are left untouched +* Booleans are converted to `true` / `false` +* Date objects are converted to `'YYYY-mm-dd HH:ii:ss'` strings +* Buffers are converted to hex strings, e.g. `X'0fa5'` +* Strings are safely escaped +* Arrays are turned into list, e.g. `['a', 'b']` turns into `'a', 'b'` +* Nested arrays are turned into grouped lists (for bulk inserts), e.g. `[['a', + 'b'], ['c', 'd']]` turns into `('a', 'b'), ('c', 'd')` +* Objects that have a `toSqlString` method will have `.toSqlString()` called + and the returned value is used as the raw SQL. +* Objects are turned into `key = 'val'` pairs for each enumerable property on + the object. If the property's value is a function, it is skipped; if the + property's value is an object, toString() is called on it and the returned + value is used. +* `undefined` / `null` are converted to `NULL` +* `NaN` / `Infinity` are left as-is. MySQL does not support these, and trying + to insert them as values will trigger MySQL errors until they implement + support. + +You may have noticed that this escaping allows you to do neat things like this: + +```js +var post = {id: 1, title: 'Hello MySQL'}; +var sql = SqlString.format('INSERT INTO posts SET ?', post); +console.log(sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL' +``` + +And the `toSqlString` method allows you to form complex queries with functions: + +```js +var CURRENT_TIMESTAMP = { toSqlString: function() { return 'CURRENT_TIMESTAMP()'; } }; +var sql = SqlString.format('UPDATE posts SET modified = ? WHERE id = ?', [CURRENT_TIMESTAMP, 42]); +console.log(sql); // UPDATE posts SET modified = CURRENT_TIMESTAMP() WHERE id = 42 +``` + +To generate objects with a `toSqlString` method, the `SqlString.raw()` method can +be used. This creates an object that will be left un-touched when using in a `?` +placeholder, useful for using functions as dynamic values: + +**Caution** The string provided to `SqlString.raw()` will skip all escaping +functions when used, so be careful when passing in unvalidated input. + +```js +var CURRENT_TIMESTAMP = SqlString.raw('CURRENT_TIMESTAMP()'); +var sql = SqlString.format('UPDATE posts SET modified = ? WHERE id = ?', [CURRENT_TIMESTAMP, 42]); +console.log(sql); // UPDATE posts SET modified = CURRENT_TIMESTAMP() WHERE id = 42 +``` + +If you feel the need to escape queries by yourself, you can also use the escaping +function directly: + +```js +var sql = 'SELECT * FROM posts WHERE title=' + SqlString.escape('Hello MySQL'); +console.log(sql); // SELECT * FROM posts WHERE title='Hello MySQL' +``` + +### Escaping query identifiers + +If you can't trust an SQL identifier (database / table / column name) because it is +provided by a user, you should escape it with `SqlString.escapeId(identifier)` like this: + +```js +var sorter = 'date'; +var sql = 'SELECT * FROM posts ORDER BY ' + SqlString.escapeId(sorter); +console.log(sql); // SELECT * FROM posts ORDER BY `date` +``` + +It also supports adding qualified identifiers. It will escape both parts. + +```js +var sorter = 'date'; +var sql = 'SELECT * FROM posts ORDER BY ' + SqlString.escapeId('posts.' + sorter); +console.log(sql); // SELECT * FROM posts ORDER BY `posts`.`date` +``` + +If you do not want to treat `.` as qualified identifiers, you can set the second +argument to `true` in order to keep the string as a literal identifier: + +```js +var sorter = 'date.2'; +var sql = 'SELECT * FROM posts ORDER BY ' + SqlString.escapeId(sorter, true); +console.log(sql); // SELECT * FROM posts ORDER BY `date.2` +``` + +Alternatively, you can use `??` characters as placeholders for identifiers you would +like to have escaped like this: + +```js +var userId = 1; +var columns = ['username', 'email']; +var sql = SqlString.format('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId]); +console.log(sql); // SELECT `username`, `email` FROM `users` WHERE id = 1 +``` +**Please note that this last character sequence is experimental and syntax might change** + +When you pass an Object to `.escape()` or `.format()`, `.escapeId()` is used to avoid SQL injection in object keys. + +### Formatting queries + +You can use `SqlString.format` to prepare a query with multiple insertion points, +utilizing the proper escaping for ids and values. A simple example of this follows: + +```js +var userId = 1; +var inserts = ['users', 'id', userId]; +var sql = SqlString.format('SELECT * FROM ?? WHERE ?? = ?', inserts); +console.log(sql); // SELECT * FROM `users` WHERE `id` = 1 +``` + +Following this you then have a valid, escaped query that you can then send to the database safely. +This is useful if you are looking to prepare the query before actually sending it to the database. +You also have the option (but are not required) to pass in `stringifyObject` and `timeZone`, +allowing you provide a custom means of turning objects into strings, as well as a +location-specific/timezone-aware `Date`. + +This can be further combined with the `SqlString.raw()` helper to generate SQL +that includes MySQL functions as dynamic vales: + +```js +var userId = 1; +var data = { email: 'foobar@example.com', modified: SqlString.raw('NOW()') }; +var sql = SqlString.format('UPDATE ?? SET ? WHERE `id` = ?', ['users', data, userId]); +console.log(sql); // UPDATE `users` SET `email` = 'foobar@example.com', `modified` = NOW() WHERE `id` = 1 +``` + +## License + +[MIT](LICENSE) + +[npm-version-image]: https://img.shields.io/npm/v/sqlstring.svg +[npm-downloads-image]: https://img.shields.io/npm/dm/sqlstring.svg +[npm-url]: https://npmjs.org/package/sqlstring +[travis-image]: https://img.shields.io/travis/mysqljs/sqlstring/master.svg +[travis-url]: https://travis-ci.org/mysqljs/sqlstring +[coveralls-image]: https://img.shields.io/coveralls/mysqljs/sqlstring/master.svg +[coveralls-url]: https://coveralls.io/r/mysqljs/sqlstring?branch=master +[node-image]: https://img.shields.io/node/v/sqlstring.svg +[node-url]: https://nodejs.org/en/download diff --git a/html/RentForCamp/node_modules/sqlstring/index.js b/html/RentForCamp/node_modules/sqlstring/index.js new file mode 100644 index 0000000..4ef5944 --- /dev/null +++ b/html/RentForCamp/node_modules/sqlstring/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/SqlString'); diff --git a/html/RentForCamp/node_modules/sqlstring/lib/SqlString.js b/html/RentForCamp/node_modules/sqlstring/lib/SqlString.js new file mode 100644 index 0000000..419adec --- /dev/null +++ b/html/RentForCamp/node_modules/sqlstring/lib/SqlString.js @@ -0,0 +1,237 @@ +var SqlString = exports; + +var ID_GLOBAL_REGEXP = /`/g; +var QUAL_GLOBAL_REGEXP = /\./g; +var CHARS_GLOBAL_REGEXP = /[\0\b\t\n\r\x1a\"\'\\]/g; // eslint-disable-line no-control-regex +var CHARS_ESCAPE_MAP = { + '\0' : '\\0', + '\b' : '\\b', + '\t' : '\\t', + '\n' : '\\n', + '\r' : '\\r', + '\x1a' : '\\Z', + '"' : '\\"', + '\'' : '\\\'', + '\\' : '\\\\' +}; + +SqlString.escapeId = function escapeId(val, forbidQualified) { + if (Array.isArray(val)) { + var sql = ''; + + for (var i = 0; i < val.length; i++) { + sql += (i === 0 ? '' : ', ') + SqlString.escapeId(val[i], forbidQualified); + } + + return sql; + } else if (forbidQualified) { + return '`' + String(val).replace(ID_GLOBAL_REGEXP, '``') + '`'; + } else { + return '`' + String(val).replace(ID_GLOBAL_REGEXP, '``').replace(QUAL_GLOBAL_REGEXP, '`.`') + '`'; + } +}; + +SqlString.escape = function escape(val, stringifyObjects, timeZone) { + if (val === undefined || val === null) { + return 'NULL'; + } + + switch (typeof val) { + case 'boolean': return (val) ? 'true' : 'false'; + case 'number': return val + ''; + case 'object': + if (val instanceof Date) { + return SqlString.dateToString(val, timeZone || 'local'); + } else if (Array.isArray(val)) { + return SqlString.arrayToList(val, timeZone); + } else if (Buffer.isBuffer(val)) { + return SqlString.bufferToString(val); + } else if (typeof val.toSqlString === 'function') { + return String(val.toSqlString()); + } else if (stringifyObjects) { + return escapeString(val.toString()); + } else { + return SqlString.objectToValues(val, timeZone); + } + default: return escapeString(val); + } +}; + +SqlString.arrayToList = function arrayToList(array, timeZone) { + var sql = ''; + + for (var i = 0; i < array.length; i++) { + var val = array[i]; + + if (Array.isArray(val)) { + sql += (i === 0 ? '' : ', ') + '(' + SqlString.arrayToList(val, timeZone) + ')'; + } else { + sql += (i === 0 ? '' : ', ') + SqlString.escape(val, true, timeZone); + } + } + + return sql; +}; + +SqlString.format = function format(sql, values, stringifyObjects, timeZone) { + if (values == null) { + return sql; + } + + if (!(values instanceof Array || Array.isArray(values))) { + values = [values]; + } + + var chunkIndex = 0; + var placeholdersRegex = /\?+/g; + var result = ''; + var valuesIndex = 0; + var match; + + while (valuesIndex < values.length && (match = placeholdersRegex.exec(sql))) { + var len = match[0].length; + + if (len > 2) { + continue; + } + + var value = len === 2 + ? SqlString.escapeId(values[valuesIndex]) + : SqlString.escape(values[valuesIndex], stringifyObjects, timeZone); + + result += sql.slice(chunkIndex, match.index) + value; + chunkIndex = placeholdersRegex.lastIndex; + valuesIndex++; + } + + if (chunkIndex === 0) { + // Nothing was replaced + return sql; + } + + if (chunkIndex < sql.length) { + return result + sql.slice(chunkIndex); + } + + return result; +}; + +SqlString.dateToString = function dateToString(date, timeZone) { + var dt = new Date(date); + + if (isNaN(dt.getTime())) { + return 'NULL'; + } + + var year; + var month; + var day; + var hour; + var minute; + var second; + var millisecond; + + if (timeZone === 'local') { + year = dt.getFullYear(); + month = dt.getMonth() + 1; + day = dt.getDate(); + hour = dt.getHours(); + minute = dt.getMinutes(); + second = dt.getSeconds(); + millisecond = dt.getMilliseconds(); + } else { + var tz = convertTimezone(timeZone); + + if (tz !== false && tz !== 0) { + dt.setTime(dt.getTime() + (tz * 60000)); + } + + year = dt.getUTCFullYear(); + month = dt.getUTCMonth() + 1; + day = dt.getUTCDate(); + hour = dt.getUTCHours(); + minute = dt.getUTCMinutes(); + second = dt.getUTCSeconds(); + millisecond = dt.getUTCMilliseconds(); + } + + // YYYY-MM-DD HH:mm:ss.mmm + var str = zeroPad(year, 4) + '-' + zeroPad(month, 2) + '-' + zeroPad(day, 2) + ' ' + + zeroPad(hour, 2) + ':' + zeroPad(minute, 2) + ':' + zeroPad(second, 2) + '.' + + zeroPad(millisecond, 3); + + return escapeString(str); +}; + +SqlString.bufferToString = function bufferToString(buffer) { + return 'X' + escapeString(buffer.toString('hex')); +}; + +SqlString.objectToValues = function objectToValues(object, timeZone) { + var sql = ''; + + for (var key in object) { + var val = object[key]; + + if (typeof val === 'function') { + continue; + } + + sql += (sql.length === 0 ? '' : ', ') + SqlString.escapeId(key) + ' = ' + SqlString.escape(val, true, timeZone); + } + + return sql; +}; + +SqlString.raw = function raw(sql) { + if (typeof sql !== 'string') { + throw new TypeError('argument sql must be a string'); + } + + return { + toSqlString: function toSqlString() { return sql; } + }; +}; + +function escapeString(val) { + var chunkIndex = CHARS_GLOBAL_REGEXP.lastIndex = 0; + var escapedVal = ''; + var match; + + while ((match = CHARS_GLOBAL_REGEXP.exec(val))) { + escapedVal += val.slice(chunkIndex, match.index) + CHARS_ESCAPE_MAP[match[0]]; + chunkIndex = CHARS_GLOBAL_REGEXP.lastIndex; + } + + if (chunkIndex === 0) { + // Nothing was escaped + return "'" + val + "'"; + } + + if (chunkIndex < val.length) { + return "'" + escapedVal + val.slice(chunkIndex) + "'"; + } + + return "'" + escapedVal + "'"; +} + +function zeroPad(number, length) { + number = number.toString(); + while (number.length < length) { + number = '0' + number; + } + + return number; +} + +function convertTimezone(tz) { + if (tz === 'Z') { + return 0; + } + + var m = tz.match(/([\+\-\s])(\d\d):?(\d\d)?/); + if (m) { + return (m[1] === '-' ? -1 : 1) * (parseInt(m[2], 10) + ((m[3] ? parseInt(m[3], 10) : 0) / 60)) * 60; + } + return false; +} diff --git a/html/RentForCamp/node_modules/sqlstring/package.json b/html/RentForCamp/node_modules/sqlstring/package.json new file mode 100644 index 0000000..c3332c6 --- /dev/null +++ b/html/RentForCamp/node_modules/sqlstring/package.json @@ -0,0 +1,144 @@ +{ + "_args": [ + [ + { + "raw": "sqlstring@2.3.1", + "scope": null, + "escapedName": "sqlstring", + "name": "sqlstring", + "rawSpec": "2.3.1", + "spec": "2.3.1", + "type": "version" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/mysql" + ] + ], + "_from": "sqlstring@2.3.1", + "_id": "sqlstring@2.3.1", + "_inCache": true, + "_location": "/sqlstring", + "_nodeVersion": "6.11.1", + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/sqlstring_2.3.1_1519516938645_0.9513261619591036" + }, + "_npmUser": { + "name": "dougwilson", + "email": "doug@somethingdoug.com" + }, + "_npmVersion": "3.10.10", + "_phantomChildren": {}, + "_requested": { + "raw": "sqlstring@2.3.1", + "scope": null, + "escapedName": "sqlstring", + "name": "sqlstring", + "rawSpec": "2.3.1", + "spec": "2.3.1", + "type": "version" + }, + "_requiredBy": [ + "/mysql" + ], + "_resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "_shasum": "475393ff9e91479aea62dcaf0ca3d14983a7fb40", + "_shrinkwrap": null, + "_spec": "sqlstring@2.3.1", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/mysql", + "bugs": { + "url": "https://github.com/mysqljs/sqlstring/issues" + }, + "contributors": [ + { + "name": "Adri Van Houdt", + "email": "adri.van.houdt@gmail.com" + }, + { + "name": "Douglas Christopher Wilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "fengmk2", + "email": "fengmk2@gmail.com", + "url": "http://fengmk2.github.com" + }, + { + "name": "Kevin Jose Martin", + "email": "kevin@tiliq.com" + }, + { + "name": "Nathan Woltman", + "email": "nwoltman@outlook.com" + }, + { + "name": "Sergej Sintschilin", + "email": "seregpie@gmail.com" + } + ], + "dependencies": {}, + "description": "Simple SQL escape and format for MySQL", + "devDependencies": { + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", + "eslint": "4.18.1", + "eslint-plugin-markdown": "1.0.0-beta.6", + "nyc": "10.3.2", + "urun": "0.0.8", + "utest": "0.0.8" + }, + "directories": {}, + "dist": { + "shasum": "475393ff9e91479aea62dcaf0ca3d14983a7fb40", + "tarball": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "fileCount": 6, + "unpackedSize": 17037 + }, + "engines": { + "node": ">= 0.6" + }, + "files": [ + "lib/", + "HISTORY.md", + "LICENSE", + "README.md", + "index.js" + ], + "gitHead": "8f193cae10a2208010102fd50f0b61e869e14dcb", + "homepage": "https://github.com/mysqljs/sqlstring#readme", + "keywords": [ + "sqlstring", + "sql", + "escape", + "sql escape" + ], + "license": "MIT", + "maintainers": [ + { + "name": "dougwilson", + "email": "doug@somethingdoug.com" + }, + { + "name": "fengmk2", + "email": "fengmk2@gmail.com" + }, + { + "name": "sidorares", + "email": "sidorares@yandex.com" + } + ], + "name": "sqlstring", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/mysqljs/sqlstring.git" + }, + "scripts": { + "bench": "node benchmark/index.js", + "lint": "eslint --plugin markdown --ext js,md .", + "test": "node test/run.js", + "test-ci": "nyc --reporter=text npm test", + "test-cov": "nyc --reporter=html --reporter=text npm test" + }, + "version": "2.3.1" +} diff --git a/html/RentForCamp/node_modules/string_decoder/.travis.yml b/html/RentForCamp/node_modules/string_decoder/.travis.yml new file mode 100644 index 0000000..3347a72 --- /dev/null +++ b/html/RentForCamp/node_modules/string_decoder/.travis.yml @@ -0,0 +1,50 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.10' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.11' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: '0.12' + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 1 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 2 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 3 + env: + - TASK=test + - NPM_LEGACY=true + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 7 + env: TASK=test + - node_js: 8 + env: TASK=test + - node_js: 9 + env: TASK=test diff --git a/html/RentForCamp/node_modules/string_decoder/LICENSE b/html/RentForCamp/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000..778edb2 --- /dev/null +++ b/html/RentForCamp/node_modules/string_decoder/LICENSE @@ -0,0 +1,48 @@ +Node.js is licensed for use as follows: + +""" +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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node 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/html/RentForCamp/node_modules/string_decoder/README.md b/html/RentForCamp/node_modules/string_decoder/README.md new file mode 100644 index 0000000..5fd5831 --- /dev/null +++ b/html/RentForCamp/node_modules/string_decoder/README.md @@ -0,0 +1,47 @@ +# string_decoder + +***Node-core v8.9.4 string_decoder for userland*** + + +[![NPM](https://nodei.co/npm/string_decoder.png?downloads=true&downloadRank=true)](https://nodei.co/npm/string_decoder/) +[![NPM](https://nodei.co/npm-dl/string_decoder.png?&months=6&height=3)](https://nodei.co/npm/string_decoder/) + + +```bash +npm install --save string_decoder +``` + +***Node-core string_decoder for userland*** + +This package is a mirror of the string_decoder implementation in Node-core. + +Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.9.4/docs/api/). + +As of version 1.0.0 **string_decoder** uses semantic versioning. + +## Previous versions + +Previous version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. + +## Update + +The *build/* directory contains a build script that will scrape the source from the [nodejs/node](https://github.com/nodejs/node) repo given a specific Node version. + +## Streams Working Group + +`string_decoder` is maintained by the Streams Working Group, which +oversees the development and maintenance of the Streams API within +Node.js. The responsibilities of the Streams Working Group include: + +* Addressing stream issues on the Node.js issue tracker. +* Authoring and editing stream documentation within the Node.js project. +* Reviewing changes to stream subclasses within the Node.js project. +* Redirecting changes to streams from the Node.js project to this + project. +* Assisting in the implementation of stream providers within Node.js. +* Recommending versions of `readable-stream` to be included in Node.js. +* Messaging about the future of streams to give the community advance + notice of changes. + +See [readable-stream](https://github.com/nodejs/readable-stream) for +more details. diff --git a/html/RentForCamp/node_modules/string_decoder/lib/string_decoder.js b/html/RentForCamp/node_modules/string_decoder/lib/string_decoder.js new file mode 100644 index 0000000..2e89e63 --- /dev/null +++ b/html/RentForCamp/node_modules/string_decoder/lib/string_decoder.js @@ -0,0 +1,296 @@ +// 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. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} \ No newline at end of file diff --git a/html/RentForCamp/node_modules/string_decoder/package.json b/html/RentForCamp/node_modules/string_decoder/package.json new file mode 100644 index 0000000..99ff205 --- /dev/null +++ b/html/RentForCamp/node_modules/string_decoder/package.json @@ -0,0 +1,114 @@ +{ + "_args": [ + [ + { + "raw": "string_decoder@~1.1.1", + "scope": null, + "escapedName": "string_decoder", + "name": "string_decoder", + "rawSpec": "~1.1.1", + "spec": ">=1.1.1 <1.2.0", + "type": "range" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/readable-stream" + ] + ], + "_from": "string_decoder@>=1.1.1 <1.2.0", + "_hasShrinkwrap": false, + "_id": "string_decoder@1.1.1", + "_inCache": true, + "_location": "/string_decoder", + "_nodeVersion": "8.10.0", + "_npmOperationalInternal": { + "host": "s3://npm-registry-packages", + "tmp": "tmp/string_decoder_1.1.1_1522397654739_0.2722524344416213" + }, + "_npmUser": { + "name": "matteo.collina", + "email": "hello@matteocollina.com" + }, + "_npmVersion": "5.8.0", + "_phantomChildren": {}, + "_requested": { + "raw": "string_decoder@~1.1.1", + "scope": null, + "escapedName": "string_decoder", + "name": "string_decoder", + "rawSpec": "~1.1.1", + "spec": ">=1.1.1 <1.2.0", + "type": "range" + }, + "_requiredBy": [ + "/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "_shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "_shrinkwrap": null, + "_spec": "string_decoder@~1.1.1", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/readable-stream", + "bugs": { + "url": "https://github.com/nodejs/string_decoder/issues" + }, + "dependencies": { + "safe-buffer": "~5.1.0" + }, + "description": "The string_decoder module from Node core", + "devDependencies": { + "babel-polyfill": "^6.23.0", + "core-util-is": "^1.0.2", + "inherits": "^2.0.3", + "tap": "~0.4.8" + }, + "directories": {}, + "dist": { + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "shasum": "9cf1611ba62685d7030ae9e4ba34149c3af03fc8", + "tarball": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "fileCount": 5, + "unpackedSize": 15298 + }, + "gitHead": "18c7f89c894ced5f610505bb006dfde9a3d1ac5e", + "homepage": "https://github.com/nodejs/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "main": "lib/string_decoder.js", + "maintainers": [ + { + "name": "cwmma", + "email": "calvin.metcalf@gmail.com" + }, + { + "name": "matteo.collina", + "email": "hello@matteocollina.com" + }, + { + "name": "nodejs-foundation", + "email": "build@iojs.org" + }, + { + "name": "rvagg", + "email": "rod@vagg.org" + }, + { + "name": "substack", + "email": "substack@gmail.com" + } + ], + "name": "string_decoder", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/string_decoder.git" + }, + "scripts": { + "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", + "test": "tap test/parallel/*.js && node test/verify-dependencies" + }, + "version": "1.1.1" +} diff --git a/html/RentForCamp/node_modules/strip-ansi/cli.js b/html/RentForCamp/node_modules/strip-ansi/cli.js new file mode 100755 index 0000000..f8019cd --- /dev/null +++ b/html/RentForCamp/node_modules/strip-ansi/cli.js @@ -0,0 +1,27 @@ +#!/usr/bin/env node +'use strict'; +var fs = require('fs'); +var strip = require('./index'); +var input = process.argv[2]; + +if (process.argv.indexOf('-h') !== -1 || process.argv.indexOf('--help') !== -1) { + console.log('strip-ansi > '); + console.log('or'); + console.log('cat | strip-ansi > '); + return; +} + +if (process.argv.indexOf('-v') !== -1 || process.argv.indexOf('--version') !== -1) { + console.log(require('./package').version); + return; +} + +if (input) { + process.stdout.write(strip(fs.readFileSync(input, 'utf8'))); + return; +} + +process.stdin.setEncoding('utf8'); +process.stdin.on('data', function (data) { + process.stdout.write(strip(data)); +}); diff --git a/html/RentForCamp/node_modules/strip-ansi/index.js b/html/RentForCamp/node_modules/strip-ansi/index.js new file mode 100644 index 0000000..62320c5 --- /dev/null +++ b/html/RentForCamp/node_modules/strip-ansi/index.js @@ -0,0 +1,4 @@ +'use strict'; +module.exports = function (str) { + return typeof str === 'string' ? str.replace(/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]/g, '') : str; +}; diff --git a/html/RentForCamp/node_modules/strip-ansi/package.json b/html/RentForCamp/node_modules/strip-ansi/package.json new file mode 100644 index 0000000..4953ee0 --- /dev/null +++ b/html/RentForCamp/node_modules/strip-ansi/package.json @@ -0,0 +1,115 @@ +{ + "_args": [ + [ + { + "raw": "strip-ansi@~0.1.0", + "scope": null, + "escapedName": "strip-ansi", + "name": "strip-ansi", + "rawSpec": "~0.1.0", + "spec": ">=0.1.0 <0.2.0", + "type": "range" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/chalk" + ] + ], + "_from": "strip-ansi@>=0.1.0 <0.2.0", + "_id": "strip-ansi@0.1.1", + "_inCache": true, + "_location": "/strip-ansi", + "_npmUser": { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + }, + "_npmVersion": "1.3.15", + "_phantomChildren": {}, + "_requested": { + "raw": "strip-ansi@~0.1.0", + "scope": null, + "escapedName": "strip-ansi", + "name": "strip-ansi", + "rawSpec": "~0.1.0", + "spec": ">=0.1.0 <0.2.0", + "type": "range" + }, + "_requiredBy": [ + "/chalk" + ], + "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "_shasum": "39e8a98d044d150660abe4a6808acf70bb7bc991", + "_shrinkwrap": null, + "_spec": "strip-ansi@~0.1.0", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/chalk", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "bin": { + "strip-ansi": "cli.js" + }, + "bugs": { + "url": "https://github.com/sindresorhus/strip-ansi/issues" + }, + "dependencies": {}, + "description": "Strip ANSI escape codes (used for colorizing strings in the terminal)", + "devDependencies": { + "mocha": "~1.x" + }, + "directories": {}, + "dist": { + "shasum": "39e8a98d044d150660abe4a6808acf70bb7bc991", + "tarball": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz" + }, + "engines": { + "node": ">=0.8.0" + }, + "files": [ + "index.js", + "cli.js" + ], + "homepage": "https://github.com/sindresorhus/strip-ansi", + "keywords": [ + "strip", + "trim", + "remove", + "ansi", + "styles", + "color", + "colour", + "colors", + "terminal", + "console", + "cli", + "string", + "tty", + "escape", + "formatting", + "rgb", + "256", + "shell", + "xterm", + "log", + "logging", + "command-line", + "text" + ], + "license": "MIT", + "maintainers": [ + { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + } + ], + "name": "strip-ansi", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/strip-ansi.git" + }, + "scripts": { + "test": "mocha" + }, + "version": "0.1.1" +} diff --git a/html/RentForCamp/node_modules/strip-ansi/readme.md b/html/RentForCamp/node_modules/strip-ansi/readme.md new file mode 100644 index 0000000..eb661b3 --- /dev/null +++ b/html/RentForCamp/node_modules/strip-ansi/readme.md @@ -0,0 +1,46 @@ +# strip-ansi [![Build Status](https://secure.travis-ci.org/sindresorhus/strip-ansi.png?branch=master)](http://travis-ci.org/sindresorhus/strip-ansi) + +> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) (used for colorizing strings in the terminal) + +Used in the terminal color module [chalk](https://github.com/sindresorhus/chalk). + + +## Install + +Install locally with [npm](https://npmjs.org/package/strip-ansi): + +``` +npm install --save strip-ansi +``` + +Or globally if you want to use it as a CLI app: + +``` +npm install --global strip-ansi +``` + +You can then use it in your Terminal like: + +``` +strip-ansi file-with-color-codes +``` + +Or pipe something to it: + +``` +ls | strip-ansi +``` + + +## Example + +```js +var stripAnsi = require('strip-ansi'); +stripAnsi('\x1b[4mcake\x1b[0m'); +//=> cake +``` + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/html/RentForCamp/node_modules/underscore/LICENSE b/html/RentForCamp/node_modules/underscore/LICENSE new file mode 100644 index 0000000..0d6b873 --- /dev/null +++ b/html/RentForCamp/node_modules/underscore/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +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/html/RentForCamp/node_modules/underscore/README.md b/html/RentForCamp/node_modules/underscore/README.md new file mode 100644 index 0000000..c2ba259 --- /dev/null +++ b/html/RentForCamp/node_modules/underscore/README.md @@ -0,0 +1,22 @@ + __ + /\ \ __ + __ __ ___ \_\ \ __ _ __ ____ ___ ___ _ __ __ /\_\ ____ + /\ \/\ \ /' _ `\ /'_ \ /'__`\/\ __\/ ,__\ / ___\ / __`\/\ __\/'__`\ \/\ \ /',__\ + \ \ \_\ \/\ \/\ \/\ \ \ \/\ __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\ __/ __ \ \ \/\__, `\ + \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/ + \/___/ \/_/\/_/\/__,_ /\/____/ \/_/ \/___/ \/____/\/___/ \/_/ \/____/\/_//\ \_\ \/___/ + \ \____/ + \/___/ + +Underscore.js is a utility-belt library for JavaScript that provides +support for the usual functional suspects (each, map, reduce, filter...) +without extending any core JavaScript objects. + +For Docs, License, Tests, and pre-packed downloads, see: +http://underscorejs.org + +Underscore is an open-sourced component of DocumentCloud: +https://github.com/documentcloud + +Many thanks to our contributors: +https://github.com/jashkenas/underscore/contributors diff --git a/html/RentForCamp/node_modules/underscore/package.json b/html/RentForCamp/node_modules/underscore/package.json new file mode 100644 index 0000000..eb0e364 --- /dev/null +++ b/html/RentForCamp/node_modules/underscore/package.json @@ -0,0 +1,101 @@ +{ + "_args": [ + [ + { + "raw": "underscore@~1.6.0", + "scope": null, + "escapedName": "underscore", + "name": "underscore", + "rawSpec": "~1.6.0", + "spec": ">=1.6.0 <1.7.0", + "type": "range" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/nomnom" + ] + ], + "_from": "underscore@>=1.6.0 <1.7.0", + "_id": "underscore@1.6.0", + "_inCache": true, + "_location": "/underscore", + "_npmUser": { + "name": "jashkenas", + "email": "jashkenas@gmail.com" + }, + "_npmVersion": "1.3.21", + "_phantomChildren": {}, + "_requested": { + "raw": "underscore@~1.6.0", + "scope": null, + "escapedName": "underscore", + "name": "underscore", + "rawSpec": "~1.6.0", + "spec": ">=1.6.0 <1.7.0", + "type": "range" + }, + "_requiredBy": [ + "/nomnom" + ], + "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "_shasum": "8b38b10cacdef63337b8b24e4ff86d45aea529a8", + "_shrinkwrap": null, + "_spec": "underscore@~1.6.0", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/nomnom", + "author": { + "name": "Jeremy Ashkenas", + "email": "jeremy@documentcloud.org" + }, + "bugs": { + "url": "https://github.com/jashkenas/underscore/issues" + }, + "dependencies": {}, + "description": "JavaScript's functional programming helper library.", + "devDependencies": { + "docco": "0.6.x", + "phantomjs": "1.9.0-1", + "uglify-js": "2.4.x" + }, + "directories": {}, + "dist": { + "shasum": "8b38b10cacdef63337b8b24e4ff86d45aea529a8", + "tarball": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" + }, + "files": [ + "underscore.js", + "underscore-min.js", + "LICENSE" + ], + "homepage": "http://underscorejs.org", + "keywords": [ + "util", + "functional", + "server", + "client", + "browser" + ], + "licenses": [ + { + "type": "MIT", + "url": "https://raw.github.com/jashkenas/underscore/master/LICENSE" + } + ], + "main": "underscore.js", + "maintainers": [ + { + "name": "jashkenas", + "email": "jashkenas@gmail.com" + } + ], + "name": "underscore", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/jashkenas/underscore.git" + }, + "scripts": { + "build": "uglifyjs underscore.js -c \"evaluate=false\" --comments \"/ .*/\" -m --source-map underscore-min.map -o underscore-min.js", + "doc": "docco underscore.js", + "test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true" + }, + "version": "1.6.0" +} diff --git a/html/RentForCamp/node_modules/underscore/underscore-min.js b/html/RentForCamp/node_modules/underscore/underscore-min.js new file mode 100644 index 0000000..3434d6c --- /dev/null +++ b/html/RentForCamp/node_modules/underscore/underscore-min.js @@ -0,0 +1,6 @@ +// Underscore.js 1.6.0 +// http://underscorejs.org +// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?void(this._wrapped=n):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.6.0";var A=j.each=j.forEach=function(n,t,e){if(null==n)return n;if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return;return n};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var O="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},j.find=j.detect=function(n,t,r){var e;return k(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var k=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:k(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,j.property(t))},j.where=function(n,t){return j.filter(n,j.matches(t))},j.findWhere=function(n,t){return j.find(n,j.matches(t))},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);var e=-1/0,u=-1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;o>u&&(e=n,u=o)}),e},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);var e=1/0,u=1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;u>o&&(e=n,u=o)}),e},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e},j.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=j.values(n)),n[j.random(n.length-1)]):j.shuffle(n).slice(0,Math.max(0,t))};var E=function(n){return null==n?j.identity:j.isFunction(n)?n:j.property(n)};j.sortBy=function(n,t,r){return t=E(t),j.pluck(j.map(n,function(n,e,u){return{value:n,index:e,criteria:t.call(r,n,e,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=E(r),A(t,function(i,a){var o=r.call(e,i,a,t);n(u,o,i)}),u}};j.groupBy=F(function(n,t,r){j.has(n,t)?n[t].push(r):n[t]=[r]}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=E(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])t?[]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var M=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):M(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return M(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.partition=function(n,t){var r=[],e=[];return A(n,function(n){(t(n)?r:e).push(n)}),[r,e]},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.contains(t,n)})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===j&&(e[u]=arguments[r++]);for(;r=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u),e=u=null):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o,c=function(){var l=j.now()-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u),i=u=null))};return function(){i=this,u=arguments,a=j.now();var l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u),i=u=null),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return j.partial(t,n)},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=function(n){if(!j.isObject(n))return[];if(w)return w(n);var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o)&&"constructor"in n&&"constructor"in t)return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.constant=function(n){return function(){return n}},j.property=function(n){return function(t){return t[n]}},j.matches=function(n){return function(t){if(t===n)return!0;for(var r in n)if(n[r]!==t[r])return!1;return!0}},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},j.now=Date.now||function(){return(new Date).getTime()};var T={escape:{"&":"&","<":"<",">":">",'"':""","'":"'"}};T.unescape=j.invert(T.escape);var I={escape:new RegExp("["+j.keys(T.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(T.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(I[n],function(t){return T[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}}),"function"==typeof define&&define.amd&&define("underscore",[],function(){return j})}).call(this); +//# sourceMappingURL=underscore-min.map \ No newline at end of file diff --git a/html/RentForCamp/node_modules/underscore/underscore.js b/html/RentForCamp/node_modules/underscore/underscore.js new file mode 100644 index 0000000..9a4cabe --- /dev/null +++ b/html/RentForCamp/node_modules/underscore/underscore.js @@ -0,0 +1,1343 @@ +// Underscore.js 1.6.0 +// http://underscorejs.org +// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `exports` on the server. + var root = this; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Establish the object that gets returned to break out of a loop iteration. + var breaker = {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + + // Create quick reference variables for speed access to core prototypes. + var + push = ArrayProto.push, + slice = ArrayProto.slice, + concat = ArrayProto.concat, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var + nativeForEach = ArrayProto.forEach, + nativeMap = ArrayProto.map, + nativeReduce = ArrayProto.reduce, + nativeReduceRight = ArrayProto.reduceRight, + nativeFilter = ArrayProto.filter, + nativeEvery = ArrayProto.every, + nativeSome = ArrayProto.some, + nativeIndexOf = ArrayProto.indexOf, + nativeLastIndexOf = ArrayProto.lastIndexOf, + nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeBind = FuncProto.bind; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for the old `require()` API. If we're in + // the browser, add `_` as a global object via a string identifier, + // for Closure Compiler "advanced" mode. + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.6.0'; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles objects with the built-in `forEach`, arrays, and raw objects. + // Delegates to **ECMAScript 5**'s native `forEach` if available. + var each = _.each = _.forEach = function(obj, iterator, context) { + if (obj == null) return obj; + if (nativeForEach && obj.forEach === nativeForEach) { + obj.forEach(iterator, context); + } else if (obj.length === +obj.length) { + for (var i = 0, length = obj.length; i < length; i++) { + if (iterator.call(context, obj[i], i, obj) === breaker) return; + } + } else { + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; + } + } + return obj; + }; + + // Return the results of applying the iterator to each element. + // Delegates to **ECMAScript 5**'s native `map` if available. + _.map = _.collect = function(obj, iterator, context) { + var results = []; + if (obj == null) return results; + if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); + each(obj, function(value, index, list) { + results.push(iterator.call(context, value, index, list)); + }); + return results; + }; + + var reduceError = 'Reduce of empty array with no initial value'; + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. + _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { + var initial = arguments.length > 2; + if (obj == null) obj = []; + if (nativeReduce && obj.reduce === nativeReduce) { + if (context) iterator = _.bind(iterator, context); + return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); + } + each(obj, function(value, index, list) { + if (!initial) { + memo = value; + initial = true; + } else { + memo = iterator.call(context, memo, value, index, list); + } + }); + if (!initial) throw new TypeError(reduceError); + return memo; + }; + + // The right-associative version of reduce, also known as `foldr`. + // Delegates to **ECMAScript 5**'s native `reduceRight` if available. + _.reduceRight = _.foldr = function(obj, iterator, memo, context) { + var initial = arguments.length > 2; + if (obj == null) obj = []; + if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { + if (context) iterator = _.bind(iterator, context); + return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); + } + var length = obj.length; + if (length !== +length) { + var keys = _.keys(obj); + length = keys.length; + } + each(obj, function(value, index, list) { + index = keys ? keys[--length] : --length; + if (!initial) { + memo = obj[index]; + initial = true; + } else { + memo = iterator.call(context, memo, obj[index], index, list); + } + }); + if (!initial) throw new TypeError(reduceError); + return memo; + }; + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, predicate, context) { + var result; + any(obj, function(value, index, list) { + if (predicate.call(context, value, index, list)) { + result = value; + return true; + } + }); + return result; + }; + + // Return all the elements that pass a truth test. + // Delegates to **ECMAScript 5**'s native `filter` if available. + // Aliased as `select`. + _.filter = _.select = function(obj, predicate, context) { + var results = []; + if (obj == null) return results; + if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context); + each(obj, function(value, index, list) { + if (predicate.call(context, value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, predicate, context) { + return _.filter(obj, function(value, index, list) { + return !predicate.call(context, value, index, list); + }, context); + }; + + // Determine whether all of the elements match a truth test. + // Delegates to **ECMAScript 5**'s native `every` if available. + // Aliased as `all`. + _.every = _.all = function(obj, predicate, context) { + predicate || (predicate = _.identity); + var result = true; + if (obj == null) return result; + if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context); + each(obj, function(value, index, list) { + if (!(result = result && predicate.call(context, value, index, list))) return breaker; + }); + return !!result; + }; + + // Determine if at least one element in the object matches a truth test. + // Delegates to **ECMAScript 5**'s native `some` if available. + // Aliased as `any`. + var any = _.some = _.any = function(obj, predicate, context) { + predicate || (predicate = _.identity); + var result = false; + if (obj == null) return result; + if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context); + each(obj, function(value, index, list) { + if (result || (result = predicate.call(context, value, index, list))) return breaker; + }); + return !!result; + }; + + // Determine if the array or object contains a given value (using `===`). + // Aliased as `include`. + _.contains = _.include = function(obj, target) { + if (obj == null) return false; + if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; + return any(obj, function(value) { + return value === target; + }); + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = function(obj, method) { + var args = slice.call(arguments, 2); + var isFunc = _.isFunction(method); + return _.map(obj, function(value) { + return (isFunc ? method : value[method]).apply(value, args); + }); + }; + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, _.property(key)); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs) { + return _.filter(obj, _.matches(attrs)); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.find(obj, _.matches(attrs)); + }; + + // Return the maximum element or (element-based computation). + // Can't optimize arrays of integers longer than 65,535 elements. + // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797) + _.max = function(obj, iterator, context) { + if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { + return Math.max.apply(Math, obj); + } + var result = -Infinity, lastComputed = -Infinity; + each(obj, function(value, index, list) { + var computed = iterator ? iterator.call(context, value, index, list) : value; + if (computed > lastComputed) { + result = value; + lastComputed = computed; + } + }); + return result; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iterator, context) { + if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { + return Math.min.apply(Math, obj); + } + var result = Infinity, lastComputed = Infinity; + each(obj, function(value, index, list) { + var computed = iterator ? iterator.call(context, value, index, list) : value; + if (computed < lastComputed) { + result = value; + lastComputed = computed; + } + }); + return result; + }; + + // Shuffle an array, using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + _.shuffle = function(obj) { + var rand; + var index = 0; + var shuffled = []; + each(obj, function(value) { + rand = _.random(index++); + shuffled[index - 1] = shuffled[rand]; + shuffled[rand] = value; + }); + return shuffled; + }; + + // Sample **n** random values from a collection. + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (n == null || guard) { + if (obj.length !== +obj.length) obj = _.values(obj); + return obj[_.random(obj.length - 1)]; + } + return _.shuffle(obj).slice(0, Math.max(0, n)); + }; + + // An internal function to generate lookup iterators. + var lookupIterator = function(value) { + if (value == null) return _.identity; + if (_.isFunction(value)) return value; + return _.property(value); + }; + + // Sort the object's values by a criterion produced by an iterator. + _.sortBy = function(obj, iterator, context) { + iterator = lookupIterator(iterator); + return _.pluck(_.map(obj, function(value, index, list) { + return { + value: value, + index: index, + criteria: iterator.call(context, value, index, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior) { + return function(obj, iterator, context) { + var result = {}; + iterator = lookupIterator(iterator); + each(obj, function(value, index) { + var key = iterator.call(context, value, index, obj); + behavior(result, key, value); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, key, value) { + _.has(result, key) ? result[key].push(value) : result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, key, value) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, key) { + _.has(result, key) ? result[key]++ : result[key] = 1; + }); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iterator, context) { + iterator = lookupIterator(iterator); + var value = iterator.call(context, obj); + var low = 0, high = array.length; + while (low < high) { + var mid = (low + high) >>> 1; + iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid; + } + return low; + }; + + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (obj.length === +obj.length) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return (obj.length === +obj.length) ? obj.length : _.keys(obj).length; + }; + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null) return void 0; + if ((n == null) || guard) return array[0]; + if (n < 0) return []; + return slice.call(array, 0, n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. The **guard** check allows it to work with + // `_.map`. + _.initial = function(array, n, guard) { + return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. The **guard** check allows it to work with `_.map`. + _.last = function(array, n, guard) { + if (array == null) return void 0; + if ((n == null) || guard) return array[array.length - 1]; + return slice.call(array, Math.max(array.length - n, 0)); + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. The **guard** + // check allows it to work with `_.map`. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, (n == null) || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, _.identity); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, output) { + if (shallow && _.every(input, _.isArray)) { + return concat.apply(output, input); + } + each(input, function(value) { + if (_.isArray(value) || _.isArguments(value)) { + shallow ? push.apply(output, value) : flatten(value, shallow, output); + } else { + output.push(value); + } + }); + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, []); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = function(array) { + return _.difference(array, slice.call(arguments, 1)); + }; + + // Split an array into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = function(array, predicate) { + var pass = [], fail = []; + each(array, function(elem) { + (predicate(elem) ? pass : fail).push(elem); + }); + return [pass, fail]; + }; + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iterator, context) { + if (_.isFunction(isSorted)) { + context = iterator; + iterator = isSorted; + isSorted = false; + } + var initial = iterator ? _.map(array, iterator, context) : array; + var results = []; + var seen = []; + each(initial, function(value, index) { + if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) { + seen.push(value); + results.push(array[index]); + } + }); + return results; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = function() { + return _.uniq(_.flatten(arguments, true)); + }; + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var rest = slice.call(arguments, 1); + return _.filter(_.uniq(array), function(item) { + return _.every(rest, function(other) { + return _.contains(other, item); + }); + }); + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = function(array) { + var rest = concat.apply(ArrayProto, slice.call(arguments, 1)); + return _.filter(array, function(value){ return !_.contains(rest, value); }); + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = function() { + var length = _.max(_.pluck(arguments, 'length').concat(0)); + var results = new Array(length); + for (var i = 0; i < length; i++) { + results[i] = _.pluck(arguments, '' + i); + } + return results; + }; + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. + _.object = function(list, values) { + if (list == null) return {}; + var result = {}; + for (var i = 0, length = list.length; i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), + // we need this function. Return the position of the first occurrence of an + // item in an array, or -1 if the item is not included in the array. + // Delegates to **ECMAScript 5**'s native `indexOf` if available. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = function(array, item, isSorted) { + if (array == null) return -1; + var i = 0, length = array.length; + if (isSorted) { + if (typeof isSorted == 'number') { + i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted); + } else { + i = _.sortedIndex(array, item); + return array[i] === item ? i : -1; + } + } + if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); + for (; i < length; i++) if (array[i] === item) return i; + return -1; + }; + + // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. + _.lastIndexOf = function(array, item, from) { + if (array == null) return -1; + var hasIndex = from != null; + if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) { + return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item); + } + var i = (hasIndex ? from : array.length); + while (i--) if (array[i] === item) return i; + return -1; + }; + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (arguments.length <= 1) { + stop = start || 0; + start = 0; + } + step = arguments[2] || 1; + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var idx = 0; + var range = new Array(length); + + while(idx < length) { + range[idx++] = start; + start += step; + } + + return range; + }; + + // Function (ahem) Functions + // ------------------ + + // Reusable constructor function for prototype setting. + var ctor = function(){}; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = function(func, context) { + var args, bound; + if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError; + args = slice.call(arguments, 2); + return bound = function() { + if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); + ctor.prototype = func.prototype; + var self = new ctor; + ctor.prototype = null; + var result = func.apply(self, args.concat(slice.call(arguments))); + if (Object(result) === result) return result; + return self; + }; + }; + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder, allowing any combination of arguments to be pre-filled. + _.partial = function(func) { + var boundArgs = slice.call(arguments, 1); + return function() { + var position = 0; + var args = boundArgs.slice(); + for (var i = 0, length = args.length; i < length; i++) { + if (args[i] === _) args[i] = arguments[position++]; + } + while (position < arguments.length) args.push(arguments[position++]); + return func.apply(this, args); + }; + }; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = function(obj) { + var funcs = slice.call(arguments, 1); + if (funcs.length === 0) throw new Error('bindAll must be passed function names'); + each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); + return obj; + }; + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memo = {}; + hasher || (hasher = _.identity); + return function() { + var key = hasher.apply(this, arguments); + return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); + }; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = function(func, wait) { + var args = slice.call(arguments, 2); + return setTimeout(function(){ return func.apply(null, args); }, wait); + }; + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = function(func) { + return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); + }; + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + options || (options = {}); + var later = function() { + previous = options.leading === false ? 0 : _.now(); + timeout = null; + result = func.apply(context, args); + context = args = null; + }; + return function() { + var now = _.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, args, context, timestamp, result; + + var later = function() { + var last = _.now() - timestamp; + if (last < wait) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = _.now(); + var callNow = immediate && !timeout; + if (!timeout) { + timeout = setTimeout(later, wait); + } + if (callNow) { + result = func.apply(context, args); + context = args = null; + } + + return result; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = function(func) { + var ran = false, memo; + return function() { + if (ran) return memo; + ran = true; + memo = func.apply(this, arguments); + func = null; + return memo; + }; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var funcs = arguments; + return function() { + var args = arguments; + for (var i = funcs.length - 1; i >= 0; i--) { + args = [funcs[i].apply(this, args)]; + } + return args[0]; + }; + }; + + // Returns a function that will only be executed after being called N times. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Object Functions + // ---------------- + + // Retrieve the names of an object's properties. + // Delegates to **ECMAScript 5**'s native `Object.keys` + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (_.has(obj, key)) keys.push(key); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = new Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Convert an object into a list of `[key, value]` pairs. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = new Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods` + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = function(obj) { + each(slice.call(arguments, 1), function(source) { + if (source) { + for (var prop in source) { + obj[prop] = source[prop]; + } + } + }); + return obj; + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = function(obj) { + var copy = {}; + var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); + each(keys, function(key) { + if (key in obj) copy[key] = obj[key]; + }); + return copy; + }; + + // Return a copy of the object without the blacklisted properties. + _.omit = function(obj) { + var copy = {}; + var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); + for (var key in obj) { + if (!_.contains(keys, key)) copy[key] = obj[key]; + } + return copy; + }; + + // Fill in a given object with default properties. + _.defaults = function(obj) { + each(slice.call(arguments, 1), function(source) { + if (source) { + for (var prop in source) { + if (obj[prop] === void 0) obj[prop] = source[prop]; + } + } + }); + return obj; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Internal recursive comparison function for `isEqual`. + var eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a == 1 / b; + // A strict comparison is necessary because `null == undefined`. + if (a == null || b == null) return a === b; + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className != toString.call(b)) return false; + switch (className) { + // Strings, numbers, dates, and booleans are compared by value. + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return a == String(b); + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for + // other numeric values. + return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a == +b; + // RegExps are compared by their source patterns and flags. + case '[object RegExp]': + return a.source == b.source && + a.global == b.global && + a.multiline == b.multiline && + a.ignoreCase == b.ignoreCase; + } + if (typeof a != 'object' || typeof b != 'object') return false; + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] == a) return bStack[length] == b; + } + // Objects with different constructors are not equivalent, but `Object`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && + _.isFunction(bCtor) && (bCtor instanceof bCtor)) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + var size = 0, result = true; + // Recursively compare objects and arrays. + if (className == '[object Array]') { + // Compare array lengths to determine if a deep comparison is necessary. + size = a.length; + result = size == b.length; + if (result) { + // Deep compare the contents, ignoring non-numeric properties. + while (size--) { + if (!(result = eq(a[size], b[size], aStack, bStack))) break; + } + } + } else { + // Deep compare objects. + for (var key in a) { + if (_.has(a, key)) { + // Count the expected number of properties. + size++; + // Deep compare each member. + if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break; + } + } + // Ensure that both objects contain the same number of properties. + if (result) { + for (key in b) { + if (_.has(b, key) && !(size--)) break; + } + result = !size; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return result; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b, [], []); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; + for (var key in obj) if (_.has(obj, key)) return false; + return true; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) == '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + return obj === Object(obj); + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp. + each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) == '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return !!(obj && _.has(obj, 'callee')); + }; + } + + // Optimize `isFunction` if appropriate. + if (typeof (/./) !== 'function') { + _.isFunction = function(obj) { + return typeof obj === 'function'; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? (NaN is the only number which does not equal itself). + _.isNaN = function(obj) { + return _.isNumber(obj) && obj != +obj; + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, key) { + return hasOwnProperty.call(obj, key); + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iterators. + _.identity = function(value) { + return value; + }; + + _.constant = function(value) { + return function () { + return value; + }; + }; + + _.property = function(key) { + return function(obj) { + return obj[key]; + }; + }; + + // Returns a predicate for checking whether an object has a given set of `key:value` pairs. + _.matches = function(attrs) { + return function(obj) { + if (obj === attrs) return true; //avoid comparing an object to itself. + for (var key in attrs) { + if (attrs[key] !== obj[key]) + return false; + } + return true; + } + }; + + // Run a function **n** times. + _.times = function(n, iterator, context) { + var accum = Array(Math.max(0, n)); + for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { return new Date().getTime(); }; + + // List of HTML entities for escaping. + var entityMap = { + escape: { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + } + }; + entityMap.unescape = _.invert(entityMap.escape); + + // Regexes containing the keys and values listed immediately above. + var entityRegexes = { + escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'), + unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g') + }; + + // Functions for escaping and unescaping strings to/from HTML interpolation. + _.each(['escape', 'unescape'], function(method) { + _[method] = function(string) { + if (string == null) return ''; + return ('' + string).replace(entityRegexes[method], function(match) { + return entityMap[method][match]; + }); + }; + }); + + // If the value of the named `property` is a function then invoke it with the + // `object` as context; otherwise, return it. + _.result = function(object, property) { + if (object == null) return void 0; + var value = object[property]; + return _.isFunction(value) ? value.call(object) : value; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return result.call(this, func.apply(_, args)); + }; + }); + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g, + escape : /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\t': 't', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + _.template = function(text, data, settings) { + var render; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = new RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset) + .replace(escaper, function(match) { return '\\' + escapes[match]; }); + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } + if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } + if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + index = offset + match.length; + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + "return __p;\n"; + + try { + render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + if (data) return render(data, _); + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled function source as a convenience for precompilation. + template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function, which will delegate to the wrapper. + _.chain = function(obj) { + return _(obj).chain(); + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var result = function(obj) { + return this._chain ? _(obj).chain() : obj; + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0]; + return result.call(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return result.call(this, method.apply(this._wrapped, arguments)); + }; + }); + + _.extend(_.prototype, { + + // Start chaining a wrapped Underscore object. + chain: function() { + this._chain = true; + return this; + }, + + // Extracts the result from a wrapped and chained object. + value: function() { + return this._wrapped; + } + + }); + + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (typeof define === 'function' && define.amd) { + define('underscore', [], function() { + return _; + }); + } +}).call(this); diff --git a/html/RentForCamp/node_modules/util-deprecate/History.md b/html/RentForCamp/node_modules/util-deprecate/History.md new file mode 100644 index 0000000..acc8675 --- /dev/null +++ b/html/RentForCamp/node_modules/util-deprecate/History.md @@ -0,0 +1,16 @@ + +1.0.2 / 2015-10-07 +================== + + * use try/catch when checking `localStorage` (#3, @kumavis) + +1.0.1 / 2014-11-25 +================== + + * browser: use `console.warn()` for deprecation calls + * browser: more jsdocs + +1.0.0 / 2014-04-30 +================== + + * initial commit diff --git a/html/RentForCamp/node_modules/util-deprecate/LICENSE b/html/RentForCamp/node_modules/util-deprecate/LICENSE new file mode 100644 index 0000000..6a60e8c --- /dev/null +++ b/html/RentForCamp/node_modules/util-deprecate/LICENSE @@ -0,0 +1,24 @@ +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +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/html/RentForCamp/node_modules/util-deprecate/README.md b/html/RentForCamp/node_modules/util-deprecate/README.md new file mode 100644 index 0000000..75622fa --- /dev/null +++ b/html/RentForCamp/node_modules/util-deprecate/README.md @@ -0,0 +1,53 @@ +util-deprecate +============== +### The Node.js `util.deprecate()` function with browser support + +In Node.js, this module simply re-exports the `util.deprecate()` function. + +In the web browser (i.e. via browserify), a browser-specific implementation +of the `util.deprecate()` function is used. + + +## API + +A `deprecate()` function is the only thing exposed by this module. + +``` javascript +// setup: +exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead'); + + +// users see: +foo(); +// foo() is deprecated, use bar() instead +foo(); +foo(); +``` + + +## License + +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +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/html/RentForCamp/node_modules/util-deprecate/browser.js b/html/RentForCamp/node_modules/util-deprecate/browser.js new file mode 100644 index 0000000..549ae2f --- /dev/null +++ b/html/RentForCamp/node_modules/util-deprecate/browser.js @@ -0,0 +1,67 @@ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} diff --git a/html/RentForCamp/node_modules/util-deprecate/node.js b/html/RentForCamp/node_modules/util-deprecate/node.js new file mode 100644 index 0000000..5e6fcff --- /dev/null +++ b/html/RentForCamp/node_modules/util-deprecate/node.js @@ -0,0 +1,6 @@ + +/** + * For Node.js, simply re-export the core `util.deprecate` function. + */ + +module.exports = require('util').deprecate; diff --git a/html/RentForCamp/node_modules/util-deprecate/package.json b/html/RentForCamp/node_modules/util-deprecate/package.json new file mode 100644 index 0000000..be079b5 --- /dev/null +++ b/html/RentForCamp/node_modules/util-deprecate/package.json @@ -0,0 +1,89 @@ +{ + "_args": [ + [ + { + "raw": "util-deprecate@~1.0.1", + "scope": null, + "escapedName": "util-deprecate", + "name": "util-deprecate", + "rawSpec": "~1.0.1", + "spec": ">=1.0.1 <1.1.0", + "type": "range" + }, + "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/readable-stream" + ] + ], + "_from": "util-deprecate@>=1.0.1 <1.1.0", + "_id": "util-deprecate@1.0.2", + "_inCache": true, + "_location": "/util-deprecate", + "_nodeVersion": "4.1.2", + "_npmUser": { + "name": "tootallnate", + "email": "nathan@tootallnate.net" + }, + "_npmVersion": "2.14.4", + "_phantomChildren": {}, + "_requested": { + "raw": "util-deprecate@~1.0.1", + "scope": null, + "escapedName": "util-deprecate", + "name": "util-deprecate", + "rawSpec": "~1.0.1", + "spec": ">=1.0.1 <1.1.0", + "type": "range" + }, + "_requiredBy": [ + "/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "_shasum": "450d4dc9fa70de732762fbd2d4a28981419a0ccf", + "_shrinkwrap": null, + "_spec": "util-deprecate@~1.0.1", + "_where": "/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/readable-stream", + "author": { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://n8.io/" + }, + "browser": "browser.js", + "bugs": { + "url": "https://github.com/TooTallNate/util-deprecate/issues" + }, + "dependencies": {}, + "description": "The Node.js `util.deprecate()` function with browser support", + "devDependencies": {}, + "directories": {}, + "dist": { + "shasum": "450d4dc9fa70de732762fbd2d4a28981419a0ccf", + "tarball": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + }, + "gitHead": "475fb6857cd23fafff20c1be846c1350abf8e6d4", + "homepage": "https://github.com/TooTallNate/util-deprecate", + "keywords": [ + "util", + "deprecate", + "browserify", + "browser", + "node" + ], + "license": "MIT", + "main": "node.js", + "maintainers": [ + { + "name": "tootallnate", + "email": "nathan@tootallnate.net" + } + ], + "name": "util-deprecate", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/util-deprecate.git" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "version": "1.0.2" +} diff --git a/html/RentForCamp/npm-debug.log b/html/RentForCamp/npm-debug.log deleted file mode 100644 index a6ace11..0000000 --- a/html/RentForCamp/npm-debug.log +++ /dev/null @@ -1,45 +0,0 @@ -0 info it worked if it ends with ok -1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'start' ] -2 info using npm@3.10.9 -3 info using node@v6.9.2 -4 verbose run-script [ 'prestart', 'start', 'poststart' ] -5 info lifecycle RentForCamp@1.0.0~prestart: RentForCamp@1.0.0 -6 silly lifecycle RentForCamp@1.0.0~prestart: no script for prestart, continuing -7 info lifecycle RentForCamp@1.0.0~start: RentForCamp@1.0.0 -8 verbose lifecycle RentForCamp@1.0.0~start: unsafe-perm in lifecycle true -9 verbose lifecycle RentForCamp@1.0.0~start: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Server.app/Contents/ServerRoot/usr/bin:/Applications/Server.app/Contents/ServerRoot/usr/sbin:/usr/local/git/bin -10 verbose lifecycle RentForCamp@1.0.0~start: CWD: /Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp -11 silly lifecycle RentForCamp@1.0.0~start: Args: [ '-c', 'node ./bin/www' ] -12 silly lifecycle RentForCamp@1.0.0~start: Returned: code: 1 signal: null -13 info lifecycle RentForCamp@1.0.0~start: Failed to exec start script -14 verbose stack Error: RentForCamp@1.0.0 start: `node ./bin/www` -14 verbose stack Exit status 1 -14 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:255:16) -14 verbose stack at emitTwo (events.js:106:13) -14 verbose stack at EventEmitter.emit (events.js:191:7) -14 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:40:14) -14 verbose stack at emitTwo (events.js:106:13) -14 verbose stack at ChildProcess.emit (events.js:191:7) -14 verbose stack at maybeClose (internal/child_process.js:877:16) -14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5) -15 verbose pkgid RentForCamp@1.0.0 -16 verbose cwd /Users/gerrit/Documents/dev/nodejs/rentfor.camp/html/RentForCamp -17 error Darwin 16.7.0 -18 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "start" -19 error node v6.9.2 -20 error npm v3.10.9 -21 error code ELIFECYCLE -22 error RentForCamp@1.0.0 start: `node ./bin/www` -22 error Exit status 1 -23 error Failed at the RentForCamp@1.0.0 start script 'node ./bin/www'. -23 error Make sure you have the latest version of node.js and npm installed. -23 error If you do, this is most likely a problem with the RentForCamp package, -23 error not with npm itself. -23 error Tell the author that this fails on your system: -23 error node ./bin/www -23 error You can get information on how to open an issue for this project with: -23 error npm bugs RentForCamp -23 error Or if that isn't available, you can get their info via: -23 error npm owner ls RentForCamp -23 error There is likely additional logging output above. -24 verbose exit [ 1, true ] diff --git a/html/RentForCamp/package.json b/html/RentForCamp/package.json index 9ae8113..1113f35 100644 --- a/html/RentForCamp/package.json +++ b/html/RentForCamp/package.json @@ -8,13 +8,17 @@ }, "dependencies": { "cookie-parser": "~1.4.3", + "dateformat": "^3.0.3", "debug": "~2.6.9", "express": "~4.16.0", "express-session": "^1.15.6", + "eyespect": "^0.1.10", "helmet": "^3.15.1", "http-errors": "~1.6.2", + "jsonlint": "^1.6.3", "less-middleware": "~2.2.1", "morgan": "~1.9.0", + "mysql": "^2.16.0", "pug": "2.0.0-beta11" } } diff --git a/html/RentForCamp/routes/index.js b/html/RentForCamp/routes/index.js index ac135b3..6eebbe1 100644 --- a/html/RentForCamp/routes/index.js +++ b/html/RentForCamp/routes/index.js @@ -1,5 +1,5 @@ var express = require('express'); -var router = express.Router(); +var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) {