├── .circleci └── config.yml ├── .eslintignore ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .nvmrc ├── CHANGELOG.md ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── package └── indexing │ ├── .versions │ ├── client.js │ ├── common.js │ ├── package.js │ └── server.js └── tests ├── .gitignore ├── .meteor ├── .finished-upgraders ├── .gitignore ├── .id ├── packages ├── platforms ├── release └── versions ├── package-lock.json ├── package.json └── tests └── main.js /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # Javascript Node CircleCI 2.0 configuration file 2 | # 3 | # Check https://circleci.com/docs/2.0/language-javascript/ for more details 4 | # 5 | version: 2 6 | jobs: 7 | build: 8 | docker: 9 | - image: circleci/node:14.15.1-browsers 10 | 11 | working_directory: ~/repo 12 | 13 | steps: 14 | - checkout 15 | 16 | # Install Meteor 17 | - run: curl https://install.meteor.com | sh 18 | 19 | # https://github.com/meteor/meteor/issues/4019 20 | - run: sudo apt-get update 21 | - run: DEBIAN_FRONTEND=noninteractive sudo apt-get install -y locales 22 | - run: sudo sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen 23 | - run: sudo dpkg-reconfigure --frontend=noninteractive locales 24 | - run: sudo update-locale LANG=en_US.UTF-8 25 | - run: export LANG=en_US.UTF-8 26 | 27 | # Download and cache dependencies 28 | - restore_cache: 29 | keys: 30 | - v1-dependencies-{{ checksum "tests/package.json" }} 31 | # fallback to using the latest cache if no exact match is found 32 | - v1-dependencies- 33 | 34 | # Install dependencies 35 | - run: cd tests && meteor npm install 36 | 37 | - save_cache: 38 | paths: 39 | - tests/node_modules 40 | key: v1-dependencies-{{ checksum "tests/package.json" }} 41 | 42 | # run tests! 43 | - run: cd tests && npm test 44 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .meteor 3 | package.js 4 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [StorytellerCZ, harryadel, jankapunkt] 2 | custom: [] 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | 12 | A clear and concise description of what the bug is. 13 | 14 | **To Reproduce** 15 | 16 | Steps to reproduce the behavior: 17 | 1. Go to '...' 18 | 2. Click on '....' 19 | 3. Scroll down to '....' 20 | 4. See error 21 | 22 | **Expected behavior** 23 | 24 | A clear and concise description of what you expected to happen. 25 | 26 | **Screenshots** 27 | 28 | If applicable, add screenshots to help explain your problem. 29 | 30 | **Versions (please complete the following information):** 31 | - Meteor version: [e.g. 1.8.2] 32 | - Browser: [e.g. firefox, chrome, safari] 33 | - Version: [e.g. 1.0.0] 34 | 35 | **Additional context** 36 | 37 | Add any other context about the problem here. 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | 12 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 13 | 14 | **Describe the solution you'd like** 15 | 16 | A clear and concise description of what you want to happen. 17 | 18 | **Describe alternatives you've considered** 19 | 20 | A clear and concise description of any alternative solutions or features you've considered. 21 | 22 | **Additional context** 23 | 24 | Add any other context or screenshots about the feature request here. 25 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* 4 | 5 | - [What](#what) 6 | - [Why](#why) 7 | 8 | 9 | 10 | 19 | 20 | 23 | ## What 24 | 25 | 26 | ## Why 27 | 28 | 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .build* 3 | .npm* 4 | node_modules 5 | npm-debug.log 6 | 7 | .idea/ 8 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 14.15.1 -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## 3.1.1 4 | 5 | Added compatibility option with `aldeed:collection2@4.0.4` 6 | 7 | ## 3.1.0 8 | 9 | Update dependencies (`aldeed:collection2@3.5.0`, `ecmascript` according to Meteor version) 10 | Index creation and dropping has been updated to use newer API if available 11 | 12 | ## 3.0.0 13 | 14 | Updated to depend on `aldeed:collection2@3.0.0` rather than `aldeed:collection2-core`. Core has been merged back into the main package as a 3.0.0 release. 15 | 16 | ## 2.1.2 17 | 18 | Split code so that the client build is smaller (thanks @SimonSimCity) 19 | 20 | ## 2.1.1 21 | 22 | Fix default error message for `notUnique` errors 23 | 24 | ## 2.1.0 25 | 26 | Remove meteor/underscore package dependency 27 | 28 | ## 2.0.0 29 | 30 | For use with aldeed:collection2-core@2.0.0. Requires SimpleSchema 2.0 31 | 32 | ## 1.1.0 33 | 34 | Update to work with SimpleSchema 2.0 35 | 36 | ## 1.0.0 37 | 38 | Initial release. Originally included in the aldeed:collection2 package. 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2020 Eric Dobbertin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![CircleCI](https://circleci.com/gh/aldeed/meteor-schema-index/tree/master.svg?style=svg)](https://circleci.com/gh/aldeed/meteor-schema-index/tree/master) 2 | 3 | aldeed:schema-index 4 | ========================= 5 | 6 | A Meteor package that allows you to control some MongoDB indexing from your SimpleSchema. 7 | 8 | ## Installation 9 | 10 | In your Meteor app directory, enter: 11 | 12 | ``` 13 | $ meteor add aldeed:schema-index 14 | ``` 15 | 16 | ## Usage 17 | 18 | Use the `index` option to ensure a MongoDB index for a specific field: 19 | 20 | ```js 21 | { 22 | title: { 23 | type: String, 24 | index: 1 25 | } 26 | } 27 | ``` 28 | 29 | Set to `1` or `true` for an ascending index. Set to `-1` for a descending index. Or you may set this to another type of specific MongoDB index, such as `"2d"`. Indexes work on embedded sub-documents as well. 30 | 31 | If you have created an index for a field by mistake and you want to remove or change it, set `index` to `false`: 32 | 33 | ```js 34 | { 35 | "address.street": { 36 | type: String, 37 | index: false 38 | } 39 | } 40 | ``` 41 | 42 | IMPORTANT: If you need to change anything about an index, you must first start the app with `index: false` to drop the old index, and then restart with the correct index properties. 43 | 44 | If a field has the `unique` option set to `true`, the MongoDB index will be a unique index as well. Then on the server, Collection2 will rely on MongoDB to check uniqueness of your field, which is more efficient than our custom checking. 45 | 46 | ```js 47 | { 48 | "pseudo": { 49 | type: String, 50 | index: true, 51 | unique: true 52 | } 53 | } 54 | ``` 55 | 56 | For the `unique` option to work, `index` must be `true`, `1`, or `-1`. The error message for uniqueness is very generic. It's best to define your own using `MyCollection.simpleSchema().messages()`. The error type string is "notUnique". 57 | 58 | You can use the `sparse` option along with the `index` and `unique` options to tell MongoDB to build a [sparse index](http://docs.mongodb.org/manual/core/index-sparse/#index-type-sparse). By default, MongoDB will only permit one document that lacks the indexed field. By setting the `sparse` option to `true`, the index will only contain entries for documents that have the indexed field. The index skips over any document that is missing the field. This is helpful when indexing on a key in an array of sub-documents. Learn more in the [MongoDB docs](http://docs.mongodb.org/manual/core/index-unique/#unique-index-and-missing-field). 59 | 60 | All indexes are built in the background so indexing does *not* block other database queries. 61 | 62 | ## Contributing 63 | 64 | Anyone is welcome to contribute. Fork, make and test your changes (`meteor test-packages ./`), and then submit a pull request. 65 | 66 | ### Running Tests 67 | 68 | ```bash 69 | $ cd tests 70 | $ npm i && npm test 71 | ``` 72 | 73 | ### Running Tests in Watch Mode 74 | 75 | ```bash 76 | $ cd tests 77 | $ npm i && npm run test:watch 78 | ``` 79 | 80 | ### Major Contributors 81 | 82 | @mquandalle 83 | 84 | (Add yourself if you should be listed here.) 85 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "meteor-schema-index", 3 | "private": true, 4 | "scripts": { 5 | "lint": "eslint ." 6 | }, 7 | "devDependencies": { 8 | "@babel/cli": "^7.12.8", 9 | "@babel/core": "^7.12.9", 10 | "babel-eslint": "^10.1.0", 11 | "eslint": "^7.2.0", 12 | "eslint-config-airbnb-base": "^14.2.1", 13 | "eslint-config-prettier": "^7.0.0", 14 | "eslint-plugin-import": "^2.22.1" 15 | }, 16 | "eslintConfig": { 17 | "extends": [ 18 | "airbnb-base", 19 | "prettier" 20 | ], 21 | "parser": "babel-eslint", 22 | "env": { 23 | "browser": true, 24 | "jest": true 25 | }, 26 | "rules": { 27 | "arrow-body-style": 0, 28 | "consistent-return": 0, 29 | "max-len": 0, 30 | "no-param-reassign": 0, 31 | "no-underscore-dangle": 0, 32 | "no-use-before-define": [ 33 | 2, 34 | "nofunc" 35 | ], 36 | "no-unused-expressions": 0, 37 | "no-console": 0, 38 | "space-before-function-paren": 0, 39 | "import/no-extraneous-dependencies": 0, 40 | "import/no-unresolved": 0, 41 | "import/extensions": 0 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /package/indexing/.versions: -------------------------------------------------------------------------------- 1 | aldeed:collection2@4.0.4 2 | aldeed:schema-index@3.1.1 3 | aldeed:simple-schema@1.13.1 4 | allow-deny@2.0.0 5 | babel-compiler@7.11.1 6 | babel-runtime@1.5.2 7 | base64@1.0.13 8 | binary-heap@1.0.12 9 | boilerplate-generator@2.0.0 10 | callback-hook@1.6.0 11 | check@1.4.4 12 | core-runtime@1.0.0 13 | ddp@1.4.2 14 | ddp-client@3.0.2 15 | ddp-common@1.4.4 16 | ddp-server@3.0.2 17 | diff-sequence@1.1.3 18 | dynamic-import@0.7.4 19 | ecmascript@0.16.9 20 | ecmascript-runtime@0.8.3 21 | ecmascript-runtime-client@0.12.2 22 | ecmascript-runtime-server@0.11.1 23 | ejson@1.1.4 24 | facts-base@1.0.2 25 | fetch@0.1.5 26 | geojson-utils@1.0.12 27 | id-map@1.2.0 28 | inter-process-messaging@0.1.2 29 | logging@1.3.5 30 | meteor@2.0.2 31 | minimongo@2.0.1 32 | modern-browsers@0.1.11 33 | modules@0.20.2 34 | modules-runtime@0.13.2 35 | mongo@2.0.2 36 | mongo-decimal@0.1.4 37 | mongo-dev-server@1.1.1 38 | mongo-id@1.0.9 39 | npm-mongo@4.17.4 40 | ordered-dict@1.2.0 41 | promise@1.0.0 42 | raix:eventemitter@1.0.0 43 | random@1.2.2 44 | react-fast-refresh@0.2.9 45 | reload@1.3.2 46 | retry@1.1.1 47 | routepolicy@1.1.2 48 | socket-stream-client@0.5.3 49 | tracker@1.3.4 50 | typescript@5.4.3 51 | underscore@1.6.4 52 | webapp@2.0.3 53 | webapp-hashing@1.1.2 54 | -------------------------------------------------------------------------------- /package/indexing/client.js: -------------------------------------------------------------------------------- 1 | import "./common"; 2 | -------------------------------------------------------------------------------- /package/indexing/common.js: -------------------------------------------------------------------------------- 1 | // collection2 checks to make sure that simpl-schema package is added 2 | import SimpleSchema from "simpl-schema"; 3 | import Collection2 from "meteor/aldeed:collection2"; 4 | 5 | // Extend the schema options allowed by SimpleSchema 6 | SimpleSchema.extendOptions([ 7 | "index", // one of Number, String, Boolean 8 | "unique", // Boolean 9 | "sparse", // Boolean 10 | ]); 11 | 12 | Collection2.on("schema.attached", (collection, ss) => { 13 | // Define validation error messages 14 | if ( 15 | ss.version >= 2 && 16 | ss.messageBox && 17 | typeof ss.messageBox.messages === "function" 18 | ) { 19 | ss.messageBox.messages({ 20 | en: { 21 | notUnique: "{{label}} must be unique", 22 | }, 23 | }); 24 | } 25 | }); 26 | -------------------------------------------------------------------------------- /package/indexing/package.js: -------------------------------------------------------------------------------- 1 | Package.describe({ 2 | name: "aldeed:schema-index", 3 | summary: "Control some MongoDB indexing with schema options", 4 | version: "3.1.1", 5 | documentation: "../../README.md", 6 | git: "https://github.com/aldeed/meteor-schema-index.git", 7 | }); 8 | 9 | Package.onUse(function (api) { 10 | api.versionsFrom(["1.12.1", "2.3.6", "2.8.1"]); 11 | api.use("ecmascript"); 12 | api.use("aldeed:collection2@3.5.0 || 4.0.4"); 13 | 14 | api.mainModule("client.js", "client"); 15 | api.mainModule("server.js", "server"); 16 | }); 17 | -------------------------------------------------------------------------------- /package/indexing/server.js: -------------------------------------------------------------------------------- 1 | import Collection2 from "meteor/aldeed:collection2"; 2 | import { Meteor } from "meteor/meteor"; 3 | 4 | import "./common"; 5 | 6 | Collection2.on("schema.attached", (collection, ss) => { 7 | function ensureIndex(index, name, unique, sparse) { 8 | Meteor.startup(() => { 9 | if (collection._collection.createIndex) { 10 | collection._collection.createIndex(index, { 11 | background: true, 12 | name, 13 | unique, 14 | sparse, 15 | }); 16 | } else { 17 | collection._collection._ensureIndex(index, { 18 | background: true, 19 | name, 20 | unique, 21 | sparse, 22 | }); 23 | } 24 | }); 25 | } 26 | 27 | function dropIndex(indexName) { 28 | Meteor.startup(() => { 29 | try { 30 | if (collection._collection.dropIndex) { 31 | collection._collection.dropIndex(indexName); 32 | } else { 33 | collection._collection._dropIndex(indexName); 34 | } 35 | } catch (err) { 36 | // no index with that name, which is what we want 37 | } 38 | }); 39 | } 40 | 41 | const propName = ss.version === 2 ? "mergedSchema" : "schema"; 42 | 43 | // Loop over fields definitions and ensure collection indexes (server side only) 44 | const schema = ss[propName](); 45 | Object.keys(schema).forEach((fieldName) => { 46 | const definition = schema[fieldName]; 47 | if ("index" in definition || definition.unique === true) { 48 | const index = {}; 49 | // If they specified `unique: true` but not `index`, 50 | // we assume `index: 1` to set up the unique index in mongo 51 | let indexValue; 52 | if ("index" in definition) { 53 | indexValue = definition.index; 54 | if (indexValue === true) indexValue = 1; 55 | } else { 56 | indexValue = 1; 57 | } 58 | 59 | const indexName = `c2_${fieldName}`; 60 | // In the index object, we want object array keys without the ".$" piece 61 | const idxFieldName = fieldName.replace(/\.\$\./g, "."); 62 | index[idxFieldName] = indexValue; 63 | const unique = 64 | !!definition.unique && (indexValue === 1 || indexValue === -1); 65 | let sparse = definition.sparse || false; 66 | 67 | // If unique and optional, force sparse to prevent errors 68 | if (!sparse && unique && definition.optional) sparse = true; 69 | 70 | if (indexValue === false) { 71 | dropIndex(indexName); 72 | } else { 73 | ensureIndex(index, indexName, unique, sparse); 74 | } 75 | } 76 | }); 77 | }); 78 | -------------------------------------------------------------------------------- /tests/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /tests/.meteor/.finished-upgraders: -------------------------------------------------------------------------------- 1 | # This file contains information which helps Meteor properly upgrade your 2 | # app when you run 'meteor update'. You should check it into version control 3 | # with your project. 4 | 5 | notices-for-0.9.0 6 | notices-for-0.9.1 7 | 0.9.4-platform-file 8 | notices-for-facebook-graph-api-2 9 | 1.2.0-standard-minifiers-package 10 | 1.2.0-meteor-platform-split 11 | 1.2.0-cordova-changes 12 | 1.2.0-breaking-changes 13 | 1.3.0-split-minifiers-package 14 | 1.4.0-remove-old-dev-bundle-link 15 | 1.4.1-add-shell-server-package 16 | 1.4.3-split-account-service-packages 17 | 1.5-add-dynamic-import-package 18 | 1.7-split-underscore-from-meteor-base 19 | 1.8.3-split-jquery-from-blaze 20 | -------------------------------------------------------------------------------- /tests/.meteor/.gitignore: -------------------------------------------------------------------------------- 1 | local 2 | -------------------------------------------------------------------------------- /tests/.meteor/.id: -------------------------------------------------------------------------------- 1 | # This file contains a token that is unique to your project. 2 | # Check it into your repository along with the rest of this directory. 3 | # It can be used for purposes such as: 4 | # - ensuring you don't accidentally deploy one app on top of another 5 | # - providing package authors with aggregated statistics 6 | 7 | nxh5kit2kfff.nh37i31py6r6 8 | -------------------------------------------------------------------------------- /tests/.meteor/packages: -------------------------------------------------------------------------------- 1 | # Meteor packages used by this project, one per line. 2 | # Check this file (and the other files in this directory) into your repository. 3 | # 4 | # 'meteor add' and 'meteor remove' will edit this file for you, 5 | # but you can also edit it by hand. 6 | 7 | meteor-base@1.4.0 # Packages every Meteor app needs to have 8 | mobile-experience@1.1.0 # Packages for a great mobile UX 9 | mongo@1.10.1 # The database Meteor supports right now 10 | blaze-html-templates # Compile .html files into Meteor Blaze views 11 | jquery # Wrapper package for npm-installed jquery 12 | reactive-var@1.0.11 # Reactive variable for tracker 13 | tracker@1.2.0 # Meteor's client-side reactive programming library 14 | 15 | standard-minifier-css@1.7.1 # CSS minifier run for production mode 16 | standard-minifier-js@2.6.0 # JS minifier run for production mode 17 | es5-shim@4.8.0 # ECMAScript 5 compatibility for older browsers 18 | ecmascript@0.14.4 # Enable ECMAScript2015+ syntax in app code 19 | typescript@4.1.2 # Enable TypeScript syntax in .ts and .tsx modules 20 | shell-server@0.5.0 # Server-side component of the `meteor shell` command 21 | 22 | autopublish@1.0.7 # Publish all data to the clients (for prototyping) 23 | insecure@1.0.7 # Allow all DB writes from clients (for prototyping) 24 | random 25 | aldeed:schema-index@3.0.0 26 | meteortesting:mocha 27 | aldeed:collection2@3.2.1 28 | -------------------------------------------------------------------------------- /tests/.meteor/platforms: -------------------------------------------------------------------------------- 1 | server 2 | browser 3 | -------------------------------------------------------------------------------- /tests/.meteor/release: -------------------------------------------------------------------------------- 1 | METEOR@1.12 2 | -------------------------------------------------------------------------------- /tests/.meteor/versions: -------------------------------------------------------------------------------- 1 | aldeed:collection2@3.2.1 2 | aldeed:schema-index@3.0.0 3 | allow-deny@1.1.0 4 | autopublish@1.0.7 5 | autoupdate@1.6.0 6 | babel-compiler@7.5.4 7 | babel-runtime@1.5.0 8 | base64@1.0.12 9 | binary-heap@1.0.11 10 | blaze@2.3.4 11 | blaze-html-templates@1.1.2 12 | blaze-tools@1.0.10 13 | boilerplate-generator@1.7.1 14 | caching-compiler@1.2.2 15 | caching-html-compiler@1.1.3 16 | callback-hook@1.3.0 17 | check@1.3.1 18 | ddp@1.4.0 19 | ddp-client@2.3.3 20 | ddp-common@1.4.0 21 | ddp-server@2.3.2 22 | deps@1.0.12 23 | diff-sequence@1.1.1 24 | dynamic-import@0.5.4 25 | ecmascript@0.14.4 26 | ecmascript-runtime@0.7.0 27 | ecmascript-runtime-client@0.11.0 28 | ecmascript-runtime-server@0.10.0 29 | ejson@1.1.1 30 | es5-shim@4.8.0 31 | fetch@0.1.1 32 | geojson-utils@1.0.10 33 | hot-code-push@1.0.4 34 | html-tools@1.0.11 35 | htmljs@1.0.11 36 | http@1.4.2 37 | id-map@1.1.0 38 | insecure@1.0.7 39 | inter-process-messaging@0.1.1 40 | jquery@3.0.0 41 | launch-screen@1.2.0 42 | livedata@1.0.18 43 | logging@1.1.20 44 | meteor@1.9.3 45 | meteor-base@1.4.0 46 | meteortesting:browser-tests@1.3.4 47 | meteortesting:mocha@2.0.1 48 | meteortesting:mocha-core@8.0.1 49 | minifier-css@1.5.3 50 | minifier-js@2.6.0 51 | minimongo@1.6.1 52 | mobile-experience@1.1.0 53 | mobile-status-bar@1.1.0 54 | modern-browsers@0.1.5 55 | modules@0.15.0 56 | modules-runtime@0.12.0 57 | mongo@1.10.1 58 | mongo-decimal@0.1.2 59 | mongo-dev-server@1.1.0 60 | mongo-id@1.0.7 61 | npm-mongo@3.8.1 62 | observe-sequence@1.0.16 63 | ordered-dict@1.1.0 64 | promise@0.11.2 65 | raix:eventemitter@0.1.3 66 | random@1.2.0 67 | reactive-var@1.0.11 68 | reload@1.3.1 69 | retry@1.1.0 70 | routepolicy@1.1.0 71 | shell-server@0.5.0 72 | socket-stream-client@0.3.1 73 | spacebars@1.0.15 74 | spacebars-compiler@1.1.3 75 | standard-minifier-css@1.7.1 76 | standard-minifier-js@2.6.0 77 | templating@1.3.2 78 | templating-compiler@1.3.3 79 | templating-runtime@1.3.2 80 | templating-tools@1.1.2 81 | tmeasday:check-npm-versions@0.3.2 82 | tracker@1.2.0 83 | typescript@4.1.2 84 | ui@1.0.13 85 | underscore@1.0.10 86 | url@1.3.1 87 | webapp@1.9.1 88 | webapp-hashing@1.0.9 89 | -------------------------------------------------------------------------------- /tests/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tests", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@babel/code-frame": { 7 | "version": "7.10.4", 8 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 9 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 10 | "dev": true, 11 | "requires": { 12 | "@babel/highlight": "^7.10.4" 13 | } 14 | }, 15 | "@babel/helper-validator-identifier": { 16 | "version": "7.10.4", 17 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 18 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 19 | "dev": true 20 | }, 21 | "@babel/highlight": { 22 | "version": "7.10.4", 23 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 24 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 25 | "dev": true, 26 | "requires": { 27 | "@babel/helper-validator-identifier": "^7.10.4", 28 | "chalk": "^2.0.0", 29 | "js-tokens": "^4.0.0" 30 | }, 31 | "dependencies": { 32 | "ansi-styles": { 33 | "version": "3.2.1", 34 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 35 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 36 | "dev": true, 37 | "requires": { 38 | "color-convert": "^1.9.0" 39 | } 40 | }, 41 | "chalk": { 42 | "version": "2.4.2", 43 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 44 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 45 | "dev": true, 46 | "requires": { 47 | "ansi-styles": "^3.2.1", 48 | "escape-string-regexp": "^1.0.5", 49 | "supports-color": "^5.3.0" 50 | } 51 | }, 52 | "color-convert": { 53 | "version": "1.9.3", 54 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 55 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 56 | "dev": true, 57 | "requires": { 58 | "color-name": "1.1.3" 59 | } 60 | }, 61 | "color-name": { 62 | "version": "1.1.3", 63 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 64 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 65 | "dev": true 66 | }, 67 | "has-flag": { 68 | "version": "3.0.0", 69 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 70 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 71 | "dev": true 72 | }, 73 | "supports-color": { 74 | "version": "5.5.0", 75 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 76 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 77 | "dev": true, 78 | "requires": { 79 | "has-flag": "^3.0.0" 80 | } 81 | } 82 | } 83 | }, 84 | "@babel/runtime": { 85 | "version": "7.12.5", 86 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", 87 | "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", 88 | "requires": { 89 | "regenerator-runtime": "^0.13.4" 90 | } 91 | }, 92 | "@jest/types": { 93 | "version": "26.6.2", 94 | "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", 95 | "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", 96 | "dev": true, 97 | "requires": { 98 | "@types/istanbul-lib-coverage": "^2.0.0", 99 | "@types/istanbul-reports": "^3.0.0", 100 | "@types/node": "*", 101 | "@types/yargs": "^15.0.0", 102 | "chalk": "^4.0.0" 103 | } 104 | }, 105 | "@types/istanbul-lib-coverage": { 106 | "version": "2.0.3", 107 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", 108 | "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", 109 | "dev": true 110 | }, 111 | "@types/istanbul-lib-report": { 112 | "version": "3.0.0", 113 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 114 | "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", 115 | "dev": true, 116 | "requires": { 117 | "@types/istanbul-lib-coverage": "*" 118 | } 119 | }, 120 | "@types/istanbul-reports": { 121 | "version": "3.0.0", 122 | "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", 123 | "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", 124 | "dev": true, 125 | "requires": { 126 | "@types/istanbul-lib-report": "*" 127 | } 128 | }, 129 | "@types/node": { 130 | "version": "14.14.11", 131 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.11.tgz", 132 | "integrity": "sha512-BJ97wAUuU3NUiUCp44xzUFquQEvnk1wu7q4CMEUYKJWjdkr0YWYDsm4RFtAvxYsNjLsKcrFt6RvK8r+mnzMbEQ==", 133 | "dev": true 134 | }, 135 | "@types/stack-utils": { 136 | "version": "2.0.0", 137 | "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", 138 | "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", 139 | "dev": true 140 | }, 141 | "@types/yargs": { 142 | "version": "15.0.11", 143 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.11.tgz", 144 | "integrity": "sha512-jfcNBxHFYJ4nPIacsi3woz1+kvUO6s1CyeEhtnDHBjHUMNj5UlW2GynmnSgiJJEdNg9yW5C8lfoNRZrHGv5EqA==", 145 | "dev": true, 146 | "requires": { 147 | "@types/yargs-parser": "*" 148 | } 149 | }, 150 | "@types/yargs-parser": { 151 | "version": "15.0.0", 152 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", 153 | "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", 154 | "dev": true 155 | }, 156 | "ajv": { 157 | "version": "6.12.6", 158 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 159 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 160 | "dev": true, 161 | "requires": { 162 | "fast-deep-equal": "^3.1.1", 163 | "fast-json-stable-stringify": "^2.0.0", 164 | "json-schema-traverse": "^0.4.1", 165 | "uri-js": "^4.2.2" 166 | } 167 | }, 168 | "ansi-regex": { 169 | "version": "5.0.0", 170 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 171 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 172 | "dev": true 173 | }, 174 | "ansi-styles": { 175 | "version": "4.3.0", 176 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 177 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 178 | "dev": true, 179 | "requires": { 180 | "color-convert": "^2.0.1" 181 | } 182 | }, 183 | "array-union": { 184 | "version": "1.0.2", 185 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 186 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 187 | "dev": true, 188 | "requires": { 189 | "array-uniq": "^1.0.1" 190 | } 191 | }, 192 | "array-uniq": { 193 | "version": "1.0.3", 194 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 195 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 196 | "dev": true 197 | }, 198 | "asn1": { 199 | "version": "0.2.4", 200 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 201 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 202 | "dev": true, 203 | "requires": { 204 | "safer-buffer": "~2.1.0" 205 | } 206 | }, 207 | "assert-plus": { 208 | "version": "1.0.0", 209 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 210 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 211 | "dev": true 212 | }, 213 | "asynckit": { 214 | "version": "0.4.0", 215 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 216 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 217 | "dev": true 218 | }, 219 | "aws-sign2": { 220 | "version": "0.7.0", 221 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 222 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 223 | "dev": true 224 | }, 225 | "aws4": { 226 | "version": "1.11.0", 227 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", 228 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", 229 | "dev": true 230 | }, 231 | "balanced-match": { 232 | "version": "1.0.0", 233 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 234 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 235 | "dev": true 236 | }, 237 | "bcrypt-pbkdf": { 238 | "version": "1.0.2", 239 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 240 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 241 | "dev": true, 242 | "requires": { 243 | "tweetnacl": "^0.14.3" 244 | } 245 | }, 246 | "brace-expansion": { 247 | "version": "1.1.11", 248 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 249 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 250 | "dev": true, 251 | "requires": { 252 | "balanced-match": "^1.0.0", 253 | "concat-map": "0.0.1" 254 | } 255 | }, 256 | "braces": { 257 | "version": "3.0.2", 258 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 259 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 260 | "dev": true, 261 | "requires": { 262 | "fill-range": "^7.0.1" 263 | } 264 | }, 265 | "buffer-crc32": { 266 | "version": "0.2.13", 267 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 268 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 269 | "dev": true 270 | }, 271 | "buffer-from": { 272 | "version": "1.1.1", 273 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 274 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 275 | "dev": true 276 | }, 277 | "caseless": { 278 | "version": "0.12.0", 279 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 280 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 281 | "dev": true 282 | }, 283 | "chalk": { 284 | "version": "4.1.0", 285 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 286 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 287 | "dev": true, 288 | "requires": { 289 | "ansi-styles": "^4.1.0", 290 | "supports-color": "^7.1.0" 291 | } 292 | }, 293 | "chromedriver": { 294 | "version": "2.46.0", 295 | "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.46.0.tgz", 296 | "integrity": "sha512-dLtKIJW3y/PuFrPmcw6Mb8Nh+HwSqgVrK1rWgTARXhHfWvV822X2VRkx2meU/tg2+YQL6/nNgT6n5qWwIDHbwg==", 297 | "dev": true, 298 | "requires": { 299 | "del": "^3.0.0", 300 | "extract-zip": "^1.6.7", 301 | "mkdirp": "^0.5.1", 302 | "request": "^2.88.0", 303 | "tcp-port-used": "^1.0.1" 304 | } 305 | }, 306 | "clone": { 307 | "version": "2.1.2", 308 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 309 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" 310 | }, 311 | "color-convert": { 312 | "version": "2.0.1", 313 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 314 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 315 | "dev": true, 316 | "requires": { 317 | "color-name": "~1.1.4" 318 | } 319 | }, 320 | "color-name": { 321 | "version": "1.1.4", 322 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 323 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 324 | "dev": true 325 | }, 326 | "combined-stream": { 327 | "version": "1.0.8", 328 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 329 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 330 | "dev": true, 331 | "requires": { 332 | "delayed-stream": "~1.0.0" 333 | } 334 | }, 335 | "concat-map": { 336 | "version": "0.0.1", 337 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 338 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 339 | "dev": true 340 | }, 341 | "concat-stream": { 342 | "version": "1.6.2", 343 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 344 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 345 | "dev": true, 346 | "requires": { 347 | "buffer-from": "^1.0.0", 348 | "inherits": "^2.0.3", 349 | "readable-stream": "^2.2.2", 350 | "typedarray": "^0.0.6" 351 | } 352 | }, 353 | "core-util-is": { 354 | "version": "1.0.2", 355 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 356 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 357 | "dev": true 358 | }, 359 | "dashdash": { 360 | "version": "1.14.1", 361 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 362 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 363 | "dev": true, 364 | "requires": { 365 | "assert-plus": "^1.0.0" 366 | } 367 | }, 368 | "debug": { 369 | "version": "2.6.9", 370 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 371 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 372 | "dev": true, 373 | "requires": { 374 | "ms": "2.0.0" 375 | } 376 | }, 377 | "deep-is": { 378 | "version": "0.1.3", 379 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 380 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 381 | "dev": true 382 | }, 383 | "del": { 384 | "version": "3.0.0", 385 | "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", 386 | "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", 387 | "dev": true, 388 | "requires": { 389 | "globby": "^6.1.0", 390 | "is-path-cwd": "^1.0.0", 391 | "is-path-in-cwd": "^1.0.0", 392 | "p-map": "^1.1.1", 393 | "pify": "^3.0.0", 394 | "rimraf": "^2.2.8" 395 | } 396 | }, 397 | "delayed-stream": { 398 | "version": "1.0.0", 399 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 400 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 401 | "dev": true 402 | }, 403 | "diff-sequences": { 404 | "version": "26.6.2", 405 | "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", 406 | "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", 407 | "dev": true 408 | }, 409 | "ecc-jsbn": { 410 | "version": "0.1.2", 411 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 412 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 413 | "dev": true, 414 | "requires": { 415 | "jsbn": "~0.1.0", 416 | "safer-buffer": "^2.1.0" 417 | } 418 | }, 419 | "escape-string-regexp": { 420 | "version": "1.0.5", 421 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 422 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 423 | "dev": true 424 | }, 425 | "expect": { 426 | "version": "26.6.2", 427 | "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", 428 | "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", 429 | "dev": true, 430 | "requires": { 431 | "@jest/types": "^26.6.2", 432 | "ansi-styles": "^4.0.0", 433 | "jest-get-type": "^26.3.0", 434 | "jest-matcher-utils": "^26.6.2", 435 | "jest-message-util": "^26.6.2", 436 | "jest-regex-util": "^26.0.0" 437 | } 438 | }, 439 | "extend": { 440 | "version": "3.0.2", 441 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 442 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 443 | "dev": true 444 | }, 445 | "extract-zip": { 446 | "version": "1.7.0", 447 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", 448 | "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", 449 | "dev": true, 450 | "requires": { 451 | "concat-stream": "^1.6.2", 452 | "debug": "^2.6.9", 453 | "mkdirp": "^0.5.4", 454 | "yauzl": "^2.10.0" 455 | } 456 | }, 457 | "extsprintf": { 458 | "version": "1.3.0", 459 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 460 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 461 | "dev": true 462 | }, 463 | "fast-deep-equal": { 464 | "version": "3.1.3", 465 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 466 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 467 | "dev": true 468 | }, 469 | "fast-json-stable-stringify": { 470 | "version": "2.1.0", 471 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 472 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 473 | "dev": true 474 | }, 475 | "fd-slicer": { 476 | "version": "1.1.0", 477 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 478 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 479 | "dev": true, 480 | "requires": { 481 | "pend": "~1.2.0" 482 | } 483 | }, 484 | "fill-range": { 485 | "version": "7.0.1", 486 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 487 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 488 | "dev": true, 489 | "requires": { 490 | "to-regex-range": "^5.0.1" 491 | } 492 | }, 493 | "forever-agent": { 494 | "version": "0.6.1", 495 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 496 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 497 | "dev": true 498 | }, 499 | "form-data": { 500 | "version": "2.3.3", 501 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 502 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 503 | "dev": true, 504 | "requires": { 505 | "asynckit": "^0.4.0", 506 | "combined-stream": "^1.0.6", 507 | "mime-types": "^2.1.12" 508 | } 509 | }, 510 | "fs.realpath": { 511 | "version": "1.0.0", 512 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 513 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 514 | "dev": true 515 | }, 516 | "getpass": { 517 | "version": "0.1.7", 518 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 519 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 520 | "dev": true, 521 | "requires": { 522 | "assert-plus": "^1.0.0" 523 | } 524 | }, 525 | "glob": { 526 | "version": "7.1.6", 527 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 528 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 529 | "dev": true, 530 | "requires": { 531 | "fs.realpath": "^1.0.0", 532 | "inflight": "^1.0.4", 533 | "inherits": "2", 534 | "minimatch": "^3.0.4", 535 | "once": "^1.3.0", 536 | "path-is-absolute": "^1.0.0" 537 | } 538 | }, 539 | "globby": { 540 | "version": "6.1.0", 541 | "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", 542 | "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", 543 | "dev": true, 544 | "requires": { 545 | "array-union": "^1.0.1", 546 | "glob": "^7.0.3", 547 | "object-assign": "^4.0.1", 548 | "pify": "^2.0.0", 549 | "pinkie-promise": "^2.0.0" 550 | }, 551 | "dependencies": { 552 | "pify": { 553 | "version": "2.3.0", 554 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 555 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 556 | "dev": true 557 | } 558 | } 559 | }, 560 | "graceful-fs": { 561 | "version": "4.2.4", 562 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 563 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", 564 | "dev": true 565 | }, 566 | "har-schema": { 567 | "version": "2.0.0", 568 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 569 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 570 | "dev": true 571 | }, 572 | "har-validator": { 573 | "version": "5.1.5", 574 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 575 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 576 | "dev": true, 577 | "requires": { 578 | "ajv": "^6.12.3", 579 | "har-schema": "^2.0.0" 580 | } 581 | }, 582 | "has-flag": { 583 | "version": "4.0.0", 584 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 585 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 586 | "dev": true 587 | }, 588 | "http-signature": { 589 | "version": "1.2.0", 590 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 591 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 592 | "dev": true, 593 | "requires": { 594 | "assert-plus": "^1.0.0", 595 | "jsprim": "^1.2.2", 596 | "sshpk": "^1.7.0" 597 | } 598 | }, 599 | "immediate": { 600 | "version": "3.0.6", 601 | "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", 602 | "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", 603 | "dev": true 604 | }, 605 | "inflight": { 606 | "version": "1.0.6", 607 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 608 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 609 | "dev": true, 610 | "requires": { 611 | "once": "^1.3.0", 612 | "wrappy": "1" 613 | } 614 | }, 615 | "inherits": { 616 | "version": "2.0.4", 617 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 618 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 619 | "dev": true 620 | }, 621 | "ip-regex": { 622 | "version": "2.1.0", 623 | "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", 624 | "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", 625 | "dev": true 626 | }, 627 | "is-number": { 628 | "version": "7.0.0", 629 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 630 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 631 | "dev": true 632 | }, 633 | "is-path-cwd": { 634 | "version": "1.0.0", 635 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 636 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", 637 | "dev": true 638 | }, 639 | "is-path-in-cwd": { 640 | "version": "1.0.1", 641 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", 642 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", 643 | "dev": true, 644 | "requires": { 645 | "is-path-inside": "^1.0.0" 646 | } 647 | }, 648 | "is-path-inside": { 649 | "version": "1.0.1", 650 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 651 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 652 | "dev": true, 653 | "requires": { 654 | "path-is-inside": "^1.0.1" 655 | } 656 | }, 657 | "is-typedarray": { 658 | "version": "1.0.0", 659 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 660 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 661 | "dev": true 662 | }, 663 | "is-url": { 664 | "version": "1.2.4", 665 | "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", 666 | "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", 667 | "dev": true 668 | }, 669 | "is2": { 670 | "version": "2.0.1", 671 | "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz", 672 | "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==", 673 | "dev": true, 674 | "requires": { 675 | "deep-is": "^0.1.3", 676 | "ip-regex": "^2.1.0", 677 | "is-url": "^1.2.2" 678 | } 679 | }, 680 | "isarray": { 681 | "version": "1.0.0", 682 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 683 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 684 | "dev": true 685 | }, 686 | "isstream": { 687 | "version": "0.1.2", 688 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 689 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 690 | "dev": true 691 | }, 692 | "jest-diff": { 693 | "version": "26.6.2", 694 | "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", 695 | "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", 696 | "dev": true, 697 | "requires": { 698 | "chalk": "^4.0.0", 699 | "diff-sequences": "^26.6.2", 700 | "jest-get-type": "^26.3.0", 701 | "pretty-format": "^26.6.2" 702 | } 703 | }, 704 | "jest-get-type": { 705 | "version": "26.3.0", 706 | "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", 707 | "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", 708 | "dev": true 709 | }, 710 | "jest-matcher-utils": { 711 | "version": "26.6.2", 712 | "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", 713 | "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", 714 | "dev": true, 715 | "requires": { 716 | "chalk": "^4.0.0", 717 | "jest-diff": "^26.6.2", 718 | "jest-get-type": "^26.3.0", 719 | "pretty-format": "^26.6.2" 720 | } 721 | }, 722 | "jest-message-util": { 723 | "version": "26.6.2", 724 | "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", 725 | "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", 726 | "dev": true, 727 | "requires": { 728 | "@babel/code-frame": "^7.0.0", 729 | "@jest/types": "^26.6.2", 730 | "@types/stack-utils": "^2.0.0", 731 | "chalk": "^4.0.0", 732 | "graceful-fs": "^4.2.4", 733 | "micromatch": "^4.0.2", 734 | "pretty-format": "^26.6.2", 735 | "slash": "^3.0.0", 736 | "stack-utils": "^2.0.2" 737 | } 738 | }, 739 | "jest-regex-util": { 740 | "version": "26.0.0", 741 | "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", 742 | "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", 743 | "dev": true 744 | }, 745 | "js-tokens": { 746 | "version": "4.0.0", 747 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 748 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 749 | "dev": true 750 | }, 751 | "jsbn": { 752 | "version": "0.1.1", 753 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 754 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 755 | "dev": true 756 | }, 757 | "json-schema": { 758 | "version": "0.2.3", 759 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 760 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 761 | "dev": true 762 | }, 763 | "json-schema-traverse": { 764 | "version": "0.4.1", 765 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 766 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 767 | "dev": true 768 | }, 769 | "json-stringify-safe": { 770 | "version": "5.0.1", 771 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 772 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 773 | "dev": true 774 | }, 775 | "jsprim": { 776 | "version": "1.4.1", 777 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 778 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 779 | "dev": true, 780 | "requires": { 781 | "assert-plus": "1.0.0", 782 | "extsprintf": "1.3.0", 783 | "json-schema": "0.2.3", 784 | "verror": "1.10.0" 785 | } 786 | }, 787 | "jszip": { 788 | "version": "3.5.0", 789 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", 790 | "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", 791 | "dev": true, 792 | "requires": { 793 | "lie": "~3.3.0", 794 | "pako": "~1.0.2", 795 | "readable-stream": "~2.3.6", 796 | "set-immediate-shim": "~1.0.1" 797 | } 798 | }, 799 | "lie": { 800 | "version": "3.3.0", 801 | "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", 802 | "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", 803 | "dev": true, 804 | "requires": { 805 | "immediate": "~3.0.5" 806 | } 807 | }, 808 | "lodash._reinterpolate": { 809 | "version": "3.0.0", 810 | "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", 811 | "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" 812 | }, 813 | "lodash.template": { 814 | "version": "4.5.0", 815 | "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", 816 | "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", 817 | "requires": { 818 | "lodash._reinterpolate": "^3.0.0", 819 | "lodash.templatesettings": "^4.0.0" 820 | } 821 | }, 822 | "lodash.templatesettings": { 823 | "version": "4.2.0", 824 | "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", 825 | "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", 826 | "requires": { 827 | "lodash._reinterpolate": "^3.0.0" 828 | } 829 | }, 830 | "message-box": { 831 | "version": "0.2.7", 832 | "resolved": "https://registry.npmjs.org/message-box/-/message-box-0.2.7.tgz", 833 | "integrity": "sha512-C4ccA5nHb58kTS+pLrgF/JWtr7fAIkHxRDceH7tdy5fMA783nUfbYwZ7H2XLvSeYfcnWIYCig5dWW+icK9X/Ag==", 834 | "requires": { 835 | "lodash.template": "^4.5.0" 836 | } 837 | }, 838 | "meteor-node-stubs": { 839 | "version": "1.0.1", 840 | "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.0.1.tgz", 841 | "integrity": "sha512-I4PE/z7eAl45XEsebHA4pcQbgjqEdK3EBGgiUoIZBi3bMQcMq6blLWZo+WdtK4Or9X4NJOiYWw4GmHiubr3egA==", 842 | "requires": { 843 | "assert": "^1.4.1", 844 | "browserify-zlib": "^0.2.0", 845 | "buffer": "^5.2.1", 846 | "console-browserify": "^1.1.0", 847 | "constants-browserify": "^1.0.0", 848 | "crypto-browserify": "^3.12.0", 849 | "domain-browser": "^1.2.0", 850 | "events": "^3.0.0", 851 | "https-browserify": "^1.0.0", 852 | "os-browserify": "^0.3.0", 853 | "path-browserify": "^1.0.0", 854 | "process": "^0.11.10", 855 | "punycode": "^2.1.1", 856 | "querystring-es3": "^0.2.1", 857 | "readable-stream": "^3.3.0", 858 | "stream-browserify": "^2.0.2", 859 | "stream-http": "^3.0.0", 860 | "string_decoder": "^1.2.0", 861 | "timers-browserify": "^2.0.10", 862 | "tty-browserify": "0.0.1", 863 | "url": "^0.11.0", 864 | "util": "^0.11.1", 865 | "vm-browserify": "^1.1.0" 866 | }, 867 | "dependencies": { 868 | "asn1.js": { 869 | "version": "4.10.1", 870 | "bundled": true, 871 | "requires": { 872 | "bn.js": "^4.0.0", 873 | "inherits": "^2.0.1", 874 | "minimalistic-assert": "^1.0.0" 875 | } 876 | }, 877 | "assert": { 878 | "version": "1.4.1", 879 | "bundled": true, 880 | "requires": { 881 | "util": "0.10.3" 882 | }, 883 | "dependencies": { 884 | "util": { 885 | "version": "0.10.3", 886 | "bundled": true, 887 | "requires": { 888 | "inherits": "2.0.1" 889 | } 890 | } 891 | } 892 | }, 893 | "base64-js": { 894 | "version": "1.3.0", 895 | "bundled": true 896 | }, 897 | "bn.js": { 898 | "version": "4.11.8", 899 | "bundled": true 900 | }, 901 | "brorand": { 902 | "version": "1.1.0", 903 | "bundled": true 904 | }, 905 | "browserify-aes": { 906 | "version": "1.2.0", 907 | "bundled": true, 908 | "requires": { 909 | "buffer-xor": "^1.0.3", 910 | "cipher-base": "^1.0.0", 911 | "create-hash": "^1.1.0", 912 | "evp_bytestokey": "^1.0.3", 913 | "inherits": "^2.0.1", 914 | "safe-buffer": "^5.0.1" 915 | } 916 | }, 917 | "browserify-cipher": { 918 | "version": "1.0.1", 919 | "bundled": true, 920 | "requires": { 921 | "browserify-aes": "^1.0.4", 922 | "browserify-des": "^1.0.0", 923 | "evp_bytestokey": "^1.0.0" 924 | } 925 | }, 926 | "browserify-des": { 927 | "version": "1.0.2", 928 | "bundled": true, 929 | "requires": { 930 | "cipher-base": "^1.0.1", 931 | "des.js": "^1.0.0", 932 | "inherits": "^2.0.1", 933 | "safe-buffer": "^5.1.2" 934 | } 935 | }, 936 | "browserify-rsa": { 937 | "version": "4.0.1", 938 | "bundled": true, 939 | "requires": { 940 | "bn.js": "^4.1.0", 941 | "randombytes": "^2.0.1" 942 | } 943 | }, 944 | "browserify-sign": { 945 | "version": "4.0.4", 946 | "bundled": true, 947 | "requires": { 948 | "bn.js": "^4.1.1", 949 | "browserify-rsa": "^4.0.0", 950 | "create-hash": "^1.1.0", 951 | "create-hmac": "^1.1.2", 952 | "elliptic": "^6.0.0", 953 | "inherits": "^2.0.1", 954 | "parse-asn1": "^5.0.0" 955 | } 956 | }, 957 | "browserify-zlib": { 958 | "version": "0.2.0", 959 | "bundled": true, 960 | "requires": { 961 | "pako": "~1.0.5" 962 | } 963 | }, 964 | "buffer": { 965 | "version": "5.2.1", 966 | "bundled": true, 967 | "requires": { 968 | "base64-js": "^1.0.2", 969 | "ieee754": "^1.1.4" 970 | } 971 | }, 972 | "buffer-xor": { 973 | "version": "1.0.3", 974 | "bundled": true 975 | }, 976 | "builtin-status-codes": { 977 | "version": "3.0.0", 978 | "bundled": true 979 | }, 980 | "cipher-base": { 981 | "version": "1.0.4", 982 | "bundled": true, 983 | "requires": { 984 | "inherits": "^2.0.1", 985 | "safe-buffer": "^5.0.1" 986 | } 987 | }, 988 | "console-browserify": { 989 | "version": "1.1.0", 990 | "bundled": true, 991 | "requires": { 992 | "date-now": "^0.1.4" 993 | } 994 | }, 995 | "constants-browserify": { 996 | "version": "1.0.0", 997 | "bundled": true 998 | }, 999 | "core-util-is": { 1000 | "version": "1.0.2", 1001 | "bundled": true 1002 | }, 1003 | "create-ecdh": { 1004 | "version": "4.0.3", 1005 | "bundled": true, 1006 | "requires": { 1007 | "bn.js": "^4.1.0", 1008 | "elliptic": "^6.0.0" 1009 | } 1010 | }, 1011 | "create-hash": { 1012 | "version": "1.2.0", 1013 | "bundled": true, 1014 | "requires": { 1015 | "cipher-base": "^1.0.1", 1016 | "inherits": "^2.0.1", 1017 | "md5.js": "^1.3.4", 1018 | "ripemd160": "^2.0.1", 1019 | "sha.js": "^2.4.0" 1020 | } 1021 | }, 1022 | "create-hmac": { 1023 | "version": "1.1.7", 1024 | "bundled": true, 1025 | "requires": { 1026 | "cipher-base": "^1.0.3", 1027 | "create-hash": "^1.1.0", 1028 | "inherits": "^2.0.1", 1029 | "ripemd160": "^2.0.0", 1030 | "safe-buffer": "^5.0.1", 1031 | "sha.js": "^2.4.8" 1032 | } 1033 | }, 1034 | "crypto-browserify": { 1035 | "version": "3.12.0", 1036 | "bundled": true, 1037 | "requires": { 1038 | "browserify-cipher": "^1.0.0", 1039 | "browserify-sign": "^4.0.0", 1040 | "create-ecdh": "^4.0.0", 1041 | "create-hash": "^1.1.0", 1042 | "create-hmac": "^1.1.0", 1043 | "diffie-hellman": "^5.0.0", 1044 | "inherits": "^2.0.1", 1045 | "pbkdf2": "^3.0.3", 1046 | "public-encrypt": "^4.0.0", 1047 | "randombytes": "^2.0.0", 1048 | "randomfill": "^1.0.3" 1049 | } 1050 | }, 1051 | "date-now": { 1052 | "version": "0.1.4", 1053 | "bundled": true 1054 | }, 1055 | "des.js": { 1056 | "version": "1.0.0", 1057 | "bundled": true, 1058 | "requires": { 1059 | "inherits": "^2.0.1", 1060 | "minimalistic-assert": "^1.0.0" 1061 | } 1062 | }, 1063 | "diffie-hellman": { 1064 | "version": "5.0.3", 1065 | "bundled": true, 1066 | "requires": { 1067 | "bn.js": "^4.1.0", 1068 | "miller-rabin": "^4.0.0", 1069 | "randombytes": "^2.0.0" 1070 | } 1071 | }, 1072 | "domain-browser": { 1073 | "version": "1.2.0", 1074 | "bundled": true 1075 | }, 1076 | "elliptic": { 1077 | "version": "6.5.3", 1078 | "bundled": true, 1079 | "requires": { 1080 | "bn.js": "^4.4.0", 1081 | "brorand": "^1.0.1", 1082 | "hash.js": "^1.0.0", 1083 | "hmac-drbg": "^1.0.0", 1084 | "inherits": "^2.0.1", 1085 | "minimalistic-assert": "^1.0.0", 1086 | "minimalistic-crypto-utils": "^1.0.0" 1087 | } 1088 | }, 1089 | "events": { 1090 | "version": "3.0.0", 1091 | "bundled": true 1092 | }, 1093 | "evp_bytestokey": { 1094 | "version": "1.0.3", 1095 | "bundled": true, 1096 | "requires": { 1097 | "md5.js": "^1.3.4", 1098 | "safe-buffer": "^5.1.1" 1099 | } 1100 | }, 1101 | "hash-base": { 1102 | "version": "3.0.4", 1103 | "bundled": true, 1104 | "requires": { 1105 | "inherits": "^2.0.1", 1106 | "safe-buffer": "^5.0.1" 1107 | } 1108 | }, 1109 | "hash.js": { 1110 | "version": "1.1.7", 1111 | "bundled": true, 1112 | "requires": { 1113 | "inherits": "^2.0.3", 1114 | "minimalistic-assert": "^1.0.1" 1115 | }, 1116 | "dependencies": { 1117 | "inherits": { 1118 | "version": "2.0.3", 1119 | "bundled": true 1120 | } 1121 | } 1122 | }, 1123 | "hmac-drbg": { 1124 | "version": "1.0.1", 1125 | "bundled": true, 1126 | "requires": { 1127 | "hash.js": "^1.0.3", 1128 | "minimalistic-assert": "^1.0.0", 1129 | "minimalistic-crypto-utils": "^1.0.1" 1130 | } 1131 | }, 1132 | "https-browserify": { 1133 | "version": "1.0.0", 1134 | "bundled": true 1135 | }, 1136 | "ieee754": { 1137 | "version": "1.1.13", 1138 | "bundled": true 1139 | }, 1140 | "inherits": { 1141 | "version": "2.0.1", 1142 | "bundled": true 1143 | }, 1144 | "isarray": { 1145 | "version": "1.0.0", 1146 | "bundled": true 1147 | }, 1148 | "md5.js": { 1149 | "version": "1.3.5", 1150 | "bundled": true, 1151 | "requires": { 1152 | "hash-base": "^3.0.0", 1153 | "inherits": "^2.0.1", 1154 | "safe-buffer": "^5.1.2" 1155 | } 1156 | }, 1157 | "miller-rabin": { 1158 | "version": "4.0.1", 1159 | "bundled": true, 1160 | "requires": { 1161 | "bn.js": "^4.0.0", 1162 | "brorand": "^1.0.1" 1163 | } 1164 | }, 1165 | "minimalistic-assert": { 1166 | "version": "1.0.1", 1167 | "bundled": true 1168 | }, 1169 | "minimalistic-crypto-utils": { 1170 | "version": "1.0.1", 1171 | "bundled": true 1172 | }, 1173 | "os-browserify": { 1174 | "version": "0.3.0", 1175 | "bundled": true 1176 | }, 1177 | "pako": { 1178 | "version": "1.0.10", 1179 | "bundled": true 1180 | }, 1181 | "parse-asn1": { 1182 | "version": "5.1.4", 1183 | "bundled": true, 1184 | "requires": { 1185 | "asn1.js": "^4.0.0", 1186 | "browserify-aes": "^1.0.0", 1187 | "create-hash": "^1.1.0", 1188 | "evp_bytestokey": "^1.0.0", 1189 | "pbkdf2": "^3.0.3", 1190 | "safe-buffer": "^5.1.1" 1191 | } 1192 | }, 1193 | "path-browserify": { 1194 | "version": "1.0.0", 1195 | "bundled": true 1196 | }, 1197 | "pbkdf2": { 1198 | "version": "3.0.17", 1199 | "bundled": true, 1200 | "requires": { 1201 | "create-hash": "^1.1.2", 1202 | "create-hmac": "^1.1.4", 1203 | "ripemd160": "^2.0.1", 1204 | "safe-buffer": "^5.0.1", 1205 | "sha.js": "^2.4.8" 1206 | } 1207 | }, 1208 | "process": { 1209 | "version": "0.11.10", 1210 | "bundled": true 1211 | }, 1212 | "process-nextick-args": { 1213 | "version": "2.0.0", 1214 | "bundled": true 1215 | }, 1216 | "public-encrypt": { 1217 | "version": "4.0.3", 1218 | "bundled": true, 1219 | "requires": { 1220 | "bn.js": "^4.1.0", 1221 | "browserify-rsa": "^4.0.0", 1222 | "create-hash": "^1.1.0", 1223 | "parse-asn1": "^5.0.0", 1224 | "randombytes": "^2.0.1", 1225 | "safe-buffer": "^5.1.2" 1226 | } 1227 | }, 1228 | "punycode": { 1229 | "version": "2.1.1", 1230 | "bundled": true 1231 | }, 1232 | "querystring": { 1233 | "version": "0.2.0", 1234 | "bundled": true 1235 | }, 1236 | "querystring-es3": { 1237 | "version": "0.2.1", 1238 | "bundled": true 1239 | }, 1240 | "randombytes": { 1241 | "version": "2.1.0", 1242 | "bundled": true, 1243 | "requires": { 1244 | "safe-buffer": "^5.1.0" 1245 | } 1246 | }, 1247 | "randomfill": { 1248 | "version": "1.0.4", 1249 | "bundled": true, 1250 | "requires": { 1251 | "randombytes": "^2.0.5", 1252 | "safe-buffer": "^5.1.0" 1253 | } 1254 | }, 1255 | "readable-stream": { 1256 | "version": "3.3.0", 1257 | "bundled": true, 1258 | "requires": { 1259 | "inherits": "^2.0.3", 1260 | "string_decoder": "^1.1.1", 1261 | "util-deprecate": "^1.0.1" 1262 | }, 1263 | "dependencies": { 1264 | "inherits": { 1265 | "version": "2.0.3", 1266 | "bundled": true 1267 | } 1268 | } 1269 | }, 1270 | "ripemd160": { 1271 | "version": "2.0.2", 1272 | "bundled": true, 1273 | "requires": { 1274 | "hash-base": "^3.0.0", 1275 | "inherits": "^2.0.1" 1276 | } 1277 | }, 1278 | "safe-buffer": { 1279 | "version": "5.1.2", 1280 | "bundled": true 1281 | }, 1282 | "setimmediate": { 1283 | "version": "1.0.5", 1284 | "bundled": true 1285 | }, 1286 | "sha.js": { 1287 | "version": "2.4.11", 1288 | "bundled": true, 1289 | "requires": { 1290 | "inherits": "^2.0.1", 1291 | "safe-buffer": "^5.0.1" 1292 | } 1293 | }, 1294 | "stream-browserify": { 1295 | "version": "2.0.2", 1296 | "bundled": true, 1297 | "requires": { 1298 | "inherits": "~2.0.1", 1299 | "readable-stream": "^2.0.2" 1300 | }, 1301 | "dependencies": { 1302 | "readable-stream": { 1303 | "version": "2.3.6", 1304 | "bundled": true, 1305 | "requires": { 1306 | "core-util-is": "~1.0.0", 1307 | "inherits": "~2.0.3", 1308 | "isarray": "~1.0.0", 1309 | "process-nextick-args": "~2.0.0", 1310 | "safe-buffer": "~5.1.1", 1311 | "string_decoder": "~1.1.1", 1312 | "util-deprecate": "~1.0.1" 1313 | }, 1314 | "dependencies": { 1315 | "inherits": { 1316 | "version": "2.0.3", 1317 | "bundled": true 1318 | } 1319 | } 1320 | }, 1321 | "string_decoder": { 1322 | "version": "1.1.1", 1323 | "bundled": true, 1324 | "requires": { 1325 | "safe-buffer": "~5.1.0" 1326 | } 1327 | } 1328 | } 1329 | }, 1330 | "stream-http": { 1331 | "version": "3.0.0", 1332 | "bundled": true, 1333 | "requires": { 1334 | "builtin-status-codes": "^3.0.0", 1335 | "inherits": "^2.0.1", 1336 | "readable-stream": "^3.0.6", 1337 | "xtend": "^4.0.0" 1338 | } 1339 | }, 1340 | "string_decoder": { 1341 | "version": "1.2.0", 1342 | "bundled": true, 1343 | "requires": { 1344 | "safe-buffer": "~5.1.0" 1345 | } 1346 | }, 1347 | "timers-browserify": { 1348 | "version": "2.0.10", 1349 | "bundled": true, 1350 | "requires": { 1351 | "setimmediate": "^1.0.4" 1352 | } 1353 | }, 1354 | "tty-browserify": { 1355 | "version": "0.0.1", 1356 | "bundled": true 1357 | }, 1358 | "url": { 1359 | "version": "0.11.0", 1360 | "bundled": true, 1361 | "requires": { 1362 | "punycode": "1.3.2", 1363 | "querystring": "0.2.0" 1364 | }, 1365 | "dependencies": { 1366 | "punycode": { 1367 | "version": "1.3.2", 1368 | "bundled": true 1369 | } 1370 | } 1371 | }, 1372 | "util": { 1373 | "version": "0.11.1", 1374 | "bundled": true, 1375 | "requires": { 1376 | "inherits": "2.0.3" 1377 | }, 1378 | "dependencies": { 1379 | "inherits": { 1380 | "version": "2.0.3", 1381 | "bundled": true 1382 | } 1383 | } 1384 | }, 1385 | "util-deprecate": { 1386 | "version": "1.0.2", 1387 | "bundled": true 1388 | }, 1389 | "vm-browserify": { 1390 | "version": "1.1.0", 1391 | "bundled": true 1392 | }, 1393 | "xtend": { 1394 | "version": "4.0.1", 1395 | "bundled": true 1396 | } 1397 | } 1398 | }, 1399 | "micromatch": { 1400 | "version": "4.0.2", 1401 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", 1402 | "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", 1403 | "dev": true, 1404 | "requires": { 1405 | "braces": "^3.0.1", 1406 | "picomatch": "^2.0.5" 1407 | } 1408 | }, 1409 | "mime-db": { 1410 | "version": "1.44.0", 1411 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 1412 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", 1413 | "dev": true 1414 | }, 1415 | "mime-types": { 1416 | "version": "2.1.27", 1417 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 1418 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 1419 | "dev": true, 1420 | "requires": { 1421 | "mime-db": "1.44.0" 1422 | } 1423 | }, 1424 | "minimatch": { 1425 | "version": "3.0.4", 1426 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1427 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1428 | "dev": true, 1429 | "requires": { 1430 | "brace-expansion": "^1.1.7" 1431 | } 1432 | }, 1433 | "minimist": { 1434 | "version": "1.2.5", 1435 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1436 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1437 | "dev": true 1438 | }, 1439 | "mkdirp": { 1440 | "version": "0.5.5", 1441 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1442 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1443 | "dev": true, 1444 | "requires": { 1445 | "minimist": "^1.2.5" 1446 | } 1447 | }, 1448 | "mongo-object": { 1449 | "version": "0.1.4", 1450 | "resolved": "https://registry.npmjs.org/mongo-object/-/mongo-object-0.1.4.tgz", 1451 | "integrity": "sha512-QtYk0gupWEn2+iB+DDRt1L+WbcNYvJRaHdih/dcqthOa1DbnREUGSs2WGcW478GNYpElflo/yybZXu0sTiRXHg==" 1452 | }, 1453 | "ms": { 1454 | "version": "2.0.0", 1455 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1456 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1457 | "dev": true 1458 | }, 1459 | "oauth-sign": { 1460 | "version": "0.9.0", 1461 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1462 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1463 | "dev": true 1464 | }, 1465 | "object-assign": { 1466 | "version": "4.1.1", 1467 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1468 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1469 | "dev": true 1470 | }, 1471 | "once": { 1472 | "version": "1.4.0", 1473 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1474 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1475 | "dev": true, 1476 | "requires": { 1477 | "wrappy": "1" 1478 | } 1479 | }, 1480 | "p-map": { 1481 | "version": "1.2.0", 1482 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", 1483 | "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", 1484 | "dev": true 1485 | }, 1486 | "pako": { 1487 | "version": "1.0.11", 1488 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 1489 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 1490 | "dev": true 1491 | }, 1492 | "path-is-absolute": { 1493 | "version": "1.0.1", 1494 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1495 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1496 | "dev": true 1497 | }, 1498 | "path-is-inside": { 1499 | "version": "1.0.2", 1500 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1501 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1502 | "dev": true 1503 | }, 1504 | "pend": { 1505 | "version": "1.2.0", 1506 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1507 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 1508 | "dev": true 1509 | }, 1510 | "performance-now": { 1511 | "version": "2.1.0", 1512 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1513 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 1514 | "dev": true 1515 | }, 1516 | "picomatch": { 1517 | "version": "2.2.2", 1518 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 1519 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 1520 | "dev": true 1521 | }, 1522 | "pify": { 1523 | "version": "3.0.0", 1524 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1525 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1526 | "dev": true 1527 | }, 1528 | "pinkie": { 1529 | "version": "2.0.4", 1530 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1531 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1532 | "dev": true 1533 | }, 1534 | "pinkie-promise": { 1535 | "version": "2.0.1", 1536 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1537 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1538 | "dev": true, 1539 | "requires": { 1540 | "pinkie": "^2.0.0" 1541 | } 1542 | }, 1543 | "pretty-format": { 1544 | "version": "26.6.2", 1545 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", 1546 | "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", 1547 | "dev": true, 1548 | "requires": { 1549 | "@jest/types": "^26.6.2", 1550 | "ansi-regex": "^5.0.0", 1551 | "ansi-styles": "^4.0.0", 1552 | "react-is": "^17.0.1" 1553 | } 1554 | }, 1555 | "process-nextick-args": { 1556 | "version": "2.0.1", 1557 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1558 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1559 | "dev": true 1560 | }, 1561 | "psl": { 1562 | "version": "1.8.0", 1563 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1564 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", 1565 | "dev": true 1566 | }, 1567 | "punycode": { 1568 | "version": "2.1.1", 1569 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1570 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1571 | "dev": true 1572 | }, 1573 | "qs": { 1574 | "version": "6.5.2", 1575 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1576 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 1577 | "dev": true 1578 | }, 1579 | "react-is": { 1580 | "version": "17.0.1", 1581 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", 1582 | "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", 1583 | "dev": true 1584 | }, 1585 | "readable-stream": { 1586 | "version": "2.3.7", 1587 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1588 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1589 | "dev": true, 1590 | "requires": { 1591 | "core-util-is": "~1.0.0", 1592 | "inherits": "~2.0.3", 1593 | "isarray": "~1.0.0", 1594 | "process-nextick-args": "~2.0.0", 1595 | "safe-buffer": "~5.1.1", 1596 | "string_decoder": "~1.1.1", 1597 | "util-deprecate": "~1.0.1" 1598 | } 1599 | }, 1600 | "regenerator-runtime": { 1601 | "version": "0.13.7", 1602 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", 1603 | "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" 1604 | }, 1605 | "request": { 1606 | "version": "2.88.2", 1607 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1608 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1609 | "dev": true, 1610 | "requires": { 1611 | "aws-sign2": "~0.7.0", 1612 | "aws4": "^1.8.0", 1613 | "caseless": "~0.12.0", 1614 | "combined-stream": "~1.0.6", 1615 | "extend": "~3.0.2", 1616 | "forever-agent": "~0.6.1", 1617 | "form-data": "~2.3.2", 1618 | "har-validator": "~5.1.3", 1619 | "http-signature": "~1.2.0", 1620 | "is-typedarray": "~1.0.0", 1621 | "isstream": "~0.1.2", 1622 | "json-stringify-safe": "~5.0.1", 1623 | "mime-types": "~2.1.19", 1624 | "oauth-sign": "~0.9.0", 1625 | "performance-now": "^2.1.0", 1626 | "qs": "~6.5.2", 1627 | "safe-buffer": "^5.1.2", 1628 | "tough-cookie": "~2.5.0", 1629 | "tunnel-agent": "^0.6.0", 1630 | "uuid": "^3.3.2" 1631 | } 1632 | }, 1633 | "rimraf": { 1634 | "version": "2.7.1", 1635 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1636 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1637 | "dev": true, 1638 | "requires": { 1639 | "glob": "^7.1.3" 1640 | } 1641 | }, 1642 | "safe-buffer": { 1643 | "version": "5.1.2", 1644 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1645 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1646 | "dev": true 1647 | }, 1648 | "safer-buffer": { 1649 | "version": "2.1.2", 1650 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1651 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1652 | "dev": true 1653 | }, 1654 | "selenium-webdriver": { 1655 | "version": "4.0.0-alpha.8", 1656 | "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.8.tgz", 1657 | "integrity": "sha512-yPSaiWySZTEbxuuWQMDqdXh3H3N4Aiw/bSUjpkKMPWWCysfPqUncrq6FewBqdxWD1wQKzy5yWaQMGsgTY/0rCQ==", 1658 | "dev": true, 1659 | "requires": { 1660 | "jszip": "^3.5.0", 1661 | "rimraf": "^2.7.1", 1662 | "tmp": "^0.1.0", 1663 | "ws": "^7.3.1" 1664 | }, 1665 | "dependencies": { 1666 | "rimraf": { 1667 | "version": "2.7.1", 1668 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1669 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1670 | "dev": true, 1671 | "requires": { 1672 | "glob": "^7.1.3" 1673 | } 1674 | } 1675 | } 1676 | }, 1677 | "set-immediate-shim": { 1678 | "version": "1.0.1", 1679 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 1680 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", 1681 | "dev": true 1682 | }, 1683 | "simpl-schema": { 1684 | "version": "1.10.2", 1685 | "resolved": "https://registry.npmjs.org/simpl-schema/-/simpl-schema-1.10.2.tgz", 1686 | "integrity": "sha512-s53RTUqy4sLR9ah8Jqgs2yqyQeImYDPWGqBxcboJRj4FN3Z022r1TEeYkN0k6sxVtE1E+dXk0aFEbRnEiFHB8w==", 1687 | "requires": { 1688 | "clone": "^2.1.2", 1689 | "message-box": "^0.2.7", 1690 | "mongo-object": "^0.1.4" 1691 | } 1692 | }, 1693 | "slash": { 1694 | "version": "3.0.0", 1695 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1696 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1697 | "dev": true 1698 | }, 1699 | "sshpk": { 1700 | "version": "1.16.1", 1701 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1702 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1703 | "dev": true, 1704 | "requires": { 1705 | "asn1": "~0.2.3", 1706 | "assert-plus": "^1.0.0", 1707 | "bcrypt-pbkdf": "^1.0.0", 1708 | "dashdash": "^1.12.0", 1709 | "ecc-jsbn": "~0.1.1", 1710 | "getpass": "^0.1.1", 1711 | "jsbn": "~0.1.0", 1712 | "safer-buffer": "^2.0.2", 1713 | "tweetnacl": "~0.14.0" 1714 | } 1715 | }, 1716 | "stack-utils": { 1717 | "version": "2.0.3", 1718 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", 1719 | "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", 1720 | "dev": true, 1721 | "requires": { 1722 | "escape-string-regexp": "^2.0.0" 1723 | }, 1724 | "dependencies": { 1725 | "escape-string-regexp": { 1726 | "version": "2.0.0", 1727 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 1728 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 1729 | "dev": true 1730 | } 1731 | } 1732 | }, 1733 | "string_decoder": { 1734 | "version": "1.1.1", 1735 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1736 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1737 | "dev": true, 1738 | "requires": { 1739 | "safe-buffer": "~5.1.0" 1740 | } 1741 | }, 1742 | "supports-color": { 1743 | "version": "7.2.0", 1744 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1745 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1746 | "dev": true, 1747 | "requires": { 1748 | "has-flag": "^4.0.0" 1749 | } 1750 | }, 1751 | "tcp-port-used": { 1752 | "version": "1.0.1", 1753 | "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.1.tgz", 1754 | "integrity": "sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q==", 1755 | "dev": true, 1756 | "requires": { 1757 | "debug": "4.1.0", 1758 | "is2": "2.0.1" 1759 | }, 1760 | "dependencies": { 1761 | "debug": { 1762 | "version": "4.1.0", 1763 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", 1764 | "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", 1765 | "dev": true, 1766 | "requires": { 1767 | "ms": "^2.1.1" 1768 | } 1769 | }, 1770 | "ms": { 1771 | "version": "2.1.3", 1772 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1773 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1774 | "dev": true 1775 | } 1776 | } 1777 | }, 1778 | "tmp": { 1779 | "version": "0.1.0", 1780 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", 1781 | "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", 1782 | "dev": true, 1783 | "requires": { 1784 | "rimraf": "^2.6.3" 1785 | }, 1786 | "dependencies": { 1787 | "rimraf": { 1788 | "version": "2.7.1", 1789 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1790 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1791 | "dev": true, 1792 | "requires": { 1793 | "glob": "^7.1.3" 1794 | } 1795 | } 1796 | } 1797 | }, 1798 | "to-regex-range": { 1799 | "version": "5.0.1", 1800 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1801 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1802 | "dev": true, 1803 | "requires": { 1804 | "is-number": "^7.0.0" 1805 | } 1806 | }, 1807 | "tough-cookie": { 1808 | "version": "2.5.0", 1809 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1810 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1811 | "dev": true, 1812 | "requires": { 1813 | "psl": "^1.1.28", 1814 | "punycode": "^2.1.1" 1815 | } 1816 | }, 1817 | "tunnel-agent": { 1818 | "version": "0.6.0", 1819 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1820 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1821 | "dev": true, 1822 | "requires": { 1823 | "safe-buffer": "^5.0.1" 1824 | } 1825 | }, 1826 | "tweetnacl": { 1827 | "version": "0.14.5", 1828 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1829 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1830 | "dev": true 1831 | }, 1832 | "typedarray": { 1833 | "version": "0.0.6", 1834 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1835 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1836 | "dev": true 1837 | }, 1838 | "uri-js": { 1839 | "version": "4.4.0", 1840 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", 1841 | "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", 1842 | "dev": true, 1843 | "requires": { 1844 | "punycode": "^2.1.0" 1845 | } 1846 | }, 1847 | "util-deprecate": { 1848 | "version": "1.0.2", 1849 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1850 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1851 | "dev": true 1852 | }, 1853 | "uuid": { 1854 | "version": "3.4.0", 1855 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1856 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 1857 | "dev": true 1858 | }, 1859 | "verror": { 1860 | "version": "1.10.0", 1861 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1862 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1863 | "dev": true, 1864 | "requires": { 1865 | "assert-plus": "^1.0.0", 1866 | "core-util-is": "1.0.2", 1867 | "extsprintf": "^1.2.0" 1868 | } 1869 | }, 1870 | "wrappy": { 1871 | "version": "1.0.2", 1872 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1873 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1874 | "dev": true 1875 | }, 1876 | "ws": { 1877 | "version": "7.4.1", 1878 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", 1879 | "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", 1880 | "dev": true 1881 | }, 1882 | "yauzl": { 1883 | "version": "2.10.0", 1884 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1885 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1886 | "dev": true, 1887 | "requires": { 1888 | "buffer-crc32": "~0.2.3", 1889 | "fd-slicer": "~1.1.0" 1890 | } 1891 | } 1892 | } 1893 | } 1894 | -------------------------------------------------------------------------------- /tests/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tests", 3 | "private": true, 4 | "scripts": { 5 | "test": "METEOR_PACKAGE_DIRS=../package TEST_BROWSER_DRIVER=chrome meteor test --once --driver-package meteortesting:mocha", 6 | "test:watch": "METEOR_PACKAGE_DIRS=../package TEST_BROWSER_DRIVER=chrome TEST_WATCH=1 meteor test --driver-package meteortesting:mocha", 7 | "test:watch:browser": "METEOR_PACKAGE_DIRS=../package TEST_WATCH=1 meteor test --driver-package meteortesting:mocha" 8 | }, 9 | "dependencies": { 10 | "@babel/runtime": "^7.11.2", 11 | "meteor-node-stubs": "^1.0.1", 12 | "simpl-schema": "^1.10.2" 13 | }, 14 | "meteor": { 15 | "testModule": "tests/main.js" 16 | }, 17 | "devDependencies": { 18 | "chromedriver": "^2.35.0", 19 | "expect": "^26.6.2", 20 | "selenium-webdriver": "^4.0.0-alpha.8" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tests/tests/main.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-shadow */ 2 | 3 | import expect from "expect"; 4 | import { Meteor } from "meteor/meteor"; 5 | import { Mongo } from "meteor/mongo"; 6 | import { Random } from "meteor/random"; 7 | import SimpleSchema from "simpl-schema"; 8 | 9 | process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = "1"; 10 | 11 | const test = new Mongo.Collection("test"); 12 | test.attachSchema( 13 | new SimpleSchema({ 14 | title: { 15 | type: String, 16 | label: "Title", 17 | max: 200, 18 | index: 1, 19 | }, 20 | author: { 21 | type: String, 22 | label: "Author", 23 | }, 24 | copies: { 25 | type: Number, 26 | label: "Number of copies", 27 | min: 0, 28 | }, 29 | lastCheckedOut: { 30 | type: Date, 31 | label: "Last date this book was checked out", 32 | optional: true, 33 | }, 34 | summary: { 35 | type: String, 36 | label: "Brief summary", 37 | optional: true, 38 | max: 1000, 39 | }, 40 | isbn: { 41 | type: String, 42 | label: "ISBN", 43 | optional: true, 44 | index: 1, 45 | unique: true, 46 | }, 47 | field1: { 48 | type: String, 49 | optional: true, 50 | }, 51 | field2: { 52 | type: String, 53 | optional: true, 54 | }, 55 | createdAt: { 56 | type: Date, 57 | optional: true, 58 | }, 59 | updatedAt: { 60 | type: Date, 61 | optional: true, 62 | }, 63 | }) 64 | ); 65 | 66 | // Add one unique index outside of C2 67 | if (Meteor.isServer) { 68 | try { 69 | test._dropIndex({ field1: 1, field2: 1 }); 70 | } catch (error) { 71 | // ignore 72 | } 73 | test._ensureIndex({ field1: 1, field2: 1 }, { unique: true, sparse: true }); 74 | } 75 | 76 | describe("unique", () => { 77 | beforeEach(() => { 78 | test.find({}).forEach((doc) => { 79 | test.remove(doc._id); 80 | }); 81 | }); 82 | 83 | it("insert does not fail if the value is unique", (done) => { 84 | const isbn = Random.id(); 85 | // Insert isbn 86 | test.insert( 87 | { 88 | title: "Ulysses", 89 | author: "James Joyce", 90 | copies: 1, 91 | isbn, 92 | }, 93 | (error, id) => { 94 | expect(!!error).toBe(false); 95 | expect(typeof id).toBe("string"); 96 | 97 | const validationErrors = test 98 | .simpleSchema() 99 | .namedContext() 100 | .validationErrors(); 101 | expect(validationErrors.length).toBe(0); 102 | 103 | // Insert isbn+'A' 104 | test.insert( 105 | { 106 | title: "Ulysses", 107 | author: "James Joyce", 108 | copies: 1, 109 | isbn: `${isbn}A`, 110 | }, 111 | (error, id) => { 112 | expect(!!error).toBe(false); 113 | expect(typeof id).toBe("string"); 114 | 115 | const validationErrors = test 116 | .simpleSchema() 117 | .namedContext() 118 | .validationErrors(); 119 | expect(validationErrors.length).toBe(0); 120 | 121 | done(); 122 | } 123 | ); 124 | } 125 | ); 126 | }); 127 | 128 | it("insert fails if another document already has the same value", (done) => { 129 | const isbn = Random.id(); 130 | // Insert isbn 131 | test.insert( 132 | { 133 | title: "Ulysses", 134 | author: "James Joyce", 135 | copies: 1, 136 | isbn, 137 | }, 138 | (error, id) => { 139 | expect(!!error).toBe(false); 140 | expect(typeof id).toBe("string"); 141 | 142 | const validationErrors = test 143 | .simpleSchema() 144 | .namedContext() 145 | .validationErrors(); 146 | expect(validationErrors.length).toBe(0); 147 | 148 | // Insert same isbn again 149 | test.insert( 150 | { 151 | title: "Ulysses", 152 | author: "James Joyce", 153 | copies: 1, 154 | isbn, 155 | }, 156 | (error, id) => { 157 | expect(error && error.message).toBe("ISBN must be unique"); 158 | expect(!!id).toBe(false); 159 | 160 | const validationErrors = test 161 | .simpleSchema() 162 | .namedContext() 163 | .validationErrors(); 164 | expect(validationErrors.length).toBe(1); 165 | 166 | const key = validationErrors[0] || {}; 167 | expect(key.name).toBe("isbn"); 168 | expect(key.type).toBe("notUnique"); 169 | 170 | done(); 171 | } 172 | ); 173 | } 174 | ); 175 | }); 176 | 177 | it("insert fails on duplicate if there is a unique index from outside collection2", (done) => { 178 | const val = Meteor.isServer ? "foo" : "bar"; 179 | 180 | // Good insert 181 | test.insert( 182 | { 183 | title: "Ulysses", 184 | author: "James Joyce", 185 | copies: 1, 186 | field1: val, 187 | field2: val, 188 | }, 189 | (error, id) => { 190 | expect(!!error).toBe(false); 191 | expect(typeof id).toBe("string"); 192 | 193 | const validationErrors = test 194 | .simpleSchema() 195 | .namedContext() 196 | .validationErrors(); 197 | expect(validationErrors.length).toBe(0); 198 | 199 | // Bad insert 200 | test.insert( 201 | { 202 | title: "Ulysses", 203 | author: "James Joyce", 204 | copies: 1, 205 | field1: val, 206 | field2: val, 207 | }, 208 | (error, id) => { 209 | expect(!!error).toBe(true); 210 | expect(!!id).toBe(false); 211 | 212 | // No validation errors since created outside C2 213 | // (Currently we can't tell which field it was from the error message for generic unique messages) 214 | const validationErrors = test 215 | .simpleSchema() 216 | .namedContext() 217 | .validationErrors(); 218 | expect(validationErrors.length).toBe(0); 219 | 220 | done(); 221 | } 222 | ); 223 | } 224 | ); 225 | }); 226 | 227 | it("validation without updating", (done) => { 228 | const context = test.simpleSchema().namedContext(); 229 | 230 | const isbn = Random.id(); 231 | // Insert isbn 232 | test.insert( 233 | { 234 | title: "Ulysses", 235 | author: "James Joyce", 236 | copies: 1, 237 | isbn, 238 | }, 239 | () => { 240 | // We don't know whether this would result in a non-unique value or not because 241 | // we don't know which documents we'd be changing; therefore, no notUnique error 242 | context.validate( 243 | { 244 | $set: { 245 | isbn, 246 | }, 247 | }, 248 | { 249 | modifier: true, 250 | } 251 | ); 252 | 253 | let validationErrors = context.validationErrors(); 254 | expect(validationErrors.length).toBe(0); 255 | 256 | context.validate( 257 | { 258 | $set: { 259 | isbn, 260 | }, 261 | }, 262 | { 263 | keys: ["isbn"], 264 | modifier: true, 265 | } 266 | ); 267 | validationErrors = context.validationErrors(); 268 | expect(validationErrors.length).toBe(0); 269 | 270 | done(); 271 | } 272 | ); 273 | }); 274 | 275 | it("updates do not fail when the document being updated has the same value", (done) => { 276 | const isbn = Random.id(); 277 | // Insert isbn 278 | test.insert( 279 | { 280 | title: "Ulysses", 281 | author: "James Joyce", 282 | copies: 1, 283 | isbn, 284 | }, 285 | (error, id) => { 286 | test.update( 287 | id, 288 | { 289 | $set: { isbn }, 290 | }, 291 | (error) => { 292 | expect(!!error).toBe(false); 293 | const validationErrors = test 294 | .simpleSchema() 295 | .namedContext() 296 | .validationErrors(); 297 | expect(validationErrors.length).toBe(0); 298 | done(); 299 | } 300 | ); 301 | } 302 | ); 303 | }); 304 | 305 | it("update fails if another document already has the same value", (done) => { 306 | const isbn1 = Random.id(); 307 | const isbn2 = Random.id(); 308 | 309 | // Insert isbn1 310 | test.insert( 311 | { 312 | title: "Ulysses", 313 | author: "James Joyce", 314 | copies: 1, 315 | isbn: isbn1, 316 | }, 317 | (error, id) => { 318 | expect(!!error).toBe(false); 319 | expect(typeof id).toBe("string"); 320 | 321 | // Insert isbn2 322 | test.insert( 323 | { 324 | title: "Ulysses", 325 | author: "James Joyce", 326 | copies: 1, 327 | isbn: isbn2, 328 | }, 329 | (error, id) => { 330 | expect(!!error).toBe(false); 331 | expect(typeof id).toBe("string"); 332 | 333 | // Try changing isbn2 to isbn1 334 | test.update( 335 | id, 336 | { 337 | $set: { isbn: isbn1 }, 338 | }, 339 | (error, result) => { 340 | expect(!!error).toBe(true); 341 | expect(result).toBe(undefined); 342 | 343 | const validationErrors = test 344 | .simpleSchema() 345 | .namedContext() 346 | .validationErrors(); 347 | expect(validationErrors.length).toBe(1); 348 | 349 | const key = validationErrors[0] || {}; 350 | expect(key.name).toBe("isbn"); 351 | expect(key.type).toBe("notUnique"); 352 | 353 | done(); 354 | } 355 | ); 356 | } 357 | ); 358 | } 359 | ); 360 | }); 361 | 362 | it("properly defines the index for arrays of objects", () => { 363 | const testCollection = new Mongo.Collection("testCollection"); 364 | // We need to handle arrays of objects specially because the 365 | // index key must be 'a.b' if, for example, the schema key is 'a.$.b'. 366 | // Here we make sure that works. 367 | const testSchema = new SimpleSchema({ 368 | a: Object, 369 | "a.$": Object, 370 | "a.$.b": { 371 | type: String, 372 | unique: true, 373 | }, 374 | }); 375 | 376 | expect(() => { 377 | testCollection.attachSchema(testSchema); 378 | }).not.toThrow(); 379 | }); 380 | }); 381 | --------------------------------------------------------------------------------