diff --git a/.docker/Dockerfile b/.docker/Dockerfile index b845c74c74a0..4dd6fde1e5c8 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,6 +1,6 @@ FROM rocketchat/base:8 -ENV RC_VERSION 0.61.2 +ENV RC_VERSION 0.62.0 MAINTAINER buildmaster@rocket.chat diff --git a/.eslintrc b/.eslintrc index 2c9849702331..21792799a5c2 100644 --- a/.eslintrc +++ b/.eslintrc @@ -93,6 +93,7 @@ "AccountBox" : false, "Accounts" : false, "AgentUsers" : false, + "Apps" : false, "Assets" : false, "Blaze" : false, "BlazeLayout" : false, diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 37465b0ef121..b30c37f15940 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -14,12 +14,13 @@ If you are experiencing a bug please search our issues to be sure it is not alre ### Server Setup Information: -* Version of Rocket.Chat Server: -* Operating System: -* Deployment Method(snap/docker/tar/etc): +* Version of Rocket.Chat Server: +* Operating System: +* Deployment Method(snap/docker/tar/etc): * Number of Running Instances: -* DB Replicaset Oplog: -* Node Version: +* DB Replicaset Oplog: +* Node Version: +* mongoDB Version: ### Steps to Reproduce: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 2d23ea31a7c7..c9f411fbc977 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -9,4 +9,6 @@ Closes #ISSUE_NUMBER + + diff --git a/.github/bot-config.yml b/.github/bot-config.yml index d87148f4b7b5..7898d36372c7 100644 --- a/.github/bot-config.yml +++ b/.github/bot-config.yml @@ -4,6 +4,7 @@ whitelist: users: - TwizzyDizzy - theorenck + - JSzaszvari labels: - duplicate - enhancement diff --git a/.meteor/packages b/.meteor/packages index 13e508f88f2d..f6da7829fd40 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -5,41 +5,42 @@ rocketchat:cors -accounts-facebook@1.3.0 -accounts-github@1.4.0 -accounts-google@1.3.0 -accounts-meteor-developer@1.4.0 +accounts-facebook@1.3.1 +accounts-github@1.4.1 +accounts-google@1.3.1 +accounts-meteor-developer@1.4.1 accounts-password@1.5.0 -accounts-twitter@1.4.0 +accounts-twitter@1.4.1 blaze-html-templates -check@1.2.5 +check@1.3.0 ddp-rate-limiter@1.0.7 -ddp-common@1.3.0 -dynamic-import@0.2.0 -ecmascript@0.9.0 +ddp-common@1.4.0 +dynamic-import@0.3.0 +ecmascript@0.10.0 ejson@1.1.0 email@1.2.3 fastclick@1.0.13 -http@1.3.0 +http@1.4.0 jquery@1.11.10 logging@1.1.19 -meteor-base@1.2.0 +meteor-base@1.3.0 mobile-experience@1.0.5 -mongo@1.3.1 -random@1.0.10 +mongo@1.4.2 +random@1.1.0 rate-limit@1.0.8 reactive-dict@1.2.0 reactive-var@1.0.11 -reload@1.1.11 +reload@1.2.0 service-configuration@1.0.11 session@1.1.7 -shell-server@0.3.0 +shell-server@0.3.1 spacebars -standard-minifier-js@2.2.0 +standard-minifier-js@2.3.1 tracker@1.1.3 rocketchat:2fa rocketchat:action-links +rocketchat:accounts rocketchat:analytics rocketchat:api rocketchat:assets @@ -67,6 +68,11 @@ rocketchat:github-enterprise rocketchat:gitlab #rocketchat:google-natural-language rocketchat:google-vision +rocketchat:grant +rocketchat:grant-facebook +rocketchat:grant-github +rocketchat:grant-google +rocketchat:graphql rocketchat:highlight-words rocketchat:iframe-login rocketchat:importer @@ -83,6 +89,7 @@ rocketchat:katex rocketchat:ldap rocketchat:lib rocketchat:livechat +rocketchat:livestream rocketchat:logger rocketchat:login-token rocketchat:mailer @@ -103,6 +110,7 @@ rocketchat:otr rocketchat:postcss rocketchat:push-notifications rocketchat:reactions +rocketchat:apps rocketchat:sandstorm rocketchat:slackbridge rocketchat:slashcommands-archive @@ -142,12 +150,12 @@ rocketchat:version rocketchat:videobridge rocketchat:webrtc rocketchat:wordpress +rocketchat:nrr konecty:change-case konecty:delayed-task konecty:mongo-counter konecty:multiple-instances-status -konecty:nrr konecty:user-presence deepwell:bootstrap-datepicker2 @@ -176,3 +184,4 @@ steffo:meteor-accounts-saml todda00:friendly-slugs yasaricli:slugify yasinuslu:blaze-meta +rocketchat:version-check diff --git a/.meteor/release b/.meteor/release index 56a7a07fee76..d502dc0d921a 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@1.6.0.1 +METEOR@1.6.1 diff --git a/.meteor/versions b/.meteor/versions index 857d6f1c91df..fe345b2e9cbd 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -8,41 +8,41 @@ accounts-password@1.5.0 accounts-twitter@1.4.1 aldeed:simple-schema@1.5.3 allow-deny@1.1.0 -autoupdate@1.3.12 -babel-compiler@6.24.7 -babel-runtime@1.1.1 -base64@1.0.10 +autoupdate@1.4.0 +babel-compiler@7.0.4 +babel-runtime@1.2.2 +base64@1.0.11 binary-heap@1.0.10 blaze@2.3.2 blaze-html-templates@1.1.2 blaze-tools@1.0.10 -boilerplate-generator@1.3.1 -caching-compiler@1.1.9 +boilerplate-generator@1.4.0 +caching-compiler@1.1.11 caching-html-compiler@1.1.2 -callback-hook@1.0.10 +callback-hook@1.1.0 cfs:http-methods@0.0.32 -check@1.2.5 -coffeescript@1.12.7_3 -coffeescript-compiler@1.12.7_3 +check@1.3.0 +coffeescript@1.0.17 dandv:caret-position@2.1.1 ddp@1.4.0 -ddp-client@2.2.0 -ddp-common@1.3.0 +ddp-client@2.3.1 +ddp-common@1.4.0 ddp-rate-limiter@1.0.7 -ddp-server@2.1.1 +ddp-server@2.1.2 deepwell:bootstrap-datepicker2@1.3.0 deps@1.0.12 -diff-sequence@1.0.7 +diff-sequence@1.1.0 dispatch:run-as-user@1.1.1 -dynamic-import@0.2.1 -ecmascript@0.9.0 +dynamic-import@0.3.0 +ecmascript@0.10.4 ecmascript-runtime@0.5.0 -ecmascript-runtime-client@0.5.0 +ecmascript-runtime-client@0.6.2 ecmascript-runtime-server@0.5.0 edgee:slingshot@0.7.1 ejson@1.1.0 email@1.2.3 emojione:emojione@2.2.6 +es5-shim@4.7.3 facebook-oauth@1.4.0 fastclick@1.0.13 francocatena:status@1.5.3 @@ -52,15 +52,15 @@ google-oauth@1.2.5 hot-code-push@1.0.4 html-tools@1.0.11 htmljs@1.0.11 -http@1.3.0 -id-map@1.0.9 +http@1.4.0 +id-map@1.1.0 jalik:ufs@0.7.4_1 jalik:ufs-gridfs@0.2.1 jalik:ufs-local@0.2.9 jparker:crypto-core@0.1.0 jparker:crypto-md5@0.1.1 jparker:gravatar@0.5.1 -jquery@1.11.10 +jquery@1.11.11 kadira:blaze-layout@2.3.0 kadira:flow-router@2.12.1 keepnox:perfect-scrollbar@0.6.8 @@ -69,31 +69,30 @@ konecty:change-case@2.3.0 konecty:delayed-task@1.0.0 konecty:mongo-counter@0.0.5_3 konecty:multiple-instances-status@1.1.0 -konecty:nrr@2.0.2 konecty:user-presence@2.0.1 launch-screen@1.1.1 -less@2.7.11 +less@2.7.12 livedata@1.0.18 localstorage@1.2.0 logging@1.1.19 matb33:collection-hooks@0.8.4 mdg:validation-error@0.5.1 meteor@1.8.2 -meteor-base@1.2.0 +meteor-base@1.3.0 meteor-developer-oauth@1.2.0 meteorhacks:inject-initial@1.0.4 meteorhacks:meteorx@1.4.1 meteorspark:util@0.2.0 -minifier-css@1.2.16 -minifier-js@2.2.2 +minifier-css@1.3.1 +minifier-js@2.3.2 minimongo@1.4.3 mizzao:autocomplete@0.5.1 mizzao:timesync@0.3.4 mobile-experience@1.0.5 mobile-status-bar@1.0.14 -modules@0.11.2 -modules-runtime@0.9.1 -mongo@1.3.1 +modules@0.11.4 +modules-runtime@0.9.2 +mongo@1.4.3 mongo-dev-server@1.1.0 mongo-id@1.0.6 mongo-livedata@1.0.12 @@ -102,32 +101,34 @@ mystor:device-detection@0.2.0 nimble:restivus@0.8.12 nooitaf:colors@1.1.2_1 npm-bcrypt@0.9.3 -npm-mongo@2.2.33 +npm-mongo@2.2.34 oauth@1.2.1 oauth1@1.2.0 oauth2@1.2.0 observe-sequence@1.0.16 -ordered-dict@1.0.9 +ordered-dict@1.1.0 ostrio:cookies@2.2.4 pauli:accounts-linkedin@2.1.5 pauli:linkedin-oauth@1.2.0 percolate:synced-cron@1.3.2 -promise@0.10.1 +promise@0.10.2 raix:eventemitter@0.1.3 raix:eventstate@0.0.4 raix:handlebar-helpers@0.2.5 raix:push@3.3.0 raix:ui-dropped-event@0.0.7 -random@1.0.10 -rate-limit@1.0.8 +random@1.1.0 +rate-limit@1.0.9 reactive-dict@1.2.0 reactive-var@1.0.11 -reload@1.1.11 -retry@1.0.9 +reload@1.2.0 +retry@1.1.0 rocketchat:2fa@0.0.1 +rocketchat:accounts@0.0.1 rocketchat:action-links@0.0.1 rocketchat:analytics@0.0.2 rocketchat:api@0.0.1 +rocketchat:apps@1.0.0 rocketchat:assets@0.0.1 rocketchat:authorization@0.0.1 rocketchat:autolinker@0.0.1 @@ -153,6 +154,11 @@ rocketchat:file-upload@0.0.1 rocketchat:github-enterprise@0.0.1 rocketchat:gitlab@0.0.1 rocketchat:google-vision@0.0.1 +rocketchat:grant@0.0.1 +rocketchat:grant-facebook@0.0.1 +rocketchat:grant-github@0.0.1 +rocketchat:grant-google@0.0.1 +rocketchat:graphql@0.0.1 rocketchat:highlight-words@0.0.1 rocketchat:i18n@0.0.1 rocketchat:iframe-login@1.0.0 @@ -170,6 +176,7 @@ rocketchat:katex@0.0.1 rocketchat:ldap@0.0.1 rocketchat:lib@0.0.1 rocketchat:livechat@0.0.1 +rocketchat:livestream@0.0.5 rocketchat:logger@0.0.1 rocketchat:login-token@1.0.0 rocketchat:mailer@0.0.1 @@ -184,6 +191,7 @@ rocketchat:message-snippet@0.0.1 rocketchat:message-star@0.0.1 rocketchat:migrations@0.0.1 rocketchat:monitoring@2.30.2_3 +rocketchat:nrr@1.0.0 rocketchat:oauth2-server@2.0.0 rocketchat:oauth2-server-config@1.0.0 rocketchat:oembed@0.0.1 @@ -228,20 +236,25 @@ rocketchat:ui-message@0.1.0 rocketchat:ui-sidenav@0.1.0 rocketchat:ui-vrecord@0.0.1 rocketchat:version@1.0.0 +rocketchat:version-check@0.0.1 rocketchat:videobridge@0.2.0 rocketchat:webrtc@0.0.1 rocketchat:wordpress@0.0.1 routepolicy@1.0.12 +server-render@0.3.0 service-configuration@1.0.11 session@1.1.7 sha@1.0.9 shell-server@0.3.1 +shim-common@0.1.0 simple:json-routes@2.1.0 +socket-stream-client@0.1.0 spacebars@1.0.15 spacebars-compiler@1.1.3 srp@1.0.10 -standard-minifier-js@2.2.3 +standard-minifier-js@2.3.2 steffo:meteor-accounts-saml@0.0.1 +swydo:graphql@0.0.3 tap:i18n@1.8.2 templating@1.3.2 templating-compiler@1.3.3 @@ -252,8 +265,8 @@ tracker@1.1.3 twitter-oauth@1.2.0 ui@1.0.13 underscore@1.0.10 -url@1.1.0 -webapp@1.4.0 +url@1.2.0 +webapp@1.5.0 webapp-hashing@1.0.9 yasaricli:slugify@0.0.7 yasinuslu:blaze-meta@0.3.3 diff --git a/.openshift/rocket-chat-ephemeral.json b/.openshift/rocket-chat-ephemeral.json index 7b924089f568..2c5cd26e68fb 100644 --- a/.openshift/rocket-chat-ephemeral.json +++ b/.openshift/rocket-chat-ephemeral.json @@ -151,7 +151,7 @@ "name": "rocketchat" }, "spec": { - "dockerImageRepository": "registry.connect.redhat.com/rocketchat", + "dockerImageRepository": "registry.connect.redhat.com/rocketchat/rocketchat", "tags": [ { "name": "latest", @@ -208,7 +208,6 @@ ], "from": { "kind": "ImageStreamTag", - "namespace": "${NAMESPACE}", "name": "rocketchat:latest" } } @@ -395,12 +394,6 @@ "description": "Maximum amount of memory the container can use.", "value": "512Mi" }, - { - "name": "NAMESPACE", - "displayName": "Namespace", - "description": "The OpenShift Namespace where the ImageStream resides.", - "value": "openshift" - }, { "name": "DATABASE_SERVICE_NAME", "displayName": "Database Service Name", @@ -428,7 +421,7 @@ "name": "MONGODB_DATABASE", "displayName": "MongoDB Database Name", "description": "Name of the MongoDB database accessed.", - "value": "sampledb", + "value": "rocketchatdb", "required": true }, { diff --git a/.openshift/rocket-chat-persistent.json b/.openshift/rocket-chat-persistent.json index dabd4d81c0d3..150347e5165a 100644 --- a/.openshift/rocket-chat-persistent.json +++ b/.openshift/rocket-chat-persistent.json @@ -228,7 +228,6 @@ ], "from": { "kind": "ImageStreamTag", - "namespace": "${NAMESPACE}", "name": "rocketchat:latest" } } @@ -415,12 +414,6 @@ "description": "Maximum amount of memory the container can use.", "value": "512Mi" }, - { - "name": "NAMESPACE", - "displayName": "Namespace", - "description": "The OpenShift Namespace where the ImageStream resides.", - "value": "openshift" - }, { "name": "DATABASE_SERVICE_NAME", "displayName": "Database Service Name", @@ -448,7 +441,7 @@ "name": "MONGODB_DATABASE", "displayName": "MongoDB Database Name", "description": "Name of the MongoDB database accessed.", - "value": "sampledb", + "value": "rocketchatdb", "required": true }, { diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index e5edaee3498a..ab32356eb114 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -21,7 +21,7 @@ const pkgdef :Spk.PackageDefinition = ( appVersion = 62, # Increment this for every release. - appMarketingVersion = (defaultText = "0.61.2"), + appMarketingVersion = (defaultText = "0.62.0"), # Human-readable representation of appVersion. Should match the way you # identify versions of your app in documentation and marketing. diff --git a/.snapcraft/snapcraft.yaml b/.snapcraft/snapcraft.yaml index 010e70512a2d..5674b4764bee 100644 --- a/.snapcraft/snapcraft.yaml +++ b/.snapcraft/snapcraft.yaml @@ -49,7 +49,7 @@ parts: build-packages: - curl plugin: dump - prepare: curl -SLf "https://releases.rocket.chat/#{RC_VERSION}/download/" -o rocket.chat.tgz; tar xvf rocket.chat.tgz --strip 1; cd programs/server; npm install; cd npm/node_modules/meteor/rocketchat_google-vision; npm install grpc@1.6.6; + prepare: curl -SLf "https://releases.rocket.chat/#{RC_VERSION}/download/" -o rocket.chat.tgz; tar xvf rocket.chat.tgz --strip 1; cd programs/server; npm install; npm install grpc@1.6.6; after: [node] source: . stage-packages: diff --git a/.travis/snap.sh b/.travis/snap.sh index 157b8d19769a..e07003b139e1 100755 --- a/.travis/snap.sh +++ b/.travis/snap.sh @@ -17,7 +17,7 @@ elif [[ $TRAVIS_TAG ]]; then RC_VERSION=$TRAVIS_TAG else CHANNEL=edge - RC_VERSION=0.61.2 + RC_VERSION=0.62.0 fi echo "Preparing to trigger a snap release for $CHANNEL channel" diff --git a/HISTORY.md b/HISTORY.md index b8fb45f406f7..1e6c26b34e90 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,265 @@ + +# 0.62.0 (2018-02-28) + + +### BREAKING CHANGES + +- [#9711](https://github.com/RocketChat/Rocket.Chat/pull/9711) Remove Graphics/Image Magick support + + +### New Features + +- [#9549](https://github.com/RocketChat/Rocket.Chat/pull/9549) Add route to get user shield/badge +- [#9457](https://github.com/RocketChat/Rocket.Chat/pull/9457) Add user settings / preferences API endpoint +- [#7098](https://github.com/RocketChat/Rocket.Chat/pull/7098) Alert admins when user requires approval & alert users when the account is approved/activated/deactivated +- [#9527](https://github.com/RocketChat/Rocket.Chat/pull/9527) Allow configuration of SAML logout behavior +- [#8193](https://github.com/RocketChat/Rocket.Chat/pull/8193) Allow request avatar placeholders as PNG or JPG instead of SVG +- [#9312](https://github.com/RocketChat/Rocket.Chat/pull/9312) Allow sounds when conversation is focused +- [#9519](https://github.com/RocketChat/Rocket.Chat/pull/9519) API to fetch permissions & user roles +- [#9642](https://github.com/RocketChat/Rocket.Chat/pull/9642) Browse more channels / Directory +- [#9778](https://github.com/RocketChat/Rocket.Chat/pull/9778) General alert banner +- [#9687](https://github.com/RocketChat/Rocket.Chat/pull/9687) Global message search (beta: disabled by default) +- [#8158](https://github.com/RocketChat/Rocket.Chat/pull/8158) GraphQL API +- [#9298](https://github.com/RocketChat/Rocket.Chat/pull/9298) Improved default welcome message +- [#8933](https://github.com/RocketChat/Rocket.Chat/pull/8933) Internal hubot support for Direct Messages and Private Groups +- [#9255](https://github.com/RocketChat/Rocket.Chat/pull/9255) Livestream tab +- [#9746](https://github.com/RocketChat/Rocket.Chat/pull/9746) Makes shield icon configurable +- [#9717](https://github.com/RocketChat/Rocket.Chat/pull/9717) Message read receipts +- [#9507](https://github.com/RocketChat/Rocket.Chat/pull/9507) New REST API to mark channel as read +- [#9608](https://github.com/RocketChat/Rocket.Chat/pull/9608) New sidebar layout +- [#9699](https://github.com/RocketChat/Rocket.Chat/pull/9699) Option to proxy files and avatars through the server +- [#9509](https://github.com/RocketChat/Rocket.Chat/pull/9509) REST API to use Spotlight +- [#9793](https://github.com/RocketChat/Rocket.Chat/pull/9793) Version update check +- [#9934](https://github.com/RocketChat/Rocket.Chat/pull/9934) Typo on french translation for "Open" + + +### Bug Fixes + +- [#9424](https://github.com/RocketChat/Rocket.Chat/pull/9424) 'Query' support for channels.list.joined, groups.list, groups.listAll, im.list +- [#9737](https://github.com/RocketChat/Rocket.Chat/pull/9737) API to retrive rooms was returning empty objects +- [#9487](https://github.com/RocketChat/Rocket.Chat/pull/9487) Chat Message Reactions REST API End Point +- [#9560](https://github.com/RocketChat/Rocket.Chat/pull/9560) Chrome 64 breaks jitsi-meet iframe +- [#9662](https://github.com/RocketChat/Rocket.Chat/pull/9662) Close button on file upload bar was not working +- [#9714](https://github.com/RocketChat/Rocket.Chat/pull/9714) Close Livechat conversation by visitor not working in version 0.61.0 +- [#9676](https://github.com/RocketChat/Rocket.Chat/pull/9676) Custom emoji was cropping sometimes +- [#9747](https://github.com/RocketChat/Rocket.Chat/pull/9747) DeprecationWarning: prom-client ... when starting Rocket Chat server +- [#9639](https://github.com/RocketChat/Rocket.Chat/pull/9639) Desktop notification not showing when avatar came from external storage service +- [#9776](https://github.com/RocketChat/Rocket.Chat/pull/9776) Emoji rendering on last message +- [#9640](https://github.com/RocketChat/Rocket.Chat/pull/9640) Facebook integration in livechat not working on version 0.61.0 +- [#9067](https://github.com/RocketChat/Rocket.Chat/pull/9067) Formal pronouns and some small mistakes in German texts +- [#9716](https://github.com/RocketChat/Rocket.Chat/pull/9716) GitLab OAuth does not work when GitLab’s URL ends with slash +- [#9697](https://github.com/RocketChat/Rocket.Chat/pull/9697) Harmonize channel-related actions +- [#9772](https://github.com/RocketChat/Rocket.Chat/pull/9772) Livechat conversation not receiving messages when start without form +- [#9599](https://github.com/RocketChat/Rocket.Chat/pull/9599) Livechat is not working when running in a sub path +- [#9750](https://github.com/RocketChat/Rocket.Chat/pull/9750) Livechat issues on external queue and lead capture +- [#9720](https://github.com/RocketChat/Rocket.Chat/pull/9720) Messages can't be quoted sometimes +- [#9454](https://github.com/RocketChat/Rocket.Chat/pull/9454) Missing link Site URLs in enrollment e-mails +- [#9610](https://github.com/RocketChat/Rocket.Chat/pull/9610) Missing string 'Username_already_exist' on the accountProfile page +- [#9520](https://github.com/RocketChat/Rocket.Chat/pull/9520) Rest API helpers only applying to v1 +- [#9696](https://github.com/RocketChat/Rocket.Chat/pull/9696) Show custom room types icon in channel header +- [#9570](https://github.com/RocketChat/Rocket.Chat/pull/9570) SVG avatars are not been displayed correctly when load in non HTML containers +- [#9623](https://github.com/RocketChat/Rocket.Chat/pull/9623) Weird rendering of emojis at sidebar when `last message` is activated +- [#9665](https://github.com/RocketChat/Rocket.Chat/pull/9665) Wrong behavior of rooms info's *Read Only* and *Collaborative* buttons +- [#9802](https://github.com/RocketChat/Rocket.Chat/pull/9802) Not receiving sound notifications in rooms created by new LiveChats +- [#9858](https://github.com/RocketChat/Rocket.Chat/pull/9858) Silence the update check error message +- [#9850](https://github.com/RocketChat/Rocket.Chat/pull/9850) Importers no longer working due to the FileUpload changes +- [#9888](https://github.com/RocketChat/Rocket.Chat/pull/9888) Misplaced "Save Changes" button in user account panel +- [#9877](https://github.com/RocketChat/Rocket.Chat/pull/9877) Not Translated Phrases +- [#9884](https://github.com/RocketChat/Rocket.Chat/pull/9884) Parsing messages with multiple markdown matches ignore some tokens +- [#9879](https://github.com/RocketChat/Rocket.Chat/pull/9879) Snap build was failing + + +
+Others + +- [#9218](https://github.com/RocketChat/Rocket.Chat/pull/9218) [NEW] Image preview as 32x32 base64 jpeg +- [#9753](https://github.com/RocketChat/Rocket.Chat/pull/9753) Move NRR package to inside the project and convert from CoffeeScript +- [#9666](https://github.com/RocketChat/Rocket.Chat/pull/9666) Rocket.Chat Apps +- [#9796](https://github.com/RocketChat/Rocket.Chat/pull/9796) Sync from Master +- [#9546](https://github.com/RocketChat/Rocket.Chat/pull/9546) Update to meteor 1.6.1 +- [#9811](https://github.com/RocketChat/Rocket.Chat/pull/9811) Dependencies update +- [#9797](https://github.com/RocketChat/Rocket.Chat/pull/9797) Develop fix sync from master +- [#9821](https://github.com/RocketChat/Rocket.Chat/pull/9821) Fix: Custom fields not showing on user info panel +- [#9843](https://github.com/RocketChat/Rocket.Chat/pull/9843) Regression: Avatar now open account related options +- [#9837](https://github.com/RocketChat/Rocket.Chat/pull/9837) Regression: Open search using ctrl/cmd + p and ctrl/cmd + k +- [#9804](https://github.com/RocketChat/Rocket.Chat/pull/9804) Regression: Page was not respecting the window height on Firefox +- [#9839](https://github.com/RocketChat/Rocket.Chat/pull/9839) Regression: Search bar is now full width +- [#9851](https://github.com/RocketChat/Rocket.Chat/pull/9851) Regression: Change create channel icon +- [#9845](https://github.com/RocketChat/Rocket.Chat/pull/9845) Regression: Fix admin/user settings item text +- [#9852](https://github.com/RocketChat/Rocket.Chat/pull/9852) Regression: Fix channel icons on safari +- [#9902](https://github.com/RocketChat/Rocket.Chat/pull/9902) Fix Apps not working on multi-instance deployments +- [#9905](https://github.com/RocketChat/Rocket.Chat/pull/9905) Regression: Improve sidebar filter +- [#9889](https://github.com/RocketChat/Rocket.Chat/pull/9889) Regression: Overlapping header in user profile panel +- [#9897](https://github.com/RocketChat/Rocket.Chat/pull/9897) Regression: sort on room's list not working correctly +- [#9908](https://github.com/RocketChat/Rocket.Chat/pull/9908) Improve link handling for attachments +- [#9931](https://github.com/RocketChat/Rocket.Chat/pull/9931) Regression: Directory now list default channel +- [#9928](https://github.com/RocketChat/Rocket.Chat/pull/9928) Regression: Fix livechat queue link +- [#9883](https://github.com/RocketChat/Rocket.Chat/pull/9883) Regression: Misplaced language dropdown in user preferences panel + +
+ + + +
+Detils + +## 0.62.0 (2018-02-28) + + +### Bug Fixes + +- [#9934](https://github.com/RocketChat/Rocket.Chat/pull/9934) Typo on french translation for "Open" + + +
+Others + +- [#9908](https://github.com/RocketChat/Rocket.Chat/pull/9908) Improve link handling for attachments +- [#9931](https://github.com/RocketChat/Rocket.Chat/pull/9931) Regression: Directory now list default channel +- [#9928](https://github.com/RocketChat/Rocket.Chat/pull/9928) Regression: Fix livechat queue link +- [#9883](https://github.com/RocketChat/Rocket.Chat/pull/9883) Regression: Misplaced language dropdown in user preferences panel +
+ + + +## 0.62.0-rc.3 (2018-02-27) + + +### Bug Fixes + +- [#9850](https://github.com/RocketChat/Rocket.Chat/pull/9850) Importers no longer working due to the FileUpload changes +- [#9888](https://github.com/RocketChat/Rocket.Chat/pull/9888) Misplaced "Save Changes" button in user account panel +- [#9877](https://github.com/RocketChat/Rocket.Chat/pull/9877) Not Translated Phrases +- [#9884](https://github.com/RocketChat/Rocket.Chat/pull/9884) Parsing messages with multiple markdown matches ignore some tokens +- [#9879](https://github.com/RocketChat/Rocket.Chat/pull/9879) Snap build was failing + + +
+Others + +- [#9902](https://github.com/RocketChat/Rocket.Chat/pull/9902) Fix Apps not working on multi-instance deployments +- [#9905](https://github.com/RocketChat/Rocket.Chat/pull/9905) Regression: Improve sidebar filter +- [#9889](https://github.com/RocketChat/Rocket.Chat/pull/9889) Regression: Overlapping header in user profile panel +- [#9897](https://github.com/RocketChat/Rocket.Chat/pull/9897) Regression: sort on room's list not working correctly +
+ + + +## 0.62.0-rc.2 (2018-02-23) + + +### Bug Fixes + +- [#9858](https://github.com/RocketChat/Rocket.Chat/pull/9858) Silence the update check error message + + +
+Others + +- [#9851](https://github.com/RocketChat/Rocket.Chat/pull/9851) Regression: Change create channel icon +- [#9845](https://github.com/RocketChat/Rocket.Chat/pull/9845) Regression: Fix admin/user settings item text +- [#9852](https://github.com/RocketChat/Rocket.Chat/pull/9852) Regression: Fix channel icons on safari +
+ + + +## 0.62.0-rc.1 (2018-02-22) + + +### Bug Fixes + +- [#9802](https://github.com/RocketChat/Rocket.Chat/pull/9802) Not receiving sound notifications in rooms created by new LiveChats + + +
+Others + +- [#9811](https://github.com/RocketChat/Rocket.Chat/pull/9811) Dependencies update +- [#9797](https://github.com/RocketChat/Rocket.Chat/pull/9797) Develop fix sync from master +- [#9821](https://github.com/RocketChat/Rocket.Chat/pull/9821) Fix: Custom fields not showing on user info panel +- [#9843](https://github.com/RocketChat/Rocket.Chat/pull/9843) Regression: Avatar now open account related options +- [#9837](https://github.com/RocketChat/Rocket.Chat/pull/9837) Regression: Open search using ctrl/cmd + p and ctrl/cmd + k +- [#9804](https://github.com/RocketChat/Rocket.Chat/pull/9804) Regression: Page was not respecting the window height on Firefox +- [#9839](https://github.com/RocketChat/Rocket.Chat/pull/9839) Regression: Search bar is now full width +
+ + + +## 0.62.0-rc.0 (2018-02-21) + + +### BREAKING CHANGES + +- [#9711](https://github.com/RocketChat/Rocket.Chat/pull/9711) Remove Graphics/Image Magick support + + +### New Features + +- [#9549](https://github.com/RocketChat/Rocket.Chat/pull/9549) Add route to get user shield/badge +- [#9457](https://github.com/RocketChat/Rocket.Chat/pull/9457) Add user settings / preferences API endpoint +- [#7098](https://github.com/RocketChat/Rocket.Chat/pull/7098) Alert admins when user requires approval & alert users when the account is approved/activated/deactivated +- [#9527](https://github.com/RocketChat/Rocket.Chat/pull/9527) Allow configuration of SAML logout behavior +- [#8193](https://github.com/RocketChat/Rocket.Chat/pull/8193) Allow request avatar placeholders as PNG or JPG instead of SVG +- [#9312](https://github.com/RocketChat/Rocket.Chat/pull/9312) Allow sounds when conversation is focused +- [#9519](https://github.com/RocketChat/Rocket.Chat/pull/9519) API to fetch permissions & user roles +- [#9642](https://github.com/RocketChat/Rocket.Chat/pull/9642) Browse more channels / Directory +- [#9778](https://github.com/RocketChat/Rocket.Chat/pull/9778) General alert banner +- [#9687](https://github.com/RocketChat/Rocket.Chat/pull/9687) Global message search (beta: disabled by default) +- [#8158](https://github.com/RocketChat/Rocket.Chat/pull/8158) GraphQL API +- [#9298](https://github.com/RocketChat/Rocket.Chat/pull/9298) Improved default welcome message +- [#8933](https://github.com/RocketChat/Rocket.Chat/pull/8933) Internal hubot support for Direct Messages and Private Groups +- [#9255](https://github.com/RocketChat/Rocket.Chat/pull/9255) Livestream tab +- [#9746](https://github.com/RocketChat/Rocket.Chat/pull/9746) Makes shield icon configurable +- [#9717](https://github.com/RocketChat/Rocket.Chat/pull/9717) Message read receipts +- [#9507](https://github.com/RocketChat/Rocket.Chat/pull/9507) New REST API to mark channel as read +- [#9608](https://github.com/RocketChat/Rocket.Chat/pull/9608) New sidebar layout +- [#9699](https://github.com/RocketChat/Rocket.Chat/pull/9699) Option to proxy files and avatars through the server +- [#9509](https://github.com/RocketChat/Rocket.Chat/pull/9509) REST API to use Spotlight +- [#9793](https://github.com/RocketChat/Rocket.Chat/pull/9793) Version update check + + +### Bug Fixes + +- [#9424](https://github.com/RocketChat/Rocket.Chat/pull/9424) 'Query' support for channels.list.joined, groups.list, groups.listAll, im.list +- [#9737](https://github.com/RocketChat/Rocket.Chat/pull/9737) API to retrive rooms was returning empty objects +- [#9487](https://github.com/RocketChat/Rocket.Chat/pull/9487) Chat Message Reactions REST API End Point +- [#9560](https://github.com/RocketChat/Rocket.Chat/pull/9560) Chrome 64 breaks jitsi-meet iframe +- [#9662](https://github.com/RocketChat/Rocket.Chat/pull/9662) Close button on file upload bar was not working +- [#9714](https://github.com/RocketChat/Rocket.Chat/pull/9714) Close Livechat conversation by visitor not working in version 0.61.0 +- [#9676](https://github.com/RocketChat/Rocket.Chat/pull/9676) Custom emoji was cropping sometimes +- [#9747](https://github.com/RocketChat/Rocket.Chat/pull/9747) DeprecationWarning: prom-client ... when starting Rocket Chat server +- [#9639](https://github.com/RocketChat/Rocket.Chat/pull/9639) Desktop notification not showing when avatar came from external storage service +- [#9776](https://github.com/RocketChat/Rocket.Chat/pull/9776) Emoji rendering on last message +- [#9640](https://github.com/RocketChat/Rocket.Chat/pull/9640) Facebook integration in livechat not working on version 0.61.0 +- [#9067](https://github.com/RocketChat/Rocket.Chat/pull/9067) Formal pronouns and some small mistakes in German texts +- [#9716](https://github.com/RocketChat/Rocket.Chat/pull/9716) GitLab OAuth does not work when GitLab’s URL ends with slash +- [#9697](https://github.com/RocketChat/Rocket.Chat/pull/9697) Harmonize channel-related actions +- [#9772](https://github.com/RocketChat/Rocket.Chat/pull/9772) Livechat conversation not receiving messages when start without form +- [#9599](https://github.com/RocketChat/Rocket.Chat/pull/9599) Livechat is not working when running in a sub path +- [#9750](https://github.com/RocketChat/Rocket.Chat/pull/9750) Livechat issues on external queue and lead capture +- [#9720](https://github.com/RocketChat/Rocket.Chat/pull/9720) Messages can't be quoted sometimes +- [#9454](https://github.com/RocketChat/Rocket.Chat/pull/9454) Missing link Site URLs in enrollment e-mails +- [#9610](https://github.com/RocketChat/Rocket.Chat/pull/9610) Missing string 'Username_already_exist' on the accountProfile page +- [#9520](https://github.com/RocketChat/Rocket.Chat/pull/9520) Rest API helpers only applying to v1 +- [#9696](https://github.com/RocketChat/Rocket.Chat/pull/9696) Show custom room types icon in channel header +- [#9570](https://github.com/RocketChat/Rocket.Chat/pull/9570) SVG avatars are not been displayed correctly when load in non HTML containers +- [#9623](https://github.com/RocketChat/Rocket.Chat/pull/9623) Weird rendering of emojis at sidebar when `last message` is activated +- [#9665](https://github.com/RocketChat/Rocket.Chat/pull/9665) Wrong behavior of rooms info's *Read Only* and *Collaborative* buttons + + +
+Others + +- [#9218](https://github.com/RocketChat/Rocket.Chat/pull/9218) [NEW] Image preview as 32x32 base64 jpeg +- [#9753](https://github.com/RocketChat/Rocket.Chat/pull/9753) Move NRR package to inside the project and convert from CoffeeScript +- [#9666](https://github.com/RocketChat/Rocket.Chat/pull/9666) Rocket.Chat Apps +- [#9796](https://github.com/RocketChat/Rocket.Chat/pull/9796) Sync from Master +- [#9546](https://github.com/RocketChat/Rocket.Chat/pull/9546) Update to meteor 1.6.1 +
+
+ + + ## 0.61.2 (2018-02-20) diff --git a/README.md b/README.md index 436faf958081..1dc6c9769967 100644 --- a/README.md +++ b/README.md @@ -297,6 +297,7 @@ It is a great solution for communities and companies wanting to privately host t - File Upload / Sharing - Scalable file sharing - S3 uploads with CDN downloads - Full text search +- Global search (from all channels/rooms at once) - Live chat / Messaging call center - LDAP Authentication - CAS 1.0, 2.0 support for educational institutions and hosting providers worldwide diff --git a/client/main.js b/client/main.js new file mode 100644 index 000000000000..090ed9e37925 --- /dev/null +++ b/client/main.js @@ -0,0 +1 @@ +import '/imports/startup/client'; diff --git a/client/notifications/notification.js b/client/notifications/notification.js index 6ad4ada930c5..db2b30ca3bb7 100644 --- a/client/notifications/notification.js +++ b/client/notifications/notification.js @@ -29,6 +29,7 @@ Meteor.startup(function() { // This logic is duplicated in /client/startup/unread.coffee. const hasFocus = readMessage.isEnable(); const messageIsInOpenedRoom = openedRoomId === notification.payload.rid; + const muteFocusedConversations = RocketChat.getUserPreference(Meteor.user(), 'muteFocusedConversations'); fireGlobalEvent('notification', { notification, @@ -42,10 +43,13 @@ Meteor.startup(function() { KonchatNotification.newMessage(notification.payload.rid); KonchatNotification.showDesktop(notification); } - } else if (!(hasFocus && messageIsInOpenedRoom)) { + } else if (!hasFocus || !messageIsInOpenedRoom) { // Play a sound and show a notification. KonchatNotification.newMessage(notification.payload.rid); KonchatNotification.showDesktop(notification); + } else if (!muteFocusedConversations) { + // Play a notification sound + KonchatNotification.newMessage(notification.payload.rid); } }); @@ -56,14 +60,15 @@ Meteor.startup(function() { // This logic is duplicated in /client/startup/unread.coffee. const hasFocus = readMessage.isEnable(); const messageIsInOpenedRoom = openedRoomId === notification.payload.rid; + const muteFocusedConversations = RocketChat.getUserPreference(Meteor.user(), 'muteFocusedConversations'); if (RocketChat.Layout.isEmbedded()) { if (!hasFocus && messageIsInOpenedRoom) { - // Play a sound and show a notification. + // Play a notification sound KonchatNotification.newMessage(notification.payload.rid); } - } else if (!(hasFocus && messageIsInOpenedRoom)) { - // Play a sound and show a notification. + } else if (!hasFocus || !messageIsInOpenedRoom || !muteFocusedConversations) { + // Play a notification sound KonchatNotification.newMessage(notification.payload.rid); } }); diff --git a/client/routes/router.js b/client/routes/router.js index 1167e8384d88..d75f07595f0b 100644 --- a/client/routes/router.js +++ b/client/routes/router.js @@ -69,6 +69,17 @@ FlowRouter.route('/home', { } }); +FlowRouter.route('/directory', { + name: 'directory', + + action() { + BlazeLayout.render('main', {center: 'directory'}); + }, + triggersExit: [function() { + $('.main-content').addClass('rc-old'); + }] +}); + FlowRouter.route('/account/:group?', { name: 'account', diff --git a/graphql.config.json b/graphql.config.json new file mode 100644 index 000000000000..fbbb30070dde --- /dev/null +++ b/graphql.config.json @@ -0,0 +1,9 @@ +{ + "schema": { + "request": { + "url" : "http://localhost:3000/api/graphql", + "method" : "POST", + "postIntrospectionQuery" : true + } + } +} diff --git a/imports/message-read-receipt/client/index.js b/imports/message-read-receipt/client/index.js new file mode 100644 index 000000000000..f8ffac5fbb31 --- /dev/null +++ b/imports/message-read-receipt/client/index.js @@ -0,0 +1,4 @@ +import './main'; +import './message'; +import './readReceipts'; +import './room'; diff --git a/imports/message-read-receipt/client/main.js b/imports/message-read-receipt/client/main.js new file mode 100644 index 000000000000..c2711f6663dd --- /dev/null +++ b/imports/message-read-receipt/client/main.js @@ -0,0 +1,7 @@ +Template.main.helpers({ + readReceiptsEnabled() { + if (RocketChat.settings.get('Message_Read_Receipt_Store_Users')) { + return 'read-receipts-enabled'; + } + } +}); diff --git a/imports/message-read-receipt/client/message.js b/imports/message-read-receipt/client/message.js new file mode 100644 index 000000000000..9a89d937b6c4 --- /dev/null +++ b/imports/message-read-receipt/client/message.js @@ -0,0 +1,13 @@ +import { Template } from 'meteor/templating'; + +Template.message.helpers({ + readReceipt() { + if (!RocketChat.settings.get('Message_Read_Receipt_Enabled')) { + return; + } + + return { + readByEveryone: (!this.unread && 'read') || 'color-component-color' + }; + } +}); diff --git a/imports/message-read-receipt/client/readReceipts.css b/imports/message-read-receipt/client/readReceipts.css new file mode 100644 index 000000000000..22788f691665 --- /dev/null +++ b/imports/message-read-receipt/client/readReceipts.css @@ -0,0 +1,51 @@ +.read-receipt { + position: absolute; + top: 2px; + right: 0.5rem; +} + +.read-receipt .rc-icon { + height: 0.8em; + width: 0.8em; +} + +.message:hover .read-receipt, .message.active .read-receipt { + display: none; +} + +.read-receipts-enabled .read-receipt { + cursor: pointer; +} + +.read-receipt.read { + color: #1d74f5; + color: var(--rc-color-button-primary); + font-style: normal; +} + +.message.temp .read-receipt { + opacity: 0.4; +} + +.read-receipts__user { + display: flex; + padding: 8px 8px; + align-items: center; +} + +.read-receipts__name { + flex: 1 1 auto; + margin: 0 10px; + font-size: 16px; +} + +.read-receipts__time { + font-size: 80%; +} + +.read-receipts__user > .avatar { + width: 36px; + width: var(--sidebar-account-thumb-size); + height: 36px; + height: var(--sidebar-account-thumb-size); +} diff --git a/imports/message-read-receipt/client/readReceipts.html b/imports/message-read-receipt/client/readReceipts.html new file mode 100644 index 000000000000..3a81ee9cdcdf --- /dev/null +++ b/imports/message-read-receipt/client/readReceipts.html @@ -0,0 +1,16 @@ + diff --git a/imports/message-read-receipt/client/readReceipts.js b/imports/message-read-receipt/client/readReceipts.js new file mode 100644 index 000000000000..b1a9cde21644 --- /dev/null +++ b/imports/message-read-receipt/client/readReceipts.js @@ -0,0 +1,35 @@ +import { ReactiveVar } from 'meteor/reactive-var'; +import moment from 'moment'; + +import './readReceipts.css'; +import './readReceipts.html'; + +Template.readReceipts.helpers({ + receipts() { + return Template.instance().readReceipts.get(); + }, + displayName() { + return (RocketChat.settings.get('UI_Use_Real_Name') && this.user.name) || this.user.username; + }, + time() { + return moment(this.ts).format('L LTS'); + }, + isLoading() { + return Template.instance().loading.get(); + } +}); + +Template.readReceipts.onCreated(function readReceiptsOnCreated() { + this.loading = new ReactiveVar(false); + this.readReceipts = new ReactiveVar([]); +}); + +Template.readReceipts.onRendered(function readReceiptsOnRendered() { + this.loading.set(true); + Meteor.call('getReadReceipts', { messageId: this.data.messageId }, (error, result) => { + if (!error) { + this.readReceipts.set(result); + } + this.loading.set(false); + }); +}); diff --git a/imports/message-read-receipt/client/room.js b/imports/message-read-receipt/client/room.js new file mode 100644 index 000000000000..dc5cde1e4a6b --- /dev/null +++ b/imports/message-read-receipt/client/room.js @@ -0,0 +1,24 @@ +RocketChat.MessageAction.addButton({ + id: 'receipt-detail', + icon: 'info-circled', + label: 'Message_info', + context: ['starred', 'message', 'message-mobile'], + action() { + const message = this._arguments[1]; + modal.open({ + title: t('Message_info'), + content: 'readReceipts', + data: { + messageId: message._id + }, + showConfirmButton: true, + showCancelButton: false, + confirmButtonText: t('Close') + }); + }, + condition() { + return RocketChat.settings.get('Message_Read_Receipt_Store_Users'); + }, + order: 1, + group: 'menu' +}); diff --git a/imports/message-read-receipt/server/api/methods/getReadReceipts.js b/imports/message-read-receipt/server/api/methods/getReadReceipts.js new file mode 100644 index 000000000000..0e6684fa129c --- /dev/null +++ b/imports/message-read-receipt/server/api/methods/getReadReceipts.js @@ -0,0 +1,20 @@ +import { Meteor } from 'meteor/meteor'; + +import { ReadReceipt } from '../../lib/ReadReceipt'; + +Meteor.methods({ + getReadReceipts({ messageId }) { + if (!Meteor.userId()) { + throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'getReadReceipts' }); + } + + const message = RocketChat.models.Messages.findOneById(messageId); + + const room = Meteor.call('canAccessRoom', message.rid, Meteor.userId()); + if (!room) { + throw new Meteor.Error('error-invalid-room', 'Invalid room', { method: 'getReadReceipts' }); + } + + return ReadReceipt.getReceipts(message); + } +}); diff --git a/imports/message-read-receipt/server/dbIndexes.js b/imports/message-read-receipt/server/dbIndexes.js new file mode 100644 index 000000000000..b88d4021a7bf --- /dev/null +++ b/imports/message-read-receipt/server/dbIndexes.js @@ -0,0 +1,5 @@ +RocketChat.models.Messages.tryEnsureIndex({ + unread: 1 +}, { + sparse: true +}); diff --git a/imports/message-read-receipt/server/hooks.js b/imports/message-read-receipt/server/hooks.js new file mode 100644 index 000000000000..560ebf449ac4 --- /dev/null +++ b/imports/message-read-receipt/server/hooks.js @@ -0,0 +1,10 @@ +import { ReadReceipt } from './lib/ReadReceipt'; + +RocketChat.callbacks.add('afterSaveMessage', (message, room) => { + + // set subscription as read right after message was sent + RocketChat.models.Subscriptions.setAsReadByRoomIdAndUserId(room._id, message.u._id); + + // mark message as read as well + ReadReceipt.markMessageAsReadBySender(message, room._id, message.u._id); +}); diff --git a/imports/message-read-receipt/server/index.js b/imports/message-read-receipt/server/index.js new file mode 100644 index 000000000000..2be56832fd46 --- /dev/null +++ b/imports/message-read-receipt/server/index.js @@ -0,0 +1,5 @@ +import './dbIndexes'; +import './hooks'; +import './settings'; + +import './api/methods/getReadReceipts'; diff --git a/imports/message-read-receipt/server/lib/ReadReceipt.js b/imports/message-read-receipt/server/lib/ReadReceipt.js new file mode 100644 index 000000000000..8cde6157ab29 --- /dev/null +++ b/imports/message-read-receipt/server/lib/ReadReceipt.js @@ -0,0 +1,86 @@ +import { Random } from 'meteor/random'; +import ModelReadReceipts from '../models/ReadReceipts'; + +const rawReadReceipts = ModelReadReceipts.model.rawCollection(); + +// debounced function by roomId, so multiple calls within 2 seconds to same roomId runs only once +const list = {}; +const debounceByRoomId = function(fn) { + return function(roomId, ...args) { + clearTimeout(list[roomId]); + list[roomId] = setTimeout(() => { fn.call(this, roomId, ...args); }, 2000); + }; +}; + +const updateMessages = debounceByRoomId(Meteor.bindEnvironment((roomId) => { + // @TODO maybe store firstSubscription in room object so we don't need to call the above update method + const firstSubscription = RocketChat.models.Subscriptions.getMinimumLastSeenByRoomId(roomId); + RocketChat.models.Messages.setAsRead(roomId, firstSubscription.ls); +})); + +export const ReadReceipt = { + markMessagesAsRead(roomId, userId, userLastSeen) { + if (!RocketChat.settings.get('Message_Read_Receipt_Enabled')) { + return; + } + + const room = RocketChat.models.Rooms.findOneById(roomId, { fields: { lm: 1 } }); + + // if users last seen is greadebounceByRoomIdter than room's last message, it means the user already have this room marked as read + if (userLastSeen > room.lm) { + return; + } + + if (userLastSeen) { + this.storeReadReceipts(RocketChat.models.Messages.findUnreadMessagesByRoomAndDate(roomId, userLastSeen), roomId, userId); + } + + updateMessages(roomId); + }, + + markMessageAsReadBySender(message, roomId, userId) { + if (!RocketChat.settings.get('Message_Read_Receipt_Enabled')) { + return; + } + + // this will usually happens if the message sender is the only one on the room + const firstSubscription = RocketChat.models.Subscriptions.getMinimumLastSeenByRoomId(roomId); + if (message.unread && message.ts < firstSubscription.ls) { + RocketChat.models.Messages.setAsReadById(message._id, firstSubscription.ls); + } + + this.storeReadReceipts([{ _id: message._id }], roomId, userId); + }, + + storeReadReceipts(messages, roomId, userId) { + if (RocketChat.settings.get('Message_Read_Receipt_Store_Users')) { + const ts = new Date(); + const receipts = messages.map(message => { + return { + _id: Random.id(), + roomId, + userId, + messageId: message._id, + ts + }; + }); + + if (receipts.length === 0) { + return; + } + + try { + rawReadReceipts.insertMany(receipts); + } catch (e) { + console.error('Error inserting read receipts per user'); + } + } + }, + + getReceipts(message) { + return ModelReadReceipts.findByMessageId(message._id).map(receipt => ({ + ...receipt, + user: RocketChat.models.Users.findOneById(receipt.userId, { fields: { username: 1, name: 1 }}) + })); + } +}; diff --git a/imports/message-read-receipt/server/models/ReadReceipts.js b/imports/message-read-receipt/server/models/ReadReceipts.js new file mode 100644 index 000000000000..4749ae5bb281 --- /dev/null +++ b/imports/message-read-receipt/server/models/ReadReceipts.js @@ -0,0 +1,19 @@ +class ModelReadReceipts extends RocketChat.models._Base { + constructor() { + super(...arguments); + + this.tryEnsureIndex({ + roomId: 1, + userId: 1, + messageId: 1 + }, { + unique: 1 + }); + } + + findByMessageId(messageId) { + return this.find({ messageId }); + } +} + +export default new ModelReadReceipts('message_read_receipt'); diff --git a/imports/message-read-receipt/server/settings.js b/imports/message-read-receipt/server/settings.js new file mode 100644 index 000000000000..5349ab399b8b --- /dev/null +++ b/imports/message-read-receipt/server/settings.js @@ -0,0 +1,12 @@ +RocketChat.settings.add('Message_Read_Receipt_Enabled', false, { + group: 'Message', + type: 'boolean', + public: true +}); + +RocketChat.settings.add('Message_Read_Receipt_Store_Users', false, { + group: 'Message', + type: 'boolean', + public: true, + enableQuery: { _id: 'Message_Read_Receipt_Enabled', value: true } +}); diff --git a/imports/startup/client/index.js b/imports/startup/client/index.js new file mode 100644 index 000000000000..d61ded85f56a --- /dev/null +++ b/imports/startup/client/index.js @@ -0,0 +1 @@ +import '../../message-read-receipt/client'; diff --git a/imports/startup/server/index.js b/imports/startup/server/index.js new file mode 100644 index 000000000000..261b86e752db --- /dev/null +++ b/imports/startup/server/index.js @@ -0,0 +1 @@ +import '../../message-read-receipt/server'; diff --git a/package-lock.json b/package-lock.json index d3088ce6f81e..0baedf23ed5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,22 @@ { "name": "Rocket.Chat", - "version": "0.61.0-develop", + "version": "0.62.0-develop", "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/runtime": { + "version": "7.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0-beta.40.tgz", + "integrity": "sha512-vIM68NUCWauZJTFoVUG1lggva1I8FLB9zFKwWG7Xjin4FkHpEKJv2y4x1DGVPVt93S5/zHSBj1bXYEuxOkFGzg==", + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, "@google-cloud/common": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.12.2.tgz", - "integrity": "sha1-eMNEKIxGBaKfTCiZORdZ19yBfEM=", + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.16.1.tgz", + "integrity": "sha512-1sufDsSfgJ7fuBLq+ux8t3TlydMlyWl9kPZx2WdLINkGtf5RjvXX6EWYZiCMKe8flJ3oC0l95j5atN2uX5n3rg==", "requires": { "array-uniq": "1.0.3", "arrify": "1.0.1", @@ -16,123 +25,49 @@ "duplexify": "3.5.3", "ent": "2.2.0", "extend": "3.0.1", - "google-auto-auth": "0.5.4", + "google-auto-auth": "0.9.3", "is": "3.2.1", "log-driver": "1.2.5", "methmeth": "1.1.0", "modelo": "4.2.3", "request": "2.83.0", - "retry-request": "1.3.2", + "retry-request": "3.3.1", "split-array-stream": "1.0.3", "stream-events": "1.0.2", "string-format-obj": "1.1.1", "through2": "2.0.3" } }, - "@google-cloud/common-grpc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@google-cloud/common-grpc/-/common-grpc-0.4.3.tgz", - "integrity": "sha1-g2iVkaEBH+5X0yqmoX/ixes6cLw=", - "requires": { - "@google-cloud/common": "0.13.6", - "dot-prop": "2.4.0", - "duplexify": "3.5.3", - "extend": "3.0.1", - "grpc": "1.8.0", - "is": "3.2.1", - "modelo": "4.2.3", - "retry-request": "3.3.1", - "through2": "2.0.3" - }, - "dependencies": { - "@google-cloud/common": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.13.6.tgz", - "integrity": "sha1-qdjhN7xCmkSrqWif5qDkMxeE+FM=", - "requires": { - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "concat-stream": "1.6.0", - "create-error-class": "3.0.2", - "duplexify": "3.5.3", - "ent": "2.2.0", - "extend": "3.0.1", - "google-auto-auth": "0.7.2", - "is": "3.2.1", - "log-driver": "1.2.5", - "methmeth": "1.1.0", - "modelo": "4.2.3", - "request": "2.83.0", - "retry-request": "3.3.1", - "split-array-stream": "1.0.3", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" - } - }, - "dot-prop": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-2.4.0.tgz", - "integrity": "sha1-hI4o9/HVB0DGdHqzywdnBGK2+Jw=", - "requires": { - "is-obj": "1.0.1" - } - }, - "google-auto-auth": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.2.tgz", - "integrity": "sha1-v5NS1cSgiXvzH9nEkQKLdl++px4=", - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.3.1", - "google-auth-library": "0.10.0", - "request": "2.83.0" - } - }, - "retry-request": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.1.tgz", - "integrity": "sha1-+3EnYjWmF+l1Uem+c3q1uRWR+54=", - "requires": { - "request": "2.83.0", - "through2": "2.0.3" - } - } - } - }, "@google-cloud/language": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@google-cloud/language/-/language-0.8.0.tgz", - "integrity": "sha1-DuPsaYi5UrjZrLvpgAk/g2Y757Y=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@google-cloud/language/-/language-1.1.0.tgz", + "integrity": "sha512-CcCc2zgX3M1X+rn+zy38QjCY/1R9CBCRd3cCqzIefZL16QgBod3ATPtVEHQG4KCyjnvCkMNMTQdYRCcsXs4wLw==", "requires": { - "@google-cloud/common": "0.12.2", - "arrify": "1.0.1", - "extend": "3.0.1", - "google-gax": "0.10.8", - "google-proto-files": "0.8.6", - "is": "3.2.1", - "propprop": "0.3.1", - "string-format-obj": "1.1.1" + "google-gax": "0.14.5", + "lodash.merge": "4.6.1" } }, "@google-cloud/storage": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.4.0.tgz", - "integrity": "sha1-r1vKwqmGmJxG81Kxyhgzvns4Pds=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.6.0.tgz", + "integrity": "sha512-yQ63bJYoiwY220gn/KdTLPoHppAPwFHfG7VFLPwJ+1R5U1eqUN5XV2a7uPj1szGF8/gxlKm2UbE8DgoJJ76DFw==", "requires": { - "@google-cloud/common": "0.13.6", + "@google-cloud/common": "0.16.1", "arrify": "1.0.1", "async": "2.6.0", + "compressible": "2.0.12", "concat-stream": "1.6.0", "create-error-class": "3.0.2", "duplexify": "3.5.3", "extend": "3.0.1", - "gcs-resumable-upload": "0.8.2", + "gcs-resumable-upload": "0.9.0", "hash-stream-validation": "0.2.1", "is": "3.2.1", + "mime": "2.2.0", "mime-types": "2.1.17", "once": "1.4.0", - "pumpify": "1.3.6", + "pumpify": "1.4.0", + "request": "2.83.0", "safe-buffer": "5.1.1", "snakeize": "0.1.0", "stream-events": "1.0.2", @@ -140,176 +75,36 @@ "through2": "2.0.3" }, "dependencies": { - "@google-cloud/common": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.13.6.tgz", - "integrity": "sha1-qdjhN7xCmkSrqWif5qDkMxeE+FM=", - "requires": { - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "concat-stream": "1.6.0", - "create-error-class": "3.0.2", - "duplexify": "3.5.3", - "ent": "2.2.0", - "extend": "3.0.1", - "google-auto-auth": "0.7.2", - "is": "3.2.1", - "log-driver": "1.2.5", - "methmeth": "1.1.0", - "modelo": "4.2.3", - "request": "2.83.0", - "retry-request": "3.3.1", - "split-array-stream": "1.0.3", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" - } - }, - "google-auto-auth": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.2.tgz", - "integrity": "sha1-v5NS1cSgiXvzH9nEkQKLdl++px4=", - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.3.1", - "google-auth-library": "0.10.0", - "request": "2.83.0" - } - }, - "retry-request": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.1.tgz", - "integrity": "sha1-+3EnYjWmF+l1Uem+c3q1uRWR+54=", - "requires": { - "request": "2.83.0", - "through2": "2.0.3" - } + "mime": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.0.tgz", + "integrity": "sha512-0Qz9uF1ATtl8RKJG4VRfOymh7PyEor6NbrI/61lRfuRe4vx9SNATrvAeTj2EWVRKjEQGskrzWkJBBY5NbaVHIA==" } } }, "@google-cloud/vision": { - "version": "0.11.5", - "resolved": "https://registry.npmjs.org/@google-cloud/vision/-/vision-0.11.5.tgz", - "integrity": "sha1-W9sS0ptVQsX7fbtelDLDmsrR9v4=", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@google-cloud/vision/-/vision-0.15.2.tgz", + "integrity": "sha512-SqirvZHIX95q24RIGGucVI4oS3FMZSnEXqw4SK8C6MlEfV3C0zn59eT1W8zcYvvFnR90+mHgw2PC2Z4ZMav/LQ==", "requires": { - "@google-cloud/common": "0.13.6", - "@google-cloud/common-grpc": "0.4.3", - "arrify": "1.0.1", + "@google-cloud/common": "0.16.1", "async": "2.6.0", "extend": "3.0.1", - "google-gax": "0.13.5", - "google-proto-files": "0.12.1", + "google-gax": "0.14.5", + "google-proto-files": "0.15.0", "is": "3.2.1", - "prop-assign": "1.0.0", - "propprop": "0.3.1", - "rgb-hex": "1.0.0", - "string-format-obj": "1.1.1" + "lodash.merge": "4.6.1" }, "dependencies": { - "@google-cloud/common": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.13.6.tgz", - "integrity": "sha1-qdjhN7xCmkSrqWif5qDkMxeE+FM=", - "requires": { - "array-uniq": "1.0.3", - "arrify": "1.0.1", - "concat-stream": "1.6.0", - "create-error-class": "3.0.2", - "duplexify": "3.5.3", - "ent": "2.2.0", - "extend": "3.0.1", - "google-auto-auth": "0.7.2", - "is": "3.2.1", - "log-driver": "1.2.5", - "methmeth": "1.1.0", - "modelo": "4.2.3", - "request": "2.83.0", - "retry-request": "3.3.1", - "split-array-stream": "1.0.3", - "stream-events": "1.0.2", - "string-format-obj": "1.1.1", - "through2": "2.0.3" - } - }, - "google-auto-auth": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.2.tgz", - "integrity": "sha1-v5NS1cSgiXvzH9nEkQKLdl++px4=", - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.3.1", - "google-auth-library": "0.10.0", - "request": "2.83.0" - } - }, - "google-gax": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.13.5.tgz", - "integrity": "sha1-OkjMUrfhZPcxk4836t0rc/fEk9c=", - "requires": { - "extend": "3.0.1", - "globby": "6.1.0", - "google-auto-auth": "0.5.4", - "google-proto-files": "0.13.1", - "grpc": "1.8.0", - "is-stream-ended": "0.1.3", - "lodash": "4.17.4", - "process-nextick-args": "1.0.7", - "protobufjs": "6.8.4", - "readable-stream": "2.3.3", - "through2": "2.0.3" - }, - "dependencies": { - "google-auto-auth": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", - "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", - "requires": { - "async": "2.6.0", - "google-auth-library": "0.10.0", - "object-assign": "3.0.0", - "request": "2.83.0" - } - }, - "google-proto-files": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.13.1.tgz", - "integrity": "sha1-/PEjY30YEWEtakywMP0UUWta7Es=" - } - } - }, "google-proto-files": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.12.1.tgz", - "integrity": "sha1-ZDTcfgJaDQyC5fBOYVxzfWpMQ4c=" - }, - "protobufjs": { - "version": "6.8.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.4.tgz", - "integrity": "sha1-GD+Q0cSspfazSnnq7dDYmtIfYDs=", - "requires": { - "@protobufjs/aspromise": "1.1.2", - "@protobufjs/base64": "1.1.2", - "@protobufjs/codegen": "2.0.4", - "@protobufjs/eventemitter": "1.1.0", - "@protobufjs/fetch": "1.1.0", - "@protobufjs/float": "1.0.2", - "@protobufjs/inquire": "1.1.0", - "@protobufjs/path": "1.1.2", - "@protobufjs/pool": "1.1.0", - "@protobufjs/utf8": "1.1.0", - "@types/long": "3.0.32", - "@types/node": "8.5.8", - "long": "3.2.0" - } - }, - "retry-request": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.1.tgz", - "integrity": "sha1-+3EnYjWmF+l1Uem+c3q1uRWR+54=", - "requires": { - "request": "2.83.0", - "through2": "2.0.3" + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.15.0.tgz", + "integrity": "sha512-reirGcMJMI4yxmQRrOJguyRa17AEPxcPfeK/v/o0ez1kJ3VG8FKl8B2W9gMpU56Sr5TmnPIwnKj9Qa1UurxgtQ==", + "requires": { + "globby": "7.1.1", + "power-assert": "1.4.4", + "prettier": "1.10.2", + "protobufjs": "6.8.4" } } } @@ -322,12 +117,12 @@ "@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU=" + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, "@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs=" + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, "@protobufjs/eventemitter": { "version": "1.1.0", @@ -371,12 +166,12 @@ "@types/long": { "version": "3.0.32", "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", - "integrity": "sha1-9OWvMenpsZbY5fyopeLiCqPWC2k=" + "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" }, "@types/node": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.8.tgz", - "integrity": "sha512-8KmlRxwbKZfjUHFIt3q8TF5S2B+/E5BaAoo/3mgc5h6FJzqxXkCK/VMetO+IRDtwtU6HUvovHMBn+XRj7SV9Qg==" + "version": "8.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.4.tgz", + "integrity": "sha512-dSvD36qnQs78G1BPsrZFdPpvLgMW/dnvr5+nTW2csMs5TiP9MOXrjUbnMZOEwnIuBklXtn7b6TPA2Cuq07bDHA==" }, "JSONStream": { "version": "1.3.2", @@ -391,12 +186,26 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.5.3" + } }, "acorn": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", - "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + }, + "acorn-es7-plugin": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz", + "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s=" }, "acorn-jsx": { "version": "3.0.1", @@ -483,7 +292,7 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha1-7D6LTp+AZPwCw6ybZfHCdb2o75I=", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", "dev": true }, "ansi-regex": { @@ -499,7 +308,7 @@ "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { "micromatch": "2.3.11", @@ -509,7 +318,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=" + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "archiver": { "version": "2.1.1", @@ -519,10 +328,10 @@ "requires": { "archiver-utils": "1.3.0", "async": "2.6.0", - "buffer-crc32": "0.2.1", + "buffer-crc32": "0.2.13", "glob": "7.1.2", - "lodash": "4.17.4", - "readable-stream": "2.3.3", + "lodash": "4.17.5", + "readable-stream": "2.3.4", "tar-stream": "1.5.5", "zip-stream": "1.2.0" } @@ -536,9 +345,9 @@ "glob": "7.1.2", "graceful-fs": "4.1.11", "lazystream": "1.0.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "normalize-path": "2.1.1", - "readable-stream": "2.3.3" + "readable-stream": "2.3.4" } }, "are-we-there-yet": { @@ -547,7 +356,7 @@ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { "delegates": "1.0.0", - "readable-stream": "2.3.3" + "readable-stream": "2.3.4" } }, "argparse": { @@ -584,9 +393,14 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=" + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -605,16 +419,6 @@ "integrity": "sha1-hlv3+K851rCYLGCQKRSsdrwBCPY=", "dev": true }, - "array-parallel": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/array-parallel/-/array-parallel-0.1.3.tgz", - "integrity": "sha1-j3hTCJJu1apHjEfmTRszS2wMlH0=" - }, - "array-series": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/array-series/-/array-series-0.1.5.tgz", - "integrity": "sha1-3103v8XC7wdV4qpPkv6ufUtaly8=" - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -666,20 +470,15 @@ "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs=", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, - "ast-types": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.15.tgz", - "integrity": "sha1-ju8IJ/BN/w7IhXupJavj/qYZTlI=" - }, "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "async-each": { @@ -705,107 +504,94 @@ "dev": true }, "autolinker": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-1.6.0.tgz", - "integrity": "sha1-utN2t62OQV8i8QL8Dzf2QOZPHL8=" + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-1.6.2.tgz", + "integrity": "sha512-IKLGtYFb3jzGTtgCpb4bm//1sXmmmgmr0msKshhYoc7EsWmLCFvuyxLcEIfcZ5gbCgZGXrnXkOkcBblOFEnlog==" }, "autoprefixer": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.5.tgz", - "integrity": "sha1-BMy9DGphExttE/U9NxkmCSlS0ZI=", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.0.0.tgz", + "integrity": "sha512-XBEqAoESCyGu3daYmWcTC37Dwmjvs0y40UtUO3MMX+Pd/w7jwNFfUKNtxoMFu0u0wcotP+arDpU3JVH54UV79Q==", "dev": true, "requires": { - "browserslist": "2.11.1", - "caniuse-lite": "1.0.30000791", + "browserslist": "3.1.0", + "caniuse-lite": "1.0.30000808", "normalize-range": "0.1.2", "num2fraction": "1.2.2", - "postcss": "6.0.16", + "postcss": "6.0.17", "postcss-value-parser": "3.3.0" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "browserslist": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.1.tgz", - "integrity": "sha512-Gp4oJOQOby5TpOJJuUtCrGE0KSJOUYVa/I+/3eD/TRWEK8jqZuJPAK1t+VuG6jp0keudrqtxlH4MbYbmylun9g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.1.0.tgz", + "integrity": "sha512-pyoJs5teqQWTdwOTG7F5IDKi7hMvifd9ri3EYLG2ElXlA2AwvqB1SZ6RIPMRHpmYb0RYN8N7GSERey5WgxSCUQ==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000791", - "electron-to-chromium": "1.3.30" + "caniuse-lite": "1.0.30000808", + "electron-to-chromium": "1.3.33" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } }, "aws-sdk": { - "version": "2.181.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.181.0.tgz", - "integrity": "sha1-Z+FjCId2FdypujhS/1zKJMd/nK4=", + "version": "2.199.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.199.0.tgz", + "integrity": "sha1-lMJISwMPKZ3aSUyUusxPZuSzLek=", "requires": { "buffer": "4.9.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", "events": "1.1.1", "jmespath": "0.15.0", "querystring": "0.2.0", @@ -816,6 +602,11 @@ "xmlbuilder": "4.2.1" }, "dependencies": { + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, "xml2js": { "version": "0.4.17", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", @@ -830,7 +621,7 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", "requires": { - "lodash": "4.17.4" + "lodash": "4.17.5" } } } @@ -863,7 +654,7 @@ "dev": true, "requires": { "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", + "babel-generator": "6.26.1", "babel-helpers": "6.24.1", "babel-messages": "6.23.0", "babel-register": "6.26.0", @@ -875,7 +666,7 @@ "convert-source-map": "1.5.1", "debug": "2.6.9", "json5": "0.4.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "minimatch": "2.0.10", "path-exists": "1.0.0", "path-is-absolute": "1.0.1", @@ -891,7 +682,7 @@ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "1.1.11" } }, "source-map": { @@ -903,9 +694,9 @@ } }, "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { "babel-messages": "6.23.0", @@ -913,7 +704,7 @@ "babel-types": "6.26.0", "detect-indent": "4.0.0", "jsesc": "1.3.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "source-map": "0.5.7", "trim-right": "1.0.1" }, @@ -980,7 +771,7 @@ "babel-helper-function-name": "6.24.1", "babel-runtime": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-helper-explode-assignable-expression": { @@ -1057,7 +848,7 @@ "requires": { "babel-runtime": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-helper-remap-async-to-generator": { @@ -1320,7 +1111,7 @@ "babel-template": "6.26.0", "babel-traverse": "6.26.0", "babel-types": "6.26.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-plugin-transform-es2015-classes": { @@ -1710,7 +1501,7 @@ "babel-runtime": "6.26.0", "core-js": "2.5.3", "home-or-tmp": "2.0.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "mkdirp": "0.5.1", "source-map-support": "0.4.18" }, @@ -1722,7 +1513,7 @@ "dev": true, "requires": { "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", + "babel-generator": "6.26.1", "babel-helpers": "6.24.1", "babel-messages": "6.23.0", "babel-register": "6.26.0", @@ -1734,7 +1525,7 @@ "convert-source-map": "1.5.1", "debug": "2.6.9", "json5": "0.5.1", - "lodash": "4.17.4", + "lodash": "4.17.5", "minimatch": "3.0.4", "path-is-absolute": "1.0.1", "private": "0.1.8", @@ -1760,6 +1551,7 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, "requires": { "core-js": "2.5.3", "regenerator-runtime": "0.11.1" @@ -1775,7 +1567,7 @@ "babel-traverse": "6.26.0", "babel-types": "6.26.0", "babylon": "6.18.0", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-traverse": { @@ -1792,7 +1584,7 @@ "debug": "2.6.9", "globals": "9.18.0", "invariant": "2.2.2", - "lodash": "4.17.4" + "lodash": "4.17.5" } }, "babel-types": { @@ -1803,16 +1595,21 @@ "requires": { "babel-runtime": "6.26.0", "esutils": "2.0.2", - "lodash": "4.17.4", + "lodash": "4.17.5", "to-fast-properties": "1.0.3" } }, "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, + "backo": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/backo/-/backo-1.1.0.tgz", + "integrity": "sha1-o2xEaJI/LSZcnopwnqVuza/4B+Y=" + }, "backoff": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", @@ -1822,9 +1619,9 @@ } }, "bad-words": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/bad-words/-/bad-words-1.3.1.tgz", - "integrity": "sha1-YD3VpBLnItb/vGtqnIiKNzQTv4I=", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/bad-words/-/bad-words-1.6.1.tgz", + "integrity": "sha1-BkgwIZUanYD7X8qi8Nmh51p0W1A=", "requires": { "badwords-list": "1.0.0" } @@ -1850,21 +1647,36 @@ "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.0.1.tgz", "integrity": "sha1-0EVzalex9sE58MffQlGKhOkbsro=" }, - "base62": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/base62/-/base62-0.1.1.tgz", - "integrity": "sha1-e0F0wvlESXU7EcJlHAg9qEGnsIQ=" - }, "base64-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha1-qRlH2h9KUW6jjltOwOw3c2deCIY=" + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + }, + "base64-url": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz", + "integrity": "sha1-GZ/WYXAqDnt9yubgaYuwicUvbXg=" }, "base64url": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" }, + "basic-auth": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz", + "integrity": "sha1-Awk1sB3nyblKgksp8/zLdQ06UpA=" + }, + "basic-auth-connect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz", + "integrity": "sha1-/bC0OWLKe0BFanwrtI/hc9otISI=" + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=" + }, "bcrypt": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-1.0.3.tgz", @@ -1906,7 +1718,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", "requires": { - "readable-stream": "2.3.3" + "readable-stream": "2.3.4" } }, "block-stream": { @@ -1918,9 +1730,52 @@ } }, "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "body-parser": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.13.3.tgz", + "integrity": "sha1-wIzzMMM1jhUQFqBXRvE/ApyX+pc=", + "requires": { + "bytes": "2.1.0", + "content-type": "1.0.4", + "debug": "2.2.0", + "depd": "1.0.1", + "http-errors": "1.3.1", + "iconv-lite": "0.4.11", + "on-finished": "2.3.0", + "qs": "4.0.0", + "raw-body": "2.1.7", + "type-is": "1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "iconv-lite": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.11.tgz", + "integrity": "sha1-LstC/SlHRJIiCaLnxATayHk9it4=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "qs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", + "integrity": "sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc=" + } + } }, "boolbase": { "version": "1.0.0", @@ -1936,9 +1791,9 @@ } }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -1955,6 +1810,11 @@ "repeat-element": "1.1.2" } }, + "browser-fingerprint": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/browser-fingerprint/-/browser-fingerprint-0.0.1.tgz", + "integrity": "sha1-jfPNyiW/fVs1QtYVRdcwBT/OYEo=" + }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", @@ -1966,14 +1826,14 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000791", - "electron-to-chromium": "1.3.30" + "caniuse-db": "1.0.30000808", + "electron-to-chromium": "1.3.33" } }, "bson": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-0.5.5.tgz", - "integrity": "sha1-HWcl1ADw+/AnG/a6/I+hEmwpmDs=" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", + "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" }, "buffer": { "version": "4.9.1", @@ -1986,9 +1846,10 @@ } }, "buffer-crc32": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", - "integrity": "sha1-vj5TgvwCttYySVasGvmKqYsIU0w=" + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true }, "buffer-equal": { "version": "1.0.0", @@ -2001,13 +1862,16 @@ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, "bugsnag": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/bugsnag/-/bugsnag-1.8.0.tgz", - "integrity": "sha1-5BKdm6KaxRQSANGG/4wK/vdDN8c=", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bugsnag/-/bugsnag-2.1.3.tgz", + "integrity": "sha512-Zge2etOwtWatxP2fElRIwLRBiPVPSuf/BJcK+PGA5YQiCIH5FBWwFva5pZ7vA/VazAZq1X+T6KyJMOyREK08jw==", "requires": { + "backo": "1.1.0", + "cuid": "1.3.8", + "json-stringify-safe": "5.0.1", "promise": "7.3.1", "request": "2.83.0", - "stack-trace": "0.0.9" + "stack-trace": "0.0.10" } }, "builtin-modules": { @@ -2068,9 +1932,14 @@ } }, "bytes": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.0.tgz", - "integrity": "sha1-qtM+wU49wsp06OfUUfm6BTrU96A=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", + "integrity": "sha1-rJPEEOL/ycx89LRks4KJBn9eR7Q=" + }, + "call-signature": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", + "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=" }, "caller-path": { "version": "0.1.0", @@ -2113,14 +1982,14 @@ } }, "caniuse-db": { - "version": "1.0.30000791", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000791.tgz", - "integrity": "sha1-Bnh/VsrvQwChfjXRN0RxI731Nvk=" + "version": "1.0.30000808", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000808.tgz", + "integrity": "sha1-MN/YMAnVcE8C3/s3clBo7RKjZrs=" }, "caniuse-lite": { - "version": "1.0.30000791", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000791.tgz", - "integrity": "sha1-jjV0Xv1IOj4ju301CZAybSMZ/BY=", + "version": "1.0.30000808", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000808.tgz", + "integrity": "sha512-vT0JLmHdvq1UVbYXioxCXHYdNw55tyvi+IUWyX0Zeh1OFQi2IllYtm38IJnSgHWCv/zUnX1hdhy3vMJvuTNSqw==", "dev": true }, "capture-stack-trace": { @@ -2168,7 +2037,7 @@ "deep-eql": "3.0.1", "get-func-name": "2.0.0", "pathval": "1.1.0", - "type-detect": "4.0.5" + "type-detect": "4.0.8" } }, "chai-as-promised": { @@ -2190,6 +2059,13 @@ "has-ansi": "2.0.0", "strip-ansi": "3.0.1", "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } } }, "character-entities": { @@ -2274,7 +2150,7 @@ "chokidar": "1.6.1", "chromedriver": "2.34.1", "colors": "1.1.2", - "commander": "2.13.0", + "commander": "2.14.1", "cucumber": "github:xolvio/cucumber-js#cf953cb5b5de30dbcc279f59e4ebff3aa040071c", "deep-extend": "0.4.2", "exit": "0.1.2", @@ -2283,7 +2159,7 @@ "fs-extra": "1.0.0", "glob": "github:lucetius/node-glob#51c7ca6e69bfbd17db5f1ea710e3f2a7a457d9ce", "hapi": "8.8.0", - "jasmine": "2.8.0", + "jasmine": "2.99.0", "loglevel": "1.4.1", "minimist": "1.2.0", "mocha": "4.1.0", @@ -2305,18 +2181,21 @@ "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", "dev": true }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", - "dev": true - }, "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "glob": { "version": "github:lucetius/node-glob#51c7ca6e69bfbd17db5f1ea710e3f2a7a457d9ce", "dev": true, @@ -2329,17 +2208,72 @@ "path-is-absolute": "1.0.1" } }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.3.0", + "path-is-absolute": "1.0.1" + } + } + } + }, "once": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.0.tgz", "integrity": "sha1-FRr4a/wfCMS58H0GqyUP/L61ZYE=", "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } } } }, @@ -2360,10 +2294,15 @@ "readdirp": "2.1.0" } }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + }, "chromedriver": { "version": "2.34.1", "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.34.1.tgz", - "integrity": "sha1-TO/xse94X7Qb11ApFn6UtQvXeEQ=", + "integrity": "sha512-ivXrPKKtnX442J8Lkbhb8hJ5+lelzAqrAI9VjVs3/iujm396JnJYXGGGjniPXvQeLVE3HDIWwsHu8goIUq3rMQ==", "dev": true, "requires": { "del": "3.0.0", @@ -2373,19 +2312,10 @@ "request": "2.83.0" } }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, "cli-cursor": { @@ -2453,14 +2383,14 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codemirror": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.33.0.tgz", - "integrity": "sha1-RirZpv6NOLVBqVNqOZfh75O0DGo=" + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.35.0.tgz", + "integrity": "sha512-8HQICjZlDfe1ai7bvU6m2uHxuZuFgsUCdDRU9OHVB+2RTRd+FftN1ezVCqbquG0Fyq+wETqyadKhUX46DswSUQ==" }, "coffeescript": { "version": "1.12.7", "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", - "integrity": "sha1-5X7kxIZ89/YGv8Sg8tVQwJgd3Sc=" + "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==" }, "collapse-white-space": { "version": "1.0.3", @@ -2468,11 +2398,19 @@ "integrity": "sha1-S5BvZw5aljqHt2sOFolkM0G2Ajw=", "dev": true }, + "color": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color/-/color-2.0.1.tgz", + "integrity": "sha512-ubUCVVKfT7r2w2D3qtHakj8mbmKms+tThR8gI8zEYCbUBl8/voqFGt3kgBqGwXAopgXybnkuOq+qMYCRrp4cXw==", + "requires": { + "color-convert": "1.9.1", + "color-string": "1.5.2" + } + }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", - "dev": true, + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { "color-name": "1.1.3" } @@ -2480,8 +2418,16 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.2.tgz", + "integrity": "sha1-JuRYFLw8mny9Z1FkikFDRRSnc6k=", + "requires": { + "color-name": "1.1.3", + "simple-swizzle": "0.2.2" + } }, "colors": { "version": "1.0.3", @@ -2494,17 +2440,17 @@ "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" }, "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { "delayed-stream": "1.0.0" } }, "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w=" + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" }, "compare-func": { "version": "1.3.2", @@ -2539,10 +2485,46 @@ "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", "dev": true, "requires": { - "buffer-crc32": "0.2.1", + "buffer-crc32": "0.2.13", "crc32-stream": "2.0.0", "normalize-path": "2.1.1", - "readable-stream": "2.3.3" + "readable-stream": "2.3.4" + } + }, + "compressible": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", + "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", + "requires": { + "mime-db": "1.33.0" + } + }, + "compression": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.5.2.tgz", + "integrity": "sha1-sDuNhub4rSloPLqN+R3cb/x3s5U=", + "requires": { + "accepts": "1.2.13", + "bytes": "2.1.0", + "compressible": "2.0.12", + "debug": "2.2.0", + "on-headers": "1.0.1", + "vary": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } } }, "concat-map": { @@ -2556,14 +2538,14 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "requires": { "inherits": "2.0.3", - "readable-stream": "2.3.3", + "readable-stream": "2.3.4", "typedarray": "0.0.6" } }, "configstore": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", - "integrity": "sha1-CU7mYquD+tmRdnjeEU+q6o/NypA=", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", "requires": { "dot-prop": "4.2.0", "graceful-fs": "4.1.11", @@ -2574,194 +2556,309 @@ } }, "connect": { - "version": "2.7.10", - "resolved": "https://registry.npmjs.org/connect/-/connect-2.7.10.tgz", - "integrity": "sha1-oKxZRk1lJAedsCyXFRx5XBtN7mQ=", - "requires": { - "buffer-crc32": "0.2.1", - "bytes": "0.2.0", - "cookie": "0.0.5", - "cookie-signature": "1.0.1", - "debug": "2.6.9", - "formidable": "1.0.14", - "fresh": "0.1.0", - "pause": "0.0.1", - "qs": "0.6.5", - "send": "0.1.0" + "version": "2.30.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-2.30.2.tgz", + "integrity": "sha1-jam8vooFTT0xjXTf7JA7XDmhtgk=", + "requires": { + "basic-auth-connect": "1.0.0", + "body-parser": "1.13.3", + "bytes": "2.1.0", + "compression": "1.5.2", + "connect-timeout": "1.6.2", + "content-type": "1.0.4", + "cookie": "0.1.3", + "cookie-parser": "1.3.5", + "cookie-signature": "1.0.6", + "csurf": "1.8.3", + "debug": "2.2.0", + "depd": "1.0.1", + "errorhandler": "1.4.3", + "express-session": "1.11.3", + "finalhandler": "0.4.0", + "fresh": "0.3.0", + "http-errors": "1.3.1", + "method-override": "2.3.10", + "morgan": "1.6.1", + "multiparty": "3.3.2", + "on-headers": "1.0.1", + "parseurl": "1.3.2", + "pause": "0.1.0", + "qs": "4.0.0", + "response-time": "2.3.2", + "serve-favicon": "2.3.2", + "serve-index": "1.7.3", + "serve-static": "1.10.3", + "type-is": "1.6.15", + "utils-merge": "1.0.0", + "vhost": "3.0.2" }, "dependencies": { - "qs": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz", - "integrity": "sha1-KUsmjksNQlD23eGbO4s0k13/FO8=" - } - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "conventional-changelog": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.7.tgz", - "integrity": "sha1-kVGmKx2O2y2CcR2r9bfPcQQfgrE=", - "dev": true, - "requires": { - "conventional-changelog-angular": "1.6.0", - "conventional-changelog-atom": "0.1.2", - "conventional-changelog-codemirror": "0.2.1", - "conventional-changelog-core": "1.9.5", - "conventional-changelog-ember": "0.2.10", - "conventional-changelog-eslint": "0.2.1", - "conventional-changelog-express": "0.2.1", - "conventional-changelog-jquery": "0.1.0", - "conventional-changelog-jscs": "0.1.0", - "conventional-changelog-jshint": "0.2.1" - } - }, - "conventional-changelog-angular": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.0.tgz", - "integrity": "sha1-CiagcfLJ/PzyuGugz79uYwG3W/o=", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "escape-html": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz", + "integrity": "sha1-130y+pjjjC9BroXpJ44ODmuhAiw=" + }, + "finalhandler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", + "integrity": "sha1-llpS2ejQXSuFdUhUH7ibU6JJfZs=", + "requires": { + "debug": "2.2.0", + "escape-html": "1.0.2", + "on-finished": "2.3.0", + "unpipe": "1.0.0" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "qs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", + "integrity": "sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" } } }, - "conventional-changelog-atom": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.1.2.tgz", - "integrity": "sha1-Ella1SZ6aTfDTPkAKBscZRmKTGM=", - "dev": true, + "connect-timeout": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.6.2.tgz", + "integrity": "sha1-3ppexh4zoStu2qt7XwYumMWZuI4=", "requires": { - "q": "1.5.1" + "debug": "2.2.0", + "http-errors": "1.3.1", + "ms": "0.7.1", + "on-headers": "1.0.1" }, "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" } } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, "conventional-changelog-cli": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-1.3.5.tgz", - "integrity": "sha1-RsUUliFrdAZYiIPe+m+sWJ6bsx4=", + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-1.3.14.tgz", + "integrity": "sha512-XxGHKAzt/Z0++OCnVG1S7XXuKZETI8ZUczfHoJniR1t0wNtlE2tJ1MPBHoLCPgYIGTPOe80EcSbHL6RQni54Tw==", "dev": true, "requires": { "add-stream": "1.0.0", - "conventional-changelog": "1.1.7", - "lodash": "4.17.4", + "conventional-changelog": "1.1.16", + "lodash": "4.17.5", "meow": "3.7.0", "tempfile": "1.1.1" - } - }, - "conventional-changelog-codemirror": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.2.1.tgz", - "integrity": "sha1-KZpPcUe681DmyBWPxUlUopHFzAk=", - "dev": true, - "requires": { - "q": "1.5.1" }, "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } - } - }, - "conventional-changelog-core": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-1.9.5.tgz", - "integrity": "sha1-XbdWba18DLddr0f7spdve/mSjB0=", - "dev": true, - "requires": { - "conventional-changelog-writer": "2.0.3", - "conventional-commits-parser": "2.1.0", - "dateformat": "1.0.12", - "get-pkg-repo": "1.4.0", - "git-raw-commits": "1.3.0", - "git-remote-origin-url": "2.0.0", - "git-semver-tags": "1.2.3", - "lodash": "4.17.4", - "normalize-package-data": "2.4.0", - "q": "1.5.1", - "read-pkg": "1.1.0", - "read-pkg-up": "1.0.1", - "through2": "2.0.3" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } - } - }, - "conventional-changelog-ember": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.2.10.tgz", - "integrity": "sha1-3NbkzcLmwrWGU89NLLFlamBCGSk=", - "dev": true, - "requires": { - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } - } - }, - "conventional-changelog-eslint": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-0.2.1.tgz", - "integrity": "sha1-LCoRvrIW+AZJunKDQYApO2h8BmI=", - "dev": true, - "requires": { - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } - } - }, - "conventional-changelog-express": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.2.1.tgz", - "integrity": "sha1-g42eHmyQmXA7FQucGaoteBdCvWw=", - "dev": true, - "requires": { - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "conventional-changelog": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.16.tgz", + "integrity": "sha512-7Z7B39PJeCbviJw6ukVOjoyWDGmSvlZj77UkPxXPLO03zGgHHADCDSu1yU/YfVsKkQiel4Ot0o7jTqbP8zIvVQ==", + "dev": true, + "requires": { + "conventional-changelog-angular": "1.6.5", + "conventional-changelog-atom": "0.2.3", + "conventional-changelog-codemirror": "0.3.3", + "conventional-changelog-core": "2.0.4", + "conventional-changelog-ember": "0.3.5", + "conventional-changelog-eslint": "1.0.3", + "conventional-changelog-express": "0.3.3", + "conventional-changelog-jquery": "0.1.0", + "conventional-changelog-jscs": "0.1.0", + "conventional-changelog-jshint": "0.3.3", + "conventional-changelog-preset-loader": "1.1.5" + } + }, + "conventional-changelog-angular": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.5.tgz", + "integrity": "sha512-70zO0ThLMlAzPOiYqRAFcMTQbe1Qewy+4v/TJuKMZueCJwR1fLqJCVfvjRlnPrYDwgjI0kc74VymbFO7rJDIPg==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.3.tgz", + "integrity": "sha512-ZhhcyBeMQQbQ/eqanVb9bFJfS7ScsPgvlbPWLrL5HgcfdO9yGSaEp/hLvXIZ2tYYDd8e5Y0AB+5C4tiSE2K4EQ==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-codemirror": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.3.tgz", + "integrity": "sha512-9vYteJT6F3Ao3CtgXYg1JCRdzLI4qqbH3GdHL0OSjEe/FQjsJRcGHqpbUQ1SQ0ga+vqAJlJdJNib9BwHIQF4mw==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-core": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.4.tgz", + "integrity": "sha512-XsmaKcbfewovP72N5w17TNV6fqZYTF0jnNKG0V/OhPsIZETFvFzJwPHCDM3FrRNvDXWRvqb2M0a83cvYhHbvzw==", + "dev": true, + "requires": { + "conventional-changelog-writer": "3.0.3", + "conventional-commits-parser": "2.1.4", + "dateformat": "1.0.12", + "get-pkg-repo": "1.4.0", + "git-raw-commits": "1.3.3", + "git-remote-origin-url": "2.0.0", + "git-semver-tags": "1.3.3", + "lodash": "4.17.5", + "normalize-package-data": "2.4.0", + "q": "1.5.1", + "read-pkg": "1.1.0", + "read-pkg-up": "1.0.1", + "through2": "2.0.3" + } + }, + "conventional-changelog-ember": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.5.tgz", + "integrity": "sha512-A55p1kg/ekyU2zTEScdRKwuHaCUfDocakIPoaxdCxsRQ1732C4Em4u6lbN0F1jQHoCsQqqA1aPAEOMKgDicnbA==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.3.tgz", + "integrity": "sha512-4Y1/9TX16RvWiOdMnJQ8flxZ+hdDGVm1E4yrWvyr1L1UBWM56CJobMRg7nf+LqqVnKj0kkuyhwf3WV9//luYHg==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-express": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.3.tgz", + "integrity": "sha512-ivIa/9a05xxcA4bH1jQFpzwCEJywDirHhcQ6OQwYvAy0/ekRfGXA9U2ULVqE1WRqcmpFuayfAuysE9BJjqthEQ==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.3.tgz", + "integrity": "sha512-RuGFuOp101qhxQdV+h4Dhdeqs1ZsycdoqN14GZ98E3MiDGQ++jfH6wjgUjU8uv8jULyrkLPenIWC0ooxQYneCw==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.5.tgz", + "integrity": "sha512-ngaSOqeyH5hYYdvl+bcJNEiT9B2c8cSRpIZtnFxbRyH7MVQbLOEn5oPV9NpQM00hTyBtqDviNDCXmy/Al6Gq8w==", "dev": true + }, + "conventional-changelog-writer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.3.tgz", + "integrity": "sha512-gzkAFnFxjEOBCwISTBUJ6DnthMwzqY1MRyElN6S25VYBcRV/6DOVbbZgbBL1KdsogO6Z/QuJlSnIH7OteVd5lQ==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "conventional-commits-filter": "1.1.4", + "dateformat": "1.0.12", + "handlebars": "4.0.11", + "json-stringify-safe": "5.0.1", + "lodash": "4.17.5", + "meow": "3.7.0", + "semver": "5.5.0", + "split": "1.0.1", + "through2": "2.0.3" + } + }, + "conventional-commits-filter": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.4.tgz", + "integrity": "sha512-VaLmHo+P1IYQenZwkgp21y9z5tyU8sH3GKI/AfthQYPK9IYhT4lNbATGW9Iona+BU3fmWw/9S3L5vMopMI+jkA==", + "dev": true, + "requires": { + "is-subset": "0.1.1", + "modify-values": "1.0.0" + } + }, + "conventional-commits-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.4.tgz", + "integrity": "sha512-dyTFuqQQzTynPN81zk9Pvm6d4mGiTuPz+Qi1ee8CmhupBji7gwO0DKXvAWo3MEFilE50pm8h8kRbETL5wsI65A==", + "dev": true, + "requires": { + "JSONStream": "1.3.2", + "is-text-path": "1.0.1", + "lodash": "4.17.5", + "meow": "3.7.0", + "split2": "2.2.0", + "through2": "2.0.3", + "trim-off-newlines": "1.0.1" + } + }, + "git-raw-commits": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.3.tgz", + "integrity": "sha512-EKgNIRhpCYFgLTM+o4lbu5+JxTGhUBgaRN3JQv/X2dm7zuSf64tay/igxf2RMJfOZYpmUYX96JOk3Q7JajPLVA==", + "dev": true, + "requires": { + "dargs": "4.1.0", + "lodash.template": "4.4.0", + "meow": "3.7.0", + "split2": "2.2.0", + "through2": "2.0.3" + } + }, + "git-semver-tags": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.3.tgz", + "integrity": "sha512-FK/ZQeFwANfsoo+3FFhO1XRVVKgSZgcO0ABtydFrPQj7U2N5ELVr8MxBqlXa5TdpRKTp6/H5ki1cK2Anxr2kJw==", + "dev": true, + "requires": { + "meow": "3.7.0", + "semver": "5.5.0" + } } } }, @@ -2799,67 +2896,6 @@ } } }, - "conventional-changelog-jshint": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.2.1.tgz", - "integrity": "sha1-hhObs6yZiZ8rF36WF+CbN9mbzzo=", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } - } - }, - "conventional-changelog-writer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-2.0.3.tgz", - "integrity": "sha1-BzsMOfHMj8D9mxVm6Tgz9RSJyBw=", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "conventional-commits-filter": "1.1.1", - "dateformat": "1.0.12", - "handlebars": "4.0.11", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.4", - "meow": "3.7.0", - "semver": "5.4.1", - "split": "1.0.1", - "through2": "2.0.3" - } - }, - "conventional-commits-filter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.1.tgz", - "integrity": "sha1-chcjGcDIgyigFbMGhrVVJ7Ol5Uo=", - "dev": true, - "requires": { - "is-subset": "0.1.1", - "modify-values": "1.0.0" - } - }, - "conventional-commits-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.0.tgz", - "integrity": "sha1-m0t8kRJL8qGposwccnYNOCy7sik=", - "dev": true, - "requires": { - "JSONStream": "1.3.2", - "is-text-path": "1.0.1", - "lodash": "4.17.4", - "meow": "3.7.0", - "split2": "2.2.0", - "through2": "2.0.3", - "trim-off-newlines": "1.0.1" - } - }, "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", @@ -2867,14 +2903,23 @@ "dev": true }, "cookie": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.0.5.tgz", - "integrity": "sha1-+az521frdWjJ/MWWJWt7si4wfIE=" + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", + "integrity": "sha1-5zSlwUF/zkctWu+Cw4HKu2TRpDU=" + }, + "cookie-parser": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.5.tgz", + "integrity": "sha1-nXVVcPtdF4kHcSJ6AjFNm+fPg1Y=", + "requires": { + "cookie": "0.1.3", + "cookie-signature": "1.0.6" + } }, "cookie-signature": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz", - "integrity": "sha1-ROByFIrwHm6OJK+/EmkNaK5pjss=" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "cookiejar": { "version": "2.1.1", @@ -2895,7 +2940,7 @@ "cosmiconfig": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-3.1.0.tgz", - "integrity": "sha1-ZAqUv5hH8yGABAPNJzr2BmXHM5c=", + "integrity": "sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q==", "dev": true, "requires": { "is-directory": "0.3.1", @@ -2928,7 +2973,7 @@ "dev": true, "requires": { "crc": "3.5.0", - "readable-stream": "2.3.3" + "readable-stream": "2.3.4" } }, "create-error-class": { @@ -2939,46 +2984,39 @@ "capture-stack-trace": "1.0.0" } }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.9" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" - } - }, "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, "requires": { "lru-cache": "4.1.1", - "which": "1.3.0" + "shebang-command": "1.2.0", + "which": "1.2.14" }, "dependencies": { "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" + }, + "dependencies": { + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } } } } @@ -2994,7 +3032,7 @@ "boom": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha1-XdnabuOl8wIHdDYpDLcX0/SlTgI=", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "requires": { "hoek": "4.2.0" } @@ -3006,6 +3044,16 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, + "csrf": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.0.6.tgz", + "integrity": "sha1-thEg3c7q/JHnbtUxO7XAsmZ7cQo=", + "requires": { + "rndm": "1.2.0", + "tsscmp": "1.0.5", + "uid-safe": "2.1.4" + } + }, "css": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", @@ -3060,15 +3108,27 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=" }, + "csurf": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.8.3.tgz", + "integrity": "sha1-I/KhO/HY/OHQyZZYg5RELLqGpWo=", + "requires": { + "cookie": "0.1.3", + "cookie-signature": "1.0.6", + "csrf": "3.0.6", + "http-errors": "1.3.1" + } + }, "csv-parse": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-1.2.0.tgz", - "integrity": "sha1-BHtzhoq5qFdG6IX2N/ntD7ZFpCU=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-1.3.3.tgz", + "integrity": "sha1-0c/YdDwvhJoKuy/VRNtWaV0ZpJA=" }, "ctype": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=" + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", + "dev": true }, "cucumber": { "version": "github:xolvio/cucumber-js#cf953cb5b5de30dbcc279f59e4ebff3aa040071c", @@ -3078,14 +3138,14 @@ "cli-table": "0.3.1", "co": "4.6.0", "colors": "1.1.2", - "commander": "2.13.0", + "commander": "2.14.1", "duration": "0.2.0", "fibers": "1.0.15", "figures": "1.7.0", "gherkin": "4.0.0", "glob": "7.1.2", "is-generator": "1.0.3", - "lodash": "4.17.4", + "lodash": "4.17.5", "meteor-promise": "0.8.6", "stack-chain": "1.3.7", "stacktrace-js": "1.3.1" @@ -3099,6 +3159,23 @@ } } }, + "cuid": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/cuid/-/cuid-1.3.8.tgz", + "integrity": "sha1-S4deCWm612T37AcGz0T1+wgx9rc=", + "requires": { + "browser-fingerprint": "0.0.1", + "core-js": "1.2.7", + "node-fingerprint": "0.0.2" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -3119,7 +3196,7 @@ "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", "dev": true, "requires": { - "es5-ext": "0.10.37" + "es5-ext": "0.10.38" } }, "dargs": { @@ -3167,7 +3244,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -3187,13 +3264,21 @@ "map-obj": "1.0.1" } }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "1.0.0" + } + }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "4.0.5" + "type-detect": "4.0.8" } }, "deep-extend": { @@ -3210,14 +3295,13 @@ "deepmerge": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz", - "integrity": "sha1-JcHCTxEPuRT4AAG5JSZN138/QxI=", + "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ==", "dev": true }, "define-properties": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, "requires": { "foreach": "2.0.5", "object-keys": "1.0.11" @@ -3235,6 +3319,29 @@ "p-map": "1.2.0", "pify": "3.0.0", "rimraf": "2.6.2" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } } }, "delayed-stream": { @@ -3245,17 +3352,22 @@ "delegate": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=" + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, - "deprecate": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-0.1.0.tgz", - "integrity": "sha1-xJBYYS3GyOUUXq/kg5uMLH0EHBQ=" + "depd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-indent": { "version": "4.0.0", @@ -3266,6 +3378,11 @@ "repeating": "2.0.1" } }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "dicer": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", @@ -3301,34 +3418,27 @@ "diff": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha1-qoVnpu7QPFMfyJ0/cRzQ5SWd7HU=", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", "dev": true }, + "diff-match-patch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.0.tgz", + "integrity": "sha1-HMPIOkkNZ/ldkeOfatHy4Ia2MEg=" + }, "dir-glob": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha1-CyBdK2rvmCOMooZZioIE0p0KADQ=", - "dev": true, + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "requires": { "arrify": "1.0.1", "path-type": "3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", - "dev": true, - "requires": { - "pify": "3.0.0" - } - } } }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "2.0.2" @@ -3374,7 +3484,7 @@ "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { "is-obj": "1.0.1" } @@ -3396,11 +3506,11 @@ "duplexify": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz", - "integrity": "sha1-i1gYgA35L9ASWyeriWSRkShYJD4=", + "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==", "requires": { "end-of-stream": "1.4.1", "inherits": "2.0.3", - "readable-stream": "2.3.3", + "readable-stream": "2.3.4", "stream-shift": "1.0.0" } }, @@ -3411,9 +3521,14 @@ "dev": true, "requires": { "d": "0.1.1", - "es5-ext": "0.10.37" + "es5-ext": "0.10.38" } }, + "eastasianwidth": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.1.1.tgz", + "integrity": "sha1-RNZW3p2kFWlEZzNTZfsxR7hXK3w=" + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -3432,34 +3547,49 @@ "safe-buffer": "5.1.1" } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, "ejs": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", "dev": true }, - "electron-releases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/electron-releases/-/electron-releases-2.1.0.tgz", - "integrity": "sha512-cyKFD1bTE/UgULXfaueIN1k5EPFzs+FRc/rvCY5tIynefAPqopQEgjr0EzY+U3Dqrk/G4m9tXSPuZ77v6dL/Rw==" - }, "electron-to-chromium": { - "version": "1.3.30", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.30.tgz", - "integrity": "sha512-zx1Prv7kYLfc4OA60FhxGbSo4qrEjgSzpo1/37i7l9ltXPYOoQBtjQxY9KmsgfHnBxHlBGXwLlsbt/gub1w5lw==", - "requires": { - "electron-releases": "2.1.0" - } + "version": "1.3.33", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.33.tgz", + "integrity": "sha1-vwBwPWKnxlI4E2V4w1LWxcBCpUU=" }, "emailreplyparser": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/emailreplyparser/-/emailreplyparser-0.0.5.tgz", "integrity": "sha1-BpYswKRCFnWbo7mOOyV3wM4w/Aw=" }, + "empower": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/empower/-/empower-1.2.3.tgz", + "integrity": "sha1-bw2nNEf07dg4/sXGAxOoi6XLhSs=", + "requires": { + "core-js": "2.5.3", + "empower-core": "0.6.2" + } + }, + "empower-core": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-0.6.2.tgz", + "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=", + "requires": { + "call-signature": "0.0.2", + "core-js": "2.5.3" + } + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { "once": "1.4.0" } @@ -3477,7 +3607,7 @@ "errno": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", - "integrity": "sha1-w4bOimKD8U/AlWO3FWCQjJv1MCY=", + "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", "optional": true, "requires": { "prr": "1.0.1" @@ -3490,6 +3620,14 @@ "dev": true, "requires": { "is-arrayish": "0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + } } }, "error-stack-parser": { @@ -3501,20 +3639,35 @@ "stackframe": "0.3.1" } }, - "es3ify": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/es3ify/-/es3ify-0.1.4.tgz", - "integrity": "sha1-rZ+l3xrjTz8x4SEbWBiy1RB439E=", + "errorhandler": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.4.3.tgz", + "integrity": "sha1-t7cO2PNZ6duICS8tIMD4MUIK2D8=", "requires": { - "esprima-fb": "3001.1.0-dev-harmony-fb", - "jstransform": "3.0.0", - "through": "2.3.8" + "accepts": "1.3.4", + "escape-html": "1.0.3" + }, + "dependencies": { + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + } } }, "es5-ext": { - "version": "0.10.37", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", - "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "version": "0.10.38", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz", + "integrity": "sha512-jCMyePo7AXbUESwbl8Qi01VSH2piY9s/a3rSU/5w/MlTIx8HPL1xn2InGN8ejt/xulcJgnTO7vqNtOAxzYd2Kg==", "dev": true, "requires": { "es6-iterator": "2.0.3", @@ -3528,7 +3681,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37", + "es5-ext": "0.10.38", "es6-symbol": "3.1.1" }, "dependencies": { @@ -3538,7 +3691,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.37" + "es5-ext": "0.10.38" } } } @@ -3556,7 +3709,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.37" + "es5-ext": "0.10.38" }, "dependencies": { "d": { @@ -3565,46 +3718,51 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.37" + "es5-ext": "0.10.38" } } } }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.15.0.tgz", - "integrity": "sha512-zEO/Z1ZUxIQ+MhDVKkVTUYpIPDTEJLXGMrkID+5v1NeQHtCz6FZikWuFRgxE1Q/RV2V4zVl1u3xmpPADHhMZ6A==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.18.1.tgz", + "integrity": "sha512-gPSfpSRCHre1GLxGmO68tZNxOlL2y7xBd95VcLD+Eo4S2js31YoMum3CAQIOaxY24hqYOMksMvW38xuuWKQTgw==", "dev": true, "requires": { "ajv": "5.5.2", "babel-code-frame": "6.26.0", - "chalk": "2.3.0", + "chalk": "2.3.1", "concat-stream": "1.6.0", "cross-spawn": "5.1.0", "debug": "3.1.0", "doctrine": "2.1.0", "eslint-scope": "3.7.1", "eslint-visitor-keys": "1.0.0", - "espree": "3.5.2", + "espree": "3.5.3", "esquery": "1.0.0", "esutils": "2.0.2", "file-entry-cache": "2.0.0", "functional-red-black-tree": "1.0.1", "glob": "7.1.2", - "globals": "11.1.0", + "globals": "11.3.0", "ignore": "3.3.7", "imurmurhash": "0.1.4", "inquirer": "3.3.0", - "is-resolvable": "1.0.1", + "is-resolvable": "1.1.0", "js-yaml": "3.10.0", "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.3.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "minimatch": "3.0.4", "mkdirp": "0.5.1", "natural-compare": "1.4.0", @@ -3613,7 +3771,7 @@ "pluralize": "7.0.0", "progress": "2.0.0", "require-uncached": "1.0.3", - "semver": "5.4.1", + "semver": "5.5.0", "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", "table": "4.0.2", @@ -3636,25 +3794,14 @@ } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "supports-color": "5.2.0" } }, "debug": { @@ -3667,27 +3814,17 @@ } }, "globals": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.1.0.tgz", - "integrity": "sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", + "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", "dev": true }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, "progress": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", @@ -3704,12 +3841,12 @@ } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -3727,36 +3864,40 @@ "eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha1-PzGA+y4pEBdxastMnW1bXDSmqB0=", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", "dev": true }, - "esmangle-evaluator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esmangle-evaluator/-/esmangle-evaluator-1.0.1.tgz", - "integrity": "sha1-Yg2GbvSGGzMR91dm1SqFcrs8YzY=" - }, "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha1-dWrai5eenc/NswqtjRqTBKkF4co=", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz", + "integrity": "sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ==", "dev": true, "requires": { - "acorn": "5.3.0", + "acorn": "5.4.1", "acorn-jsx": "3.0.1" }, "dependencies": { "acorn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", - "integrity": "sha1-dEbTlFnFT7SagObuZHgUm5QOyCI=", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", + "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", "dev": true } } }, - "esprima-fb": { - "version": "3001.1.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz", - "integrity": "sha1-t303q8046gt3Qmu4vCkizmtCZBE=" + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "espurify": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", + "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", + "requires": { + "core-js": "2.5.3" + } }, "esquery": { "version": "1.0.0", @@ -3775,21 +3916,12 @@ "requires": { "estraverse": "4.2.0", "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - } } }, "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" }, "esutils": { "version": "2.0.2", @@ -3797,6 +3929,11 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, "eventemitter3": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", @@ -3840,6 +3977,55 @@ "fill-range": "2.2.3" } }, + "express-session": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.11.3.tgz", + "integrity": "sha1-XMmPP1/4Ttg1+Ry/CqvQxxB0AK8=", + "requires": { + "cookie": "0.1.3", + "cookie-signature": "1.0.6", + "crc": "3.3.0", + "debug": "2.2.0", + "depd": "1.0.1", + "on-headers": "1.0.1", + "parseurl": "1.3.2", + "uid-safe": "2.0.0", + "utils-merge": "1.0.0" + }, + "dependencies": { + "crc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.3.0.tgz", + "integrity": "sha1-+mIuG8OIvyVzCQgta2UgDOZwkLo=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "uid-safe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz", + "integrity": "sha1-p/PGymSh9qXQTsDvPkw9U2cxcTc=", + "requires": { + "base64-url": "1.2.1" + } + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", @@ -3848,7 +4034,7 @@ "external-editor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha1-PQJqIbf5W1cmOH1CAKwWDTcsO0g=", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", "dev": true, "requires": { "chardet": "0.4.2", @@ -3898,24 +4084,6 @@ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" }, - "falafel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.2.0.tgz", - "integrity": "sha1-wY0k71CRF0pJfzGM0ksCaiXN2rQ=", - "requires": { - "acorn": "1.2.2", - "foreach": "2.0.5", - "isarray": "0.0.1", - "object-keys": "1.0.11" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } - }, "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", @@ -3988,14 +4156,6 @@ "requires": { "escape-string-regexp": "1.0.5", "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - } } }, "file-entry-cache": { @@ -4006,20 +4166,12 @@ "requires": { "flat-cache": "1.3.0", "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - } } }, "file-type": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.4.0.tgz", - "integrity": "sha1-KnyU9ioAMBULt9m2xwz6HT51nIY=" + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.6.0.tgz", + "integrity": "sha512-EAogdjMKf0PEU26Wk+N/Qkg8JXpMRo9t70dg7+t9QvcYUZb/XfA66Hdt15g4xRdam4wgiQsg/qycKUIuZQDJog==" }, "filename-regex": { "version": "2.0.1", @@ -4028,9 +4180,9 @@ "dev": true }, "filesize": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz", - "integrity": "sha1-GRkyZ0lDO7PPdzaL0VjKq8wZ6e4=" + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.0.tgz", + "integrity": "sha512-g5OWtoZWcPI56js1DFhIEqyG9tnu/7sG3foHwgS9KGYFMfsYguI3E+PRVCmtmE96VajQIEMRU2OhN+ME589Gdw==" }, "fill-keys": { "version": "1.0.2", @@ -4117,12 +4269,6 @@ "pinkie-promise": "2.0.1" } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -4162,19 +4308,20 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { "asynckit": "0.4.0", - "combined-stream": "1.0.5", + "combined-stream": "1.0.6", "mime-types": "2.1.17" } }, "formidable": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz", - "integrity": "sha1-Kz9MQRy7X91pXESEPiojUUpDIxo=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", + "dev": true }, "freeport": { "version": "1.0.5", @@ -4183,9 +4330,9 @@ "dev": true }, "fresh": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz", - "integrity": "sha1-A+SwF4Qk5MLV0ZpU2IFM3JeTSFA=" + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" }, "fs-extra": { "version": "1.0.0", @@ -4198,6 +4345,14 @@ "klaw": "1.3.1" } }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "2.2.1" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5131,7 +5286,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "functional-red-black-tree": { @@ -5153,13 +5308,6 @@ "string-width": "1.0.2", "strip-ansi": "3.0.1", "wide-align": "1.1.2" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } } }, "gaze": { @@ -5172,50 +5320,26 @@ } }, "gcp-metadata": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.3.1.tgz", - "integrity": "sha1-MTgURW58PQ7rj4sISzNXnohvgpo=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.4.1.tgz", + "integrity": "sha512-yFE7v+NyoMiTOi2L6r8q87eVbiZCKooJNPKXTHhBStga8pwwgWofK9iHl00qd0XevZxcpk7ORaEL/ALuTvlaGQ==", "requires": { "extend": "3.0.1", "retry-request": "3.3.1" - }, - "dependencies": { - "retry-request": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.1.tgz", - "integrity": "sha1-+3EnYjWmF+l1Uem+c3q1uRWR+54=", - "requires": { - "request": "2.83.0", - "through2": "2.0.3" - } - } } }, "gcs-resumable-upload": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.8.2.tgz", - "integrity": "sha1-N98CRwQwOVp4mmN+csq8gGd66WQ=", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.9.0.tgz", + "integrity": "sha512-+Zrmr0JKO2y/2mg953TW6JLu+NAMHqQsKzqCm7CIT24gMQakolPJCMzDleVpVjXAqB7ZCD276tcUq2ebOfqTug==", "requires": { "buffer-equal": "1.0.0", "configstore": "3.1.1", - "google-auto-auth": "0.7.2", - "pumpify": "1.3.6", + "google-auto-auth": "0.9.3", + "pumpify": "1.4.0", "request": "2.83.0", "stream-events": "1.0.2", "through2": "2.0.3" - }, - "dependencies": { - "google-auto-auth": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.2.tgz", - "integrity": "sha1-v5NS1cSgiXvzH9nEkQKLdl++px4=", - "requires": { - "async": "2.6.0", - "gcp-metadata": "0.3.1", - "google-auth-library": "0.10.0", - "request": "2.83.0" - } - } } }, "generate-function": { @@ -5276,19 +5400,6 @@ "integrity": "sha1-edzgTRIj6kO0hip2vlzo+JwSwyw=", "dev": true }, - "git-raw-commits": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.0.tgz", - "integrity": "sha1-C8hZbpDV/+c29/VUa9LRL3OrqsY=", - "dev": true, - "requires": { - "dargs": "4.1.0", - "lodash.template": "4.4.0", - "meow": "3.7.0", - "split2": "2.2.0", - "through2": "2.0.3" - } - }, "git-remote-origin-url": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", @@ -5307,16 +5418,6 @@ } } }, - "git-semver-tags": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.2.3.tgz", - "integrity": "sha1-GItFOIK/nXojr9Mbq6U32rc4jV0=", - "dev": true, - "requires": { - "meow": "3.7.0", - "semver": "5.4.1" - } - }, "gitconfiglocal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", @@ -5361,31 +5462,20 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "requires": { "array-union": "1.0.2", + "dir-glob": "2.0.0", "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" } }, "globjoin": { @@ -5401,35 +5491,14 @@ "dev": true, "requires": { "glob": "7.1.2", - "lodash": "4.17.4", + "lodash": "4.17.5", "minimatch": "3.0.4" } }, - "gm": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/gm/-/gm-1.23.1.tgz", - "integrity": "sha1-Lt7rlYCE0PjqeYjl2ZWxx9/BR3c=", - "requires": { - "array-parallel": "0.1.3", - "array-series": "0.1.5", - "cross-spawn": "4.0.2", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", - "requires": { - "ms": "2.0.0" - } - } - } - }, "gonzales-pe": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.2.3.tgz", - "integrity": "sha1-QQkXA2JUMyheCu46pHgp/B++tvI=", + "integrity": "sha512-Kjhohco0esHQnOiqqdJeNz/5fyPkOMD/d6XVjwTAoPGUFh0mCollPUTUTa2OZy4dYNAqlPIQdTiNzJTWdd9Htw==", "dev": true, "requires": { "minimist": "1.1.3" @@ -5452,46 +5521,43 @@ } }, "google-auth-library": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", - "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.12.0.tgz", + "integrity": "sha512-79qCXtJ1VweBmmLr4yLq9S4clZB2p5Y+iACvuKk9gu4JitEnPc+bQFmYvtCYehVR44MQzD1J8DVmYW2w677IEw==", "requires": { "gtoken": "1.2.3", "jws": "3.1.4", - "lodash.noop": "3.0.1", + "lodash.isstring": "4.0.1", + "lodash.merge": "4.6.1", "request": "2.83.0" } }, "google-auto-auth": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.5.4.tgz", - "integrity": "sha1-HYbHko1jPnWpwasDSlJ+/M5KQLE=", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.9.3.tgz", + "integrity": "sha512-TbOZZs0WJOolrRmdQLK5qmWdOJQFG1oPnxcIBbAwL7XCWcv3XgZ9gHJ6W4byrdEZT8TahNFgMfkHd73mqxM9dw==", "requires": { "async": "2.6.0", - "google-auth-library": "0.10.0", - "object-assign": "3.0.0", + "gcp-metadata": "0.4.1", + "google-auth-library": "0.12.0", "request": "2.83.0" } }, "google-gax": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.10.8.tgz", - "integrity": "sha1-IKas3I/PAdccHJkLheZldh423fA=", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.14.5.tgz", + "integrity": "sha512-3A6KbrtLDavrqZnnzurnSydRIJnyH+2Sm56fAvXciQ/62aEnSDaR43MCgWhtReCLVjeFjBiCEIdX5zV0LVLVBg==", "requires": { "extend": "3.0.1", - "google-auto-auth": "0.5.4", - "google-proto-files": "0.9.1", - "grpc": "1.8.0", - "lodash": "4.17.4", - "process-nextick-args": "1.0.7", - "readable-stream": "2.3.3" - }, - "dependencies": { - "google-proto-files": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.9.1.tgz", - "integrity": "sha1-x2DHkFm/Yro6xW4dG6e41FYIA74=" - } + "globby": "7.1.1", + "google-auto-auth": "0.9.3", + "google-proto-files": "0.14.2", + "grpc": "1.7.3", + "is-stream-ended": "0.1.3", + "lodash": "4.17.5", + "protobufjs": "6.8.4", + "readable-stream": "2.3.4", + "through2": "2.0.3" } }, "google-p12-pem": { @@ -5503,9 +5569,15 @@ } }, "google-proto-files": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.8.6.tgz", - "integrity": "sha1-p8jdzNIXlpDScLDr/EKZTVbaDuY=" + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.14.2.tgz", + "integrity": "sha512-wwm2TIlfTgAjDbjrxAb3akznO7vBM0PRLS6Xf2QfR3L7b0p+szD3iwOW0wMSFl3B0UbLv27hUVk+clePqCVmXA==", + "requires": { + "globby": "7.1.1", + "power-assert": "1.4.4", + "prettier": "1.10.2", + "protobufjs": "6.8.4" + } }, "graceful-fs": { "version": "4.1.11", @@ -5523,23 +5595,23 @@ "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha1-GSa6kM8+3+KttJJ/WIC8IsZseQ8=", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", "dev": true }, "grpc": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.8.0.tgz", - "integrity": "sha512-AwVQiyMdNv09O4kwec3z52HwkPuo1i61Uk1oENWM9CDeLAUiixQLMpXDIJL31MmZdAuKnAYds/naFEXzprbgHg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.7.3.tgz", + "integrity": "sha512-7zXQJlDXMr/ZaDqdaIchgclViyoWo8GQxZSmFUAxR8GwSr28b6/BTgF221WG+2W693jpp74XJ/+I9DcPXsgt9Q==", "requires": { "arguejs": "0.2.3", - "lodash": "4.17.4", + "lodash": "4.17.5", "nan": "2.8.0", "node-pre-gyp": "0.6.39", "protobufjs": "5.0.2" }, "dependencies": { "abbrev": { - "version": "1.1.1", + "version": "1.0.9", "bundled": true }, "ajv": { @@ -5672,7 +5744,7 @@ } }, "debug": { - "version": "2.6.9", + "version": "2.6.8", "bundled": true, "requires": { "ms": "2.0.0" @@ -5691,7 +5763,7 @@ "bundled": true }, "detect-libc": { - "version": "1.0.3", + "version": "1.0.2", "bundled": true }, "ecc-jsbn": { @@ -5774,7 +5846,7 @@ } }, "glob": { - "version": "7.1.2", + "version": "7.1.1", "bundled": true, "requires": { "fs.realpath": "1.0.0", @@ -5841,7 +5913,7 @@ "bundled": true }, "ini": { - "version": "1.3.5", + "version": "1.3.4", "bundled": true }, "is-fullwidth-code-point": { @@ -5940,7 +6012,7 @@ "version": "0.6.39", "bundled": true, "requires": { - "detect-libc": "1.0.3", + "detect-libc": "1.0.2", "hawk": "3.1.3", "mkdirp": "0.5.1", "nopt": "4.0.1", @@ -5951,14 +6023,16 @@ "semver": "5.4.1", "tar": "2.2.1", "tar-pack": "3.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.4" + }, + "dependencies": { + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1.0.9", + "osenv": "0.1.4" + } + } } }, "npmlog": { @@ -6018,6 +6092,17 @@ "version": "1.0.7", "bundled": true }, + "protobufjs": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", + "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", + "requires": { + "ascli": "1.0.1", + "bytebuffer": "5.0.1", + "glob": "7.1.1", + "yargs": "3.32.0" + } + }, "punycode": { "version": "1.4.1", "bundled": true @@ -6031,7 +6116,7 @@ "bundled": true, "requires": { "deep-extend": "0.4.2", - "ini": "1.3.5", + "ini": "1.3.4", "minimist": "1.2.0", "strip-json-comments": "2.0.1" }, @@ -6087,7 +6172,7 @@ "version": "2.6.2", "bundled": true, "requires": { - "glob": "7.1.2" + "glob": "7.1.1" } }, "safe-buffer": { @@ -6177,7 +6262,7 @@ "version": "3.4.1", "bundled": true, "requires": { - "debug": "2.6.9", + "debug": "2.6.8", "fstream": "1.0.11", "fstream-ignore": "1.0.5", "once": "1.4.0", @@ -6249,7 +6334,7 @@ "gtoken": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", - "integrity": "sha1-VQlXG4r9QyLhJM9mz2gRUoTEdtg=", + "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", "requires": { "google-p12-pem": "0.1.2", "jws": "3.1.4", @@ -6674,14 +6759,6 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "requires": { - "inherits": "2.0.3" - } - }, "hash-stream-validation": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz", @@ -6703,7 +6780,7 @@ "hawk": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha1-r02RTrBl+bXOTZ0RwcshJu7MMDg=", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { "boom": "4.3.1", "cryptiles": "3.1.2", @@ -6724,7 +6801,7 @@ "hoek": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha1-ctnQdU9/4lyi0BrY+PmpRJqJUm0=" + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" }, "home-or-tmp": { "version": "2.0.0", @@ -6739,7 +6816,7 @@ "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", "dev": true }, "html-tags": { @@ -6761,9 +6838,9 @@ }, "dependencies": { "domutils": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", - "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "requires": { "dom-serializer": "0.1.0", "domelementtype": "1.3.0" @@ -6776,10 +6853,10 @@ "requires": { "domelementtype": "1.3.0", "domhandler": "2.3.0", - "domutils": "1.6.2", + "domutils": "1.7.0", "entities": "1.1.1", "inherits": "2.0.3", - "readable-stream": "2.3.3" + "readable-stream": "2.3.4" } } } @@ -6833,10 +6910,19 @@ } } }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "requires": { + "inherits": "2.0.3", + "statuses": "1.3.1" + } + }, "http-parser-js": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", - "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", "dev": true }, "http-signature": { @@ -6862,7 +6948,7 @@ "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=" + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "ieee754": { "version": "1.1.8", @@ -6872,13 +6958,12 @@ "ignore": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=", - "dev": true + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==" }, "image-size": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.2.tgz", - "integrity": "sha1-juMW1CmLAouWUJG2c9XxU3re5bQ=" + "integrity": "sha512-pH3vDzpczdsKHdZ9xxR3O46unSjisgVx0IImay7Zz2EdhRVbCkj+nthx9OuuWEhakx9FAO+fNVGrF0rZ2oMOvw==" }, "imap": { "version": "0.8.19", @@ -6937,6 +7022,11 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6962,62 +7052,21 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=" - }, - "inline-process-browser": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/inline-process-browser/-/inline-process-browser-1.0.0.tgz", - "integrity": "sha1-RqYbFT3TybFiSxoAYm7bT39BTyI=", - "requires": { - "falafel": "1.2.0", - "through2": "0.6.5" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } - } + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { "ansi-escapes": "3.0.0", - "chalk": "2.3.0", + "chalk": "2.3.1", "cli-cursor": "2.1.0", "cli-width": "2.2.0", "external-editor": "2.1.0", "figures": "2.0.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "mute-stream": "0.0.7", "run-async": "2.3.0", "rx-lite": "4.0.8", @@ -7036,21 +7085,21 @@ "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "supports-color": "5.2.0" } }, "figures": { @@ -7063,9 +7112,9 @@ } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "is-fullwidth-code-point": { @@ -7077,7 +7126,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -7094,12 +7143,12 @@ } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -7123,13 +7172,13 @@ "resolved": "https://registry.npmjs.org/ip-range-check/-/ip-range-check-0.0.2.tgz", "integrity": "sha1-YFyFloeqTxhGORjUYZDYs2maKTw=", "requires": { - "ipaddr.js": "1.5.4" + "ipaddr.js": "1.6.0" } }, "ipaddr.js": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.4.tgz", - "integrity": "sha1-liJj2dJhMpVvxcYwtjijDTzf/BQ=" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" }, "is": { "version": "3.2.1", @@ -7159,10 +7208,9 @@ } }, "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.1.tgz", + "integrity": "sha1-wt/DhquqDD4zxI2z/ocFnmkGXv0=" }, "is-binary-path": { "version": "1.0.1", @@ -7176,7 +7224,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-builtin-module": { @@ -7265,13 +7313,19 @@ "integrity": "sha1-bghLvJIGH7sJcexYts5tQE4k2mk=", "dev": true }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==" + }, "is-my-json-valid": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz", - "integrity": "sha1-PamJFKcKIvCoVj7xURokbG/FVHE=", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", "requires": { "generate-function": "2.0.0", "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", "jsonpointer": "4.0.1", "xtend": "4.0.1" } @@ -7356,9 +7410,9 @@ "dev": true }, "is-resolvable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz", - "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, "is-stream": { @@ -7424,7 +7478,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "2.1.0", @@ -7441,20 +7496,20 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "version": "2.99.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", + "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=", "dev": true, "requires": { "exit": "0.1.2", "glob": "7.1.2", - "jasmine-core": "2.8.0" + "jasmine-core": "2.99.1" } }, "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", "dev": true }, "jmespath": { @@ -7463,14 +7518,14 @@ "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" }, "jquery": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", - "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" }, "js-base64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.0.tgz", - "integrity": "sha512-Wehd+7Pf9tFvGb+ydPm9TjYjV8X1YHOVyG8QyELZxEMqOhemVwGRmoG8iQ/soqI3n8v4xn59zaLxiCJiaaRzKA==" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==" }, "js-tokens": { "version": "3.0.2", @@ -7481,19 +7536,11 @@ "js-yaml": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { "argparse": "1.0.9", "esprima": "4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", - "dev": true - } } }, "jsbn": { @@ -7505,7 +7552,7 @@ "jschardet": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.6.0.tgz", - "integrity": "sha1-x9GnHtz/KDnbL57DD8XV69PBpng=" + "integrity": "sha512-xYuhvQ7I9PDJIGBWev9xm0+SMSed3ZDBAmvVjbFR1ZRLAF+vlXcQu6cRI9uAlj81rzikElRVteehwV7DuX2ZmQ==" }, "jsesc": { "version": "1.3.0", @@ -7516,7 +7563,7 @@ "json-parse-better-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha1-UBg80bLSUnXeBp6ecbRnrJ6rlzo=", + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", "dev": true }, "json-schema": { @@ -7581,22 +7628,6 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" }, - "jsonwebtoken": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-5.4.1.tgz", - "integrity": "sha1-IFXGORlf/lYxT6alHfAkaBhqlpU=", - "requires": { - "jws": "3.1.4", - "ms": "0.7.3" - }, - "dependencies": { - "ms": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", - "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=" - } - } - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -7608,26 +7639,6 @@ "verror": "1.10.0" } }, - "jstransform": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-3.0.0.tgz", - "integrity": "sha1-olkats7o2XvzvoMNv6IxO4fNZAs=", - "requires": { - "base62": "0.1.1", - "esprima-fb": "3001.1.0-dev-harmony-fb", - "source-map": "0.1.31" - }, - "dependencies": { - "source-map": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz", - "integrity": "sha1-n3BNDWnZ4TioG63267T94z0VHGE=", - "requires": { - "amdefine": "1.0.1" - } - } - } - }, "jwa": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", @@ -7649,11 +7660,6 @@ "safe-buffer": "5.1.1" } }, - "jwt-simple": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/jwt-simple/-/jwt-simple-0.1.0.tgz", - "integrity": "sha1-VGs0qrAuPNScQ6QnlJizTZQAQeM=" - }, "kew": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", @@ -7681,7 +7687,7 @@ "known-css-properties": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.5.0.tgz", - "integrity": "sha1-b/ZpQ+1KW1VlfuCVd5qR9FNvgIQ=", + "integrity": "sha512-LOS0CoS8zcZnB1EjLw4LLqDXw8nvt3AGH5dXLQP3D9O1nLLA+9GC5GnPl5mmF+JiQAtSX4VyZC7KvEtcA4kUtA==", "dev": true }, "lazy-cache": { @@ -7697,7 +7703,7 @@ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "dev": true, "requires": { - "readable-stream": "2.3.3" + "readable-stream": "2.3.4" } }, "lcid": { @@ -7801,7 +7807,7 @@ "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000791", + "caniuse-db": "1.0.30000808", "normalize-range": "0.1.2", "num2fraction": "1.2.2", "postcss": "5.2.18", @@ -7848,14 +7854,11 @@ "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=" }, "lie": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.0.2.tgz", - "integrity": "sha1-/9oh17uibzd8rYZdNkmy/Izjn+o=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", "requires": { - "es3ify": "0.1.4", - "immediate": "3.0.6", - "inline-process-browser": "1.0.0", - "unreachable-branch-transform": "0.3.0" + "immediate": "3.0.6" } }, "linkify-it": { @@ -7863,7 +7866,7 @@ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", "requires": { - "uc.micro": "1.0.3" + "uc.micro": "1.0.5" } }, "load-json-file": { @@ -7888,11 +7891,11 @@ } }, "localforage": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.5.5.tgz", - "integrity": "sha1-VfwcOoikf2f1+sbxIxsl/xNVZCM=", + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.5.6.tgz", + "integrity": "sha1-0DTRXlNy7pfGQXPpqa65aBX13QY=", "requires": { - "lie": "3.0.2" + "lie": "3.1.1" } }, "locate-path": { @@ -7914,9 +7917,9 @@ } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -7924,10 +7927,15 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, - "lodash.noop": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-3.0.1.tgz", - "integrity": "sha1-OBiPTWUKOkdCWEObluxFsyYXEzw=" + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" }, "lodash.template": { "version": "4.4.0", @@ -7954,12 +7962,12 @@ "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=" }, "log-symbols": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.1.0.tgz", - "integrity": "sha512-zLeLrzMA1A2vRF1e/0Mo+LNINzi6jzBylHj5WqvQ/WK/5WCZt8si9SyN4p9llr/HRYvVR1AoXHRHl4WTHyQAzQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "chalk": "2.3.0" + "chalk": "2.3.1" }, "dependencies": { "ansi-styles": { @@ -7972,29 +7980,29 @@ } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -8006,9 +8014,9 @@ "dev": true }, "lokijs": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.4.1.tgz", - "integrity": "sha1-6he+ktLqfKuhyBbWwgBkJOjbC/4=" + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.5.3.tgz", + "integrity": "sha1-aVJyL/owSaVaXhwQ7koJR6Pl4Zs=" }, "long": { "version": "3.2.0", @@ -8024,7 +8032,7 @@ "longest-streak": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", - "integrity": "sha1-JCG2upOaRDu5/+v1llhaULTDji4=", + "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", "dev": true }, "loose-envify": { @@ -8053,14 +8061,14 @@ "dev": true }, "lru-cache": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.5.tgz", - "integrity": "sha1-5W1jVBSO3o13B7WNFDIg/QjfD9U=" + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" }, "mailparser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-2.1.0.tgz", - "integrity": "sha1-zaYmHJE1DId4FzMR5GAqPNNH8K4=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-2.2.0.tgz", + "integrity": "sha512-HVaPa+5xQtG3CQ5SUxbDuJMRnDANC8WllUKXHm46v0tKu3I4YaUlBxg4Lpkvf+qF+kOn0lGcnQgvM6xY5mYALw==", "requires": { "addressparser": "1.0.1", "he": "1.1.1", @@ -8068,24 +8076,31 @@ "iconv-lite": "0.4.19", "libmime": "3.1.0", "linkify-it": "2.0.3", - "mailsplit": "4.0.2", - "tlds": "1.197.0" + "mailsplit": "4.1.2", + "tlds": "1.199.0" } }, "mailsplit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-4.0.2.tgz", - "integrity": "sha1-Kdy91XBbKe7LDr9PkFamiGosbf4=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/mailsplit/-/mailsplit-4.1.2.tgz", + "integrity": "sha512-5UWjUfhKlC4OR5PqZKcl4h7vnz2EP4M3Zg2SBbrztvAYX5lM/rA7tvaXkZ6zRcvK32Uul0GkRA037icDbiJIOw==", "requires": { - "libbase64": "0.1.0", + "libbase64": "1.0.2", "libmime": "3.1.0", "libqp": "1.1.0" + }, + "dependencies": { + "libbase64": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-1.0.2.tgz", + "integrity": "sha512-CyPjvTFbsGps2Sdvy9GVjSRPvUGpji8Hxb+iunp466guzxcd3QaK0k8Hur1sPkgD9FonW8V1z2F1y066YiliEg==" + } } }, "make-dir": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", - "integrity": "sha1-GbQ2n+SMEW9Twq+VrRAsDjnoXVE=", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", "requires": { "pify": "3.0.0" } @@ -8109,9 +8124,9 @@ "dev": true }, "marked": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.12.tgz", - "integrity": "sha1-fPJf8iUmMvP+JAa94ljpTu6SdRk=" + "version": "0.3.16", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.16.tgz", + "integrity": "sha512-diLiAxHidES67uJ1P5unXBUB4CyOFwodKrctuK0U4Ogw865N9Aw4dLmY0BK0tGKOy3xvkdMGgUXPD6W9z1Ne0Q==" }, "mathml-tag-names": { "version": "2.0.1", @@ -8157,12 +8172,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true } } }, @@ -8175,7 +8184,7 @@ "meteor-promise": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/meteor-promise/-/meteor-promise-0.8.6.tgz", - "integrity": "sha1-aZehWiIfuFnUcgQ/y9yuAZBr8Z0=", + "integrity": "sha512-HP6tOr67z/9XU2Dr0F2SSr8WRTuE23AG9Dj578DCJPEYHs67OLKBviU8A8rwvbwMD7Lu2+Of+yAMz2Wd8r4yxg==", "dev": true }, "methmeth": { @@ -8183,11 +8192,28 @@ "resolved": "https://registry.npmjs.org/methmeth/-/methmeth-1.1.0.tgz", "integrity": "sha1-6AomYY5S9cQiKGG7dIUQvRDikIk=" }, + "method-override": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz", + "integrity": "sha1-49r41d7hDdLc59SuiNYrvud0drQ=", + "requires": { + "debug": "2.6.9", + "methods": "1.1.2", + "parseurl": "1.3.2", + "vary": "1.1.2" + }, + "dependencies": { + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + } + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { "version": "2.3.11", @@ -8213,12 +8239,12 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.32.0.tgz", - "integrity": "sha1-SFs4SLAaPNpflotIgsB3HljglBQ=" + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" }, "mime-type": { "version": "3.0.5", @@ -8247,17 +8273,22 @@ } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -8268,13 +8299,36 @@ "minimist-options": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha1-+6TIGRM54T7PTWG+sD8HAQPz2VQ=", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dev": true, "requires": { "arrify": "1.0.1", "is-plain-obj": "1.1.0" } }, + "minipass": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.1.tgz", + "integrity": "sha512-u1aUllxPJUI07cOqzR7reGmQxmCqlH88uIIsf6XZFEWgw7gXKpJdR+5R9Y3KEDmWYkdIz9wXZs3C0jOPxejk/Q==", + "requires": { + "yallist": "3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + } + } + }, + "minizlib": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", + "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "requires": { + "minipass": "2.2.1" + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -8284,9 +8338,9 @@ } }, "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha1-fYbPvPNcuCnidUwy4XNV7AUzh5Q=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.1.tgz", + "integrity": "sha512-SpwyojlnE/WRBNGtvJSNfllfm5PqEDFxcWluSIgLeSBJtXG4DmoX2NNAeEA7rP5kK+79VgtVq8nG6HskaL1ykg==", "dev": true, "requires": { "browser-stdout": "1.3.0", @@ -8304,13 +8358,13 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", "dev": true }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -8325,7 +8379,7 @@ "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha1-iD992rwWUUKyphQn8zUt7RldGj4=", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, "requires": { "has-flag": "2.0.0" @@ -8345,7 +8399,7 @@ "modelo": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/modelo/-/modelo-4.2.3.tgz", - "integrity": "sha1-snhYik24f8HlEHrjonfAh2842JQ=" + "integrity": "sha512-9DITV2YEMcw7XojdfvGl3gDD8J9QjZTJ7ZOUuSAkP+F3T6rDbzMJuPktxptsdHYEvZcmXrCD3LMOhdSAEq6zKA==" }, "modify-values": { "version": "1.0.0", @@ -8362,7 +8416,7 @@ "moment": { "version": "2.20.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", - "integrity": "sha1-1usaRsvMFKKy+UNBEsH/iQfzE/0=" + "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" }, "moment-timezone": { "version": "0.5.14", @@ -8372,11 +8426,70 @@ "moment": "2.20.1" } }, + "morgan": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", + "integrity": "sha1-X9gYOYxoGcuiinzWZk8pL+HAu/I=", + "requires": { + "basic-auth": "1.0.4", + "debug": "2.2.0", + "depd": "1.0.1", + "on-finished": "2.3.0", + "on-headers": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multiparty": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-3.3.2.tgz", + "integrity": "sha1-Nd5oBNwZZD5SSfPT473GyM4wHT8=", + "requires": { + "readable-stream": "1.1.14", + "stream-counter": "0.2.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -8426,7 +8539,7 @@ "natives": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz", - "integrity": "sha1-ARrM4ffL2H97prMJPWzZOSvhxXQ=", + "integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA==", "optional": true }, "natural-compare": { @@ -8441,10 +8554,15 @@ "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", "optional": true }, + "negotiator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", + "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=" + }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { "lower-case": "1.1.4" @@ -8455,6 +8573,11 @@ "resolved": "https://registry.npmjs.org/node-dogstatsd/-/node-dogstatsd-0.0.7.tgz", "integrity": "sha1-VE0nTJGkE0JqLzxA/3uOiBPP2TA=" }, + "node-fingerprint": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/node-fingerprint/-/node-fingerprint-0.0.2.tgz", + "integrity": "sha1-Mcur63GmeufdWn3AQuUcPHWGhQE=" + }, "node-forge": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", @@ -8468,14 +8591,19 @@ "mkdirp": "0.5.1", "nopt": "4.0.1", "npmlog": "4.1.2", - "rc": "1.2.3", + "rc": "1.2.5", "request": "2.83.0", "rimraf": "2.6.2", - "semver": "5.4.1", + "semver": "5.5.0", "tar": "2.2.1", "tar-pack": "3.4.1" } }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + }, "nopt": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", @@ -8488,12 +8616,12 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", - "semver": "5.4.1", + "semver": "5.5.0", "validate-npm-package-license": "3.0.1" } }, @@ -8558,9 +8686,9 @@ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" }, "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-keys": { "version": "1.0.11", @@ -8575,7 +8703,7 @@ "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "1.1.2", @@ -8594,6 +8722,19 @@ "is-extendable": "0.1.1" } }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8608,7 +8749,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "1.2.0" } }, "optimist": { @@ -8682,7 +8823,7 @@ "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "dev": true, "requires": { "p-try": "1.0.0" @@ -8700,7 +8841,7 @@ "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, "p-try": { @@ -8750,6 +8891,11 @@ "error-ex": "1.3.1" } }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, "path-exists": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", @@ -8774,22 +8920,11 @@ "dev": true }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "pify": "3.0.0" } }, "path.js": { @@ -8809,9 +8944,9 @@ "dev": true }, "pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.1.0.tgz", + "integrity": "sha1-68ikqGGf8LioGsFRPDQ0/0af23Q=" }, "pend": { "version": "1.2.0", @@ -8888,7 +9023,7 @@ "dev": true, "requires": { "asynckit": "0.4.0", - "combined-stream": "1.0.5", + "combined-stream": "1.0.6", "mime-types": "2.1.17" } }, @@ -8958,7 +9093,7 @@ "aws-sign2": "0.6.0", "aws4": "1.6.0", "caseless": "0.12.0", - "combined-stream": "1.0.5", + "combined-stream": "1.0.6", "extend": "3.0.1", "forever-agent": "0.6.1", "form-data": "2.1.4", @@ -8976,7 +9111,7 @@ "stringstream": "0.0.5", "tough-cookie": "2.3.3", "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "uuid": "3.2.1" } }, "sntp": { @@ -8987,15 +9122,6 @@ "requires": { "hoek": "2.16.3" } - }, - "which": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true, - "requires": { - "isexe": "2.0.0" - } } } }, @@ -9025,7 +9151,7 @@ "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", "dev": true }, "poplib": { @@ -9039,10 +9165,10 @@ "postcss": { "version": "5.2.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { "chalk": "1.1.3", - "js-base64": "2.4.0", + "js-base64": "2.4.3", "source-map": "0.5.7", "supports-color": "3.2.3" }, @@ -9051,88 +9177,69 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "1.0.0" - } } } }, "postcss-custom-properties": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-6.2.0.tgz", - "integrity": "sha1-XZKafwbpuE4PETNBlMC6mjCs++k=", + "integrity": "sha512-eNR2h9T9ciKMoQEORrPjH33XeN/nuvVuxArOKmHtsFbGbNss631tgTrKou3/pmjAZbA4QQkhLIkPQkIk3WW+8w==", "dev": true, "requires": { "balanced-match": "1.0.0", - "postcss": "6.0.16" + "postcss": "6.0.17" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -9140,7 +9247,7 @@ "postcss-html": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.12.0.tgz", - "integrity": "sha1-ObattABd/FRk33mZwPgclbztflA=", + "integrity": "sha512-KxKUpj7AY7nlCbLcTOYxdfJnGE7QFAfU2n95ADj1Q90RM/pOLdz8k3n4avOyRFs7MDQHcRzJQWM1dehCwJxisQ==", "dev": true, "requires": { "htmlparser2": "3.9.2", @@ -9149,9 +9256,9 @@ }, "dependencies": { "domutils": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", - "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { "dom-serializer": "0.1.0", @@ -9166,21 +9273,21 @@ "requires": { "domelementtype": "1.3.0", "domhandler": "2.3.0", - "domutils": "1.6.2", + "domutils": "1.7.0", "entities": "1.1.1", "inherits": "2.0.3", - "readable-stream": "2.3.3" + "readable-stream": "2.3.4" } } } }, "postcss-import": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.0.0.tgz", - "integrity": "sha1-qWLi34LTvFptpqOGhBdHIE9B71s=", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", "dev": true, "requires": { - "postcss": "6.0.16", + "postcss": "6.0.17", "postcss-value-parser": "3.3.0", "read-cache": "1.0.0", "resolve": "1.5.0" @@ -9189,64 +9296,53 @@ "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -9254,7 +9350,7 @@ "postcss-less": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.3.tgz", - "integrity": "sha1-aTBSUnG/441Xk9M6wJwaVGuHu1E=", + "integrity": "sha512-WS0wsQxRm+kmN8wEYAGZ3t4lnoNfoyx9EJZrhiPR1K0lMHR0UNWnz52Ya5QRXChHtY75Ef+kDc05FpnBujebgw==", "dev": true, "requires": { "postcss": "5.2.18" @@ -9266,70 +9362,59 @@ "integrity": "sha1-Z1JWA3pD70C8Twdgv9BtTcadSNI=", "dev": true, "requires": { - "postcss": "6.0.16" + "postcss": "6.0.17" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -9343,74 +9428,63 @@ "postcss-nested": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-3.0.0.tgz", - "integrity": "sha1-zeQL0HoHhWXz33Li3CZlhxxySFI=", + "integrity": "sha512-1xxmLHSfubuUi6xZZ0zLsNoiKfk3BWQj6fkNMaBJC529wKKLcdeCxXt6KJmDLva+trNyQNwEaE/ZWMA7cve1fA==", "dev": true, "requires": { - "postcss": "6.0.16", + "postcss": "6.0.17", "postcss-selector-parser": "3.1.1" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -9418,76 +9492,65 @@ "postcss-reporter": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", - "integrity": "sha1-oUF3/RNCgp0pFlPyeG79ZxEDMsM=", + "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", "dev": true, "requires": { - "chalk": "2.3.0", - "lodash": "4.17.4", - "log-symbols": "2.1.0", - "postcss": "6.0.16" + "chalk": "2.3.1", + "lodash": "4.17.5", + "log-symbols": "2.2.0", + "postcss": "6.0.17" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" - }, - "dependencies": { - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -9504,70 +9567,59 @@ "integrity": "sha1-t1Pv9sfArqXoN1++TN6L+QY/8UI=", "dev": true, "requires": { - "postcss": "6.0.16" + "postcss": "6.0.17" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -9575,74 +9627,63 @@ "postcss-sass": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.2.0.tgz", - "integrity": "sha1-5VUWRB6VJrpLOApzDToC6eqnjHo=", + "integrity": "sha512-cUmYzkP747fPCQE6d+CH2l1L4VSyIlAzZsok3HPjb5Gzsq3jE+VjpAdGlPsnQ310WKWI42sw+ar0UNN59/f3hg==", "dev": true, "requires": { "gonzales-pe": "4.2.3", - "postcss": "6.0.16" + "postcss": "6.0.17" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -9650,73 +9691,62 @@ "postcss-scss": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.3.tgz", - "integrity": "sha1-TACrRA/ByZQTTj1OYAwjNBr2zSc=", + "integrity": "sha512-N2ZPDOV5PGEGVwdiB7b1QppxKkmkHodNWkemja7PV+/mHqbUlA6ZcYRreden5Ag5nwBBX8/aRE7lfg1xjdszyg==", "dev": true, "requires": { - "postcss": "6.0.16" + "postcss": "6.0.17" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -9728,13 +9758,13 @@ "dev": true, "requires": { "balanced-match": "0.4.2", - "postcss": "6.0.16" + "postcss": "6.0.17" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" @@ -9747,57 +9777,46 @@ "dev": true }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -9816,74 +9835,63 @@ "postcss-sorting": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-3.1.0.tgz", - "integrity": "sha1-r3yQ7nOtElaaV2ZOrwZzXC4lvsA=", + "integrity": "sha512-YCPTcJwGIInF1LpMD1lIYvMHTGUL4s97o/OraA6eKvoauhhk6vjwOWDDjm6uRKqug/kyDPMKEzmYZ6FtW6RDgw==", "dev": true, "requires": { - "lodash": "4.17.4", - "postcss": "6.0.16" + "lodash": "4.17.5", + "postcss": "6.0.17" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -9893,6 +9901,115 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" }, + "power-assert": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.4.4.tgz", + "integrity": "sha1-kpXqdDcZb1pgH95CDwQmMRhtdRc=", + "requires": { + "define-properties": "1.1.2", + "empower": "1.2.3", + "power-assert-formatter": "1.4.1", + "universal-deep-strict-equal": "1.2.2", + "xtend": "4.0.1" + } + }, + "power-assert-context-formatter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.1.1.tgz", + "integrity": "sha1-7bo1LT7YpgMRTWZyZazOYNaJzN8=", + "requires": { + "core-js": "2.5.3", + "power-assert-context-traversal": "1.1.1" + } + }, + "power-assert-context-reducer-ast": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.1.2.tgz", + "integrity": "sha1-SEqZ4m9Jc/+IMuXFzHVnAuYJQXQ=", + "requires": { + "acorn": "4.0.13", + "acorn-es7-plugin": "1.1.7", + "core-js": "2.5.3", + "espurify": "1.7.0", + "estraverse": "4.2.0" + } + }, + "power-assert-context-traversal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.1.1.tgz", + "integrity": "sha1-iMq8oNE7Y1nwfT0+ivppkmRXftk=", + "requires": { + "core-js": "2.5.3", + "estraverse": "4.2.0" + } + }, + "power-assert-formatter": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/power-assert-formatter/-/power-assert-formatter-1.4.1.tgz", + "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=", + "requires": { + "core-js": "2.5.3", + "power-assert-context-formatter": "1.1.1", + "power-assert-context-reducer-ast": "1.1.2", + "power-assert-renderer-assertion": "1.1.1", + "power-assert-renderer-comparison": "1.1.1", + "power-assert-renderer-diagram": "1.1.2", + "power-assert-renderer-file": "1.1.1" + } + }, + "power-assert-renderer-assertion": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.1.1.tgz", + "integrity": "sha1-y/wOd+AIao+Wrz8djme57n4ozpg=", + "requires": { + "power-assert-renderer-base": "1.1.1", + "power-assert-util-string-width": "1.1.1" + } + }, + "power-assert-renderer-base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz", + "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s=" + }, + "power-assert-renderer-comparison": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.1.1.tgz", + "integrity": "sha1-10Odl9hRVr5OMKAPL7WnJRTOPAg=", + "requires": { + "core-js": "2.5.3", + "diff-match-patch": "1.0.0", + "power-assert-renderer-base": "1.1.1", + "stringifier": "1.3.0", + "type-name": "2.0.2" + } + }, + "power-assert-renderer-diagram": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.1.2.tgz", + "integrity": "sha1-ZV+PcRk1qbbVQbhjJ2VHF8Y3qYY=", + "requires": { + "core-js": "2.5.3", + "power-assert-renderer-base": "1.1.1", + "power-assert-util-string-width": "1.1.1", + "stringifier": "1.3.0" + } + }, + "power-assert-renderer-file": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.1.1.tgz", + "integrity": "sha1-o34rvReMys0E5427eckv40kzxec=", + "requires": { + "power-assert-renderer-base": "1.1.1" + } + }, + "power-assert-util-string-width": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.1.1.tgz", + "integrity": "sha1-vmWet5N/3S5smncmjar2S9W3xZI=", + "requires": { + "eastasianwidth": "0.1.1" + } + }, "precond": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", @@ -9910,15 +10027,21 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "prettier": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.10.2.tgz", + "integrity": "sha512-TcdNoQIWFoHblurqqU6d1ysopjq7UX0oRcT/hJ8qvBAELiYWn+Ugf0AXdnzISEJ7vuhNnQ98N8jR8Sh53x4IZg==" + }, "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=" + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { "version": "1.1.8", @@ -9929,7 +10052,7 @@ "prom-client": { "version": "10.2.2", "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-10.2.2.tgz", - "integrity": "sha1-drOXIHEOwQeW185gE1tdXa+/9hU=", + "integrity": "sha512-d3qCBK41qZx00/WVzWOX4tau9FinCztqaECZiGuMI5vGYD//5VSdKMOZPRQKjVh5RkI4Ex98DI0YPsoFnEo1QQ==", "requires": { "tdigest": "0.1.1" } @@ -9937,30 +10060,29 @@ "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { "asap": "2.0.6" } }, - "prop-assign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prop-assign/-/prop-assign-1.0.0.tgz", - "integrity": "sha1-l2eh+/1wk5CGR6boRtMbT+qnBFk=" - }, - "propprop": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/propprop/-/propprop-0.3.1.tgz", - "integrity": "sha1-oEmjVouJZEAGfRXY7J8zc15XAXg=" - }, "protobufjs": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.2.tgz", - "integrity": "sha1-WXSNfc8D0tsiwT2p/rAk4Wq4DJE=", + "version": "6.8.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.4.tgz", + "integrity": "sha512-d+WZqUDXKM+oZhr8yprAtQW07q08p9/V35AJ2J1fds+r903S/aH9P8uO1gmTwozOKugt2XCjdrre3OxuPRGkGg==", "requires": { - "ascli": "1.0.1", - "bytebuffer": "5.0.1", - "glob": "7.1.2", - "yargs": "3.32.0" + "@protobufjs/aspromise": "1.1.2", + "@protobufjs/base64": "1.1.2", + "@protobufjs/codegen": "2.0.4", + "@protobufjs/eventemitter": "1.1.0", + "@protobufjs/fetch": "1.1.0", + "@protobufjs/float": "1.0.2", + "@protobufjs/inquire": "1.1.0", + "@protobufjs/path": "1.1.2", + "@protobufjs/pool": "1.1.0", + "@protobufjs/utf8": "1.1.0", + "@types/long": "3.0.32", + "@types/node": "8.9.4", + "long": "3.2.0" } }, "proxyquire": { @@ -9988,28 +10110,23 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "optional": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, "pump": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.0.tgz", - "integrity": "sha512-6MYypjOvtiXhBSTOD0Zs5eNjCGfnqi5mPsCsW+dgKTxrZzQMZQNpBo3XRkLx7id753f3EeyHLBqzqqUymIolgw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { "end-of-stream": "1.4.1", "once": "1.4.0" } }, "pumpify": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.6.tgz", - "integrity": "sha512-BurGAcvezsINL5US9T9wGHHcLNrG6MCp//ECtxron3vcR+Rfx5Anqq7HbZXNJvFQli8FGVsWCAvywEJFV5Hx/Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", "requires": { "duplexify": "3.5.3", "inherits": "2.0.3", - "pump": "2.0.0" + "pump": "2.0.1" } }, "punycode": { @@ -10018,14 +10135,15 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "q": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", - "integrity": "sha1-TeLmyzspCIyeTLwDv51C+5bOL3U=" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true }, "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=" + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" }, "querystring": { "version": "0.2.0", @@ -10038,10 +10156,15 @@ "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { "is-number": "3.0.0", @@ -10080,14 +10203,36 @@ } }, "range-parser": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz", - "integrity": "sha1-wEJ//vUcEKy6B4KkbJYC50T/Ygs=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" + }, + "raw-body": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" + } + } }, "rc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.3.tgz", - "integrity": "sha1-UVdakA+N1oOBxxC0cSwhVMPiA1s=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz", + "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=", "requires": { "deep-extend": "0.4.2", "ini": "1.3.5", @@ -10128,6 +10273,25 @@ "load-json-file": "1.1.0", "normalize-package-data": "2.4.0", "path-type": "1.1.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, "read-pkg-up": { @@ -10141,14 +10305,14 @@ } }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", + "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "1.0.7", + "process-nextick-args": "2.0.0", "safe-buffer": "5.1.1", "string_decoder": "1.0.3", "util-deprecate": "1.0.2" @@ -10162,33 +10326,10 @@ "requires": { "graceful-fs": "4.1.11", "minimatch": "3.0.4", - "readable-stream": "2.3.3", + "readable-stream": "2.3.4", "set-immediate-shim": "1.0.1" } }, - "recast": { - "version": "0.10.43", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.43.tgz", - "integrity": "sha1-uV1Q9tYHYaX2JS4V2AZ4FoSRzn8=", - "requires": { - "ast-types": "0.8.15", - "esprima-fb": "15001.1001.0-dev-harmony-fb", - "private": "0.1.8", - "source-map": "0.5.7" - }, - "dependencies": { - "esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -10200,28 +10341,40 @@ } }, "redis": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/redis/-/redis-2.2.5.tgz", - "integrity": "sha1-+B1XALMmhmCfKcCvsp1TnthTrXg=", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", + "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", "requires": { - "double-ended-queue": "2.1.0-0" + "double-ended-queue": "2.1.0-0", + "redis-commands": "1.3.1", + "redis-parser": "2.6.0" } }, + "redis-commands": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.1.tgz", + "integrity": "sha1-gdgm9F+pyLIBH0zXoP5ZfSQdRCs=" + }, + "redis-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" + }, "regenerate": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha1-DDNtOYBVPXVcObWGrjsgqknIK38=", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", "dev": true }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=" + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, "regenerator-transform": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { "babel-runtime": "6.26.0", @@ -10232,7 +10385,7 @@ "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { "is-equal-shallow": "0.1.3" @@ -10275,7 +10428,7 @@ "remark": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/remark/-/remark-8.0.0.tgz", - "integrity": "sha1-KHtt8v4RkOJjwdFeSG0/qDVZTW0=", + "integrity": "sha512-K0PTsaZvJlXTl9DN6qYlvjTkqSZBFELhROZMrblm2rB+085flN84nz4g/BscKRMqDvhzlK1oQ/xnWQumdeNZYw==", "dev": true, "requires": { "remark-parse": "4.0.0", @@ -10286,7 +10439,7 @@ "remark-parse": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-4.0.0.tgz", - "integrity": "sha1-mfHwSa+sgDgjZuLg0L1VQp3UXYs=", + "integrity": "sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw==", "dev": true, "requires": { "collapse-white-space": "1.0.3", @@ -10309,7 +10462,7 @@ "remark-stringify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-4.0.0.tgz", - "integrity": "sha1-RDGITAQY8RLaRJkbTjVs/jf6zYc=", + "integrity": "sha512-xLuyKTnuQer3ke9hkU38SUYLiTmS078QOnoFavztmbt/pAJtNSkNtFgR0U//uCcmG0qnyxao+PDuatQav46F1w==", "dev": true, "requires": { "ccount": "1.0.2", @@ -10364,15 +10517,15 @@ "request": { "version": "2.83.0", "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha1-ygtl2gLtYpNYh4COb1EDgQNOM1Y=", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", "requires": { "aws-sign2": "0.7.0", "aws4": "1.6.0", "caseless": "0.12.0", - "combined-stream": "1.0.5", + "combined-stream": "1.0.6", "extend": "3.0.1", "forever-agent": "0.6.1", - "form-data": "2.3.1", + "form-data": "2.3.2", "har-validator": "5.0.3", "hawk": "6.0.2", "http-signature": "1.2.0", @@ -10383,227 +10536,108 @@ "oauth-sign": "0.8.2", "performance-now": "2.1.0", "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true, - "requires": { - "throttleit": "1.0.0" - } - }, - "requestretry": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.5.0.tgz", - "integrity": "sha1-7RV7ulNSbt6z7DKo5wSkmYvs5ic=", - "dev": true, - "requires": { - "fg-lodash": "0.0.2", - "request": "2.83.0" - } - }, - "require-from-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.1.tgz", - "integrity": "sha1-xUUjPp19pmFunVmt+zn8n1iGdv8=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha1-HwmsznlsmnYlefMbLBzEw83fnzY=", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "retry": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.8.0.tgz", - "integrity": "sha1-I2dijcDtskex6rZJ3FOshiisLV8=" - }, - "retry-request": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-1.3.2.tgz", - "integrity": "sha1-Wa0k5x+K4/MS1fe0vPRnpeWle9Y=", - "requires": { - "request": "2.76.0", - "through2": "2.0.3" - }, - "dependencies": { - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.16.3" - } - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.10.1" - } - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "requires": { - "chalk": "1.1.3", - "commander": "2.13.0", - "is-my-json-valid": "2.17.1", - "pinkie-promise": "2.0.1" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" - }, - "request": { - "version": "2.76.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.76.0.tgz", - "integrity": "sha1-vkRQWv73A2CgQ2lVEGvjlF2VVg4=", - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "node-uuid": "1.4.8", - "oauth-sign": "0.8.2", - "qs": "6.3.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.4.3" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.16.3" - } - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true, + "requires": { + "throttleit": "1.0.0" + } + }, + "requestretry": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.5.0.tgz", + "integrity": "sha1-7RV7ulNSbt6z7DKo5wSkmYvs5ic=", + "dev": true, + "requires": { + "fg-lodash": "0.0.2", + "request": "2.83.0" + } + }, + "require-from-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.1.tgz", + "integrity": "sha1-xUUjPp19pmFunVmt+zn8n1iGdv8=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "response-time": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/response-time/-/response-time-2.3.2.tgz", + "integrity": "sha1-/6cbq5UtYvfB1Jt0NDVfvGjf/Fo=", + "requires": { + "depd": "1.1.2", + "on-headers": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" } } }, - "rgb-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgb-hex/-/rgb-hex-1.0.0.tgz", - "integrity": "sha1-v6+M2c2RZLWibXHrTxWgllMks8E=" + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "retry": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.8.0.tgz", + "integrity": "sha1-I2dijcDtskex6rZJ3FOshiisLV8=" + }, + "retry-request": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.1.tgz", + "integrity": "sha512-PjAmtWIxjNj4Co/6FRtBl8afRP3CxrrIAnUzb1dzydfROd+6xt7xAebFeskgQgkfFf8NmzrXIoaB3HxmswXyxw==", + "requires": { + "request": "2.83.0", + "through2": "2.0.3" + } }, "rgb2hex": { "version": "0.1.0", @@ -10624,19 +10658,15 @@ "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { "glob": "7.1.2" } }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } + "rndm": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", + "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" }, "run-async": { "version": "2.3.0", @@ -10665,7 +10695,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "safe-json-stringify": { "version": "1.0.4", @@ -10704,17 +10734,17 @@ "dev": true, "requires": { "async": "2.6.0", - "commander": "2.13.0", + "commander": "2.14.1", "cross-spawn": "5.1.0", "debug": "3.1.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "minimist": "1.2.0", "mkdirp": "0.5.1", "progress": "2.0.0", "request": "2.79.0", "tar-stream": "1.5.2", - "urijs": "1.19.0", - "which": "1.3.0", + "urijs": "1.19.1", + "which": "1.2.14", "yauzl": "2.9.1" }, "dependencies": { @@ -10739,29 +10769,12 @@ "hoek": "2.16.3" } }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, "caseless": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", "dev": true }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", @@ -10774,7 +10787,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -10787,7 +10800,7 @@ "dev": true, "requires": { "asynckit": "0.4.0", - "combined-stream": "1.0.5", + "combined-stream": "1.0.6", "mime-types": "2.1.17" } }, @@ -10798,8 +10811,8 @@ "dev": true, "requires": { "chalk": "1.1.3", - "commander": "2.13.0", - "is-my-json-valid": "2.17.1", + "commander": "2.14.1", + "is-my-json-valid": "2.17.2", "pinkie-promise": "2.0.1" } }, @@ -10832,16 +10845,6 @@ "sshpk": "1.13.1" } }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -10869,7 +10872,7 @@ "aws-sign2": "0.6.0", "aws4": "1.6.0", "caseless": "0.11.0", - "combined-stream": "1.0.5", + "combined-stream": "1.0.6", "extend": "3.0.1", "forever-agent": "0.6.1", "form-data": "2.1.4", @@ -10885,7 +10888,7 @@ "stringstream": "0.0.5", "tough-cookie": "2.3.3", "tunnel-agent": "0.4.3", - "uuid": "3.1.0" + "uuid": "3.2.1" } }, "sntp": { @@ -10905,7 +10908,7 @@ "requires": { "bl": "1.2.1", "end-of-stream": "1.4.1", - "readable-stream": "2.3.3", + "readable-stream": "2.3.4", "xtend": "4.0.1" } }, @@ -10928,28 +10931,116 @@ } }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, "send": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.1.0.tgz", - "integrity": "sha1-z7COvTzsm3/Bo32f+eh1qXHPRkA=", - "requires": { - "debug": "2.6.9", - "fresh": "0.1.0", - "mime": "1.2.6", - "range-parser": "0.0.4" + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz", + "integrity": "sha1-dl52B8gFVFK7pvCwUllTUJhgNt4=", + "requires": { + "debug": "2.2.0", + "depd": "1.1.2", + "destroy": "1.0.4", + "escape-html": "1.0.3", + "etag": "1.7.0", + "fresh": "0.3.0", + "http-errors": "1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "2.3.0", + "range-parser": "1.0.3", + "statuses": "1.2.1" }, "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, "mime": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.6.tgz", - "integrity": "sha1-sfhsdowCX6h7SAdfFwnyiuryA2U=" + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + }, + "serve-favicon": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.2.tgz", + "integrity": "sha1-3UGeJo3gEqtysxnTN/IQUBP5OB8=", + "requires": { + "etag": "1.7.0", + "fresh": "0.3.0", + "ms": "0.7.2", + "parseurl": "1.3.2" + }, + "dependencies": { + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + } + } + }, + "serve-index": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.3.tgz", + "integrity": "sha1-egV/xu4o3GP2RWbl+lexEahq7NI=", + "requires": { + "accepts": "1.2.13", + "batch": "0.5.3", + "debug": "2.2.0", + "escape-html": "1.0.3", + "http-errors": "1.3.1", + "mime-types": "2.1.17", + "parseurl": "1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" } } }, + "serve-static": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz", + "integrity": "sha1-zlpuzTEB/tXsCYJ9rCKpwpv7BTU=", + "requires": { + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.13.2" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -10961,13 +11052,38 @@ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, - "sha.js": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "sharp": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.19.0.tgz", + "integrity": "sha1-YXKekPKR5iVAEiqAZcpfxwwaix8=", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "color": "2.0.1", + "detect-libc": "1.0.3", + "nan": "2.8.0", + "semver": "5.5.0", + "simple-get": "2.7.0", + "tar": "4.3.3", + "tunnel-agent": "0.6.0" + }, + "dependencies": { + "tar": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.3.3.tgz", + "integrity": "sha512-v9wjbOXloOIeXifMQGkKhPH3H7tjd+8BubFKOTU+64JpFZ3q2zBfsGlnc7KmyRgl8UxVa1SCRiF3F9tqSOgcaQ==", + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.1", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "yallist": "3.0.2" + } + }, + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + } } }, "shebang-command": { @@ -10990,10 +11106,25 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.7.0.tgz", + "integrity": "sha512-RkE9rGPHcxYZ/baYmgJtOSM63vH0Vyq+ma5TijBcLla41SWlh8t6XYIGMR/oeZcmr+/G8k+zrClkkVrtnQ0esg==", + "requires": { + "decompress-response": "3.3.0", + "once": "1.4.0", + "simple-concat": "1.0.0" + } + }, "simple-git": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.85.0.tgz", - "integrity": "sha1-VjrSke/IoSdzXo+815aWc3dhTNQ=", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.91.0.tgz", + "integrity": "sha1-hC22wroIMo6TwXORqJW4UFGM0To=", "dev": true, "requires": { "debug": "3.1.0" @@ -11010,6 +11141,14 @@ } } }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "0.3.1" + } + }, "slack-client": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/slack-client/-/slack-client-2.0.6.tgz", @@ -11042,13 +11181,12 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0" @@ -11070,7 +11208,7 @@ "sntp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha1-LGzsFP7cIiJznK+bXD2F0cxaLMg=", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { "hoek": "4.2.0" } @@ -11098,7 +11236,7 @@ "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { "source-map": "0.5.7" @@ -11150,13 +11288,13 @@ "specificity": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.2.tgz", - "integrity": "sha1-meZRHs7vD42bV5JJN6rCyxPRPEI=", + "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==", "dev": true }, "split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, "requires": { "through": "2.3.8" @@ -11174,7 +11312,7 @@ "split2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha1-GGsldbz4PoW30YRldWI47k7kJJM=", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dev": true, "requires": { "through2": "2.0.3" @@ -11218,15 +11356,15 @@ "stackframe": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", - "integrity": "sha1-NXskqZL5Qny6a1RdlqFO0svKGHs=", + "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", "dev": true } } }, "stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, "stackframe": { "version": "0.3.1", @@ -11269,6 +11407,42 @@ "integrity": "sha1-0g+aYWu08MO5i5GSLSW2QKorxCU=", "dev": true }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "stream-counter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz", + "integrity": "sha1-3tJmVWMZyLDiIoErnPOyb6fZR94=", + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "stream-events": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.2.tgz", @@ -11290,7 +11464,7 @@ "string-format-obj": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string-format-obj/-/string-format-obj-1.1.1.tgz", - "integrity": "sha1-x2EspOKtkjgSqB2xktwpGFCqH2U=" + "integrity": "sha512-Mm+sROy+pHJmx0P/0Bs1uxIX6UhGJGj6xDGQZ5zh9v/SZRmLGevp+p0VJxV7lirrkAmQ2mvva/gHKpnF/pTb+Q==" }, "string-width": { "version": "1.0.2", @@ -11310,11 +11484,21 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "requires": { "safe-buffer": "5.1.1" } }, + "stringifier": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.3.0.tgz", + "integrity": "sha1-3vGDQvaTPbDy2/yaoCF1tEjBeVk=", + "requires": { + "core-js": "2.5.3", + "traverse": "0.6.6", + "type-name": "2.0.2" + } + }, "stringify-entities": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.1.tgz", @@ -11377,12 +11561,12 @@ "stylelint": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-8.4.0.tgz", - "integrity": "sha1-wtuusXI2kXgZ+SBuHA31/d9vg8M=", + "integrity": "sha512-56hPH5mTFnk8LzlEuTWq0epa34fHuS54UFYQidBOFt563RJBNi1nz1F2HK2MoT1X1waq47milvRsRahFCCJs/Q==", "dev": true, "requires": { - "autoprefixer": "7.2.5", + "autoprefixer": "7.2.6", "balanced-match": "1.0.0", - "chalk": "2.3.0", + "chalk": "2.3.1", "cosmiconfig": "3.1.0", "debug": "3.1.0", "execall": "1.0.0", @@ -11394,14 +11578,14 @@ "ignore": "3.3.7", "imurmurhash": "0.1.4", "known-css-properties": "0.5.0", - "lodash": "4.17.4", - "log-symbols": "2.1.0", + "lodash": "4.17.5", + "log-symbols": "2.2.0", "mathml-tag-names": "2.0.1", "meow": "4.0.0", "micromatch": "2.3.11", "normalize-selector": "0.2.0", "pify": "3.0.0", - "postcss": "6.0.16", + "postcss": "6.0.17", "postcss-html": "0.12.0", "postcss-less": "1.1.3", "postcss-media-query-parser": "0.2.3", @@ -11430,12 +11614,36 @@ "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "dev": true, + "requires": { + "browserslist": "2.11.3", + "caniuse-lite": "1.0.30000808", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.17", + "postcss-value-parser": "3.3.0" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000808", + "electron-to-chromium": "1.3.33" + } + }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -11454,20 +11662,20 @@ } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "supports-color": "5.2.0" } }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -11488,24 +11696,10 @@ "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", "dev": true }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.7", - "pify": "3.0.0", - "slash": "1.0.0" - } - }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "indent-string": { @@ -11541,7 +11735,7 @@ "meow": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", - "integrity": "sha1-/VhV3QCNtbksVSCC2xwwfLogsp0=", + "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", "dev": true, "requires": { "camelcase-keys": "4.2.0", @@ -11571,35 +11765,15 @@ "json-parse-better-errors": "1.0.1" } }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "5.1.0" - }, - "dependencies": { - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", + "dev": true, + "requires": { + "chalk": "2.3.1", + "source-map": "0.6.1", + "supports-color": "5.2.0" } }, "read-pkg": { @@ -11636,19 +11810,19 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -11677,12 +11851,12 @@ "dev": true }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } }, "trim-newlines": { @@ -11694,77 +11868,66 @@ } }, "stylelint-order": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-0.8.0.tgz", - "integrity": "sha1-SdpWFcuR7Qd+vSdGh/TfPW/utOQ=", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-0.8.1.tgz", + "integrity": "sha512-8mp1P2wnI9XShYXVXDsxVigE2eXnc0C2O4ktbwUvTBwjCP4xZskIbUVxp1evSG3OK4R7hXVNl/2BnJCZkrcc/w==", "dev": true, "requires": { - "lodash": "4.17.4", - "postcss": "6.0.16", + "lodash": "4.17.5", + "postcss": "6.0.19", "postcss-sorting": "3.1.0" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.19.tgz", + "integrity": "sha512-f13HRz0HtVwVaEuW6J6cOUCBLFtymhgyLPV7t4QEk2UD3twRI9IluDcQNdzQdBpiixkXj2OmzejhhTbSbDxNTg==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -11772,73 +11935,62 @@ "sugarss": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.1.tgz", - "integrity": "sha1-voJtkAPg8kdzX5I2XcP9fxuunkQ=", + "integrity": "sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA==", "dev": true, "requires": { - "postcss": "6.0.16" + "postcss": "6.0.17" }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "postcss": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz", - "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=", + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", + "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", "dev": true, "requires": { - "chalk": "2.3.0", + "chalk": "2.3.1", "source-map": "0.6.1", - "supports-color": "5.1.0" + "supports-color": "5.2.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -11846,35 +11998,29 @@ "superagent": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", - "integrity": "sha1-5KEbnQR/fT7+s7vlNtnsACHRZAM=", + "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", "dev": true, "requires": { "component-emitter": "1.2.1", "cookiejar": "2.1.1", "debug": "3.1.0", "extend": "3.0.1", - "form-data": "2.3.1", + "form-data": "2.3.2", "formidable": "1.1.1", "methods": "1.1.2", "mime": "1.6.0", "qs": "6.5.1", - "readable-stream": "2.3.3" + "readable-stream": "2.3.4" }, "dependencies": { "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" } - }, - "formidable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", - "dev": true } } }, @@ -11889,9 +12035,12 @@ } }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "1.0.0" + } }, "svg-tags": { "version": "1.0.0", @@ -11902,13 +12051,13 @@ "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { "ajv": "5.5.2", "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", + "chalk": "2.3.1", + "lodash": "4.17.5", "slice-ansi": "1.0.0", "string-width": "2.1.1" }, @@ -11922,27 +12071,27 @@ "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { "color-convert": "1.9.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "supports-color": "5.2.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "is-fullwidth-code-point": { @@ -11954,7 +12103,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", @@ -11971,12 +12120,12 @@ } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "3.0.0" } } } @@ -11994,13 +12143,13 @@ "tar-pack": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz", - "integrity": "sha1-4dvAOpudO6B+iWrQJzF+tnmhCh8=", + "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==", "requires": { "debug": "2.6.9", "fstream": "1.0.11", "fstream-ignore": "1.0.5", "once": "1.4.0", - "readable-stream": "2.3.3", + "readable-stream": "2.3.4", "rimraf": "2.6.2", "tar": "2.2.1", "uid-number": "0.0.6" @@ -12009,11 +12158,11 @@ "tar-stream": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha1-XK2Ed59FyDsfJQjZawnYjHIYr1U=", + "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", "requires": { "bl": "1.2.1", "end-of-stream": "1.4.1", - "readable-stream": "2.3.3", + "readable-stream": "2.3.4", "xtend": "4.0.1" } }, @@ -12046,7 +12195,7 @@ "text-extensions": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz", - "integrity": "sha1-+qq6JiXtdG1WiiPk0KrNm/CKizk=", + "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg==", "dev": true }, "text-table": { @@ -12064,31 +12213,32 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "through2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { - "readable-stream": "2.3.3", + "readable-stream": "2.3.4", "xtend": "4.0.1" } }, "tiny-emitter": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", - "integrity": "sha1-gtJ0aKylrejl/R5tIrV91D69+3w=" + "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==" }, "tlds": { - "version": "1.197.0", - "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.197.0.tgz", - "integrity": "sha1-XlRjoqDXhICusXaLZhHk87wid40=" + "version": "1.199.0", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.199.0.tgz", + "integrity": "sha512-NM0jUhibJjEX4g0+1ETxOhuODIDpyvCC0A2BjxrTfMUMZ+uRZc6ZnJl9SmFtAW1s5iQgQIxezFpUij6/6OiRbg==" }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "1.0.2" @@ -12105,7 +12255,7 @@ "resolved": "https://registry.npmjs.org/toastr/-/toastr-2.1.4.tgz", "integrity": "sha1-i0O+ZPudDEFIcURvLbjoyk6V8YE=", "requires": { - "jquery": "3.2.1" + "jquery": "3.3.1" } }, "tough-cookie": { @@ -12116,6 +12266,11 @@ "punycode": "1.4.1" } }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=" + }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -12152,6 +12307,11 @@ "integrity": "sha1-qf2LA5Swro//guBjOgo2zK1bX4Y=", "dev": true }, + "tsscmp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", + "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -12167,46 +12327,35 @@ "optional": true }, "twilio": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/twilio/-/twilio-2.9.1.tgz", - "integrity": "sha1-BDv6JAzLM/X3a3cUNMJCGgFEvIU=", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/twilio/-/twilio-2.11.1.tgz", + "integrity": "sha1-RRCZRnMTxWs3Z5lN8tGQYvEO+MQ=", "requires": { "deprecate": "0.1.0", "jsonwebtoken": "5.4.1", - "jwt-simple": "0.1.0", "q": "0.9.7", - "request": "2.55.0", + "request": "2.74.0", "scmp": "0.0.3", "string.prototype.startswith": "0.2.0", "underscore": "1.8.3" }, "dependencies": { - "asn1": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=" - }, "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" }, "aws-sign2": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" }, "bl": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", "requires": { - "readable-stream": "1.0.34" + "readable-stream": "2.0.6" } }, "boom": { @@ -12218,17 +12367,9 @@ } }, "caseless": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.9.0.tgz", - "integrity": "sha1-t7Zc5r8UE4hlOc/VM/CzDv+pz4g=" - }, - "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "requires": { - "delayed-stream": "0.0.5" - } + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" }, "cryptiles": { "version": "2.0.5", @@ -12238,36 +12379,36 @@ "boom": "2.10.1" } }, - "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=" + "deprecate": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-0.1.0.tgz", + "integrity": "sha1-xJBYYS3GyOUUXq/kg5uMLH0EHBQ=" }, "form-data": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", - "integrity": "sha1-Jvi8JtpkQOKZy9z7aQNcT3em5GY=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", + "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", "requires": { - "async": "0.9.2", - "combined-stream": "0.0.7", - "mime-types": "2.0.14" + "async": "2.6.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.17" } }, "har-validator": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", - "integrity": "sha1-2DhCsOtMQ1lgrrEIoGejqpTA7rI=", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "requires": { - "bluebird": "2.11.0", "chalk": "1.1.3", - "commander": "2.13.0", - "is-my-json-valid": "2.17.1" + "commander": "2.14.1", + "is-my-json-valid": "2.17.2", + "pinkie-promise": "2.0.1" } }, "hawk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", - "integrity": "sha1-HnMc45RH+h0PbXB/e87r7A/R7B8=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { "boom": "2.10.1", "cryptiles": "2.0.5", @@ -12281,79 +12422,80 @@ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, "http-signature": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "requires": { - "asn1": "0.1.11", - "assert-plus": "0.1.5", - "ctype": "0.5.3" + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "mime-db": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", - "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=" - }, - "mime-types": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", - "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", + "jsonwebtoken": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-5.4.1.tgz", + "integrity": "sha1-IFXGORlf/lYxT6alHfAkaBhqlpU=", "requires": { - "mime-db": "1.12.0" + "jws": "3.1.4", + "ms": "0.7.3" } }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + "ms": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", + "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=" }, - "oauth-sign": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz", - "integrity": "sha1-fb6uRPbKRU4fFoRR1jB0ZzWBPOM=" + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "q": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "integrity": "sha1-TeLmyzspCIyeTLwDv51C+5bOL3U=" }, "qs": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.4.2.tgz", - "integrity": "sha1-9854jld33wtQENp/fE5zujJHD1o=" + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=" }, "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" } }, "request": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.55.0.tgz", - "integrity": "sha1-11wc32eddrsQD5v/4f5VG1wk6T0=", + "version": "2.74.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.74.0.tgz", + "integrity": "sha1-dpPKdou7DqXIzgjAhKRe+gW4kqs=", "requires": { - "aws-sign2": "0.5.0", - "bl": "0.9.5", - "caseless": "0.9.0", - "combined-stream": "0.0.7", + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "bl": "1.1.2", + "caseless": "0.11.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", "forever-agent": "0.6.1", - "form-data": "0.2.0", - "har-validator": "1.8.0", - "hawk": "2.3.1", - "http-signature": "0.10.1", + "form-data": "1.0.1", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", "isstream": "0.1.2", "json-stringify-safe": "5.0.1", - "mime-types": "2.0.14", + "mime-types": "2.1.17", "node-uuid": "1.4.8", - "oauth-sign": "0.6.0", - "qs": "2.4.2", + "oauth-sign": "0.8.2", + "qs": "6.2.3", "stringstream": "0.0.5", "tough-cookie": "2.3.3", "tunnel-agent": "0.4.3" @@ -12389,11 +12531,25 @@ } }, "type-detect": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", - "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "type-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", + "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=" + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -12402,12 +12558,12 @@ "ua-parser-js": { "version": "0.7.17", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha1-6exflJi57JEOeuOsYmqAXE0J7Kw=" + "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==" }, "uc.micro": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz", - "integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", + "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==" }, "uglify-js": { "version": "2.8.29", @@ -12488,6 +12644,14 @@ "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" }, + "uid-safe": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz", + "integrity": "sha1-Otbzg2jG1MjHXsF2I/t5qh0HHYE=", + "requires": { + "random-bytes": "1.0.0" + } + }, "ultron": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", @@ -12520,7 +12684,7 @@ "unified": { "version": "6.1.6", "resolved": "https://registry.npmjs.org/unified/-/unified-6.1.6.tgz", - "integrity": "sha1-Xqf4B6CJjx+Kze7+XyX6oBDMQrE=", + "integrity": "sha512-pW2f82bCIo2ifuIGYcV12fL96kMMYgw7JKVEgh7ODlrM9rj6vXSY3BV+H6lCcv1ksxynFf582hwWLnA1qRFy4w==", "dev": true, "requires": { "bail": "1.0.2", @@ -12588,54 +12752,27 @@ "unist-util-visit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.0.tgz", - "integrity": "sha1-Qcp8gpgf0c5sdiqsOX/CTjVxFEQ=", + "integrity": "sha512-9ntYcxPFtl44gnwXrQKZ5bMqXMY0ZHzUpqMFiU4zcc8mmf/jzYm8GhYgezuUlX4cJIM1zIDYaO6fG/fI+L6iiQ==", "dev": true, "requires": { "unist-util-is": "2.1.1" } }, - "unreachable-branch-transform": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unreachable-branch-transform/-/unreachable-branch-transform-0.3.0.tgz", - "integrity": "sha1-2ZzExudG0mSSiEW2EdtUsPNHTKo=", + "universal-deep-strict-equal": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz", + "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=", "requires": { - "esmangle-evaluator": "1.0.1", - "recast": "0.10.43", - "through2": "0.6.5" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" - } - } + "array-filter": "1.0.0", + "indexof": "0.0.1", + "object-keys": "1.0.11" } }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", @@ -12643,9 +12780,9 @@ "dev": true }, "urijs": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.0.tgz", - "integrity": "sha1-2KooTQ50aXA6aYitBFxMv98IraA=", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", + "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==", "dev": true }, "urix": { @@ -12705,9 +12842,9 @@ } }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, "validate-npm-package-license": { "version": "3.0.1", @@ -12722,9 +12859,14 @@ "validator": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/validator/-/validator-9.1.2.tgz", - "integrity": "sha1-VxG2QT94vZ1WADEwyBtHw56GVGw=", + "integrity": "sha512-1Tml6crNdsSC61jHssWksQxq6C7MmSFCCmf99Eb+l/V/cwVlw4/Pg3YXBP1WKcHLsyqe3E+iJXUZgoTTQFcqQg==", "dev": true }, + "vary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", + "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=" + }, "vasync": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", @@ -12761,7 +12903,7 @@ "vfile": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", - "integrity": "sha1-5i2OcrIOg8MkvGxnJ47ickiL+Eo=", + "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", "dev": true, "requires": { "is-buffer": "1.1.6", @@ -12779,12 +12921,17 @@ "vfile-message": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.0.tgz", - "integrity": "sha1-pq2wR06kAPol2Snx1nOr6moX41k=", + "integrity": "sha512-HPREhzTOB/sNDc9/Mxf8w0FmHnThg5CRSJdR9VRFkD2riqYWs+fuXlj5z8mIpv2LrD7uU41+oPWFOL4Mjlf+dw==", "dev": true, "requires": { "unist-util-stringify-position": "1.1.1" } }, + "vhost": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vhost/-/vhost-3.0.2.tgz", + "integrity": "sha1-L7HezUxGaqiLD5NBrzPcGv8keNU=" + }, "wdio-dot-reporter": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.9.tgz", @@ -12821,9 +12968,9 @@ } }, "webdriverio": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.10.1.tgz", - "integrity": "sha1-Qvekh7czebJ0Oi+uULMUJhX2EXA=", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.10.2.tgz", + "integrity": "sha1-DShiKALJZgFa/jSzrFZtwznyLkM=", "dev": true, "requires": { "archiver": "2.1.1", @@ -12871,7 +13018,7 @@ "supports-color": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.0.1.tgz", - "integrity": "sha1-HFMx8iJQyEICgFsvF63xZpnzo5o=", + "integrity": "sha512-7FQGOlSQ+AQxBNXJpVDj8efTA/FtyB5wcNE1omXXJ0cq6jm1jjDwuROlYDbnzHqdNPqliWFhcioCWSyav+xBnA==", "dev": true, "requires": { "has-flag": "2.0.0" @@ -12895,14 +13042,14 @@ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "dev": true, "requires": { - "http-parser-js": "0.4.9", + "http-parser-js": "0.4.10", "websocket-extensions": "0.1.3" } }, "websocket-extensions": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, "wgxpath": { @@ -12912,9 +13059,10 @@ "dev": true }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, "requires": { "isexe": "2.0.0" } @@ -12942,7 +13090,7 @@ "cycle": "1.0.3", "eyes": "0.1.8", "isstream": "0.1.2", - "stack-trace": "0.0.9" + "stack-trace": "0.0.10" }, "dependencies": { "async": { @@ -12955,7 +13103,7 @@ "wolfy87-eventemitter": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.2.4.tgz", - "integrity": "sha1-UCHSlS02EcvNGVFJcR2bWVzRHUg=" + "integrity": "sha512-yUOUSIzZxqBeu6VdnigqYHwwjy5N3CRX5XSHh/YcVpy+Qsx+HkHaEWdmdyAr3NvyBYDraOa5EfNIbu47T5QzIA==" }, "wordwrap": { "version": "0.0.3", @@ -12988,7 +13136,7 @@ "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", @@ -12998,7 +13146,7 @@ "ws": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", - "integrity": "sha1-y9nm514J/F0skAFfIfDECHXg3VE=", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", "requires": { "options": "0.0.6", "ultron": "1.0.2" @@ -13022,9 +13170,9 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "xml-crypto": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-0.6.0.tgz", - "integrity": "sha1-RSKeACjLPultxTP6M4DCvzuGrbg=", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/xml-crypto/-/xml-crypto-0.10.1.tgz", + "integrity": "sha1-+DL3TM9W8kr8rhFjofyrRNlndKg=", "requires": { "xmldom": "0.1.19", "xpath.js": "1.1.0" @@ -13038,17 +13186,25 @@ } }, "xml2js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.0.tgz", - "integrity": "sha1-99pSJ33rtkeYMFOtti2XLe5loaw=", + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "requires": { - "sax": "1.2.1" + "sax": "1.2.1", + "xmlbuilder": "9.0.7" + }, + "dependencies": { + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + } } }, "xmlbuilder": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-2.6.4.tgz", - "integrity": "sha1-gSOsFXbZxmkY9BBJbx/p8Ci4yj4=", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-2.6.5.tgz", + "integrity": "sha1-b/etYPty0idk8AehZLd/K/FABSY=", "requires": { "lodash": "3.10.1" }, @@ -13111,6 +13267,12 @@ "readable-stream": "1.0.34" } }, + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", + "dev": true + }, "boom": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", @@ -13311,7 +13473,7 @@ "integrity": "sha1-vCud1ghCMR8EV59agtzqaisxnH0=", "dev": true, "requires": { - "jasmine-core": "2.8.0" + "jasmine-core": "2.99.1" } }, "xolvio-sync-webdriverio": { @@ -13324,14 +13486,14 @@ "meteor-promise": "0.8.6", "underscore": "1.8.3", "wdio-sync": "0.6.14", - "webdriverio": "4.10.1", + "webdriverio": "4.10.2", "xolvio-fiber-utils": "2.0.3" } }, "xpath.js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz", - "integrity": "sha1-OBakTtS7NSCRCD0AKjg91RBKX/E=" + "integrity": "sha512-jg+qkfS4K8E7965sqaUl8mRngXiKb3WZGfONgE18pr03FUQiuSV6G+Ej4tS55B+rIQSFEIw3phdVAQ4pPqNWfQ==" }, "xtend": { "version": "4.0.1", @@ -13343,11 +13505,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, "yaqrcode": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/yaqrcode/-/yaqrcode-0.2.1.tgz", @@ -13384,8 +13541,8 @@ "requires": { "archiver-utils": "1.3.0", "compress-commons": "1.2.2", - "lodash": "4.17.4", - "readable-stream": "2.3.3" + "lodash": "4.17.5", + "readable-stream": "2.3.4" } } } diff --git a/package.json b/package.json index 6946a833e3a9..676512cd3de3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "Rocket.Chat", "description": "The Ultimate Open Source WebChat Platform", - "version": "0.61.2", + "version": "0.62.0", "author": { "name": "Rocket.Chat", "url": "https://rocket.chat/" @@ -86,93 +86,94 @@ "email": "support@rocket.chat" }, "devDependencies": { - "autoprefixer": "^7.2.5", + "autoprefixer": "^8.0.0", "babel-mocha-es6-compiler": "^0.1.0", "babel-plugin-array-includes": "^2.0.3", "chimp": "^0.51.0", - "conventional-changelog-cli": "^1.3.5", - "eslint": "^4.15.0", + "conventional-changelog-cli": "^1.3.14", + "eslint": "^4.18.1", + "mocha": "^5.0.1", "mock-require": "^3.0.1", "postcss-custom-properties": "^6.2.0", - "postcss-import": "^11.0.0", + "postcss-import": "^11.1.0", "postcss-media-minmax": "^3.0.0", "postcss-nested": "^3.0.0", "postcss-selector-not": "^3.0.1", "proxyquire": "^1.8.0", - "simple-git": "^1.85.0", + "simple-git": "^1.91.0", "stylelint": "^8.4.0", - "stylelint-order": "^0.8.0", + "stylelint-order": "^0.8.1", "supertest": "^3.0.0" }, "dependencies": { - "@google-cloud/language": "0.8.0", - "@google-cloud/storage": "1.4.0", - "@google-cloud/vision": "0.11.5", - "adm-zip": "0.4.7", - "atlassian-crowd": "0.5.0", - "autolinker": "1.6.0", - "aws-sdk": "^2.180.0", - "babel-runtime": "^6.26.0", - "bad-words": "1.3.1", + "@babel/runtime": "^7.0.0-beta.40", + "@google-cloud/language": "^1.1.0", + "@google-cloud/storage": "^1.6.0", + "@google-cloud/vision": "^0.15.2", + "adm-zip": "^0.4.7", + "atlassian-crowd": "^0.5.0", + "autolinker": "^1.6.2", + "aws-sdk": "^2.199.0", + "bad-words": "^1.6.1", "bcrypt": "^1.0.3", - "bson": "0.5.5", - "bugsnag": "1.8.0", + "bson": "^1.0.4", + "bugsnag": "^2.1.3", "bunyan": "^1.8.12", - "busboy": "0.2.14", + "busboy": "^0.2.14", "cas": "https://github.com/kcbanner/node-cas/tarball/fcd27dad333223b3b75a048bce27973fb3ca0f62", - "clipboard": "1.7.1", - "codemirror": "^5.33.0", - "coffeescript": "1.12.7", - "connect": "2.7.10", + "clipboard": "^1.7.1", + "codemirror": "^5.35.0", + "coffeescript": "^1.12.7", + "connect": "^2.7.10", "core-js": "^2.5.3", - "csv-parse": "1.2.0", + "csv-parse": "^1.3.3", "emailreplyparser": "^0.0.5", - "file-type": "^7.4.0", - "filesize": "3.5.11", - "gm": "1.23.1", - "gridfs-stream": "1.1.1", - "he": "1.1.1", + "file-type": "^7.6.0", + "filesize": "^3.6.0", + "gridfs-stream": "^1.1.1", + "he": "^1.1.1", "highlight.js": "^9.12.0", - "iconv-lite": "0.4.19", - "image-size": "0.6.2", + "iconv-lite": "^0.4.19", + "image-size": "^0.6.2", "imap": "^0.8.19", - "ip-range-check": "0.0.2", - "jquery": "^3.2.1", - "jschardet": "1.6.0", + "ip-range-check": "^0.0.2", + "jquery": "^3.3.1", + "jschardet": "^1.6.0", "ldapjs": "^1.0.2", "less": "https://github.com/meteor/less.js/tarball/8130849eb3d7f0ecf0ca8d0af7c4207b0442e3f6", - "less-plugin-autoprefix": "1.5.1", - "localforage": "1.5.5", - "lokijs": "1.4.1", - "lru-cache": "2.6.5", - "mailparser": "^2.1.0", - "marked": "0.3.12", - "mime-db": "^1.32.0", + "less-plugin-autoprefix": "^1.5.1", + "localforage": "^1.5.6", + "lokijs": "^1.5.3", + "lru-cache": "^2.6.5", + "mailparser": "^2.2.0", + "marked": "^0.3.16", + "mime-db": "^1.33.0", "mime-type": "^3.0.5", - "mkdirp": "0.5.1", + "mkdirp": "^0.5.1", "moment": "^2.20.1", "moment-timezone": "^0.5.14", - "node-dogstatsd": "0.0.7", - "object-path": "0.11.4", + "node-dogstatsd": "^0.0.7", + "object-path": "^0.11.4", "photoswipe": "^4.1.2", "poplib": "^0.1.7", "prom-client": "^10.2.2", - "querystring": "0.2.0", - "redis": "2.2.5", - "semver": "^5.4.1", - "slack-client": "2.0.6", - "speakeasy": "2.0.0", - "tar-stream": "1.5.5", + "querystring": "^0.2.0", + "redis": "^2.8.0", + "semver": "^5.5.0", + "sharp": "^0.19.0", + "slack-client": "^2.0.6", + "speakeasy": "^2.0.0", + "tar-stream": "^1.5.5", "toastr": "^2.1.4", - "twilio": "2.9.1", - "ua-parser-js": "0.7.17", + "twilio": "^2.9.1", + "ua-parser-js": "^0.7.17", "underscore": "^1.8.3", "underscore.string": "^3.3.4", "wolfy87-eventemitter": "^5.2.4", - "xml-crypto": "0.6.0", - "xml2js": "0.2.0", - "xmlbuilder": "2.6.4", - "xmldom": "0.1.27", - "yaqrcode": "0.2.1" + "xml-crypto": "^0.10.1", + "xml2js": "^0.4.19", + "xmlbuilder": "^2.6.4", + "xmldom": "^0.1.27", + "yaqrcode": "^0.2.1" } } diff --git a/packages/autoupdate/autoupdate_client.js b/packages/autoupdate/autoupdate_client.js index 41b20c77e1ac..64c9af0ca810 100644 --- a/packages/autoupdate/autoupdate_client.js +++ b/packages/autoupdate/autoupdate_client.js @@ -59,6 +59,14 @@ var retry = new Retry({ }); var failures = 0; +function after(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; +}; + Autoupdate._retrySubscription = function () { Meteor.subscribe("meteor_autoupdate_clientVersions", { onError: function (error) { @@ -86,18 +94,30 @@ Autoupdate._retrySubscription = function () { // https://github.com/guard/guard-livereload/blob/master/js/livereload.js#L710 var newCss = (doc.assets && doc.assets.allCss) || []; var oldLinks = []; - _.each(document.getElementsByTagName('link'), function (link) { - if (link.className === '__meteor-css__') { - oldLinks.push(link); + + Array.prototype.forEach.call( + document.getElementsByTagName('link'), + function (link) { + if (link.className === '__meteor-css__') { + oldLinks.push(link); + } + } + ); + + function waitUntilCssLoads(link, callback) { + var called; + function executeCallback(...args) { + if (! called) { + called = true; + return callback(...args); + } } - }); - var waitUntilCssLoads = function (link, callback) { - var executeCallback = _.once(callback); link.onload = function () { knownToSupportCssOnLoad = true; executeCallback(); }; + if (! knownToSupportCssOnLoad) { var id = Meteor.setInterval(function () { if (link.sheet) { @@ -106,11 +126,11 @@ Autoupdate._retrySubscription = function () { } }, 50); } - }; + } - var removeOldLinks = _.after(newCss.length, function () { - _.each(oldLinks, function (oldLink) { - oldLink.parentNode.removeChild(oldLink); + var removeOldLinks = after(newCss.length, function () { + oldLinks.forEach(function (link) { + link.parentNode.removeChild(link); }); }); @@ -123,7 +143,7 @@ Autoupdate._retrySubscription = function () { }; if (newCss.length !== 0) { - _.each(newCss, function (css) { + newCss.forEach(function (css) { var newLink = document.createElement("link"); newLink.setAttribute("rel", "stylesheet"); newLink.setAttribute("type", "text/css"); @@ -153,4 +173,4 @@ Autoupdate._retrySubscription = function () { } }); }; -Autoupdate._retrySubscription(); +Autoupdate._retrySubscription(); \ No newline at end of file diff --git a/packages/autoupdate/package.js b/packages/autoupdate/package.js index 07db268a1e39..359144e4c662 100644 --- a/packages/autoupdate/package.js +++ b/packages/autoupdate/package.js @@ -1,6 +1,6 @@ Package.describe({ summary: "Update the client when new client code is available", - version: '1.3.12' + version: '1.4.0' }); Package.onUse(function (api) { @@ -15,9 +15,9 @@ Package.onUse(function (api) { ], 'client'); api.use([ + 'ecmascript', 'ddp', - 'mongo', - 'ecmascript' + 'mongo' ], ['client', 'server']); api.use(['http', 'random'], 'web.cordova'); @@ -27,4 +27,4 @@ Package.onUse(function (api) { api.addFiles('autoupdate_cordova.js', 'web.cordova'); api.export('Autoupdate'); -}); +}); \ No newline at end of file diff --git a/packages/meteor-accounts-saml/saml_client.js b/packages/meteor-accounts-saml/saml_client.js index 22cc21ed7a0a..5a6432e207a5 100644 --- a/packages/meteor-accounts-saml/saml_client.js +++ b/packages/meteor-accounts-saml/saml_client.js @@ -9,19 +9,31 @@ if (!Accounts.saml) { // If we find a samlProvider, and we are using single // logout we will initiate logout from rocketchat via saml. // If not using single logout, we just do the standard logout. +// This can be overridden by a configured logout behaviour. // // TODO: This may need some work as it is not clear if we are really // logging out of the idp when doing the standard logout. const MeteorLogout = Meteor.logout; +const logoutBehaviour = { + TERMINATE_SAML: 'SAML', + ONLY_RC: 'Local' +}; Meteor.logout = function() { - const samlService = ServiceConfiguration.configurations.findOne({service: 'saml'}); + const samlService = ServiceConfiguration.configurations.findOne({ service: 'saml' }); if (samlService) { const provider = samlService.clientConfig && samlService.clientConfig.provider; if (provider) { - if (samlService.idpSLORedirectURL) { - return Meteor.logoutWithSaml({ provider }); + if (samlService.logoutBehaviour == null || samlService.logoutBehaviour === logoutBehaviour.TERMINATE_SAML) { + if (samlService.idpSLORedirectURL) { + console.info('SAML session terminated via SLO'); + return Meteor.logoutWithSaml({ provider }); + } + } + + if (samlService.logoutBehaviour === logoutBehaviour.ONLY_RC) { + console.info('SAML session not terminated, only the Rocket.Chat session is going to be killed'); } } } diff --git a/packages/meteor-accounts-saml/saml_rocketchat.js b/packages/meteor-accounts-saml/saml_rocketchat.js index 31b5aeffa125..3425ca7173bf 100644 --- a/packages/meteor-accounts-saml/saml_rocketchat.js +++ b/packages/meteor-accounts-saml/saml_rocketchat.js @@ -85,6 +85,16 @@ Meteor.methods({ section: name, i18nLabel: 'SAML_Custom_Generate_Username' }); + RocketChat.settings.add(`SAML_Custom_${ name }_logout_behaviour`, 'SAML', { + type: 'select', + values: [ + {key: 'SAML', i18nLabel: 'SAML_Custom_Logout_Behaviour_Terminate_SAML_Session'}, + {key: 'Local', i18nLabel: 'SAML_Custom_Logout_Behaviour_End_Only_RocketChat'} + ], + group: 'SAML', + section: name, + i18nLabel: 'SAML_Custom_Logout_Behaviour' + }); } }); @@ -100,6 +110,7 @@ const getSamlConfigs = function(service) { idpSLORedirectURL: RocketChat.settings.get(`${ service.key }_idp_slo_redirect_url`), generateUsername: RocketChat.settings.get(`${ service.key }_generate_username`), issuer: RocketChat.settings.get(`${ service.key }_issuer`), + logoutBehaviour: RocketChat.settings.get(`${ service.key }_logout_behaviour`), secret: { privateKey: RocketChat.settings.get(`${ service.key }_private_key`), publicCert: RocketChat.settings.get(`${ service.key }_public_cert`), diff --git a/packages/rocketchat-accounts/.npm/package/.gitignore b/packages/rocketchat-accounts/.npm/package/.gitignore new file mode 100644 index 000000000000..3c3629e647f5 --- /dev/null +++ b/packages/rocketchat-accounts/.npm/package/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/packages/rocketchat-accounts/.npm/package/README b/packages/rocketchat-accounts/.npm/package/README new file mode 100644 index 000000000000..3d492553a438 --- /dev/null +++ b/packages/rocketchat-accounts/.npm/package/README @@ -0,0 +1,7 @@ +This directory and the files immediately inside it are automatically generated +when you change this package's NPM dependencies. Commit the files in this +directory (npm-shrinkwrap.json, .gitignore, and this README) to source control +so that others run the same versions of sub-dependencies. + +You should NOT check in the node_modules directory that Meteor automatically +creates; if you are using git, the .gitignore file tells git to ignore it. diff --git a/packages/rocketchat-accounts/.npm/package/npm-shrinkwrap.json b/packages/rocketchat-accounts/.npm/package/npm-shrinkwrap.json new file mode 100644 index 000000000000..64d4dcb8e5b9 --- /dev/null +++ b/packages/rocketchat-accounts/.npm/package/npm-shrinkwrap.json @@ -0,0 +1,259 @@ +{ + "lockfileVersion": 1, + "dependencies": { + "@accounts/common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@accounts/common/-/common-0.0.18.tgz", + "integrity": "sha1-QB9Sd+tHk6qNBD8TUCituAh+FHs=" + }, + "@accounts/mongo": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@accounts/mongo/-/mongo-0.0.12.tgz", + "integrity": "sha1-n7UNmgn2vThw5u3ZYC/xHL0gxns=" + }, + "@accounts/server": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@accounts/server/-/server-0.0.18.tgz", + "integrity": "sha1-S7UCs0WZUkRgRbqXYyT5MnuLekQ=" + }, + "addressparser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.3.2.tgz", + "integrity": "sha1-WYc/Nej89sc2HBAjkmHXbhU0i7I=" + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=" + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "base64url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "bson": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", + "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "bufferjs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bufferjs/-/bufferjs-1.1.0.tgz", + "integrity": "sha1-CV/6OcXmtAoheKEWnJ7/xYSnMgE=" + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crypto": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-0.0.3.tgz", + "integrity": "sha1-RwqBuGvkxe4XrMggeh9TFa4g27A=" + }, + "ecdsa-sig-formatter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", + "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=" + }, + "emailjs": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/emailjs/-/emailjs-1.0.12.tgz", + "integrity": "sha1-vWVZxRxJYxJSGGJtoJi+ci96HHI=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=" + }, + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isemail": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" + }, + "joi": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", + "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=" + }, + "jsonwebtoken": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz", + "integrity": "sha1-d/UCHeBYtgWheD+hKD6ZgS5kVjg=" + }, + "jwa": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=" + }, + "jws": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=" + }, + "jwt-decode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", + "integrity": "sha1-fYa9VmefWM5qhHBKZX3TkruoGnk=" + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "mimelib": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/mimelib/-/mimelib-0.2.14.tgz", + "integrity": "sha1-KhqnJL0ZC4W9Um5jF6thBu39aDE=", + "dependencies": { + "addressparser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.2.1.tgz", + "integrity": "sha1-0RpbLu2gTP7+vfMZbBCuE9ts1gc=" + } + } + }, + "moment": { + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.15.2.tgz", + "integrity": "sha1-G/3t9qbjRfMi/pVtXfW9CKjOhNw=" + }, + "mongodb": { + "version": "2.2.33", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.33.tgz", + "integrity": "sha1-tTfEcdNKZlG0jzb9vyl1A0Dgi1A=" + }, + "mongodb-core": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.17.tgz", + "integrity": "sha1-pBizN6FKFJkPtRC5I97mqBMXPfg=" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=" + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==" + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "starttls": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/starttls/-/starttls-1.0.1.tgz", + "integrity": "sha1-5ggcJd5rF49adfjyccFIdEkYO0I=" + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==" + }, + "topo": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", + "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} diff --git a/packages/rocketchat-accounts/README.md b/packages/rocketchat-accounts/README.md new file mode 100644 index 000000000000..91ee3cc93aa5 --- /dev/null +++ b/packages/rocketchat-accounts/README.md @@ -0,0 +1,3 @@ +# rocketchat:accounts + +Integration with `js-accounts` system. diff --git a/packages/rocketchat-accounts/package.js b/packages/rocketchat-accounts/package.js new file mode 100644 index 000000000000..777c614620ba --- /dev/null +++ b/packages/rocketchat-accounts/package.js @@ -0,0 +1,22 @@ +Package.describe({ + name: 'rocketchat:accounts', + version: '0.0.1', + summary: 'JS-Accounts integration', + git: '' +}); + +Package.onUse(function(api) { + api.use([ + 'underscore', + 'ecmascript' + ]); + + api.use('mongo', ['client', 'server']); + + api.mainModule('server/index.js', 'server'); +}); + +Npm.depends({ + '@accounts/server': '0.0.18', + '@accounts/mongo': '0.0.12' +}); diff --git a/packages/rocketchat-accounts/server/config.js b/packages/rocketchat-accounts/server/config.js new file mode 100644 index 000000000000..21a6629b0b08 --- /dev/null +++ b/packages/rocketchat-accounts/server/config.js @@ -0,0 +1,24 @@ +import AccountsServer from '@accounts/server'; +import MongoAdapter from '@accounts/mongo'; +import { MongoInternals } from 'meteor/mongo'; +import { Meteor } from 'meteor/meteor'; + +Meteor.startup(() => { + const mongodb = MongoInternals.defaultRemoteCollectionDriver().mongo.db; + + const mongoAdapter = new MongoAdapter(mongodb, { + convertUserIdToMongoObjectId: false + }); + + AccountsServer.config({ + tokenConfigs: { + accessToken: { + expiresIn: '3d' + }, + refreshToken: { + expiresIn: '30d' + } + }, + passwordHashAlgorithm: 'sha256' + }, mongoAdapter); +}); diff --git a/packages/rocketchat-accounts/server/index.js b/packages/rocketchat-accounts/server/index.js new file mode 100644 index 000000000000..7651774b4e8c --- /dev/null +++ b/packages/rocketchat-accounts/server/index.js @@ -0,0 +1,8 @@ +import './config'; + +import AccountsServer from '@accounts/server'; + + +export { + AccountsServer +}; diff --git a/packages/rocketchat-api/package.js b/packages/rocketchat-api/package.js index 859ca35ffdf0..df6d1b9b3ab4 100644 --- a/packages/rocketchat-api/package.js +++ b/packages/rocketchat-api/package.js @@ -15,16 +15,13 @@ Package.onUse(function(api) { api.addFiles('server/api.js', 'server'); api.addFiles('server/settings.js', 'server'); - //Register v1 helpers - api.addFiles('server/v1/helpers/requestParams.js', 'server'); - api.addFiles('server/v1/helpers/getPaginationItems.js', 'server'); - api.addFiles('server/v1/helpers/getUserFromParams.js', 'server'); - api.addFiles('server/v1/helpers/isUserFromParams.js', 'server'); - api.addFiles('server/v1/helpers/parseJsonQuery.js', 'server'); - api.addFiles('server/v1/helpers/getLoggedInUser.js', 'server'); - - //Register default helpers - api.addFiles('server/default/helpers/getLoggedInUser.js', 'server'); + //Register helpers + api.addFiles('server/helpers/requestParams.js', 'server'); + api.addFiles('server/helpers/getPaginationItems.js', 'server'); + api.addFiles('server/helpers/getUserFromParams.js', 'server'); + api.addFiles('server/helpers/isUserFromParams.js', 'server'); + api.addFiles('server/helpers/parseJsonQuery.js', 'server'); + api.addFiles('server/helpers/getLoggedInUser.js', 'server'); //Add default routes api.addFiles('server/default/info.js', 'server'); @@ -40,8 +37,10 @@ Package.onUse(function(api) { api.addFiles('server/v1/im.js', 'server'); api.addFiles('server/v1/integrations.js', 'server'); api.addFiles('server/v1/misc.js', 'server'); + api.addFiles('server/v1/permissions.js', 'server'); api.addFiles('server/v1/push.js', 'server'); api.addFiles('server/v1/settings.js', 'server'); api.addFiles('server/v1/stats.js', 'server'); api.addFiles('server/v1/users.js', 'server'); + api.addFiles('server/v1/spotlight.js', 'server'); }); diff --git a/packages/rocketchat-api/server/api.js b/packages/rocketchat-api/server/api.js index df2e1a9dd72a..c332c67f4575 100644 --- a/packages/rocketchat-api/server/api.js +++ b/packages/rocketchat-api/server/api.js @@ -6,7 +6,6 @@ class API extends Restivus { super(properties); this.logger = new Logger(`API ${ properties.version ? properties.version : 'default' } Logger`, {}); this.authMethods = []; - this.helperMethods = new Map(); this.fieldSeparator = '.'; this.defaultFieldsToExclude = { joinCode: 0, @@ -51,6 +50,14 @@ class API extends Restivus { }; } + hasHelperMethods() { + return RocketChat.API.helperMethods.size !== 0; + } + + getHelperMethods() { + return RocketChat.API.helperMethods; + } + addAuthMethod(method) { this.authMethods.push(method); } @@ -86,23 +93,22 @@ class API extends Restivus { }; } - - unauthorized(msg) { + notFound(msg) { return { - statusCode: 403, + statusCode: 404, body: { success: false, - error: msg ? msg : 'unauthorized' + error: msg ? msg : 'Resource not found' } }; } - notFound(msg) { + unauthorized(msg) { return { - statusCode: 404, + statusCode: 403, body: { success: false, - error: msg ? msg : 'Nothing was found' + error: msg ? msg : 'unauthorized' } }; } @@ -121,7 +127,7 @@ class API extends Restivus { routes.forEach((route) => { //Note: This is required due to Restivus calling `addRoute` in the constructor of itself - if (this.helperMethods) { + if (this.hasHelperMethods()) { Object.keys(endpoints).forEach((method) => { if (typeof endpoints[method] === 'function') { endpoints[method] = {action: endpoints[method]}; @@ -129,7 +135,7 @@ class API extends Restivus { //Add a try/catch for each endpoint const originalAction = endpoints[method].action; - endpoints[method].action = function() { + endpoints[method].action = function _internalRouteActionHandler() { this.logger.debug(`${ this.request.method.toUpperCase() }: ${ this.request.url }`); let result; try { @@ -155,7 +161,7 @@ class API extends Restivus { return result; }; - for (const [name, helperMethod] of this.helperMethods) { + for (const [name, helperMethod] of this.getHelperMethods()) { endpoints[method][name] = helperMethod; } @@ -321,9 +327,9 @@ class API extends Restivus { }; /* - Add a logout endpoint to the API - After the user is logged out, the onLoggedOut hook is called (see Restfully.configure() for - adding hook). + Add a logout endpoint to the API + After the user is logged out, the onLoggedOut hook is called (see Restfully.configure() for + adding hook). */ return this.addRoute('logout', { authRequired: true @@ -338,9 +344,6 @@ class API extends Restivus { } } - -RocketChat.API = {}; - const getUserAuth = function _getUserAuth() { const invalidResults = [undefined, null, false]; return { @@ -374,7 +377,13 @@ const getUserAuth = function _getUserAuth() { }; }; -const createApi = function(enableCors) { +RocketChat.API = { + helperMethods: new Map(), + getUserAuth, + ApiClass: API +}; + +const createApi = function _createApi(enableCors) { if (!RocketChat.API.v1 || RocketChat.API.v1._config.enableCors !== enableCors) { RocketChat.API.v1 = new API({ version: 'v1', diff --git a/packages/rocketchat-api/server/default/helpers/getLoggedInUser.js b/packages/rocketchat-api/server/default/helpers/getLoggedInUser.js deleted file mode 100644 index bfca9f0d11bf..000000000000 --- a/packages/rocketchat-api/server/default/helpers/getLoggedInUser.js +++ /dev/null @@ -1,12 +0,0 @@ -RocketChat.API.default.helperMethods.set('getLoggedInUser', function _getLoggedInUser() { - let user; - - if (this.request.headers['x-auth-token'] && this.request.headers['x-user-id']) { - user = RocketChat.models.Users.findOne({ - '_id': this.request.headers['x-user-id'], - 'services.resume.loginTokens.hashedToken': Accounts._hashLoginToken(this.request.headers['x-auth-token']) - }); - } - - return user; -}); diff --git a/packages/rocketchat-api/server/helpers/README.md b/packages/rocketchat-api/server/helpers/README.md new file mode 100644 index 000000000000..8437f7558dcb --- /dev/null +++ b/packages/rocketchat-api/server/helpers/README.md @@ -0,0 +1,4 @@ +# REST API Helpers + +## What are they? +Helpers are functions which get injected into the context of `this` on each request the REST API recieves. This allows for commonly used code, such as retriving the target user, to be placed in one spot and used throughout the entire REST API code base. diff --git a/packages/rocketchat-api/server/v1/helpers/getLoggedInUser.js b/packages/rocketchat-api/server/helpers/getLoggedInUser.js similarity index 78% rename from packages/rocketchat-api/server/v1/helpers/getLoggedInUser.js rename to packages/rocketchat-api/server/helpers/getLoggedInUser.js index ab9d141e8130..4589e13dda2b 100644 --- a/packages/rocketchat-api/server/v1/helpers/getLoggedInUser.js +++ b/packages/rocketchat-api/server/helpers/getLoggedInUser.js @@ -1,4 +1,4 @@ -RocketChat.API.v1.helperMethods.set('getLoggedInUser', function _getLoggedInUser() { +RocketChat.API.helperMethods.set('getLoggedInUser', function _getLoggedInUser() { let user; if (this.request.headers['x-auth-token'] && this.request.headers['x-user-id']) { diff --git a/packages/rocketchat-api/server/v1/helpers/getPaginationItems.js b/packages/rocketchat-api/server/helpers/getPaginationItems.js similarity index 92% rename from packages/rocketchat-api/server/v1/helpers/getPaginationItems.js rename to packages/rocketchat-api/server/helpers/getPaginationItems.js index dd1732df6c73..96052a56b848 100644 --- a/packages/rocketchat-api/server/v1/helpers/getPaginationItems.js +++ b/packages/rocketchat-api/server/helpers/getPaginationItems.js @@ -2,7 +2,7 @@ // If the count query param isn't defined, then we set it to the "API_Default_Count" setting // If the count is zero, then that means unlimited and is only allowed if the setting "API_Allow_Infinite_Count" is true -RocketChat.API.v1.helperMethods.set('getPaginationItems', function _getPaginationItems() { +RocketChat.API.helperMethods.set('getPaginationItems', function _getPaginationItems() { const hardUpperLimit = RocketChat.settings.get('API_Upper_Count_Limit') <= 0 ? 100 : RocketChat.settings.get('API_Upper_Count_Limit'); const defaultCount = RocketChat.settings.get('API_Default_Count') <= 0 ? 50 : RocketChat.settings.get('API_Default_Count'); const offset = this.queryParams.offset ? parseInt(this.queryParams.offset) : 0; diff --git a/packages/rocketchat-api/server/v1/helpers/getUserFromParams.js b/packages/rocketchat-api/server/helpers/getUserFromParams.js similarity index 90% rename from packages/rocketchat-api/server/v1/helpers/getUserFromParams.js rename to packages/rocketchat-api/server/helpers/getUserFromParams.js index c52296f0fb7a..b00ba0173724 100644 --- a/packages/rocketchat-api/server/v1/helpers/getUserFromParams.js +++ b/packages/rocketchat-api/server/helpers/getUserFromParams.js @@ -1,5 +1,5 @@ //Convenience method, almost need to turn it into a middleware of sorts -RocketChat.API.v1.helperMethods.set('getUserFromParams', function _getUserFromParams() { +RocketChat.API.helperMethods.set('getUserFromParams', function _getUserFromParams() { const doesntExist = { _doesntExist: true }; let user; const params = this.requestParams(); diff --git a/packages/rocketchat-api/server/v1/helpers/isUserFromParams.js b/packages/rocketchat-api/server/helpers/isUserFromParams.js similarity index 76% rename from packages/rocketchat-api/server/v1/helpers/isUserFromParams.js rename to packages/rocketchat-api/server/helpers/isUserFromParams.js index fab907bc96da..194011d93d91 100644 --- a/packages/rocketchat-api/server/v1/helpers/isUserFromParams.js +++ b/packages/rocketchat-api/server/helpers/isUserFromParams.js @@ -1,4 +1,4 @@ -RocketChat.API.v1.helperMethods.set('isUserFromParams', function _isUserFromParams() { +RocketChat.API.helperMethods.set('isUserFromParams', function _isUserFromParams() { const params = this.requestParams(); return (!params.userId && !params.username && !params.user) || diff --git a/packages/rocketchat-api/server/v1/helpers/parseJsonQuery.js b/packages/rocketchat-api/server/helpers/parseJsonQuery.js similarity index 97% rename from packages/rocketchat-api/server/v1/helpers/parseJsonQuery.js rename to packages/rocketchat-api/server/helpers/parseJsonQuery.js index 663a19f938d4..c01cc120e6a7 100644 --- a/packages/rocketchat-api/server/v1/helpers/parseJsonQuery.js +++ b/packages/rocketchat-api/server/helpers/parseJsonQuery.js @@ -1,4 +1,4 @@ -RocketChat.API.v1.helperMethods.set('parseJsonQuery', function _parseJsonQuery() { +RocketChat.API.helperMethods.set('parseJsonQuery', function _parseJsonQuery() { let sort; if (this.queryParams.sort) { try { diff --git a/packages/rocketchat-api/server/v1/helpers/requestParams.js b/packages/rocketchat-api/server/helpers/requestParams.js similarity index 54% rename from packages/rocketchat-api/server/v1/helpers/requestParams.js rename to packages/rocketchat-api/server/helpers/requestParams.js index bc5718313913..aa4290c00b6d 100644 --- a/packages/rocketchat-api/server/v1/helpers/requestParams.js +++ b/packages/rocketchat-api/server/helpers/requestParams.js @@ -1,3 +1,3 @@ -RocketChat.API.v1.helperMethods.set('requestParams', function _requestParams() { +RocketChat.API.helperMethods.set('requestParams', function _requestParams() { return ['POST', 'PUT'].includes(this.request.method) ? this.bodyParams : this.queryParams; }); diff --git a/packages/rocketchat-api/server/v1/channels.js b/packages/rocketchat-api/server/v1/channels.js index 087e0792de9c..c8dd2905385c 100644 --- a/packages/rocketchat-api/server/v1/channels.js +++ b/packages/rocketchat-api/server/v1/channels.js @@ -133,37 +133,82 @@ RocketChat.API.v1.addRoute('channels.close', { authRequired: true }, { } }); -RocketChat.API.v1.addRoute('channels.create', { authRequired: true }, { - post() { - if (!RocketChat.authz.hasPermission(this.userId, 'create-c')) { - return RocketChat.API.v1.unauthorized(); - } +// Channel -> create - if (!this.bodyParams.name) { - return RocketChat.API.v1.failure('Body param "name" is required'); - } +function createChannelValidator(params) { + if (!RocketChat.authz.hasPermission(params.user.value, 'create-c')) { + throw new Error('unauthorized'); + } - if (this.bodyParams.members && !_.isArray(this.bodyParams.members)) { - return RocketChat.API.v1.failure('Body param "members" must be an array if provided'); - } + if (!params.name || !params.name.value) { + throw new Error(`Param "${ params.name.key }" is required`); + } - if (this.bodyParams.customFields && !(typeof this.bodyParams.customFields === 'object')) { - return RocketChat.API.v1.failure('Body param "customFields" must be an object if provided'); - } + if (params.members && params.members.value && !_.isArray(params.members.value)) { + throw new Error(`Param "${ params.members.key }" must be an array if provided`); + } + + if (params.customFields && params.customFields.value && !(typeof params.customFields.value === 'object')) { + throw new Error(`Param "${ params.customFields.key }" must be an object if provided`); + } +} + +function createChannel(userId, params) { + let readOnly = false; + if (typeof params.readOnly !== 'undefined') { + readOnly = params.readOnly; + } + + let id; + Meteor.runAsUser(userId, () => { + id = Meteor.call('createChannel', params.name, params.members ? params.members : [], readOnly, params.customFields); + }); - let readOnly = false; - if (typeof this.bodyParams.readOnly !== 'undefined') { - readOnly = this.bodyParams.readOnly; + return { + channel: RocketChat.models.Rooms.findOneById(id.rid, { fields: RocketChat.API.v1.defaultFieldsToExclude }) + }; +} + +RocketChat.API.channels = {}; +RocketChat.API.channels.create = { + validate: createChannelValidator, + execute: createChannel +}; + +RocketChat.API.v1.addRoute('channels.create', { authRequired: true }, { + post() { + const userId = this.userId; + const bodyParams = this.bodyParams; + + let error; + + try { + RocketChat.API.channels.create.validate({ + user: { + value: userId + }, + name: { + value: bodyParams.name, + key: 'name' + }, + members: { + value: bodyParams.members, + key: 'members' + } + }); + } catch (e) { + if (e.message === 'unauthorized') { + error = RocketChat.API.v1.unauthorized(); + } else { + error = RocketChat.API.v1.failure(e.message); + } } - let id; - Meteor.runAsUser(this.userId, () => { - id = Meteor.call('createChannel', this.bodyParams.name, this.bodyParams.members ? this.bodyParams.members : [], readOnly, this.bodyParams.customFields); - }); + if (error) { + return error; + } - return RocketChat.API.v1.success({ - channel: RocketChat.models.Rooms.findOneById(id.rid, { fields: RocketChat.API.v1.defaultFieldsToExclude }) - }); + return RocketChat.API.v1.success(RocketChat.API.channels.create.execute(userId, bodyParams)); } }); @@ -404,8 +449,13 @@ RocketChat.API.v1.addRoute('channels.list', { authRequired: true }, { RocketChat.API.v1.addRoute('channels.list.joined', { authRequired: true }, { get() { const { offset, count } = this.getPaginationItems(); - const { sort, fields } = this.parseJsonQuery(); - let rooms = _.pluck(RocketChat.models.Subscriptions.findByTypeAndUserId('c', this.userId).fetch(), '_room'); + const { sort, fields, query } = this.parseJsonQuery(); + const ourQuery = Object.assign({}, query, { + t: 'c', + 'u._id': this.userId + }); + + let rooms = _.pluck(RocketChat.models.Subscriptions.find(ourQuery).fetch(), '_room'); const totalCount = rooms.length; rooms = RocketChat.models.Rooms.processQueryOptionsOnResult(rooms, { diff --git a/packages/rocketchat-api/server/v1/chat.js b/packages/rocketchat-api/server/v1/chat.js index 15f1500d0b2a..6a866923121c 100644 --- a/packages/rocketchat-api/server/v1/chat.js +++ b/packages/rocketchat-api/server/v1/chat.js @@ -255,3 +255,23 @@ RocketChat.API.v1.addRoute('chat.update', { authRequired: true }, { }); } }); + +RocketChat.API.v1.addRoute('chat.react', { authRequired: true }, { + post() { + if (!this.bodyParams.messageId || !this.bodyParams.messageId.trim()) { + throw new Meteor.Error('error-messageid-param-not-provided', 'The required "messageId" param is missing.'); + } + + const msg = RocketChat.models.Messages.findOneById(this.bodyParams.messageId); + + if (!msg) { + throw new Meteor.Error('error-message-not-found', 'The provided "messageId" does not match any existing message.'); + } + + const emoji = this.bodyParams.emoji; + + Meteor.runAsUser(this.userId, () => Meteor.call('setReaction', emoji, msg._id)); + + return RocketChat.API.v1.success(); + } +}); diff --git a/packages/rocketchat-api/server/v1/groups.js b/packages/rocketchat-api/server/v1/groups.js index ccc7790978c5..6e12f4b4d225 100644 --- a/packages/rocketchat-api/server/v1/groups.js +++ b/packages/rocketchat-api/server/v1/groups.js @@ -317,8 +317,13 @@ RocketChat.API.v1.addRoute('groups.leave', { authRequired: true }, { RocketChat.API.v1.addRoute('groups.list', { authRequired: true }, { get() { const { offset, count } = this.getPaginationItems(); - const { sort, fields } = this.parseJsonQuery(); - let rooms = _.pluck(RocketChat.models.Subscriptions.findByTypeAndUserId('p', this.userId).fetch(), '_room'); + const { sort, fields, query } = this.parseJsonQuery(); + const ourQuery = Object.assign({}, query, { + t: 'p', + 'u._id': this.userId + }); + + let rooms = _.pluck(RocketChat.models.Subscriptions.find(ourQuery).fetch(), '_room'); const totalCount = rooms.length; rooms = RocketChat.models.Rooms.processQueryOptionsOnResult(rooms, { @@ -344,8 +349,10 @@ RocketChat.API.v1.addRoute('groups.listAll', { authRequired: true }, { return RocketChat.API.v1.unauthorized(); } const { offset, count } = this.getPaginationItems(); - const { sort, fields } = this.parseJsonQuery(); - let rooms = RocketChat.models.Rooms.findByType('p').fetch(); + const { sort, fields, query } = this.parseJsonQuery(); + const ourQuery = Object.assign({}, query, { t: 'p' }); + + let rooms = RocketChat.models.Rooms.find(ourQuery).fetch(); const totalCount = rooms.length; rooms = RocketChat.models.Rooms.processQueryOptionsOnResult(rooms, { diff --git a/packages/rocketchat-api/server/v1/im.js b/packages/rocketchat-api/server/v1/im.js index f5bff08b80c4..4a554f6f585a 100644 --- a/packages/rocketchat-api/server/v1/im.js +++ b/packages/rocketchat-api/server/v1/im.js @@ -217,8 +217,13 @@ RocketChat.API.v1.addRoute(['dm.messages.others', 'im.messages.others'], { authR RocketChat.API.v1.addRoute(['dm.list', 'im.list'], { authRequired: true }, { get() { const { offset, count } = this.getPaginationItems(); - const { sort, fields } = this.parseJsonQuery(); - let rooms = _.pluck(RocketChat.models.Subscriptions.findByTypeAndUserId('d', this.userId).fetch(), '_room'); + const { sort, fields, query } = this.parseJsonQuery(); + const ourQuery = Object.assign({}, query, { + t: 'd', + 'u._id': this.userId + }); + + let rooms = _.pluck(RocketChat.models.Subscriptions.find(ourQuery).fetch(), '_room'); const totalCount = rooms.length; rooms = RocketChat.models.Rooms.processQueryOptionsOnResult(rooms, { diff --git a/packages/rocketchat-api/server/v1/misc.js b/packages/rocketchat-api/server/v1/misc.js index 3960511cef5d..c1bf99ef3e99 100644 --- a/packages/rocketchat-api/server/v1/misc.js +++ b/packages/rocketchat-api/server/v1/misc.js @@ -47,34 +47,65 @@ RocketChat.API.v1.addRoute('shield.svg', { authRequired: false }, { get() { const { type, channel, name, icon } = this.queryParams; if (!RocketChat.settings.get('API_Enable_Shields')) { - throw new Meteor.Error('error-endpoint-disabled', 'This endpoint is disabled', { route: '/api/v1/shields.svg' }); + throw new Meteor.Error('error-endpoint-disabled', 'This endpoint is disabled', { route: '/api/v1/shield.svg' }); } + const types = RocketChat.settings.get('API_Shield_Types'); if (type && (types !== '*' && !types.split(',').map((t) => t.trim()).includes(type))) { - throw new Meteor.Error('error-shield-disabled', 'This shield type is disabled', { route: '/api/v1/shields.svg' }); + throw new Meteor.Error('error-shield-disabled', 'This shield type is disabled', { route: '/api/v1/shield.svg' }); } + const hideIcon = icon === 'false'; if (hideIcon && (!name || !name.trim())) { return RocketChat.API.v1.failure('Name cannot be empty when icon is hidden'); } + let text; + let backgroundColor = '#4c1'; switch (type) { case 'online': if (Date.now() - onlineCacheDate > cacheInvalid) { onlineCache = RocketChat.models.Users.findUsersNotOffline().count(); onlineCacheDate = Date.now(); } + text = `${ onlineCache } ${ TAPi18n.__('Online') }`; break; case 'channel': if (!channel) { return RocketChat.API.v1.failure('Shield channel is required for type "channel"'); } + text = `#${ channel }`; break; + case 'user': + const user = this.getUserFromParams(); + + // Respect the server's choice for using their real names or not + if (user.name && RocketChat.settings.get('UI_Use_Real_Name')) { + text = `${ user.name }`; + } else { + text = `@${ user.username }`; + } + + switch (user.status) { + case 'online': + backgroundColor = '#1fb31f'; + break; + case 'away': + backgroundColor = '#dc9b01'; + break; + case 'busy': + backgroundColor = '#bc2031'; + break; + case 'offline': + backgroundColor = '#a5a1a1'; + } + break; default: text = TAPi18n.__('Join_Chat').toUpperCase(); } + const iconSize = hideIcon ? 7 : 24; const leftSize = name ? name.length * 6 + 7 + iconSize : iconSize; const rightSize = text.length * 6 + 20; @@ -93,10 +124,10 @@ RocketChat.API.v1.addRoute('shield.svg', { authRequired: false }, { - + - ${ hideIcon ? '' : '' } + ${ hideIcon ? '' : '' } ${ name ? `${ name } ${ name }` : '' } diff --git a/packages/rocketchat-api/server/v1/permissions.js b/packages/rocketchat-api/server/v1/permissions.js new file mode 100644 index 000000000000..68ccb81c01e7 --- /dev/null +++ b/packages/rocketchat-api/server/v1/permissions.js @@ -0,0 +1,14 @@ +/** + This API returns all permissions that exists + on the server, with respective roles. + + Method: GET + Route: api/v1/permissions + */ +RocketChat.API.v1.addRoute('permissions', { authRequired: true }, { + get() { + const result = Meteor.runAsUser(this.userId, () => Meteor.call('permissions/get')); + + return RocketChat.API.v1.success(result); + } +}); diff --git a/packages/rocketchat-api/server/v1/spotlight.js b/packages/rocketchat-api/server/v1/spotlight.js new file mode 100644 index 000000000000..9dbea532fa11 --- /dev/null +++ b/packages/rocketchat-api/server/v1/spotlight.js @@ -0,0 +1,27 @@ +/** + This API returns the result of a query of rooms + and users, using Meteor's Spotlight method. + + Method: GET + Route: api/v1/spotlight + Query params: + - query: The term to be searched. + */ +RocketChat.API.v1.addRoute('spotlight', { authRequired: true }, { + get() { + check(this.queryParams, { + query: String + }); + + const { query } = this.queryParams; + + const result = Meteor.runAsUser(this.userId, () => + Meteor.call('spotlight', query, null, { + rooms: true, + users: true + }) + ); + + return RocketChat.API.v1.success(result); + } +}); diff --git a/packages/rocketchat-api/server/v1/subscriptions.js b/packages/rocketchat-api/server/v1/subscriptions.js index 9b82c0de0007..0cc9c89a7dc5 100644 --- a/packages/rocketchat-api/server/v1/subscriptions.js +++ b/packages/rocketchat-api/server/v1/subscriptions.js @@ -24,3 +24,26 @@ RocketChat.API.v1.addRoute('subscriptions.get', { authRequired: true }, { return RocketChat.API.v1.success(result); } }); + +/** + This API is suppose to mark any room as read. + + Method: POST + Route: api/v1/subscriptions.read + Params: + - rid: The rid of the room to be marked as read. + */ +RocketChat.API.v1.addRoute('subscriptions.read', { authRequired: true }, { + post() { + check(this.bodyParams, { + rid: String + }); + + Meteor.runAsUser(this.userId, () => + Meteor.call('readMessages', this.bodyParams.rid) + ); + + return RocketChat.API.v1.success(); + } +}); + diff --git a/packages/rocketchat-api/server/v1/users.js b/packages/rocketchat-api/server/v1/users.js index 234e73e83ac6..ab92925e3c39 100644 --- a/packages/rocketchat-api/server/v1/users.js +++ b/packages/rocketchat-api/server/v1/users.js @@ -270,3 +270,94 @@ RocketChat.API.v1.addRoute('users.createToken', { authRequired: true }, { return data ? RocketChat.API.v1.success({data}) : RocketChat.API.v1.unauthorized(); } }); + +RocketChat.API.v1.addRoute('users.getPreferences', { authRequired: true }, { + get() { + const user = RocketChat.models.Users.findOneById(this.userId); + if (user.settings) { + const preferences = user.settings.preferences; + preferences['language'] = user.language; + + return RocketChat.API.v1.success({ + preferences + }); + } else { + return RocketChat.API.v1.failure(TAPi18n.__('Accounts_Default_User_Preferences_not_available').toUpperCase()); + } + } +}); + +RocketChat.API.v1.addRoute('users.setPreferences', { authRequired: true }, { + post() { + check(this.bodyParams, { + userId: Match.Maybe(String), + data: Match.ObjectIncluding({ + newRoomNotification: Match.Maybe(String), + newMessageNotification: Match.Maybe(String), + useEmojis: Match.Maybe(Boolean), + convertAsciiEmoji: Match.Maybe(Boolean), + saveMobileBandwidth: Match.Maybe(Boolean), + collapseMediaByDefault: Match.Maybe(Boolean), + autoImageLoad: Match.Maybe(Boolean), + emailNotificationMode: Match.Maybe(String), + roomsListExhibitionMode: Match.Maybe(String), + unreadAlert: Match.Maybe(Boolean), + notificationsSoundVolume: Match.Maybe(Number), + desktopNotifications: Match.Maybe(String), + mobileNotifications: Match.Maybe(String), + enableAutoAway: Match.Maybe(Boolean), + highlights: Match.Maybe(Array), + desktopNotificationDuration: Match.Maybe(Number), + viewMode: Match.Maybe(Number), + hideUsernames: Match.Maybe(Boolean), + hideRoles: Match.Maybe(Boolean), + hideAvatars: Match.Maybe(Boolean), + hideFlexTab: Match.Maybe(Boolean), + sendOnEnter: Match.Maybe(String), + roomCounterSidebar: Match.Maybe(Boolean), + language: Match.Maybe(String), + sidebarShowFavorites: Match.Optional(Boolean), + sidebarShowUnread: Match.Optional(Boolean), + sidebarSortby: Match.Optional(String), + sidebarViewMode: Match.Optional(String), + sidebarHideAvatar: Match.Optional(Boolean), + mergeChannels: Match.Optional(Boolean), + muteFocusedConversations: Match.Optional(Boolean) + }) + }); + + let preferences; + const userId = this.bodyParams.userId ? this.bodyParams.userId : this.userId; + if (this.bodyParams.data.language) { + const language = this.bodyParams.data.language; + delete this.bodyParams.data.language; + preferences = _.extend({ _id: userId, settings: { preferences: this.bodyParams.data }, language }); + } else { + preferences = _.extend({ _id: userId, settings: { preferences: this.bodyParams.data }}); + } + + Meteor.runAsUser(this.userId, () => RocketChat.saveUser(this.userId, preferences)); + + return RocketChat.API.v1.success({ user: RocketChat.models.Users.findOneById(this.bodyParams.userId, { fields: preferences }) }); + } +}); + +/** + This API returns the logged user roles. + + Method: GET + Route: api/v1/user.roles + */ +RocketChat.API.v1.addRoute('user.roles', { authRequired: true }, { + get() { + let currentUserRoles = {}; + + const result = Meteor.runAsUser(this.userId, () => Meteor.call('getUserRoles')); + + if (Array.isArray(result) && result.length > 0) { + currentUserRoles = result[0]; + } + + return RocketChat.API.v1.success(currentUserRoles); + } +}); diff --git a/packages/rocketchat-apps/.gitignore b/packages/rocketchat-apps/.gitignore new file mode 100644 index 000000000000..918ef5d781a1 --- /dev/null +++ b/packages/rocketchat-apps/.gitignore @@ -0,0 +1 @@ +.npm diff --git a/packages/rocketchat-apps/README.md b/packages/rocketchat-apps/README.md new file mode 100644 index 000000000000..65b130d4c5d7 --- /dev/null +++ b/packages/rocketchat-apps/README.md @@ -0,0 +1,11 @@ +# Rocket.Chat Apps +Finally! :smile: + +## What is an "Orchestrator"? +An orchestrator is the file/class which is responsible for orchestrating (starting up) everything which is required of the system to get up and going. There are two of these. One for the server and one for the client. + +## What is a "Bridge"? +A bridge is a file/class which is responsible for bridging the Rocket.Chat system's data and the App system's data. They are implementations of the interfaces inside of the Rocket.Chat Apps-engine project `src/server/bridges`. They allow the two systems to talk to each other (hince the name bridge, as they "bridge the gap"). + +## What is a "Converter"? +A converter does what the name implies, it handles converting from one system's data type into the other's. diff --git a/packages/rocketchat-apps/assets/stylesheets/apps.css b/packages/rocketchat-apps/assets/stylesheets/apps.css new file mode 100644 index 000000000000..b8800c68d5f6 --- /dev/null +++ b/packages/rocketchat-apps/assets/stylesheets/apps.css @@ -0,0 +1,20 @@ +input.app-author-name { + width: auto !important; + display: inline-block !important; +} + +div.app-enable-loading .loading-animation { + justify-content: left; + margin-left: 50px; +} + +div.apps-error { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: calc(100% - 60px); + padding: 25px 40px; + width: 100%; + font-size: 45px; +} diff --git a/packages/rocketchat-apps/client/admin/appInstall.html b/packages/rocketchat-apps/client/admin/appInstall.html new file mode 100644 index 000000000000..0444b82f1fb4 --- /dev/null +++ b/packages/rocketchat-apps/client/admin/appInstall.html @@ -0,0 +1,35 @@ + diff --git a/packages/rocketchat-apps/client/admin/appInstall.js b/packages/rocketchat-apps/client/admin/appInstall.js new file mode 100644 index 000000000000..e32ec62a694c --- /dev/null +++ b/packages/rocketchat-apps/client/admin/appInstall.js @@ -0,0 +1,75 @@ +// The idea of this page is to allow them to select a file from their system +// or enter a url or visit this page with a url attached which then their server +// downloads the file from the url. After it's either uploaded or downloaded, +// then the server parses it and takes them to that App's setting page +// to then allow them to enable it and go from there. A brand new App +// will NOT be enabled by default, they will have to manually enable it. However, +// if you're developing it and using a rest api with a particular parameter passed +// then it will be enabled by default for development reasons. The server prefers a url +// over the passed in body, so if both are found it will only use the url. + +Template.appInstall.helpers({ + isInstalling() { + return Template.instance().isInstalling.get(); + }, + appUrl() { + return Template.instance().appUrl.get(); + } +}); + +Template.appInstall.onCreated(function() { + const instance = this; + instance.isInstalling = new ReactiveVar(false); + instance.appUrl = new ReactiveVar(''); + + // Allow passing in a url as a query param to show installation of + if (FlowRouter.getQueryParam('url')) { + instance.appUrl.set(FlowRouter.getQueryParam('url')); + FlowRouter.setQueryParams({ url: null }); + } +}); + +Template.appInstall.events({ + 'click .install'(e, t) { + const url = $('#appPackage').val().trim(); + + // Handle url installations + if (url) { + t.isInstalling.set(true); + RocketChat.API.post('apps', { url }).then((result) => { + FlowRouter.go(`/admin/apps/${ result.app.id }`); + }).catch((err) => { + console.warn('err', err); + t.isInstalling.set(false); + }); + + return; + } + + const files = $('#upload-app')[0].files; + if (!(files instanceof FileList)) { + return; + } + + const data = new FormData(); + for (let i = 0; i < files.length; i++) { + const f = files[0]; + + if (f.type === 'application/zip') { + data.append('app', f, f.name); + } + } + + if (!data.has('app')) { + return; + } + + t.isInstalling.set(true); + RocketChat.API.upload('apps', data).then((result) => { + FlowRouter.go(`/admin/apps/${ result.app.id }`); + }).catch((err) => { + console.warn('err', err); + t.isInstalling.set(false); + }); + } +}); diff --git a/packages/rocketchat-apps/client/admin/appLogs.html b/packages/rocketchat-apps/client/admin/appLogs.html new file mode 100644 index 000000000000..431f9a85eef2 --- /dev/null +++ b/packages/rocketchat-apps/client/admin/appLogs.html @@ -0,0 +1,70 @@ + diff --git a/packages/rocketchat-apps/client/admin/appLogs.js b/packages/rocketchat-apps/client/admin/appLogs.js new file mode 100644 index 000000000000..94071b3564c3 --- /dev/null +++ b/packages/rocketchat-apps/client/admin/appLogs.js @@ -0,0 +1,82 @@ +import moment from 'moment'; +import hljs from 'highlight.js'; + +Template.appLogs.onCreated(function() { + const instance = this; + this.id = new ReactiveVar(FlowRouter.getParam('appId')); + this.ready = new ReactiveVar(false); + this.hasError = new ReactiveVar(false); + this.theError = new ReactiveVar(''); + this.app = new ReactiveVar({}); + this.logs = new ReactiveVar([]); + + const id = this.id.get(); + + Promise.all([ + RocketChat.API.get(`apps/${ id }`), + RocketChat.API.get(`apps/${ id }/logs`) + ]).then((results) => { + + instance.app.set(results[0].app); + instance.logs.set(results[1].logs); + + this.ready.set(true); + }).catch((e) => { + instance.hasError.set(true); + instance.theError.set(e.message); + }); +}); + +Template.appLogs.helpers({ + isReady() { + if (Template.instance().ready) { + return Template.instance().ready.get(); + } + + return false; + }, + hasError() { + if (Template.instance().hasError) { + return Template.instance().hasError.get(); + } + + return false; + }, + theError() { + if (Template.instance().theError) { + return Template.instance().theError.get(); + } + + return ''; + }, + app() { + return Template.instance().app.get(); + }, + logs() { + return Template.instance().logs.get(); + }, + formatDate(date) { + return moment(date).format('L LTS'); + }, + jsonStringify(data) { + if (!data) { + return ''; + } else if (typeof data === 'object') { + return hljs.highlight('json', JSON.stringify(data, null, 2)).value; + } else { + return hljs.highlight('json', data).value; + } + } +}); + +Template.appLogs.events({ + 'click .expand': (e) => { + $(e.currentTarget).closest('.section').removeClass('section-collapsed'); + $(e.currentTarget).closest('button').removeClass('expand').addClass('collapse').find('span').text(TAPi18n.__('Collapse')); + }, + + 'click .collapse': (e) => { + $(e.currentTarget).closest('.section').addClass('section-collapsed'); + $(e.currentTarget).closest('button').addClass('expand').removeClass('collapse').find('span').text(TAPi18n.__('Expand')); + } +}); diff --git a/packages/rocketchat-apps/client/admin/appManage.html b/packages/rocketchat-apps/client/admin/appManage.html new file mode 100644 index 000000000000..8bc9c6ea98eb --- /dev/null +++ b/packages/rocketchat-apps/client/admin/appManage.html @@ -0,0 +1,261 @@ + + diff --git a/packages/rocketchat-apps/client/admin/appManage.js b/packages/rocketchat-apps/client/admin/appManage.js new file mode 100644 index 000000000000..8341928043b9 --- /dev/null +++ b/packages/rocketchat-apps/client/admin/appManage.js @@ -0,0 +1,227 @@ +import _ from 'underscore'; +import s from 'underscore.string'; + +import { AppEvents } from '../communication'; + +Template.appManage.onCreated(function() { + const instance = this; + this.id = new ReactiveVar(FlowRouter.getParam('appId')); + this.ready = new ReactiveVar(false); + this.hasError = new ReactiveVar(false); + this.theError = new ReactiveVar(''); + this.processingEnabled = new ReactiveVar(false); + this.app = new ReactiveVar({}); + this.settings = new ReactiveVar({}); + + const id = this.id.get(); + + function _morphSettings(settings) { + Object.keys(settings).forEach((k) => { + settings[k].i18nPlaceholder = settings[k].i18nPlaceholder || ' '; + settings[k].value = settings[k].value || settings[k].packageValue; + settings[k].oldValue = settings[k].value; + }); + + instance.settings.set(settings); + } + + Promise.all([ + RocketChat.API.get(`apps/${ id }`), + RocketChat.API.get(`apps/${ id }/settings`) + ]).then((results) => { + instance.app.set(results[0].app); + _morphSettings(results[1].settings); + + this.ready.set(true); + }).catch((e) => { + instance.hasError.set(true); + instance.theError.set(e.message); + }); + + instance.onStatusChanged = function _onStatusChanged({ appId, status }) { + if (appId !== id) { + return; + } + + const app = instance.app.get(); + app.status = status; + instance.app.set(app); + }; + + instance.onSettingUpdated = function _onSettingUpdated({ appId }) { + if (appId !== id) { + return; + } + + RocketChat.API.get(`apps/${ id }/settings`).then((result) => { + _morphSettings(result.settings); + }); + }; + + window.Apps.getWsListener().registerListener(AppEvents.APP_STATUS_CHANGE, instance.onStatusChanged); + window.Apps.getWsListener().registerListener(AppEvents.APP_SETTING_UPDATED, instance.onSettingUpdated); +}); + +Template.apps.onDestroyed(function() { + const instance = this; + + window.Apps.getWsListener().unregisterListener(AppEvents.APP_STATUS_CHANGE, instance.onStatusChanged); + window.Apps.getWsListener().unregisterListener(AppEvents.APP_SETTING_UPDATED, instance.onSettingUpdated); +}); + +Template.appManage.helpers({ + isReady() { + if (Template.instance().ready) { + return Template.instance().ready.get(); + } + + return false; + }, + hasError() { + if (Template.instance().hasError) { + return Template.instance().hasError.get(); + } + + return false; + }, + theError() { + if (Template.instance().theError) { + return Template.instance().theError.get(); + } + + return ''; + }, + isProcessingEnabled() { + if (Template.instance().processingEnabled) { + return Template.instance().processingEnabled.get(); + } + + return false; + }, + isEnabled() { + if (!Template.instance().app) { + return false; + } + + const info = Template.instance().app.get(); + + return info.status === 'auto_enabled' || info.status === 'manually_enabled'; + }, + app() { + return Template.instance().app.get(); + }, + settings() { + return Object.values(Template.instance().settings.get()); + }, + parseDescription(i18nDescription) { + const item = RocketChat.Markdown.parseMessageNotEscaped({ html: t(i18nDescription) }); + + item.tokens.forEach((t) => item.html = item.html.replace(t.token, t.text)); + + return item.html; + } +}); + +Template.appManage.events({ + 'click .expand': (e) => { + $(e.currentTarget).closest('.section').removeClass('section-collapsed'); + $(e.currentTarget).closest('button').removeClass('expand').addClass('collapse').find('span').text(TAPi18n.__('Collapse')); + $('.CodeMirror').each((index, codeMirror) => codeMirror.CodeMirror.refresh()); + }, + + 'click .collapse': (e) => { + $(e.currentTarget).closest('.section').addClass('section-collapsed'); + $(e.currentTarget).closest('button').addClass('expand').removeClass('collapse').find('span').text(TAPi18n.__('Expand')); + }, + + 'change #enabled': (e, t) => { + t.processingEnabled.set(true); + $('#enabled').prop('disabled', true); + + const status = $('#enabled').prop('checked') ? 'manually_enabled' : 'manually_disabled'; + RocketChat.API.post(`apps/${ t.id.get() }/status`, { status }).then((result) => { + const info = t.app.get(); + info.status = result.status; + t.app.set(info); + + if (info.status.indexOf('disabled') !== -1) { + $('#enabled').prop('checked', false); + } + }).catch(() => { + $('#enabled').prop('checked', !$('#enabled').prop('checked')); + }).then(() => { + t.processingEnabled.set(false); + $('#enabled').prop('disabled', false); + }); + }, + + 'click .uninstall': (e, t) => { + t.ready.set(false); + + RocketChat.API.delete(`apps/${ t.id.get() }`).then(() => { + FlowRouter.go('/admin/apps'); + }).catch((err) => { + console.warn('Error:', err); + t.ready.set(true); + }); + }, + + 'click .logs': (e, t) => { + FlowRouter.go(`/admin/apps/${ t.id.get() }/logs`); + }, + + 'click .save': (e, t) => { + const toSave = []; + + Object.keys(t.settings.get()).forEach((k) => { + const setting = t.settings.get()[k]; + if (setting.hasChanged) { + toSave.push(setting); + } + }); + + if (toSave.length === 0) { + console.log('Nothing to save..'); + return; + } + + RocketChat.API.post(`apps/${ t.id.get() }/settings`, undefined, { settings: toSave }).then((result) => { + console.log('Updating results:', result); + result.updated.forEach((setting) => { + t.settings.get()[setting.id].oldValue = setting.value; + }); + }); + }, + + 'click .input.checkbox label': (e, t) => { + const labelFor = $(e.currentTarget).attr('for'); + const isChecked = $(`input[name="${ labelFor }"]`).prop('checked'); + + $(`input[name="${ labelFor }"]`).prop('checked', !isChecked); + + const setting = t.settings.get()[labelFor]; + + if (setting) { + setting.value = !isChecked; + t.settings.get()[labelFor].hasChanged = setting.oldValue !== setting.value; + } + }, + + 'change .input-monitor, keyup .input-monitor': _.throttle(function(e, t) { + let value = s.trim($(e.target).val()); + switch (this.type) { + case 'int': + value = parseInt(value); + break; + case 'boolean': + value = value === '1'; + } + + const setting = t.settings.get()[this.id]; + setting.value = value; + + if (setting.oldValue !== setting.value) { + t.settings.get()[this.id].hasChanged = true; + } + }, 500) +}); diff --git a/packages/rocketchat-apps/client/admin/apps.html b/packages/rocketchat-apps/client/admin/apps.html new file mode 100644 index 000000000000..977c0243a890 --- /dev/null +++ b/packages/rocketchat-apps/client/admin/apps.html @@ -0,0 +1,33 @@ + diff --git a/packages/rocketchat-apps/client/admin/apps.js b/packages/rocketchat-apps/client/admin/apps.js new file mode 100644 index 000000000000..9582e1e494ab --- /dev/null +++ b/packages/rocketchat-apps/client/admin/apps.js @@ -0,0 +1,74 @@ +import { AppEvents } from '../communication'; + +Template.apps.onCreated(function() { + const instance = this; + this.ready = new ReactiveVar(false); + this.apps = new ReactiveVar([]); + + RocketChat.API.get('apps').then((result) => { + instance.apps.set(result.apps); + instance.ready.set(true); + }); + + instance.onAppAdded = function _appOnAppAdded(appId) { + RocketChat.API.get(`apps/${ appId }`).then((result) => { + const apps = instance.apps.get(); + apps.push(result.app); + instance.apps.set(apps); + }); + }; + + instance.onAppRemoved = function _appOnAppRemoved(appId) { + const apps = instance.apps.get(); + + let index = -1; + apps.find((item, i) => { + if (item.id === appId) { + index = i; + return true; + } + }); + + apps.splice(index, 1); + instance.apps.set(apps); + }; + + window.Apps.getWsListener().registerListener(AppEvents.APP_ADDED, instance.onAppAdded); + window.Apps.getWsListener().registerListener(AppEvents.APP_REMOVED, instance.onAppAdded); +}); + +Template.apps.onDestroyed(function() { + const instance = this; + + window.Apps.getWsListener().unregisterListener(AppEvents.APP_ADDED, instance.onAppAdded); + window.Apps.getWsListener().unregisterListener(AppEvents.APP_REMOVED, instance.onAppAdded); +}); + +Template.apps.helpers({ + isReady() { + if (Template.instance().ready != null) { + return Template.instance().ready.get(); + } + + return false; + }, + apps() { + return Template.instance().apps.get(); + } +}); + +Template.apps.events({ + 'click .manage'() { + const rl = this; + + if (rl && rl.id) { + FlowRouter.go(`/admin/apps/${ rl.id }`); + } else { + // show an error ? I don't think this should ever happen + } + }, + + 'click [data-button="install"]'() { + FlowRouter.go('/admin/app/install'); + } +}); diff --git a/packages/rocketchat-apps/client/communication/index.js b/packages/rocketchat-apps/client/communication/index.js new file mode 100644 index 000000000000..8878b65fcf21 --- /dev/null +++ b/packages/rocketchat-apps/client/communication/index.js @@ -0,0 +1,3 @@ +import { AppWebsocketReceiver, AppEvents } from './websockets'; + +export { AppWebsocketReceiver, AppEvents }; diff --git a/packages/rocketchat-apps/client/communication/websockets.js b/packages/rocketchat-apps/client/communication/websockets.js new file mode 100644 index 000000000000..2f2ccc9aa7e2 --- /dev/null +++ b/packages/rocketchat-apps/client/communication/websockets.js @@ -0,0 +1,82 @@ +export const AppEvents = Object.freeze({ + APP_ADDED: 'app/added', + APP_REMOVED: 'app/removed', + APP_UPDATED: 'app/updated', + APP_STATUS_CHANGE: 'app/statusUpdate', + APP_SETTING_UPDATED: 'app/settingUpdated', + COMMAND_ADDED: 'command/added', + COMMAND_DISABLED: 'command/disabled', + COMMAND_UPDATED: 'command/updated', + COMMAND_REMOVED: 'command/removed' +}); + +export class AppWebsocketReceiver { + constructor(orch) { + this.orch = orch; + this.streamer = new Meteor.Streamer('apps'); + + this.streamer.on(AppEvents.APP_ADDED, this.onAppAdded.bind(this)); + this.streamer.on(AppEvents.APP_REMOVED, this.onAppRemoved.bind(this)); + this.streamer.on(AppEvents.APP_UPDATED, this.onAppUpdated.bind(this)); + this.streamer.on(AppEvents.APP_STATUS_CHANGE, this.onAppStatusUpdated.bind(this)); + this.streamer.on(AppEvents.APP_SETTING_UPDATED, this.onAppSettingUpdated.bind(this)); + this.streamer.on(AppEvents.COMMAND_ADDED, this.onCommandAdded.bind(this)); + this.streamer.on(AppEvents.COMMAND_DISABLED, this.onCommandDisabled.bind(this)); + this.streamer.on(AppEvents.COMMAND_UPDATED, this.onCommandUpdated.bind(this)); + this.streamer.on(AppEvents.COMMAND_REMOVED, this.onCommandDisabled.bind(this)); + + this.listeners = {}; + + Object.keys(AppEvents).forEach((v) => { + this.listeners[AppEvents[v]] = []; + }); + } + + registerListener(event, listener) { + this.listeners[event].push(listener); + } + + unregisterListener(event, listener) { + this.listeners[event].splice(this.listeners[event].indexOf(listener), 1); + } + + onAppAdded(appId) { + RocketChat.API.get(`apps/${ appId }/languages`).then((result) => { + this.orch.parseAndLoadLanguages(result.languages); + }); + + this.listeners[AppEvents.APP_ADDED].forEach((listener) => listener(appId)); + } + + onAppRemoved(appId) { + this.listeners[AppEvents.APP_REMOVED].forEach((listener) => listener(appId)); + } + + onAppUpdated(appId) { + this.listeners[AppEvents.APP_UPDATED].forEach((listener) => listener(appId)); + } + + onAppStatusUpdated({ appId, status }) { + this.listeners[AppEvents.APP_STATUS_CHANGE].forEach((listener) => listener({ appId, status })); + } + + onAppSettingUpdated({ appId }) { + this.listeners[AppEvents.APP_SETTING_UPDATED].forEach((listener) => listener({ appId })); + } + + onCommandAdded(command) { + RocketChat.API.v1.get('commands.get', { command }).then((result) => { + RocketChat.slashCommands.commands[command] = result.command; + }); + } + + onCommandDisabled(command) { + delete RocketChat.slashCommands.commands[command]; + } + + onCommandUpdated(command) { + RocketChat.API.v1.get('commands.get', { command }).then((result) => { + RocketChat.slashCommands.commands[command] = result.command; + }); + } +} diff --git a/packages/rocketchat-apps/client/orchestrator.js b/packages/rocketchat-apps/client/orchestrator.js new file mode 100644 index 000000000000..fc75039fff32 --- /dev/null +++ b/packages/rocketchat-apps/client/orchestrator.js @@ -0,0 +1,74 @@ +import { AppWebsocketReceiver } from './communication'; + +class AppClientOrchestrator { + constructor() { + this.ws = new AppWebsocketReceiver(this); + + this._addAdminMenuOption(); + + Meteor.defer(() => this._loadLanguages()); + } + + getWsListener() { + return this.ws; + } + + _addAdminMenuOption() { + RocketChat.AdminBox.addOption({ + href: 'apps', + i18nLabel: 'Apps', + permissionGranted() { + return RocketChat.authz.hasAtLeastOnePermission(['manage-apps']); + } + }); + } + + _loadLanguages() { + RocketChat.API.get('apps/languages').then((info) => { + info.apps.forEach((rlInfo) => this.parseAndLoadLanguages(rlInfo.languages)); + }); + } + + parseAndLoadLanguages(languages) { + Object.keys(languages).forEach((key) => { + try { + TAPi18next.addResourceBundle(key, 'project', languages[key]); + } catch (e) { + // Failed to parse the json + } + }); + } +} + +Meteor.startup(function _rlClientOrch() { + Meteor.call('apps/is-enabled', (error, e) => e ? window.Apps = new AppClientOrchestrator() : undefined); +}); + +// Bah, this has to be done *before* `Meteor.startup` +FlowRouter.route('/admin/apps', { + name: 'apps', + action() { + BlazeLayout.render('main', { center: 'apps' }); + } +}); + +FlowRouter.route('/admin/app/install', { + name: 'app-install', + action() { + BlazeLayout.render('main', { center: 'appInstall' }); + } +}); + +FlowRouter.route('/admin/apps/:appId', { + name: 'app-manage', + action() { + BlazeLayout.render('main', { center: 'appManage' }); + } +}); + +FlowRouter.route('/admin/apps/:appId/logs', { + name: 'app-logs', + action() { + BlazeLayout.render('main', { center: 'appLogs' }); + } +}); diff --git a/packages/rocketchat-apps/lib/Apps.js b/packages/rocketchat-apps/lib/Apps.js new file mode 100644 index 000000000000..2a232ab0d0b2 --- /dev/null +++ b/packages/rocketchat-apps/lib/Apps.js @@ -0,0 +1,2 @@ +// Please see both server and client's repsective "orchestrator" file for the contents +Apps = {}; diff --git a/packages/rocketchat-apps/package.js b/packages/rocketchat-apps/package.js new file mode 100644 index 000000000000..3a96da97e885 --- /dev/null +++ b/packages/rocketchat-apps/package.js @@ -0,0 +1,92 @@ +Package.describe({ + name: 'rocketchat:apps', + version: '1.0.0' +}); + +Package.onUse(function(api) { + api.use([ + 'ecmascript', + 'rocketchat:lib', + 'rocketchat:api', + 'templating' + ]); + + api.use(['reactive-var', 'kadira:flow-router', 'underscore'], 'client'); + + api.addFiles('lib/Apps.js', ['client', 'server']); + + // Storage + api.addFiles([ + 'server/storage/apps-logs-model.js', + 'server/storage/apps-model.js', + 'server/storage/apps-persistence-model.js', + 'server/storage/storage.js', + 'server/storage/index.js' + ], 'server'); + + // Bridges + api.addFiles([ + 'server/bridges/activation.js', + 'server/bridges/bridges.js', + 'server/bridges/commands.js', + 'server/bridges/environmental.js', + 'server/bridges/messages.js', + 'server/bridges/persistence.js', + 'server/bridges/rooms.js', + 'server/bridges/settings.js', + 'server/bridges/users.js', + 'server/bridges/index.js' + ], 'server'); + + // Communication pieces + api.addFiles([ + 'server/communication/methods.js', + 'server/communication/rest.js', + 'server/communication/websockets.js', + 'server/communication/index.js' + ], 'server'); + + // RocketChat <-> App Data Converters + api.addFiles([ + 'server/converters/messages.js', + 'server/converters/rooms.js', + 'server/converters/settings.js', + 'server/converters/users.js', + 'server/converters/index.js' + ], 'server'); + + // Server Orchestrator + api.addFiles('server/orchestrator.js', 'server'); + + // Client communication pieces + api.addFiles([ + 'client/communication/websockets.js', + 'client/communication/index.js' + ], 'client'); + + // Client Admin Management + api.addFiles([ + 'client/admin/apps.html', + 'client/admin/apps.js', + 'client/admin/appManage.html', + 'client/admin/appManage.js', + 'client/admin/appInstall.html', + 'client/admin/appInstall.js', + 'client/admin/appLogs.html', + 'client/admin/appLogs.js' + ], 'client'); + + api.addFiles('assets/stylesheets/apps.css', 'client'); + + // Client orchestrator + api.addFiles('client/orchestrator.js', 'client'); + + // Add what this package actually does export (needs updated to the module import style) + api.export('Apps'); +}); + +Npm.depends({ + 'busboy': '0.2.13', + '@rocket.chat/apps-engine': '0.4.0', + '@rocket.chat/apps-ts-definition': '0.7.6' +}); diff --git a/packages/rocketchat-apps/server/bridges/activation.js b/packages/rocketchat-apps/server/bridges/activation.js new file mode 100644 index 000000000000..b15bcc0c4e24 --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/activation.js @@ -0,0 +1,21 @@ +export class AppActivationBridge { + constructor(orch) { + this.orch = orch; + } + + appAdded(app) { + this.orch.getNotifier().appAdded(app.getID()); + } + + appUpdated(app) { + this.orch.getNotifier().appUpdated(app.getID()); + } + + appRemoved(app) { + this.orch.getNotifier().appRemoved(app.getID()); + } + + appStatusChanged(app, status) { + this.orch.getNotifier().appStatusUpdated(app.getID(), status); + } +} diff --git a/packages/rocketchat-apps/server/bridges/bridges.js b/packages/rocketchat-apps/server/bridges/bridges.js new file mode 100644 index 000000000000..ff7dc3cd0149 --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/bridges.js @@ -0,0 +1,69 @@ +import { AppBridges } from '@rocket.chat/apps-engine/server/bridges'; + +import { AppActivationBridge } from './activation'; +import { AppDetailChangesBridge } from './details'; +import { AppCommandsBridge } from './commands'; +import { AppEnvironmentalVariableBridge } from './environmental'; +import { AppHttpBridge } from './http'; +import { AppMessageBridge } from './messages'; +import { AppPersistenceBridge } from './persistence'; +import { AppRoomBridge } from './rooms'; +import { AppSettingBridge } from './settings'; +import { AppUserBridge } from './users'; + +export class RealAppBridges extends AppBridges { + constructor(orch) { + super(); + + this._actBridge = new AppActivationBridge(orch); + this._cmdBridge = new AppCommandsBridge(orch); + this._detBridge = new AppDetailChangesBridge(orch); + this._envBridge = new AppEnvironmentalVariableBridge(orch); + this._httpBridge = new AppHttpBridge(); + this._msgBridge = new AppMessageBridge(orch); + this._persistBridge = new AppPersistenceBridge(orch); + this._roomBridge = new AppRoomBridge(orch); + this._setsBridge = new AppSettingBridge(orch); + this._userBridge = new AppUserBridge(orch); + } + + getCommandBridge() { + return this._cmdBridge; + } + + getEnvironmentalVariableBridge() { + return this._envBridge; + } + + getHttpBridge() { + return this._httpBridge; + } + + getMessageBridge() { + return this._msgBridge; + } + + getPersistenceBridge() { + return this._persistBridge; + } + + getAppActivationBridge() { + return this._actBridge; + } + + getAppDetailChangesBridge() { + return this._detBridge; + } + + getRoomBridge() { + return this._roomBridge; + } + + getServerSettingBridge() { + return this._setsBridge; + } + + getUserBridge() { + return this._userBridge; + } +} diff --git a/packages/rocketchat-apps/server/bridges/commands.js b/packages/rocketchat-apps/server/bridges/commands.js new file mode 100644 index 000000000000..adec9f715ca5 --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/commands.js @@ -0,0 +1,141 @@ +import { SlashCommandContext } from '@rocket.chat/apps-ts-definition/slashcommands'; + +export class AppCommandsBridge { + constructor(orch) { + this.orch = orch; + this.disabledCommands = new Map(); + } + + doesCommandExist(command, appId) { + console.log(`The App ${ appId } is checking if "${ command }" command exists.`); + + if (typeof command !== 'string' || command.length === 0) { + return false; + } + + const cmd = command.toLowerCase(); + return typeof RocketChat.slashCommands.commands[cmd] === 'object' || this.disabledCommands.has(cmd); + } + + enableCommand(command, appId) { + console.log(`The App ${ appId } is attempting to enable the command: "${ command }"`); + + if (typeof command !== 'string' || command.trim().length === 0) { + throw new Error('Invalid command parameter provided, must be a string.'); + } + + const cmd = command.toLowerCase(); + if (!this.disabledCommands.has(cmd)) { + throw new Error(`The command is not currently disabled: "${ cmd }"`); + } + + RocketChat.slashCommands.commands[cmd] = this.disabledCommands.get(cmd); + this.disabledCommands.delete(cmd); + + this.orch.getNotifier().commandUpdated(cmd); + } + + disableCommand(command, appId) { + console.log(`The App ${ appId } is attempting to disable the command: "${ command }"`); + + if (typeof command !== 'string' || command.trim().length === 0) { + throw new Error('Invalid command parameter provided, must be a string.'); + } + + const cmd = command.toLowerCase(); + if (this.disabledCommands.has(cmd)) { + // The command is already disabled, no need to disable it yet again + return; + } + + if (typeof RocketChat.slashCommands.commands[cmd] === 'undefined') { + throw new Error(`Command does not exist in the system currently: "${ cmd }"`); + } + + this.disabledCommands.set(cmd, RocketChat.slashCommands.commands[cmd]); + delete RocketChat.slashCommands.commands[cmd]; + + this.orch.getNotifier().commandDisabled(cmd); + } + + // command: { command, paramsExample, i18nDescription, executor: function } + modifyCommand(command, appId) { + console.log(`The App ${ appId } is attempting to modify the command: "${ command }"`); + + this._verifyCommand(command); + + const cmd = command.toLowerCase(); + if (typeof RocketChat.slashCommands.commands[cmd] === 'undefined') { + throw new Error(`Command does not exist in the system currently (or it is disabled): "${ cmd }"`); + } + + const item = RocketChat.slashCommands.commands[cmd]; + item.params = command.paramsExample ? command.paramsExample : item.params; + item.description = command.i18nDescription ? command.i18nDescription : item.params; + item.callback = this._appCommandExecutor.bind(this); + + RocketChat.slashCommands.commands[cmd] = item; + this.orch.getNotifier().commandUpdated(cmd); + } + + registerCommand(command, appId) { + console.log(`The App ${ appId } is registering the command: "${ command.command }"`); + + this._verifyCommand(command); + + const item = { + command: command.command.toLowerCase(), + params: command.paramsExample, + description: command.i18nDescription, + callback: this._appCommandExecutor.bind(this) + }; + + RocketChat.slashCommands.commands[command.command.toLowerCase()] = item; + this.orch.getNotifier().commandAdded(command.command.toLowerCase()); + } + + unregisterCommand(command, appId) { + console.log(`The App ${ appId } is unregistering the command: "${ command }"`); + + if (typeof command !== 'string' || command.trim().length === 0) { + throw new Error('Invalid command parameter provided, must be a string.'); + } + + const cmd = command.toLowerCase(); + this.disabledCommands.delete(cmd); + delete RocketChat.slashCommands.commands[cmd]; + + this.orch.getNotifier().commandRemoved(cmd); + } + + _verifyCommand(command) { + if (typeof command !== 'object') { + throw new Error('Invalid Slash Command parameter provided, it must be a valid ISlashCommand object.'); + } + + if (typeof command.command !== 'string') { + throw new Error('Invalid Slash Command parameter provided, it must be a valid ISlashCommand object.'); + } + + if (command.paramsExample && typeof command.paramsExample !== 'string') { + throw new Error('Invalid Slash Command parameter provided, it must be a valid ISlashCommand object.'); + } + + if (command.i18nDescription && typeof command.i18nDescription !== 'string') { + throw new Error('Invalid Slash Command parameter provided, it must be a valid ISlashCommand object.'); + } + + if (typeof command.executor !== 'function') { + throw new Error('Invalid Slash Command parameter provided, it must be a valid ISlashCommand object.'); + } + } + + _appCommandExecutor(command, parameters, message) { + const user = this.orch.getConverters().get('users').convertById(Meteor.userId()); + const room = this.orch.getConverters().get('rooms').convertById(message.rid); + const params = parameters.length === 0 || parameters === ' ' ? [] : parameters.split(' '); + + const context = new SlashCommandContext(Object.freeze(user), Object.freeze(room), Object.freeze(params)); + this.orch.getManager().getCommandManager().executeCommand(command, context); + } +} diff --git a/packages/rocketchat-apps/server/bridges/details.js b/packages/rocketchat-apps/server/bridges/details.js new file mode 100644 index 000000000000..dea680abe07a --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/details.js @@ -0,0 +1,13 @@ +export class AppDetailChangesBridge { + constructor(orch) { + this.orch = orch; + } + + onAppSettingsChange(appId, setting) { + try { + this.orch.getNotifier().appSettingsChange(appId, setting); + } catch (e) { + console.warn('failed to notify about the setting change.', appId); + } + } +} diff --git a/packages/rocketchat-apps/server/bridges/environmental.js b/packages/rocketchat-apps/server/bridges/environmental.js new file mode 100644 index 000000000000..d175037fc3e2 --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/environmental.js @@ -0,0 +1,32 @@ +export class AppEnvironmentalVariableBridge { + constructor(orch) { + this.orch = orch; + this.allowed = ['NODE_ENV', 'ROOT_URL', 'INSTANCE_IP']; + } + + getValueByName(envVarName, appId) { + console.log(`The App ${ appId } is getting the environmental variable value ${ envVarName }.`); + + if (this.isReadable(envVarName, appId)) { + return process.env[envVarName]; + } + + throw new Error(`The environmental variable "${ envVarName }" is not readable.`); + } + + isReadable(envVarName, appId) { + console.log(`The App ${ appId } is checking if the environmental variable is readable ${ envVarName }.`); + + return this.allowed.includes(envVarName.toUpperCase()); + } + + isSet(envVarName, appId) { + console.log(`The App ${ appId } is checking if the environmental variable is set ${ envVarName }.`); + + if (this.isReadable(envVarName, appId)) { + return typeof process.env[envVarName] !== 'undefined'; + } + + throw new Error(`The environmental variable "${ envVarName }" is not readable.`); + } +} diff --git a/packages/rocketchat-apps/server/bridges/http.js b/packages/rocketchat-apps/server/bridges/http.js new file mode 100644 index 000000000000..23853301b6c4 --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/http.js @@ -0,0 +1,15 @@ +export class AppHttpBridge { + call(info) { + if (!info.request.content && typeof info.request.data === 'object') { + info.request.content = JSON.stringify(info.request.data); + } + + console.log(`The App ${ info.appId } is requesting from the outter webs:`, info); + + try { + return HTTP.call(info.method, info.url, info.request); + } catch (e) { + return e.response; + } + } +} diff --git a/packages/rocketchat-apps/server/bridges/index.js b/packages/rocketchat-apps/server/bridges/index.js new file mode 100644 index 000000000000..5eaae0b938ad --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/index.js @@ -0,0 +1,23 @@ +import { RealAppBridges } from './bridges'; +import { AppActivationBridge } from './activation'; +import { AppCommandsBridge } from './commands'; +import { AppEnvironmentalVariableBridge } from './environmental'; +import { AppHttpBridge } from './http'; +import { AppMessageBridge } from './messages'; +import { AppPersistenceBridge } from './persistence'; +import { AppRoomBridge } from './rooms'; +import { AppSettingBridge } from './settings'; +import { AppUserBridge } from './users'; + +export { + RealAppBridges, + AppActivationBridge, + AppCommandsBridge, + AppEnvironmentalVariableBridge, + AppHttpBridge, + AppMessageBridge, + AppPersistenceBridge, + AppRoomBridge, + AppSettingBridge, + AppUserBridge +}; diff --git a/packages/rocketchat-apps/server/bridges/messages.js b/packages/rocketchat-apps/server/bridges/messages.js new file mode 100644 index 000000000000..33b77a0d0318 --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/messages.js @@ -0,0 +1,40 @@ +export class AppMessageBridge { + constructor(orch) { + this.orch = orch; + } + + create(message, appId) { + console.log(`The App ${ appId } is creating a new message.`); + + let msg = this.orch.getConverters().get('messages').convertAppMessage(message); + + Meteor.runAsUser(msg.u._id, () => { + msg = Meteor.call('sendMessage', msg); + }); + + return msg._id; + } + + getById(messageId, appId) { + console.log(`The App ${ appId } is getting the message: "${ messageId }"`); + + return this.orch.getConverters().get('messages').convertById(messageId); + } + + update(message, appId) { + console.log(`The App ${ appId } is updating a message.`); + + if (!message.editor) { + throw new Error('Invalid editor assigned to the message for the update.'); + } + + if (!message.id || !RocketChat.models.Messages.findOneById(message.id)) { + throw new Error('A message must exist to update.'); + } + + const msg = this.orch.getConverters().get('messages').convertAppMessage(message); + const editor = RocketChat.models.Users.findOneById(message.editor.id); + + RocketChat.updateMessage(msg, editor); + } +} diff --git a/packages/rocketchat-apps/server/bridges/persistence.js b/packages/rocketchat-apps/server/bridges/persistence.js new file mode 100644 index 000000000000..03ff53e9bc1c --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/persistence.js @@ -0,0 +1,75 @@ +export class AppPersistenceBridge { + constructor(orch) { + this.orch = orch; + } + + purge(appId) { + console.log(`The App's persistent storage is being purged: ${ appId }`); + + this.orch.getPersistenceModel().remove({ appId }); + } + + create(data, appId) { + console.log(`The App ${ appId } is storing a new object in their persistence.`, data); + + if (typeof data !== 'object') { + throw new Error('Attempted to store an invalid data type, it must be an object.'); + } + + return this.orch.getPersistenceModel().insert({ appId, data }); + } + + createWithAssociations(data, associations, appId) { + console.log(`The App ${ appId } is storing a new object in their persistence that is associated with some models.`, data, associations); + + if (typeof data !== 'object') { + throw new Error('Attempted to store an invalid data type, it must be an object.'); + } + + return this.orch.getPersistenceModel().insert({ appId, associations, data }); + } + + readById(id, appId) { + console.log(`The App ${ appId } is reading their data in their persistence with the id: "${ id }"`); + + const record = this.orch.getPersistenceModel().findOneById(id); + + return record.data; + } + + readByAssociations(associations, appId) { + console.log(`The App ${ appId } is searching for records that are associated with the following:`, associations); + + throw new Error('Not implemented.'); + } + + remove(id, appId) { + console.log(`The App ${ appId } is removing one of their records by the id: "${ id }"`); + + const record = this.orch.getPersistenceModel().findOneById(id); + + if (!record) { + return undefined; + } + + this.orch.getPersistenceModel().remove({ _id: id }); + + return record.data; + } + + removeByAssociations(associations, appId) { + console.log(`The App ${ appId } is removing records with the following associations:`, associations); + + throw new Error('Not implemented.'); + } + + update(id, data, upsert, appId) { + console.log(`The App ${ appId } is updating the record "${ id }" to:`, data); + + if (typeof data !== 'object') { + throw new Error('Attempted to store an invalid data type, it must be an object.'); + } + + throw new Error('Not implemented.'); + } +} diff --git a/packages/rocketchat-apps/server/bridges/rooms.js b/packages/rocketchat-apps/server/bridges/rooms.js new file mode 100644 index 000000000000..85c4b946081e --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/rooms.js @@ -0,0 +1,57 @@ +import { RoomType } from '@rocket.chat/apps-ts-definition/rooms'; + +export class AppRoomBridge { + constructor(orch) { + this.orch = orch; + } + + create(room, appId) { + console.log(`The App ${ appId } is creating a new room.`, room); + + const rcRoom = this.orch.getConverters().get('rooms').convertAppRoom(room); + let method; + + switch (room.type) { + case RoomType.CHANNEL: + method = 'createChannel'; + break; + case RoomType.PRIVATE_GROUP: + method = 'createPrivateGroup'; + break; + default: + throw new Error('Only channels and private groups can be created.'); + } + + let rid; + Meteor.runAsUser(room.creator.id, () => { + const info = Meteor.call(method, rcRoom.usernames); + rid = info.rid; + }); + + return rid; + } + + getById(roomId, appId) { + console.log(`The App ${ appId } is getting the roomById: "${ roomId }"`); + + return this.orch.getConverters().get('rooms').convertById(roomId); + } + + getByName(roomName, appId) { + console.log(`The App ${ appId } is getting the roomByName: "${ roomName }"`); + + return this.orch.getConverters().get('rooms').convertByName(roomName); + } + + update(room, appId) { + console.log(`The App ${ appId } is updating a room.`); + + if (!room.id || RocketChat.models.Rooms.findOneById(room.id)) { + throw new Error('A room must exist to update.'); + } + + const rm = this.orch.getConverters().get('rooms').convertAppRoom(room); + + RocketChat.models.Rooms.update(rm._id, rm); + } +} diff --git a/packages/rocketchat-apps/server/bridges/settings.js b/packages/rocketchat-apps/server/bridges/settings.js new file mode 100644 index 000000000000..96e6ffd1a78e --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/settings.js @@ -0,0 +1,71 @@ +export class AppSettingBridge { + constructor(orch) { + this.orch = orch; + this.allowedGroups = []; + this.disallowedSettings = [ + 'Accounts_RegistrationForm_SecretURL', 'CROWD_APP_USERNAME', 'CROWD_APP_PASSWORD', 'Direct_Reply_Username', + 'Direct_Reply_Password', 'SMTP_Username', 'SMTP_Password', 'FileUpload_S3_AWSAccessKeyId', 'FileUpload_S3_AWSSecretAccessKey', + 'FileUpload_S3_BucketURL', 'FileUpload_GoogleStorage_Bucket', 'FileUpload_GoogleStorage_AccessId', + 'FileUpload_GoogleStorage_Secret', 'GoogleVision_ServiceAccount', 'Allow_Invalid_SelfSigned_Certs', 'GoogleTagManager_id', + 'Bugsnag_api_key', 'LDAP_CA_Cert', 'LDAP_Reject_Unauthorized', 'LDAP_Domain_Search_User', 'LDAP_Domain_Search_Password', + 'Livechat_secret_token', 'Livechat_Knowledge_Apiai_Key', 'AutoTranslate_GoogleAPIKey', 'MapView_GMapsAPIKey', + 'Meta_fb_app_id', 'Meta_google-site-verification', 'Meta_msvalidate01', 'Accounts_OAuth_Dolphin_secret', + 'Accounts_OAuth_Drupal_secret', 'Accounts_OAuth_Facebook_secret', 'Accounts_OAuth_Github_secret', 'API_GitHub_Enterprise_URL', + 'Accounts_OAuth_GitHub_Enterprise_secret', 'API_Gitlab_URL', 'Accounts_OAuth_Gitlab_secret', 'Accounts_OAuth_Google_secret', + 'Accounts_OAuth_Linkedin_secret', 'Accounts_OAuth_Meteor_secret', 'Accounts_OAuth_Twitter_secret', 'API_Wordpress_URL', + 'Accounts_OAuth_Wordpress_secret', 'Push_apn_passphrase', 'Push_apn_key', 'Push_apn_cert', 'Push_apn_dev_passphrase', + 'Push_apn_dev_key', 'Push_apn_dev_cert', 'Push_gcm_api_key', 'Push_gcm_project_number', 'SAML_Custom_Default_cert', + 'SAML_Custom_Default_private_key', 'SlackBridge_APIToken', 'Smarsh_Email', 'SMS_Twilio_Account_SID', 'SMS_Twilio_authToken' + ]; + } + + getAll(appId) { + console.log(`The App ${ appId } is getting all the settings.`); + + return RocketChat.models.Settings.find({ _id: { $nin: this.disallowedSettings } }).fetch().map((s) => { + this.orch.getConverters().get('settings').convertToApp(s); + }); + } + + getOneById(id, appId) { + console.log(`The App ${ appId } is getting the setting by id ${ id }.`); + + if (!this.isReadableById(id, appId)) { + throw new Error(`The setting "${ id }" is not readable.`); + } + + return this.orch.getConverters().get('settings').convertById(id); + } + + hideGroup(name, appId) { + console.log(`The App ${ appId } is hidding the group ${ name }.`); + + throw new Error('Method not implemented.'); + } + + hideSetting(id, appId) { + console.log(`The App ${ appId } is hidding the setting ${ id }.`); + + if (!this.isReadableById(id, appId)) { + throw new Error(`The setting "${ id }" is not readable.`); + } + + throw new Error('Method not implemented.'); + } + + isReadableById(id, appId) { + console.log(`The App ${ appId } is checking if they can read the setting ${ id }.`); + + return !this.disallowedSettings.includes(id); + } + + updateOne(setting, appId) { + console.log(`The App ${ appId } is updating the setting ${ setting.id } .`); + + if (!this.isReadableById(setting.id, appId)) { + throw new Error(`The setting "${ setting.id }" is not readable.`); + } + + throw new Error('Method not implemented.'); + } +} diff --git a/packages/rocketchat-apps/server/bridges/users.js b/packages/rocketchat-apps/server/bridges/users.js new file mode 100644 index 000000000000..5b4a2d07de42 --- /dev/null +++ b/packages/rocketchat-apps/server/bridges/users.js @@ -0,0 +1,17 @@ +export class AppUserBridge { + constructor(orch) { + this.orch = orch; + } + + getById(userId, appId) { + console.log(`The App ${ appId } is getting the userId: "${ userId }"`); + + return this.orch.getConverters().get('users').convertById(userId); + } + + getByUsername(username, appId) { + console.log(`The App ${ appId } is getting the username: "${ username }"`); + + return this.orch.getConverters().get('users').convertByUsername(username); + } +} diff --git a/packages/rocketchat-apps/server/communication/index.js b/packages/rocketchat-apps/server/communication/index.js new file mode 100644 index 000000000000..ad9090a71b4b --- /dev/null +++ b/packages/rocketchat-apps/server/communication/index.js @@ -0,0 +1,11 @@ +import { AppMethods} from './methods'; +import { AppsRestApi } from './rest'; +import { AppEvents, AppServerNotifier, AppServerListener } from './websockets'; + +export { + AppMethods, + AppsRestApi, + AppEvents, + AppServerNotifier, + AppServerListener +}; diff --git a/packages/rocketchat-apps/server/communication/methods.js b/packages/rocketchat-apps/server/communication/methods.js new file mode 100644 index 000000000000..1875856dad79 --- /dev/null +++ b/packages/rocketchat-apps/server/communication/methods.js @@ -0,0 +1,21 @@ +export class AppMethods { + constructor(manager) { + this._manager = manager; + + this._addMethods(); + } + + _addMethods() { + const manager = this._manager; + + Meteor.methods({ + 'apps/is-enabled'() { + return typeof manager !== 'undefined'; + }, + + 'apps/is-loaded'() { + return typeof manager !== 'undefined' || manager.areAppsLoaded(); + } + }); + } +} diff --git a/packages/rocketchat-apps/server/communication/rest.js b/packages/rocketchat-apps/server/communication/rest.js new file mode 100644 index 000000000000..972466d32a47 --- /dev/null +++ b/packages/rocketchat-apps/server/communication/rest.js @@ -0,0 +1,318 @@ +export class AppsRestApi { + constructor(orch, manager) { + this._orch = orch; + this._manager = manager; + this.api = new RocketChat.API.ApiClass({ + version: 'apps', + useDefaultAuth: true, + prettyJson: false, + enableCors: false, + auth: RocketChat.API.getUserAuth() + }); + + this.addManagementRoutes(); + } + + _handleFile(request, fileField) { + const Busboy = Npm.require('busboy'); + const busboy = new Busboy({ headers: request.headers }); + + return Meteor.wrapAsync((callback) => { + busboy.on('file', Meteor.bindEnvironment((fieldname, file) => { + if (fieldname !== fileField) { + return callback(new Meteor.Error('invalid-field', `Expected the field "${ fileField }" but got "${ fieldname }" instead.`)); + } + + const fileData = []; + file.on('data', Meteor.bindEnvironment((data) => { + fileData.push(data); + })); + + file.on('end', Meteor.bindEnvironment(() => callback(undefined, Buffer.concat(fileData)))); + })); + + request.pipe(busboy); + })(); + } + + addManagementRoutes() { + const orchestrator = this._orch; + const manager = this._manager; + const fileHandler = this._handleFile; + + this.api.addRoute('', { authRequired: true }, { + get() { + const apps = manager.get().map(prl => { + const info = prl.getInfo(); + info.languages = prl.getStorageItem().languageContent; + info.status = prl.getStatus(); + + return info; + }); + + return RocketChat.API.v1.success({ apps }); + }, + post() { + let buff; + + if (this.bodyParams.url) { + const result = HTTP.call('GET', this.bodyParams.url, { npmRequestOptions: { encoding: 'base64' }}); + + if (result.statusCode !== 200 || !result.headers['content-type'] || result.headers['content-type'] !== 'application/zip') { + return RocketChat.API.v1.failure({ error: 'Invalid url. It doesn\'t exist or is not "application/zip".' }); + } + + buff = Buffer.from(result.content, 'base64'); + } else { + buff = fileHandler(this.request, 'app'); + } + + if (!buff) { + return RocketChat.API.v1.failure({ error: 'Failed to get a file to install for the App. '}); + } + + const item = Meteor.wrapAsync((callback) => { + manager.add(buff.toString('base64'), false).then((rl) => callback(undefined, rl)).catch((e) => { + console.warn('Error!', e); + callback(e); + }); + })(); + + const info = item.getInfo(); + info.status = item.getStatus(); + + return RocketChat.API.v1.success({ app: info }); + } + }); + + this.api.addRoute('languages', { authRequired: false }, { + get() { + const apps = manager.get().map(prl => { + return { + id: prl.getID(), + languages: prl.getStorageItem().languageContent + }; + }); + + return RocketChat.API.v1.success({ apps }); + } + }); + + this.api.addRoute(':id', { authRequired: true }, { + get() { + console.log('Getting:', this.urlParams.id); + const prl = manager.getOneById(this.urlParams.id); + + if (prl) { + const info = prl.getInfo(); + info.status = prl.getStatus(); + + return RocketChat.API.v1.success({ app: info }); + } else { + return RocketChat.API.v1.notFound(`No App found by the id of: ${ this.urlParams.id }`); + } + }, + post() { + console.log('Updating:', this.urlParams.id); + // TODO: Verify permissions + + const buff = fileHandler(this.request, 'app'); + const item = Meteor.wrapAsync((callback) => { + manager.update(buff.toString('base64')).then((rl) => callback(rl)).catch((e) => callback(e)); + }); + + const info = item.getInfo(); + info.status = item.getStatus(); + + return RocketChat.API.v1.success({ app: info }); + }, + delete() { + console.log('Uninstalling:', this.urlParams.id); + const prl = manager.getOneById(this.urlParams.id); + + if (prl) { + Promise.await(manager.remove(prl.getID())); + + const info = prl.getInfo(); + info.status = prl.getStatus(); + + return RocketChat.API.v1.success({ app: info }); + } else { + return RocketChat.API.v1.notFound(`No App found by the id of: ${ this.urlParams.id }`); + } + } + }); + + this.api.addRoute(':id/icon', { authRequired: true }, { + get() { + console.log('Getting the App\'s Icon:', this.urlParams.id); + const prl = manager.getOneById(this.urlParams.id); + + if (prl) { + const info = prl.getInfo(); + + return RocketChat.API.v1.success({ iconFileContent: info.iconFileContent }); + } else { + return RocketChat.API.v1.notFound(`No App found by the id of: ${ this.urlParams.id }`); + } + } + }); + + this.api.addRoute(':id/languages', { authRequired: false }, { + get() { + console.log(`Getting ${ this.urlParams.id }'s languages..`); + const prl = manager.getOneById(this.urlParams.id); + + if (prl) { + const languages = prl.getStorageItem().languageContent || {}; + + return RocketChat.API.v1.success({ languages }); + } else { + return RocketChat.API.v1.notFound(`No App found by the id of: ${ this.urlParams.id }`); + } + } + }); + + this.api.addRoute(':id/logs', { authRequired: true }, { + get() { + console.log(`Getting ${ this.urlParams.id }'s logs..`); + const prl = manager.getOneById(this.urlParams.id); + + if (prl) { + const { offset, count } = this.getPaginationItems(); + const { sort, fields, query } = this.parseJsonQuery(); + + const ourQuery = Object.assign({}, query, { appId: prl.getID() }); + const options = { + sort: sort ? sort : { _updatedAt: -1 }, + skip: offset, + limit: count, + fields + }; + + const logs = Promise.await(orchestrator.getLogStorage().find(ourQuery, options)); + + return RocketChat.API.v1.success({ logs }); + } else { + return RocketChat.API.v1.notFound(`No App found by the id of: ${ this.urlParams.id }`); + } + } + }); + + this.api.addRoute(':id/settings', { authRequired: true }, { + get() { + console.log(`Getting ${ this.urlParams.id }'s settings..`); + const prl = manager.getOneById(this.urlParams.id); + + if (prl) { + const settings = Object.assign({}, prl.getStorageItem().settings); + + Object.keys(settings).forEach((k) => { + if (settings[k].hidden) { + delete settings[k]; + } + }); + + return RocketChat.API.v1.success({ settings }); + } else { + return RocketChat.API.v1.notFound(`No App found by the id of: ${ this.urlParams.id }`); + } + }, + post() { + console.log(`Updating ${ this.urlParams.id }'s settings..`); + if (!this.bodyParams || !this.bodyParams.settings) { + return RocketChat.API.v1.failure('The settings to update must be present.'); + } + + const prl = manager.getOneById(this.urlParams.id); + + if (!prl) { + return RocketChat.API.v1.notFound(`No App found by the id of: ${ this.urlParams.id }`); + } + + const settings = prl.getStorageItem().settings; + + const updated = []; + this.bodyParams.settings.forEach((s) => { + if (settings[s.id]) { + Promise.await(manager.getSettingsManager().updateAppSetting(this.urlParams.id, s)); + // Updating? + updated.push(s); + } + }); + + return RocketChat.API.v1.success({ updated }); + } + }); + + this.api.addRoute(':id/settings/:settingId', { authRequired: true }, { + get() { + console.log(`Getting the App ${ this.urlParams.id }'s setting ${ this.urlParams.settingId }`); + + try { + const setting = manager.getSettingsManager().getAppSetting(this.urlParams.id, this.urlParams.settingId); + + RocketChat.API.v1.success({ setting }); + } catch (e) { + if (e.message.includes('No setting found')) { + return RocketChat.API.v1.notFound(`No Setting found on the App by the id of: "${ this.urlParams.settingId }"`); + } else if (e.message.includes('No App found')) { + return RocketChat.API.v1.notFound(`No App found by the id of: ${ this.urlParams.id }`); + } else { + return RocketChat.API.v1.failure(e.message); + } + } + }, + post() { + console.log(`Updating the App ${ this.urlParams.id }'s setting ${ this.urlParams.settingId }`); + + if (!this.bodyParams.setting) { + return RocketChat.API.v1.failure('Setting to update to must be present on the posted body.'); + } + + try { + Promise.await(manager.getSettingsManager().updateAppSetting(this.urlParams.id, this.bodyParams.setting)); + + return RocketChat.API.v1.success(); + } catch (e) { + if (e.message.includes('No setting found')) { + return RocketChat.API.v1.notFound(`No Setting found on the App by the id of: "${ this.urlParams.settingId }"`); + } else if (e.message.includes('No App found')) { + return RocketChat.API.v1.notFound(`No App found by the id of: ${ this.urlParams.id }`); + } else { + return RocketChat.API.v1.failure(e.message); + } + } + } + }); + + this.api.addRoute(':id/status', { authRequired: true }, { + get() { + console.log(`Getting ${ this.urlParams.id }'s status..`); + const prl = manager.getOneById(this.urlParams.id); + + if (prl) { + return RocketChat.API.v1.success({ status: prl.getStatus() }); + } else { + return RocketChat.API.v1.notFound(`No App found by the id of: ${ this.urlParams.id }`); + } + }, + post() { + if (!this.bodyParams.status || typeof this.bodyParams.status !== 'string') { + return RocketChat.API.v1.failure('Invalid status provided, it must be "status" field and a string.'); + } + + console.log(`Updating ${ this.urlParams.id }'s status...`, this.bodyParams.status); + const prl = manager.getOneById(this.urlParams.id); + + if (prl) { + const result = Promise.await(manager.changeStatus(prl.getID(), this.bodyParams.status)); + + return RocketChat.API.v1.success({ status: result.getStatus() }); + } else { + return RocketChat.API.v1.notFound(`No App found by the id of: ${ this.urlParams.id }`); + } + } + }); + } +} diff --git a/packages/rocketchat-apps/server/communication/websockets.js b/packages/rocketchat-apps/server/communication/websockets.js new file mode 100644 index 000000000000..f9cd49f4a1b6 --- /dev/null +++ b/packages/rocketchat-apps/server/communication/websockets.js @@ -0,0 +1,152 @@ +import { AppStatus, AppStatusUtils } from '@rocket.chat/apps-ts-definition/AppStatus'; + +export const AppEvents = Object.freeze({ + APP_ADDED: 'app/added', + APP_REMOVED: 'app/removed', + APP_UPDATED: 'app/updated', + APP_STATUS_CHANGE: 'app/statusUpdate', + APP_SETTING_UPDATED: 'app/settingUpdated', + COMMAND_ADDED: 'command/added', + COMMAND_DISABLED: 'command/disabled', + COMMAND_UPDATED: 'command/updated', + COMMAND_REMOVED: 'command/removed' +}); + +export class AppServerListener { + constructor(orch, engineStreamer, clientStreamer, recieved) { + this.orch = orch; + this.engineStreamer = engineStreamer; + this.clientStreamer = clientStreamer; + this.recieved = recieved; + + this.engineStreamer.on(AppEvents.APP_ADDED, this.onAppAdded.bind(this)); + this.engineStreamer.on(AppEvents.APP_STATUS_CHANGE, this.onAppStatusUpdated.bind(this)); + this.engineStreamer.on(AppEvents.APP_SETTING_UPDATED, this.onAppSettingUpdated.bind(this)); + this.engineStreamer.on(AppEvents.APP_REMOVED, this.onAppRemoved.bind(this)); + this.engineStreamer.on(AppEvents.COMMAND_ADDED, this.onCommandAdded.bind(this)); + this.engineStreamer.on(AppEvents.COMMAND_DISABLED, this.onCommandDisabled.bind(this)); + this.engineStreamer.on(AppEvents.COMMAND_UPDATED, this.onCommandUpdated.bind(this)); + this.engineStreamer.on(AppEvents.COMMAND_REMOVED, this.onCommandRemoved.bind(this)); + } + + onAppAdded(appId) { + this.orch.getManager().loadOne(appId).then(() => this.clientStreamer.emit(AppEvents.APP_ADDED, appId)); + } + + onAppStatusUpdated({ appId, status }) { + this.recieved.set(`${ AppEvents.APP_STATUS_CHANGE }_${ appId }`, { appId, status, when: new Date() }); + + if (AppStatusUtils.isEnabled(status)) { + this.orch.getManager().enable(appId) + .then(() => this.clientStreamer.emit(AppEvents.APP_STATUS_CHANGE, { appId, status })); + } else if (AppStatusUtils.isDisabled(status)) { + this.orch.getManager().disable(appId, AppStatus.MANUALLY_DISABLED === status) + .then(() => this.clientStreamer.emit(AppEvents.APP_STATUS_CHANGE, { appId, status })); + } + } + + onAppSettingUpdated({ appId, setting }) { + this.recieved.set(`${ AppEvents.APP_SETTING_UPDATED }_${ appId }_${ setting.id }`, { appId, setting, when: new Date() }); + + this.orch.getManager().getSettingsManager().updateAppSetting(appId, setting) + .then(() => this.clientStreamer.emit(AppEvents.APP_SETTING_UPDATED, { appId })); + } + + onAppRemoved(appId) { + this.orch.getManager().remove(appId).then(() => this.clientStreamer.emit(AppEvents.APP_REMOVED, appId)); + } + + onCommandAdded(command) { + this.clientStreamer.emit(AppEvents.COMMAND_ADDED, command); + } + + onCommandDisabled(command) { + this.clientStreamer.emit(AppEvents.COMMAND_DISABLED, command); + } + + onCommandUpdated(command) { + this.clientStreamer.emit(AppEvents.COMMAND_UPDATED, command); + } + + onCommandRemoved(command) { + this.clientStreamer.emit(AppEvents.COMMAND_REMOVED, command); + } +} + +export class AppServerNotifier { + constructor(orch) { + this.engineStreamer = new Meteor.Streamer('apps-engine', { retransmit: false }); + this.engineStreamer.serverOnly = true; + this.engineStreamer.allowRead('none'); + this.engineStreamer.allowEmit('all'); + this.engineStreamer.allowWrite('none'); + + // This is used to broadcast to the web clients + this.clientStreamer = new Meteor.Streamer('apps', { retransmit: false }); + this.clientStreamer.serverOnly = true; + this.clientStreamer.allowRead('all'); + this.clientStreamer.allowEmit('all'); + this.clientStreamer.allowWrite('none'); + + this.recieved = new Map(); + this.listener = new AppServerListener(orch, this.engineStreamer, this.clientStreamer, this.recieved); + } + + appAdded(appId) { + this.engineStreamer.emit(AppEvents.APP_ADDED, appId); + this.clientStreamer.emit(AppEvents.APP_ADDED, appId); + } + + appRemoved(appId) { + this.engineStreamer.emit(AppEvents.APP_REMOVED, appId); + this.clientStreamer.emit(AppEvents.APP_REMOVED, appId); + } + + appUpdated(appId) { + this.engineStreamer.emit(AppEvents.APP_UPDATED, appId); + this.clientStreamer.emit(AppEvents.APP_UPDATED, appId); + } + + appStatusUpdated(appId, status) { + if (this.recieved.has(`${ AppEvents.APP_STATUS_CHANGE }_${ appId }`)) { + const details = this.recieved.get(`${ AppEvents.APP_STATUS_CHANGE }_${ appId }`); + if (details.status === status) { + this.recieved.delete(`${ AppEvents.APP_STATUS_CHANGE }_${ appId }`); + return; + } + } + + this.engineStreamer.emit(AppEvents.APP_STATUS_CHANGE, { appId, status }); + this.clientStreamer.emit(AppEvents.APP_STATUS_CHANGE, { appId, status }); + } + + appSettingsChange(appId, setting) { + if (this.recieved.has(`${ AppEvents.APP_SETTING_UPDATED }_${ appId }_${ setting.id }`)) { + this.recieved.delete(`${ AppEvents.APP_SETTING_UPDATED }_${ appId }_${ setting.id }`); + return; + } + + this.engineStreamer.emit(AppEvents.APP_SETTING_UPDATED, { appId, setting }); + this.clientStreamer.emit(AppEvents.APP_SETTING_UPDATED, { appId }); + } + + commandAdded(command) { + this.engineStreamer.emit(AppEvents.COMMAND_ADDED, command); + this.clientStreamer.emit(AppEvents.COMMAND_ADDED, command); + } + + commandDisabled(command) { + this.engineStreamer.emit(AppEvents.COMMAND_DISABLED, command); + this.clientStreamer.emit(AppEvents.COMMAND_DISABLED, command); + } + + commandUpdated(command) { + this.engineStreamer.emit(AppEvents.COMMAND_UPDATED, command); + this.clientStreamer.emit(AppEvents.COMMAND_UPDATED, command); + } + + commandRemoved(command) { + this.engineStreamer.emit(AppEvents.COMMAND_REMOVED, command); + this.clientStreamer.emit(AppEvents.COMMAND_REMOVED, command); + } +} diff --git a/packages/rocketchat-apps/server/converters/index.js b/packages/rocketchat-apps/server/converters/index.js new file mode 100644 index 000000000000..ece9c3708add --- /dev/null +++ b/packages/rocketchat-apps/server/converters/index.js @@ -0,0 +1,11 @@ +import { AppMessagesConverter } from './messages'; +import { AppRoomsConverter } from './rooms'; +import { AppSettingsConverter } from './settings'; +import { AppUsersConverter } from './users'; + +export { + AppMessagesConverter, + AppRoomsConverter, + AppSettingsConverter, + AppUsersConverter +}; diff --git a/packages/rocketchat-apps/server/converters/messages.js b/packages/rocketchat-apps/server/converters/messages.js new file mode 100644 index 000000000000..2c957ddafb4e --- /dev/null +++ b/packages/rocketchat-apps/server/converters/messages.js @@ -0,0 +1,154 @@ +export class AppMessagesConverter { + constructor(orch) { + this.orch = orch; + } + + convertById(msgId) { + const msg = RocketChat.models.Messages.getOneById(msgId); + + return this.convertMessage(msg); + } + + convertMessage(msgObj) { + if (!msgObj) { + return undefined; + } + + const room = this.orch.getConverters().get('rooms').convertById(msgObj.rid); + const sender = this.orch.getConverters().get('users').convertById(msgObj.u._id); + + let editor; + if (msgObj.editedBy) { + editor = this.orch.getConverters().get('users').convertById(msgObj.editedBy._id); + } + + const attachments = this._convertAttachmentsToApp(msgObj.attachments); + + return { + id: msgObj._id, + room, + sender, + text: msgObj.msg, + createdAt: msgObj.ts, + updatedAt: msgObj._updatedAt, + editor, + editedAt: msgObj.editedAt, + emoji: msgObj.emoji, + avatarUrl: msgObj.avatar, + alias: msgObj.alias, + customFields: msgObj.customFields, + attachments + }; + } + + convertAppMessage(message) { + if (!message) { + return undefined; + } + + const room = RocketChat.models.Rooms.findOneById(message.room.id); + const user = RocketChat.models.Users.findOneById(message.sender.id); + + if (!room || !user) { + throw new Error('Invalid user or room provided on the message.'); + } + + let editedBy; + if (message.editor) { + const editor = RocketChat.models.Users.findOneById(message.editor.id); + editedBy = { + _id: editor._id, + username: editor.username + }; + } + + const attachments = this._convertAppAttachments(message.attachments); + + return { + _id: message.id || Random.id(), + rid: room._id, + u: { + _id: user._id, + username: user.username + }, + msg: message.text, + ts: message.createdAt || new Date(), + _updatedAt: message.updatedAt || new Date(), + editedBy, + editedAt: message.editedAt, + emoji: message.emoji, + avatar: message.avatarUrl, + alias: message.alias, + customFields: message.customFields, + attachments + }; + } + + _convertAppAttachments(attachments) { + if (typeof attachments === 'undefined' || !Array.isArray(attachments)) { + return undefined; + } + + return attachments.map((attachment) => { + return { + collapsed: attachment.collapsed, + color: attachment.color, + text: attachment.text, + ts: attachment.timestamp, + message_link: attachment.timestampLink, + thumb_url: attachment.thumbnailUrl, + author_name: attachment.author ? attachment.author.name : undefined, + author_link: attachment.author ? attachment.author.link : undefined, + author_icon: attachment.author ? attachment.author.icon : undefined, + title: attachment.title ? attachment.title.value : undefined, + title_link: attachment.title ? attachment.title.link : undefined, + title_link_download: attachment.title ? attachment.title.downloadLink : undefined, + image_url: attachment.imageUrl, + audio_url: attachment.audioUrl, + video_url: attachment.videoUrl, + fields: attachment.fields + }; + }); + } + + _convertAttachmentsToApp(attachments) { + if (typeof attachments === 'undefined' || !Array.isArray(attachments)) { + return undefined; + } + + return attachments.map((attachment) => { + let author; + if (attachment.author_name || attachment.author_link || attachment.author_icon) { + author = { + name: attachment.author_name, + link: attachment.author_link, + icon: attachment.author_icon + }; + } + + let title; + if (attachment.title || attachment.title_link || attachment.title_link_download) { + title = { + value: attachment.title, + link: attachment.title_link, + downloadLink: attachment.title_link_download + }; + } + + return { + collapsed: attachment.collapsed, + color: attachment.color, + text: attachment.text, + timestamp: attachment.ts, + timestampLink: attachment.message_link, + thumbnailUrl: attachment.thumb_url, + author, + title, + imageUrl: attachment.image_url, + audioUrl: attachment.audio_url, + videoUrl: attachment.video_url, + fields: attachment.fields + }; + }); + } +} diff --git a/packages/rocketchat-apps/server/converters/rooms.js b/packages/rocketchat-apps/server/converters/rooms.js new file mode 100644 index 000000000000..99e3b46e204b --- /dev/null +++ b/packages/rocketchat-apps/server/converters/rooms.js @@ -0,0 +1,82 @@ +import { RoomType } from '@rocket.chat/apps-ts-definition/rooms'; + +export class AppRoomsConverter { + constructor(orch) { + this.orch = orch; + } + + convertById(roomId) { + const room = RocketChat.models.Rooms.findOneById(roomId); + + return this._convertToApp(room); + } + + convertByName(roomName) { + const room = RocketChat.models.Rooms.findOneByName(roomName); + + return this._convertToApp(room); + } + + convertAppRoom(room) { + if (!room) { + return undefined; + } + + const creator = RocketChat.models.Users.findOneById(room.creator.id); + + return { + _id: room.id, + u: { + _id: creator._id, + username: creator.username + }, + ts: room.createdAt, + t: room.type, + name: room.name, + msgs: room.messageCount || 0, + default: typeof room.isDefault === 'undefined' ? false : room.isDefault, + _updatedAt: room.updatedAt, + lm: room.lastModifiedAt, + usernames: room.usernames + }; + } + + _convertToApp(room) { + if (!room) { + return undefined; + } + + let creator; + if (room.u) { + creator = this.orch.getConverters().get('users').convertById(room.u._id); + } + + return { + id: room._id, + name: room.name, + type: this._convertTypeToApp(room.t), + creator, + usernames: room.usernames, + isDefault: typeof room.default === 'undefined' ? false : room.default, + messageCount: room.msgs, + createdAt: room.ts, + updatedAt: room._updatedAt, + lastModifiedAt: room.lm + }; + } + + _convertTypeToApp(typeChar) { + switch (typeChar) { + case 'c': + return RoomType.CHANNEL; + case 'p': + return RoomType.PRIVATE_GROUP; + case 'd': + return RoomType.DIRECT_MESSAGE; + case 'lc': + return RoomType.LIVE_CHAT; + default: + throw new Error(`Unknown room type of: "${ typeChar }"`); + } + } +} diff --git a/packages/rocketchat-apps/server/converters/settings.js b/packages/rocketchat-apps/server/converters/settings.js new file mode 100644 index 000000000000..08b0681b84aa --- /dev/null +++ b/packages/rocketchat-apps/server/converters/settings.js @@ -0,0 +1,51 @@ +import { SettingType } from '@rocket.chat/apps-ts-definition/settings'; + +export class AppSettingsConverter { + constructor(orch) { + this.orch = orch; + } + + convertById(settingId) { + const setting = RocketChat.models.Settings.findOneById(settingId); + + return this.convertToApp(setting); + } + + convertToApp(setting) { + return { + id: setting._id, + type: this._convertTypeToApp(setting.type), + packageValue: setting.packageValue, + values: setting.values, + value: setting.value, + public: setting.public, + hidden: setting.hidden, + group: setting.group, + i18nLabel: setting.i18nLabel, + i18nDescription: setting.i18nDescription, + createdAt: setting.ts, + updatedAt: setting._updatedAt + }; + } + + _convertTypeToApp(type) { + switch (type) { + case 'boolean': + return SettingType.BOOLEAN; + case 'code': + return SettingType.CODE; + case 'color': + return SettingType.COLOR; + case 'font': + return SettingType.FONT; + case 'int': + return SettingType.NUMBER; + case 'select': + return SettingType.SELECT; + case 'string': + return SettingType.STRING; + default: + return type; + } + } +} diff --git a/packages/rocketchat-apps/server/converters/users.js b/packages/rocketchat-apps/server/converters/users.js new file mode 100644 index 000000000000..d33775186166 --- /dev/null +++ b/packages/rocketchat-apps/server/converters/users.js @@ -0,0 +1,71 @@ +import { UserStatusConnection, UserType } from '@rocket.chat/apps-ts-definition/users'; + +export class AppUsersConverter { + constructor(orch) { + this.orch = orch; + } + + convertById(userId) { + const user = RocketChat.models.Users.findOneById(userId); + + return this._convertToApp(user); + } + + convertByUsername(username) { + const user = RocketChat.models.Users.findOneByUsername(username); + + return this._convertToApp(user); + } + + _convertToApp(user) { + if (!user) { + return undefined; + } + + const type = this._convertUserTypeToEnum(user.type); + const status = this._convertStatusConnectionToEnum(user.status); + const statusConnection = this._convertStatusConnectionToEnum(user.statusConnection); + + return { + id: user._id, + username: user.username, + emails: user.emails, + type, + isEnabled: user.active, + name: user.name, + roles: user.roles, + status, + statusConnection, + utcOffset: user.utcOffset, + createdAt: user.createdAt, + updatedAt: user._updatedAt, + lastLoginAt: user.lastLogin + }; + } + + _convertUserTypeToEnum(type) { + switch (type) { + case 'user': + return UserType.USER; + case 'bot': + return UserType.BOT; + default: + throw new Error('Unknown user type of:', type); + } + } + + _convertStatusConnectionToEnum(status) { + switch (status) { + case 'offline': + return UserStatusConnection.OFFLINE; + case 'online': + return UserStatusConnection.ONLINE; + case 'away': + return UserStatusConnection.AWAY; + case 'busy': + return UserStatusConnection.BUSY; + default: + throw new Error('Unknown status type of:', status); + } + } +} diff --git a/packages/rocketchat-apps/server/orchestrator.js b/packages/rocketchat-apps/server/orchestrator.js new file mode 100644 index 000000000000..71a6f6b92075 --- /dev/null +++ b/packages/rocketchat-apps/server/orchestrator.js @@ -0,0 +1,81 @@ +import { RealAppBridges } from './bridges'; +import { AppMethods, AppsRestApi, AppServerNotifier } from './communication'; +import { AppMessagesConverter, AppRoomsConverter, AppSettingsConverter, AppUsersConverter } from './converters'; +import { AppsLogsModel, AppsModel, AppsPersistenceModel, AppRealStorage, AppRealLogsStorage } from './storage'; + +import { AppManager } from '@rocket.chat/apps-engine/server/AppManager'; + +class AppServerOrchestrator { + constructor() { + if (RocketChat.models && RocketChat.models.Permissions) { + RocketChat.models.Permissions.createOrUpdate('manage-apps', ['admin']); + } + + this._model = new AppsModel(); + this._logModel = new AppsLogsModel(); + this._persistModel = new AppsPersistenceModel(); + this._storage = new AppRealStorage(this._model); + this._logStorage = new AppRealLogsStorage(this._persistModel); + + this._converters = new Map(); + this._converters.set('messages', new AppMessagesConverter(this)); + this._converters.set('rooms', new AppRoomsConverter(this)); + this._converters.set('settings', new AppSettingsConverter(this)); + this._converters.set('users', new AppUsersConverter(this)); + + this._bridges = new RealAppBridges(this); + + this._manager = new AppManager(this._storage, this._logStorage, this._bridges); + + this._communicators = new Map(); + this._communicators.set('methods', new AppMethods(this._manager)); + this._communicators.set('notifier', new AppServerNotifier(this)); + this._communicators.set('restapi', new AppsRestApi(this, this._manager)); + } + + getModel() { + return this._model; + } + + getPersistenceModel() { + return this._persistModel; + } + + getStorage() { + return this._storage; + } + + getLogStorage() { + return this._logStorage; + } + + getConverters() { + return this._converters; + } + + getBridges() { + return this._bridges; + } + + getNotifier() { + return this._communicators.get('notifier'); + } + + getManager() { + return this._manager; + } +} + +Meteor.startup(function _appServerOrchestrator() { + // Ensure that everything is setup + if (process.env[AppManager.ENV_VAR_NAME_FOR_ENABLING] !== 'true' && process.env[AppManager.SUPER_FUN_ENV_ENABLEMENT_NAME] !== 'true') { + return new AppMethods(); + } + + console.log('Orchestrating the app piece...'); + global.Apps = new AppServerOrchestrator(); + + global.Apps.getManager().load() + .then(() => console.log('...done! ;)')) + .catch((err) => console.warn('...failed!', err)); +}); diff --git a/packages/rocketchat-apps/server/storage/apps-logs-model.js b/packages/rocketchat-apps/server/storage/apps-logs-model.js new file mode 100644 index 000000000000..762b50106718 --- /dev/null +++ b/packages/rocketchat-apps/server/storage/apps-logs-model.js @@ -0,0 +1,5 @@ +export class AppsLogsModel extends RocketChat.models._Base { + constructor() { + super('apps_logs'); + } +} diff --git a/packages/rocketchat-apps/server/storage/apps-model.js b/packages/rocketchat-apps/server/storage/apps-model.js new file mode 100644 index 000000000000..7f582c794722 --- /dev/null +++ b/packages/rocketchat-apps/server/storage/apps-model.js @@ -0,0 +1,5 @@ +export class AppsModel extends RocketChat.models._Base { + constructor() { + super('apps'); + } +} diff --git a/packages/rocketchat-apps/server/storage/apps-persistence-model.js b/packages/rocketchat-apps/server/storage/apps-persistence-model.js new file mode 100644 index 000000000000..c6b85aefef09 --- /dev/null +++ b/packages/rocketchat-apps/server/storage/apps-persistence-model.js @@ -0,0 +1,5 @@ +export class AppsPersistenceModel extends RocketChat.models._Base { + constructor() { + super('apps_persistence'); + } +} diff --git a/packages/rocketchat-apps/server/storage/index.js b/packages/rocketchat-apps/server/storage/index.js new file mode 100644 index 000000000000..7f24049628fa --- /dev/null +++ b/packages/rocketchat-apps/server/storage/index.js @@ -0,0 +1,7 @@ +import { AppsLogsModel } from './apps-logs-model'; +import { AppsModel } from './apps-model'; +import { AppsPersistenceModel } from './apps-persistence-model'; +import { AppRealLogsStorage } from './logs-storage'; +import { AppRealStorage } from './storage'; + +export { AppsLogsModel, AppsModel, AppsPersistenceModel, AppRealLogsStorage, AppRealStorage }; diff --git a/packages/rocketchat-apps/server/storage/logs-storage.js b/packages/rocketchat-apps/server/storage/logs-storage.js new file mode 100644 index 000000000000..a184526883bc --- /dev/null +++ b/packages/rocketchat-apps/server/storage/logs-storage.js @@ -0,0 +1,51 @@ +import { AppConsole } from '@rocket.chat/apps-engine/server/logging'; +import { AppLogStorage } from '@rocket.chat/apps-engine/server/storage'; + +export class AppRealLogsStorage extends AppLogStorage { + constructor(model) { + super('mongodb'); + this.db = model; + } + + find() { + return new Promise((resolve, reject) => { + let docs; + + try { + docs = this.db.find(...arguments).fetch(); + } catch (e) { + return reject(e); + } + + resolve(docs); + }); + } + + storeEntries(appId, logger) { + return new Promise((resolve, reject) => { + const item = AppConsole.toStorageEntry(appId, logger); + + try { + const id = this.db.insert(item); + + resolve(this.db.findOneById(id)); + } catch (e) { + reject(e); + } + }); + } + + getEntriesFor(appId) { + return new Promise((resolve, reject) => { + let docs; + + try { + docs = this.db.find({ appId }).fetch(); + } catch (e) { + return reject(e); + } + + resolve(docs); + }); + } +} diff --git a/packages/rocketchat-apps/server/storage/storage.js b/packages/rocketchat-apps/server/storage/storage.js new file mode 100644 index 000000000000..0e1d732d9904 --- /dev/null +++ b/packages/rocketchat-apps/server/storage/storage.js @@ -0,0 +1,96 @@ +import { AppStorage } from '@rocket.chat/apps-engine/server/storage'; + +export class AppRealStorage extends AppStorage { + constructor(data) { + super('mongodb'); + this.db = data; + } + + create(item) { + return new Promise((resolve, reject) => { + item.createdAt = new Date(); + item.updatedAt = new Date(); + + let doc; + + try { + doc = this.db.findOne({ $or: [{ id: item.id }, { 'info.nameSlug': item.info.nameSlug }] }); + } catch (e) { + return reject(e); + } + + if (doc) { + return reject(new Error('App already exists.')); + } + + try { + const id = this.db.insert(item); + item._id = id; + + resolve(item); + } catch (e) { + reject(e); + } + }); + } + + retrieveOne(id) { + return new Promise((resolve, reject) => { + let doc; + + try { + doc = this.db.findOne({ $or: [ {_id: id }, { id } ]}); + } catch (e) { + return reject(e); + } + + if (doc) { + resolve(doc); + } else { + reject(new Error(`No App found by the id: ${ id }`)); + } + }); + } + + retrieveAll() { + return new Promise((resolve, reject) => { + let docs; + + try { + docs = this.db.find({}).fetch(); + } catch (e) { + return reject(e); + } + + const items = new Map(); + + docs.forEach((i) => items.set(i.id, i)); + + resolve(items); + }); + } + + update(item) { + return new Promise((resolve, reject) => { + try { + this.db.update({ id: item.id }, item); + } catch (e) { + return reject(e); + } + + this.retrieveOne(item.id).then((updated) => resolve(updated)).catch((err) => reject(err)); + }); + } + + remove(id) { + return new Promise((resolve, reject) => { + try { + this.db.remove({ id }); + } catch (e) { + return reject(e); + } + + resolve({ success: true }); + }); + } +} diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.html b/packages/rocketchat-channel-settings/client/views/channelSettings.html index f90ecd10dc4a..735b947029ec 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.html +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.html @@ -85,7 +85,7 @@ {{_ "Just_invited_people_can_access_this_channel"}} - + {{/with}} @@ -93,10 +93,10 @@ {{#with settings.ro}}
-
- {{_ "Read_only"}}{{equal default value '*'}} +
+ {{_ "Colaborative"}}{{equal default value '*'}}
- {{_ "Only_authorized_users_can_write_new_messages"}} + {{_ "All_users_in_the_channel_can_write_new_messages"}}
@@ -107,10 +107,10 @@
-
- {{_ "Colaborative"}} +
+ {{_ "Read_only"}}
- {{_ "All_users_in_the_channel_can_write_new_messages"}} + {{_ "Only_authorized_users_can_write_new_messages"}}
diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.js b/packages/rocketchat-channel-settings/client/views/channelSettings.js index 13474e64329d..3e13b3e06777 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.js +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.js @@ -1,6 +1,6 @@ import toastr from 'toastr'; import s from 'underscore.string'; -import { RocketChat, RoomSettingsEnum } from 'meteor/rocketchat:lib'; +import { call, erase, hide, leave, RocketChat, RoomSettingsEnum } from 'meteor/rocketchat:lib'; const common = { canLeaveRoom() { const { cl: canLeave, t: roomType } = Template.instance().room; @@ -25,18 +25,6 @@ const common = { return room.t === 'd'; } }; -const call = (method, ...params) => { - return new Promise((resolve, reject) => { - Meteor.call(method, ...params, (err, result)=> { - if (err) { - handleError(err); - return reject(err); - } - return resolve(result); - }); - }); -}; - Template.channelSettingsEditing.events({ 'input .js-input'(e) { @@ -46,11 +34,11 @@ Template.channelSettingsEditing.events({ this.value.set(e.currentTarget.checked); }, 'click .js-reset'(e, t) { - const {settings} = t; + const { settings } = t; Object.keys(settings).forEach(key => settings[key].value.set(settings[key].default.get())); }, async 'click .js-save'(e, t) { - const {settings} = t; + const { settings } = t; Object.keys(settings).forEach(async name => { const setting = settings[name]; const value = setting.value.get(); @@ -201,7 +189,7 @@ Template.channelSettingsEditing.onCreated(function() { }; if (room['default']) { if (RocketChat.authz.hasRole(Meteor.userId(), 'admin')) { - return new Promise((resolve, reject)=> { + return new Promise((resolve, reject) => { modal.open({ title: t('Room_default_change_to_private_will_be_default_no_more'), type: 'warning', @@ -269,7 +257,7 @@ Template.channelSettingsEditing.onCreated(function() { return RocketChat.authz.hasAtLeastOnePermission(['archive-room', 'unarchive-room'], room._id); }, save(value) { - return new Promise((resolve, reject)=>{ + return new Promise((resolve, reject) => { modal.open({ title: t('Are_you_sure'), type: 'warning', @@ -347,7 +335,7 @@ Template.channelSettingsEditing.onCreated(function() { }; Object.keys(this.settings).forEach(key => { const setting = this.settings[key]; - const def =setting.getValue ? setting.getValue(this.room): this.room[key]; + const def = setting.getValue ? setting.getValue(this.room) : this.room[key]; setting.default = new ReactiveVar(def || false); setting.value = new ReactiveVar(def || false); }); @@ -368,7 +356,7 @@ Template.channelSettingsEditing.helpers({ return this.value.get();// ? '' : 'checked'; }, modified(text = '') { - const {settings} = Template.instance(); + const { settings } = Template.instance(); return !Object.keys(settings).some(key => settings[key].default.get() !== settings[key].value.get()) ? text : ''; }, equal(text = '', text2 = '', ret = '*') { @@ -385,7 +373,7 @@ Template.channelSettingsEditing.helpers({ return 'hashtag'; case 'l': return 'livechat'; - default : + default: return null; } }, @@ -420,96 +408,20 @@ Template.channelSettings.events({ t.editing.set(true); }, 'click .js-leave'(e, instance) { - let warnText; - const { rid, name, t : type } = instance.room; - switch (type) { - case 'c': warnText = 'Leave_Room_Warning'; break; - case 'p': warnText = 'Leave_Group_Warning'; break; - case 'd': warnText = 'Leave_Private_Warning'; break; - case 'l': warnText = 'Leave_Livechat_Warning'; break; - } - - modal.open({ - title: t('Are_you_sure'), - text: warnText ? t(warnText, name) : '', - type: 'warning', - showCancelButton: true, - confirmButtonColor: '#DD6B55', - confirmButtonText: t('Yes_leave_it'), - cancelButtonText: t('Cancel'), - closeOnConfirm: true, - html: false - }, async function() { - if (['channel', 'group', 'direct'].includes(FlowRouter.getRouteName()) && (Session.get('openedRoom') === rid)) { - FlowRouter.go('home'); - } - - await call('leaveRoom', rid); - - if (rid === Session.get('openedRoom')) { - Session.delete('openedRoom'); - } - - }); + const { name, t: type } = instance.room; + const rid = instance.room._id; + leave(type, rid, name); }, 'click .js-hide'(e, instance) { - let warnText; - const { rid, name, t: type } = instance.room; - switch (type) { - case 'c': warnText = 'Hide_Room_Warning'; break; - case 'p': warnText = 'Hide_Group_Warning'; break; - case 'd': warnText = 'Hide_Private_Warning'; break; - case 'l': warnText = 'Hide_Livechat_Warning'; break; - } - - modal.open({ - title: t('Are_you_sure'), - text: warnText ? t(warnText, name) : '', - type: 'warning', - showCancelButton: true, - confirmButtonColor: '#DD6B55', - confirmButtonText: t('Yes_hide_it'), - cancelButtonText: t('Cancel'), - closeOnConfirm: true, - html: false - }, async function() { - if (['channel', 'group', 'direct'].includes(FlowRouter.getRouteName()) && (Session.get('openedRoom') === rid)) { - FlowRouter.go('home'); - } - - await call('hideRoom', rid); - - if (rid === Session.get('openedRoom')) { - Session.delete('openedRoom'); - } - - }); + const { name, t: type } = instance.room; + const rid = instance.room._id; + hide(type, rid, name); }, 'click .js-cancel'(e, t) { t.editing.set(false); }, 'click .js-delete'() { - return modal.open({ - title: t('Are_you_sure'), - text: t('Delete_Room_Warning'), - type: 'warning', - showCancelButton: true, - confirmButtonColor: '#DD6B55', - confirmButtonText: t('Yes_delete_it'), - cancelButtonText: t('Cancel'), - closeOnConfirm: false, - html: false - }, () => { - call('eraseRoom', this.rid).then(() => { - modal.open({ - title: t('Deleted'), - text: t('Room_has_been_deleted'), - type: 'success', - timer: 2000, - showConfirmButton: false - }); - }); - }); + return erase(this.rid); } }); @@ -558,7 +470,7 @@ Template.channelSettingsInfo.helpers({ return 'hashtag'; case 'l': return 'livechat'; - default : + default: return null; } } diff --git a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.js b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.js index f67c9e9cffe1..5ccdced2aaa3 100644 --- a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.js +++ b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.js @@ -1,4 +1,4 @@ -const fields = ['roomName', 'roomTopic', 'roomAnnouncement', 'roomDescription', 'roomType', 'readOnly', 'reactWhenReadOnly', 'systemMessages', 'default', 'joinCode', 'tokenpass']; +const fields = ['roomName', 'roomTopic', 'roomAnnouncement', 'roomDescription', 'roomType', 'readOnly', 'reactWhenReadOnly', 'systemMessages', 'default', 'joinCode', 'tokenpass', 'streamingOptions']; Meteor.methods({ saveRoomSettings(rid, settings, value) { if (!Meteor.userId()) { @@ -99,6 +99,9 @@ Meteor.methods({ }); RocketChat.saveRoomTokenpass(rid, value); break; + case 'streamingOptions': + RocketChat.saveStreamingOptions(rid, value); + break; case 'readOnly': if (value !== room.ro) { RocketChat.saveRoomReadOnly(rid, value, user); diff --git a/packages/rocketchat-emoji-custom/assets/stylesheets/emojiCustomAdmin.css b/packages/rocketchat-emoji-custom/assets/stylesheets/emojiCustomAdmin.css index 8cae1bdfc85b..30fb4da03c2f 100644 --- a/packages/rocketchat-emoji-custom/assets/stylesheets/emojiCustomAdmin.css +++ b/packages/rocketchat-emoji-custom/assets/stylesheets/emojiCustomAdmin.css @@ -21,7 +21,7 @@ border-radius: 4px; background-repeat: no-repeat; background-position: center; - background-size: cover; + background-size: contain; } } diff --git a/packages/rocketchat-file-upload/globalFileRestrictions.js b/packages/rocketchat-file-upload/globalFileRestrictions.js index 0568c018d8f1..ca98fd5a6f3b 100644 --- a/packages/rocketchat-file-upload/globalFileRestrictions.js +++ b/packages/rocketchat-file-upload/globalFileRestrictions.js @@ -15,7 +15,7 @@ const slingShotConfig = { const maxFileSize = RocketChat.settings.get('FileUpload_MaxFileSize'); - if (maxFileSize && maxFileSize < file.size) { + if (maxFileSize >= -1 && maxFileSize < file.size) { throw new Meteor.Error(TAPi18n.__('File_exceeds_allowed_size_of_bytes', { size: filesize(maxFileSize) })); } diff --git a/packages/rocketchat-file-upload/lib/FileUpload.js b/packages/rocketchat-file-upload/lib/FileUpload.js index f6f82c3905fe..006b2e37a170 100644 --- a/packages/rocketchat-file-upload/lib/FileUpload.js +++ b/packages/rocketchat-file-upload/lib/FileUpload.js @@ -30,14 +30,15 @@ FileUpload = { throw new Meteor.Error('error-direct-message-file-upload-not-allowed', reason); } - if (file.size > maxFileSize) { + // -1 maxFileSize means there is no limit + if (maxFileSize >= -1 && file.size > maxFileSize) { const reason = TAPi18n.__('File_exceeds_allowed_size_of_bytes', { size: filesize(maxFileSize) }, user.language); throw new Meteor.Error('error-file-too-large', reason); } - if (parseInt(maxFileSize) > 0) { + if (maxFileSize > 0) { if (file.size > maxFileSize) { const reason = TAPi18n.__('File_exceeds_allowed_size_of_bytes', { size: filesize(maxFileSize) @@ -56,5 +57,9 @@ FileUpload = { }; RocketChat.settings.get('FileUpload_MaxFileSize', function(key, value) { - maxFileSize = value; + try { + maxFileSize = parseInt(value); + } catch (e) { + maxFileSize = RocketChat.models.Settings.findOneById('FileUpload_MaxFileSize').packageValue; + } }); diff --git a/packages/rocketchat-file-upload/server/config/AmazonS3.js b/packages/rocketchat-file-upload/server/config/AmazonS3.js index 7cc97b3ea520..bc80d64b233d 100644 --- a/packages/rocketchat-file-upload/server/config/AmazonS3.js +++ b/packages/rocketchat-file-upload/server/config/AmazonS3.js @@ -3,15 +3,24 @@ import _ from 'underscore'; import { FileUploadClass } from '../lib/FileUpload'; import '../../ufs/AmazonS3/server.js'; +import http from 'http'; +import https from 'https'; const get = function(file, req, res) { const fileUrl = this.store.getRedirectURL(file); if (fileUrl) { - res.setHeader('Location', fileUrl); - res.writeHead(302); + if (RocketChat.settings.get('FileUpload_S3_Proxy')) { + const request = /^https:/.test(fileUrl) ? https : http; + request.get(fileUrl, fileRes => fileRes.pipe(res)); + } else { + res.setHeader('Location', fileUrl); + res.writeHead(302); + res.end(); + } + } else { + res.end(); } - res.end(); }; const AmazonS3Uploads = new FileUploadClass({ diff --git a/packages/rocketchat-file-upload/server/config/FileSystem.js b/packages/rocketchat-file-upload/server/config/FileSystem.js index f2ba60b92980..096df87e4dee 100644 --- a/packages/rocketchat-file-upload/server/config/FileSystem.js +++ b/packages/rocketchat-file-upload/server/config/FileSystem.js @@ -36,16 +36,6 @@ const FileSystemAvatars = new FileUploadClass({ // store setted bellow get(file, req, res) { - const reqModifiedHeader = req.headers['if-modified-since']; - if (reqModifiedHeader) { - if (reqModifiedHeader === (file.uploadedAt && file.uploadedAt.toUTCString())) { - res.setHeader('Last-Modified', reqModifiedHeader); - res.writeHead(304); - res.end(); - return; - } - } - const filePath = this.store.getFilePath(file._id, file); try { @@ -53,10 +43,6 @@ const FileSystemAvatars = new FileUploadClass({ if (stat && stat.isFile()) { file = FileUpload.addExtensionTo(file); - res.setHeader('Content-Disposition', 'inline'); - res.setHeader('Last-Modified', file.uploadedAt.toUTCString()); - res.setHeader('Content-Type', file.type); - res.setHeader('Content-Length', file.size); this.store.getReadStream(file._id, file).pipe(res); } diff --git a/packages/rocketchat-file-upload/server/config/GoogleStorage.js b/packages/rocketchat-file-upload/server/config/GoogleStorage.js index 89673b1035f9..fd571ea6ec8f 100644 --- a/packages/rocketchat-file-upload/server/config/GoogleStorage.js +++ b/packages/rocketchat-file-upload/server/config/GoogleStorage.js @@ -3,7 +3,8 @@ import _ from 'underscore'; import { FileUploadClass } from '../lib/FileUpload'; import '../../ufs/GoogleStorage/server.js'; - +import http from 'http'; +import https from 'https'; const get = function(file, req, res) { this.store.getRedirectURL(file, (err, fileUrl) => { @@ -12,10 +13,17 @@ const get = function(file, req, res) { } if (fileUrl) { - res.setHeader('Location', fileUrl); - res.writeHead(302); + if (RocketChat.settings.get('FileUpload_GoogleStorage_Proxy')) { + const request = /^https:/.test(fileUrl) ? https : http; + request.get(fileUrl, fileRes => fileRes.pipe(res)); + } else { + res.setHeader('Location', fileUrl); + res.writeHead(302); + res.end(); + } + } else { + res.end(); } - res.end(); }); }; diff --git a/packages/rocketchat-file-upload/server/config/GridFS.js b/packages/rocketchat-file-upload/server/config/GridFS.js index 1dc16f697909..54bb40712cac 100644 --- a/packages/rocketchat-file-upload/server/config/GridFS.js +++ b/packages/rocketchat-file-upload/server/config/GridFS.js @@ -64,7 +64,7 @@ const getByteRange = function(header) { // code from: https://github.com/jalik/jalik-ufs/blob/master/ufs-server.js#L310 -const readFromGridFS = function(storeName, fileId, file, headers, req, res) { +const readFromGridFS = function(storeName, fileId, file, req, res) { const store = UploadFS.getStore(storeName); const rs = store.getReadStream(fileId, file); const ws = new stream.PassThrough(); @@ -82,7 +82,7 @@ const readFromGridFS = function(storeName, fileId, file, headers, req, res) { const accept = req.headers['accept-encoding'] || ''; // Transform stream - store.transformRead(rs, ws, fileId, file, req, headers); + store.transformRead(rs, ws, fileId, file, req); const range = getByteRange(req.headers.range); let out_of_range = false; if (range) { @@ -91,34 +91,34 @@ const readFromGridFS = function(storeName, fileId, file, headers, req, res) { // Compress data using gzip if (accept.match(/\bgzip\b/) && range === null) { - headers['Content-Encoding'] = 'gzip'; - delete headers['Content-Length']; - res.writeHead(200, headers); + res.setHeader('Content-Encoding', 'gzip'); + res.removeHeader('Content-Length'); + res.writeHead(200); ws.pipe(zlib.createGzip()).pipe(res); } else if (accept.match(/\bdeflate\b/) && range === null) { // Compress data using deflate - headers['Content-Encoding'] = 'deflate'; - delete headers['Content-Length']; - res.writeHead(200, headers); + res.setHeader('Content-Encoding', 'deflate'); + res.removeHeader('Content-Length'); + res.writeHead(200); ws.pipe(zlib.createDeflate()).pipe(res); } else if (range && out_of_range) { // out of range request, return 416 - delete headers['Content-Length']; - delete headers['Content-Type']; - delete headers['Content-Disposition']; - delete headers['Last-Modified']; - headers['Content-Range'] = `bytes */${ file.size }`; - res.writeHead(416, headers); + res.removeHeader('Content-Length'); + res.removeHeader('Content-Type'); + res.removeHeader('Content-Disposition'); + res.removeHeader('Last-Modified'); + res.setHeader('Content-Range', `bytes */${ file.size }`); + res.writeHead(416); res.end(); } else if (range) { - headers['Content-Range'] = `bytes ${ range.start }-${ range.stop }/${ file.size }`; - delete headers['Content-Length']; - headers['Content-Length'] = range.stop - range.start + 1; - res.writeHead(206, headers); + res.setHeader('Content-Range', `bytes ${ range.start }-${ range.stop }/${ file.size }`); + res.removeHeader('Content-Length'); + res.setHeader('Content-Length', range.stop - range.start + 1); + res.writeHead(206); logger.debug('File upload extracting range'); ws.pipe(new ExtractRange({ start: range.start, stop: range.stop })).pipe(res); } else { - res.writeHead(200, headers); + res.writeHead(200); ws.pipe(res); } }; @@ -140,13 +140,13 @@ new FileUploadClass({ get(file, req, res) { file = FileUpload.addExtensionTo(file); - const headers = { - 'Content-Disposition': `attachment; filename*=UTF-8''${ encodeURIComponent(file.name) }`, - 'Last-Modified': file.uploadedAt.toUTCString(), - 'Content-Type': file.type, - 'Content-Length': file.size - }; - return readFromGridFS(file.store, file._id, file, headers, req, res); + + res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${ encodeURIComponent(file.name) }`); + res.setHeader('Last-Modified', file.uploadedAt.toUTCString()); + res.setHeader('Content-Type', file.type); + res.setHeader('Content-Length', file.size); + + return readFromGridFS(file.store, file._id, file, req, res); } }); @@ -154,22 +154,8 @@ new FileUploadClass({ name: 'GridFS:Avatars', get(file, req, res) { - const reqModifiedHeader = req.headers['if-modified-since']; - if (reqModifiedHeader && reqModifiedHeader === (file.uploadedAt && file.uploadedAt.toUTCString())) { - res.setHeader('Last-Modified', reqModifiedHeader); - res.writeHead(304); - res.end(); - return; - } file = FileUpload.addExtensionTo(file); - const headers = { - 'Cache-Control': 'public, max-age=0', - 'Expires': '-1', - 'Content-Disposition': 'inline', - 'Last-Modified': file.uploadedAt.toUTCString(), - 'Content-Type': file.type, - 'Content-Length': file.size - }; - return readFromGridFS(file.store, file._id, file, headers, req, res); + + return readFromGridFS(file.store, file._id, file, req, res); } }); diff --git a/packages/rocketchat-file-upload/server/lib/FileUpload.js b/packages/rocketchat-file-upload/server/lib/FileUpload.js index 7ef2d5049117..a056e991fba5 100644 --- a/packages/rocketchat-file-upload/server/lib/FileUpload.js +++ b/packages/rocketchat-file-upload/server/lib/FileUpload.js @@ -4,6 +4,7 @@ import fs from 'fs'; import stream from 'stream'; import mime from 'mime-type/with-db'; import Future from 'fibers/future'; +import sharp from 'sharp'; import { Cookies } from 'meteor/ostrio:cookies'; const cookie = new Cookies(); @@ -30,7 +31,6 @@ Object.assign(FileUpload, { getPath(file) { return `${ RocketChat.settings.get('uniqueID') }/uploads/${ file.rid }/${ file.userId }/${ file._id }`; }, - // transformWrite: FileUpload.uploadsTransformWrite onValidate: FileUpload.uploadsOnValidate, onRead(fileId, file, req, res) { if (!FileUpload.requestCanAccessFiles(req)) { @@ -50,7 +50,6 @@ Object.assign(FileUpload, { // filter: new UploadFS.Filter({ // onCheck: FileUpload.validateFileUpload // }), - // transformWrite: FileUpload.avatarTransformWrite, getPath(file) { return `${ RocketChat.settings.get('uniqueID') }/avatars/${ file.userId }`; }, @@ -59,66 +58,63 @@ Object.assign(FileUpload, { }; }, - avatarTransformWrite(readStream, writeStream/*, fileId, file*/) { - if (RocketChatFile.enabled === false || RocketChat.settings.get('Accounts_AvatarResize') !== true) { - return readStream.pipe(writeStream); - } - const height = RocketChat.settings.get('Accounts_AvatarSize'); - const width = height; - return (file => RocketChat.Info.GraphicsMagick.enabled ? file: file.alpha('remove'))(RocketChatFile.gm(readStream).background('#FFFFFF')).resize(width, `${ height }^`).gravity('Center').crop(width, height).extent(width, height).stream('jpeg').pipe(writeStream); - }, - avatarsOnValidate(file) { - if (RocketChatFile.enabled === false || RocketChat.settings.get('Accounts_AvatarResize') !== true) { + if (RocketChat.settings.get('Accounts_AvatarResize') !== true) { return; } const tempFilePath = UploadFS.getTempFilePath(file._id); const height = RocketChat.settings.get('Accounts_AvatarSize'); - const width = height; const future = new Future(); - (file => RocketChat.Info.GraphicsMagick.enabled ? file: file.alpha('remove'))(RocketChatFile.gm(tempFilePath).background('#FFFFFF')).resize(width, `${ height }^`).gravity('Center').crop(width, height).extent(width, height).setFormat('jpeg').write(tempFilePath, Meteor.bindEnvironment(err => { - if (err != null) { - console.error(err); - } - const size = fs.lstatSync(tempFilePath).size; - this.getCollection().direct.update({_id: file._id}, {$set: {size}}); - future.return(); + const s = sharp(tempFilePath); + s.rotate(); + // Get metadata to resize the image the first time to keep "inside" the dimensions + // then resize again to create the canvas around + s.metadata(Meteor.bindEnvironment((err, metadata) => { + s.toFormat(sharp.format.jpeg) + .resize(Math.min(height, metadata.width), Math.min(height, metadata.height)) + .pipe(sharp() + .resize(height, height) + .background('#FFFFFF') + .embed() + ) + // Use buffer to get the result in memory then replace the existing file + // There is no option to override a file using this library + .toBuffer() + .then(Meteor.bindEnvironment(outputBuffer => { + fs.writeFile(tempFilePath, outputBuffer, Meteor.bindEnvironment(err => { + if (err != null) { + console.error(err); + } + const size = fs.lstatSync(tempFilePath).size; + this.getCollection().direct.update({_id: file._id}, {$set: {size}}); + future.return(); + })); + })); })); + return future.wait(); }, - uploadsTransformWrite(readStream, writeStream, fileId, file) { - if (RocketChatFile.enabled === false || !/^image\/.+/.test(file.type)) { - return readStream.pipe(writeStream); - } - - let stream = undefined; - - const identify = function(err, data) { - if (err) { - return stream.pipe(writeStream); - } - - file.identify = { - format: data.format, - size: data.size - }; - - if (data.Orientation && !['', 'Unknown', 'Undefined'].includes(data.Orientation)) { - RocketChatFile.gm(stream).autoOrient().stream().pipe(writeStream); - } else { - stream.pipe(writeStream); - } - }; - - stream = RocketChatFile.gm(readStream).identify(identify).stream(); + resizeImagePreview(file) { + file = RocketChat.models.Uploads.findOneById(file._id); + file = FileUpload.addExtensionTo(file); + const image = FileUpload.getStore('Uploads')._store.getReadStream(file._id, file); + + const transformer = sharp() + .resize(32, 32) + .max() + .jpeg() + .blur(); + const result = transformer.toBuffer().then((out) => out.toString('base64')); + image.pipe(transformer); + return result; }, uploadsOnValidate(file) { - if (RocketChatFile.enabled === false || !/^image\/((x-windows-)?bmp|p?jpeg|png)$/.test(file.type)) { + if (!/^image\/((x-windows-)?bmp|p?jpeg|png)$/.test(file.type)) { return; } @@ -126,33 +122,45 @@ Object.assign(FileUpload, { const fut = new Future(); - const identify = Meteor.bindEnvironment((err, data) => { + const s = sharp(tmpFile); + s.metadata(Meteor.bindEnvironment((err, metadata) => { if (err != null) { console.error(err); return fut.return(); } - file.identify = { - format: data.format, - size: data.size + const identify = { + format: metadata.format, + size: { + width: metadata.width, + height: metadata.height + } }; - if ([null, undefined, '', 'Unknown', 'Undefined'].includes(data.Orientation)) { + if (metadata.orientation == null) { return fut.return(); } - RocketChatFile.gm(tmpFile).autoOrient().write(tmpFile, Meteor.bindEnvironment((err) => { - if (err != null) { + s.rotate() + .toFile(`${ tmpFile }.tmp`) + .then(Meteor.bindEnvironment(() => { + fs.unlink(tmpFile, Meteor.bindEnvironment(() => { + fs.rename(`${ tmpFile }.tmp`, tmpFile, Meteor.bindEnvironment(() => { + const size = fs.lstatSync(tmpFile).size; + this.getCollection().direct.update({_id: file._id}, { + $set: { + size, + identify + } + }); + fut.return(); + })); + })); + })).catch((err) => { console.error(err); - } - - const size = fs.lstatSync(tmpFile).size; - this.getCollection().direct.update({_id: file._id}, {$set: {size}}); - fut.return(); - })); - }); - - RocketChatFile.gm(tmpFile).identify(identify); + fut.return(); + }); + })); return fut.wait(); }, diff --git a/packages/rocketchat-file-upload/server/methods/sendFileMessage.js b/packages/rocketchat-file-upload/server/methods/sendFileMessage.js index 1dd56865770a..74a6c30d2e98 100644 --- a/packages/rocketchat-file-upload/server/methods/sendFileMessage.js +++ b/packages/rocketchat-file-upload/server/methods/sendFileMessage.js @@ -1,7 +1,7 @@ import _ from 'underscore'; Meteor.methods({ - 'sendFileMessage'(roomId, store, file, msgData = {}) { + async 'sendFileMessage'(roomId, store, file, msgData = {}) { if (!Meteor.userId()) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'sendFileMessage' }); } @@ -39,6 +39,7 @@ Meteor.methods({ if (file.identify && file.identify.size) { attachment.image_dimensions = file.identify.size; } + attachment.image_preview = await FileUpload.resizeImagePreview(file); } else if (/^audio\/.+/.test(file.type)) { attachment.audio_url = fileUrl; attachment.audio_type = file.type; diff --git a/packages/rocketchat-file-upload/server/startup/settings.js b/packages/rocketchat-file-upload/server/startup/settings.js index 12db1a4dba8e..d5b3cbb5f385 100644 --- a/packages/rocketchat-file-upload/server/startup/settings.js +++ b/packages/rocketchat-file-upload/server/startup/settings.js @@ -112,6 +112,13 @@ RocketChat.settings.addGroup('FileUpload', function() { }, i18nDescription: 'FileUpload_S3_URLExpiryTimeSpan_Description' }); + this.add('FileUpload_S3_Proxy', false, { + type: 'boolean', + enableQuery: { + _id: 'FileUpload_Storage_Type', + value: 'AmazonS3' + } + }); }); this.section('Google Cloud Storage', function() { @@ -140,6 +147,13 @@ RocketChat.settings.addGroup('FileUpload', function() { value: 'GoogleCloudStorage' } }); + this.add('FileUpload_GoogleStorage_Proxy', false, { + type: 'boolean', + enableQuery: { + _id: 'FileUpload_Storage_Type', + value: 'GoogleCloudStorage' + } + }); }); this.section('File System', function() { diff --git a/packages/rocketchat-file/file.server.js b/packages/rocketchat-file/file.server.js index 1fb0487184e6..e4888d56d291 100644 --- a/packages/rocketchat-file/file.server.js +++ b/packages/rocketchat-file/file.server.js @@ -3,76 +3,13 @@ import stream from 'stream'; import fs from 'fs'; import path from 'path'; import mkdirp from 'mkdirp'; -import gm from 'gm'; -import {exec} from 'child_process'; // Fix problem with usernames being converted to object id Grid.prototype.tryParseObjectId = function() { return false; }; //TODO: REMOVE RocketChatFile from globals -RocketChatFile = { - gm, - enabled: undefined, - enable() { - RocketChatFile.enabled = true; - return RocketChat.settings.updateOptionsById('Accounts_AvatarResize', { - alert: undefined - }); - }, - disable() { - RocketChatFile.enabled = false; - return RocketChat.settings.updateOptionsById('Accounts_AvatarResize', { - alert: 'The_image_resize_will_not_work_because_we_can_not_detect_ImageMagick_or_GraphicsMagick_installed_in_your_server' - }); - } -}; - -const detectGM = function() { - return exec('gm version', Meteor.bindEnvironment(function(error, stdout) { - if ((error == null) && stdout.indexOf('GraphicsMagick') > -1) { - RocketChatFile.enable(); - RocketChat.Info.GraphicsMagick = { - enabled: true, - version: stdout - }; - } else { - RocketChat.Info.GraphicsMagick = { - enabled: false - }; - } - return exec('convert -version', Meteor.bindEnvironment(function(error, stdout) { - if ((error == null) && stdout.indexOf('ImageMagick') > -1) { - if (RocketChatFile.enabled !== true) { - // Enable GM to work with ImageMagick if no GraphicsMagick - RocketChatFile.gm = RocketChatFile.gm.subClass({ - imageMagick: true - }); - RocketChatFile.enable(); - } - return RocketChat.Info.ImageMagick = { - enabled: true, - version: stdout - }; - } else { - if (RocketChatFile.enabled !== true) { - RocketChatFile.disable(); - } - return RocketChat.Info.ImageMagick = { - enabled: false - }; - } - })); - })); -}; - -detectGM(); - -Meteor.methods({ - 'detectGM'() { - detectGM(); - } -}); +RocketChatFile = {}; RocketChatFile.bufferToStream = function(buffer) { const bufferStream = new stream.PassThrough(); diff --git a/packages/rocketchat-grant-facebook/README.md b/packages/rocketchat-grant-facebook/README.md new file mode 100644 index 000000000000..9d2da06860b2 --- /dev/null +++ b/packages/rocketchat-grant-facebook/README.md @@ -0,0 +1,3 @@ +# rocketchat:grant-facebook + +An implementation of the Facebook OAuth flow. diff --git a/packages/rocketchat-grant-facebook/package.js b/packages/rocketchat-grant-facebook/package.js new file mode 100644 index 000000000000..ad67058dde82 --- /dev/null +++ b/packages/rocketchat-grant-facebook/package.js @@ -0,0 +1,16 @@ +Package.describe({ + name: 'rocketchat:grant-facebook', + version: '0.0.1', + summary: 'Provides Facebook to rocketchat:grant', + git: '' +}); + +Package.onUse(function(api) { + api.use([ + 'ecmascript', + 'http', + 'rocketchat:grant' + ]); + + api.mainModule('server/index.js', 'server'); +}); diff --git a/packages/rocketchat-grant-facebook/server/index.js b/packages/rocketchat-grant-facebook/server/index.js new file mode 100644 index 000000000000..7dc87f6494f9 --- /dev/null +++ b/packages/rocketchat-grant-facebook/server/index.js @@ -0,0 +1,56 @@ +import { Providers, GrantError } from 'meteor/rocketchat:grant'; +import { HTTP } from 'meteor/http'; + +const userAgent = 'Meteor'; +const version = 'v2.10'; + +function getIdentity(accessToken, fields) { + try { + return HTTP.get( + `https://graph.facebook.com/${ version }/me`, { + headers: { 'User-Agent': userAgent }, + params: { + access_token: accessToken, + fields: fields.join(',') + } + }).data; + } catch (err) { + throw new GrantError(`Failed to fetch identity from Facebook. ${ err.message }`); + } +} + +function getPicture(accessToken) { + try { + return HTTP.get( + `https://graph.facebook.com/${ version }/me/picture`, { + headers: { 'User-Agent': userAgent }, + params: { + redirect: false, + height: 200, + width: 200, + type: 'normal', + access_token: accessToken + } + }).data; + } catch (err) { + throw new GrantError(`Failed to fetch profile picture from Facebook. ${ err.message }`); + } +} + +export function getUser(accessToken) { + const whitelisted = ['id', 'email', 'name', 'first_name', 'last_name']; + const identity = getIdentity(accessToken, whitelisted); + const avatar = getPicture(accessToken); + const username = identity.name.toLowerCase().replace(' ', '.'); + + return { + id: identity.id, + email: identity.email, + username, + name: `${ identity.first_name } ${ identity.last_name }`, + avatar: avatar.data.url + }; +} + +// Register Facebook OAuth +Providers.register('facebook', { scope: ['public_profile', 'email'] }, getUser); diff --git a/packages/rocketchat-grant-github/README.md b/packages/rocketchat-grant-github/README.md new file mode 100644 index 000000000000..e5fea3c781c7 --- /dev/null +++ b/packages/rocketchat-grant-github/README.md @@ -0,0 +1,3 @@ +# rocketchat:grant-github + +An implementation of the GitHub OAuth flow. diff --git a/packages/rocketchat-grant-github/package.js b/packages/rocketchat-grant-github/package.js new file mode 100644 index 000000000000..0e3ce2d86198 --- /dev/null +++ b/packages/rocketchat-grant-github/package.js @@ -0,0 +1,16 @@ +Package.describe({ + name: 'rocketchat:grant-github', + version: '0.0.1', + summary: 'Provides GitHub to rocketchat:grant', + git: '' +}); + +Package.onUse(function(api) { + api.use([ + 'ecmascript', + 'http', + 'rocketchat:grant' + ]); + + api.mainModule('server/index.js', 'server'); +}); diff --git a/packages/rocketchat-grant-github/server/index.js b/packages/rocketchat-grant-github/server/index.js new file mode 100644 index 000000000000..1358986420c3 --- /dev/null +++ b/packages/rocketchat-grant-github/server/index.js @@ -0,0 +1,46 @@ +import { Providers, GrantError } from 'meteor/rocketchat:grant'; +import { HTTP } from 'meteor/http'; + +const userAgent = 'Meteor'; + +function getIdentity(accessToken) { + try { + return HTTP.get( + 'https://api.github.com/user', { + headers: { 'User-Agent': userAgent }, // http://developer.github.com/v3/#user-agent-required + params: { access_token: accessToken } + }).data; + } catch (err) { + throw new GrantError(`Failed to fetch identity from Github. ${ err.message }`); + } +} + +function getEmails(accessToken) { + try { + return HTTP.get( + 'https://api.github.com/user/emails', { + headers: { 'User-Agent': userAgent }, // http://developer.github.com/v3/#user-agent-required + params: { access_token: accessToken } + }).data; + } catch (err) { + return []; + } +} + +export function getUser(accessToken) { + const identity = getIdentity(accessToken); + const emails = getEmails(accessToken); + const primaryEmail = (emails || []).find(email => email.primary === true); + + return { + id: identity.id, + email: identity.email || (primaryEmail && primaryEmail.email) || '', + username: identity.login, + emails, + name: identity.name, + avatar: identity.avatar_url + }; +} + +// Register GitHub OAuth +Providers.register('github', { scope: ['user', 'user:email'] }, getUser); diff --git a/packages/rocketchat-grant-google/README.md b/packages/rocketchat-grant-google/README.md new file mode 100644 index 000000000000..cdd59d97b562 --- /dev/null +++ b/packages/rocketchat-grant-google/README.md @@ -0,0 +1,3 @@ +# rocketchat:grant-google + +An implementation of the Google OAuth flow. diff --git a/packages/rocketchat-grant-google/package.js b/packages/rocketchat-grant-google/package.js new file mode 100644 index 000000000000..b0a538c44e57 --- /dev/null +++ b/packages/rocketchat-grant-google/package.js @@ -0,0 +1,16 @@ +Package.describe({ + name: 'rocketchat:grant-google', + version: '0.0.1', + summary: 'Provides Google to rocketchat:grant', + git: '' +}); + +Package.onUse(function(api) { + api.use([ + 'ecmascript', + 'http', + 'rocketchat:grant' + ]); + + api.mainModule('server/index.js', 'server'); +}); diff --git a/packages/rocketchat-grant-google/server/index.js b/packages/rocketchat-grant-google/server/index.js new file mode 100644 index 000000000000..f1cf2ae853a6 --- /dev/null +++ b/packages/rocketchat-grant-google/server/index.js @@ -0,0 +1,38 @@ +import { Providers, GrantError } from 'meteor/rocketchat:grant'; +import { HTTP } from 'meteor/http'; + +const userAgent = 'Meteor'; + +function getIdentity(accessToken) { + try { + return HTTP.get( + 'https://www.googleapis.com/oauth2/v1/userinfo', { + headers: { 'User-Agent': userAgent }, + params: { + access_token: accessToken + } + }).data; + } catch (err) { + throw new GrantError(`Failed to fetch identity from Google. ${ err.message }`); + } +} + +export function getUser(accessToken) { + const whitelisted = [ + 'id', 'email', 'verified_email', 'name', + 'given_name', 'family_name', 'picture' + ]; + const identity = getIdentity(accessToken, whitelisted); + const username = `${ identity.given_name.toLowerCase() }.${ identity.family_name.toLowerCase() }`; + + return { + id: identity.id, + email: identity.email, + username, + name: identity.name, + avatar: identity.picture + }; +} + +// Register Google OAuth +Providers.register('google', { scope: ['openid', 'email'] }, getUser); diff --git a/packages/rocketchat-grant/.npm/package/.gitignore b/packages/rocketchat-grant/.npm/package/.gitignore new file mode 100644 index 000000000000..3c3629e647f5 --- /dev/null +++ b/packages/rocketchat-grant/.npm/package/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/packages/rocketchat-grant/.npm/package/README b/packages/rocketchat-grant/.npm/package/README new file mode 100644 index 000000000000..3d492553a438 --- /dev/null +++ b/packages/rocketchat-grant/.npm/package/README @@ -0,0 +1,7 @@ +This directory and the files immediately inside it are automatically generated +when you change this package's NPM dependencies. Commit the files in this +directory (npm-shrinkwrap.json, .gitignore, and this README) to source control +so that others run the same versions of sub-dependencies. + +You should NOT check in the node_modules directory that Meteor automatically +creates; if you are using git, the .gitignore file tells git to ignore it. diff --git a/packages/rocketchat-grant/.npm/package/npm-shrinkwrap.json b/packages/rocketchat-grant/.npm/package/npm-shrinkwrap.json new file mode 100644 index 000000000000..0f2cc65af3df --- /dev/null +++ b/packages/rocketchat-grant/.npm/package/npm-shrinkwrap.json @@ -0,0 +1,539 @@ +{ + "lockfileVersion": 1, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=" + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=" + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", + "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "crc": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", + "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" + }, + "deep-copy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/deep-copy/-/deep-copy-1.2.0.tgz", + "integrity": "sha1-X7KnqV9UVUc9fOOaOS9Cw1FOEeg=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", + "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=" + }, + "express": { + "version": "4.15.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz", + "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=" + }, + "express-session": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.4.tgz", + "integrity": "sha1-Xizc9t7+PB7aTpgPE7mGzFjPuVQ=", + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "finalhandler": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", + "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=" + }, + "forwarded": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" + }, + "fresh": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "grant": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/grant/-/grant-3.8.0.tgz", + "integrity": "sha512-Q8UN1j9JQmmb/Wf7PlYXJn92IjX9Tio21rEV5jOte/novOaZ/l0xMWNel7CDbRw0zqFEnYIIAyh1Cri2u3poUw==" + }, + "grant-express": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/grant-express/-/grant-express-3.8.0.tgz", + "integrity": "sha512-Ph3SSr8vQTt9igZn4GAARjfOYPlB3nxngs0NwBqFNPbBdSPf+m5keEibfrP2GfeYK1GCYoz85BPQzQQZYbBzpQ==" + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=" + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=" + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "http-errors": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=", + "dependencies": { + "depd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + } + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "mime-db": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", + "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" + }, + "mime-types": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", + "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "proxy-addr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "send": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", + "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=" + }, + "serve-static": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", + "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=" + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=" + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=" + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "vary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", + "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + } + } +} diff --git a/packages/rocketchat-grant/README.md b/packages/rocketchat-grant/README.md new file mode 100644 index 000000000000..716b57bfcf80 --- /dev/null +++ b/packages/rocketchat-grant/README.md @@ -0,0 +1,101 @@ +# rocketchat:grant + +The main idea behind creating this package was to allow external apps (i.e. PWA) to use OAuth smoothely with currently available accounts system. + +## Usage + +1. Define providers using `Settings.add()` +1. Add apps with `Settings.apps.add()` +1. Put the path that stars OAuth flow in your app +1. You app should be able to authenticate user with received tokens + +## Paths + +There are few paths you need to be familiar with. + +### Start OAuth flow + +> \/_oauth_apps/connect/\/\ + +### Authorization callback URL + +> \/_oauth_apps/connect/\/callback + +### List of available providers + +> \/_oauth_apps/providers + +## API + +### Providers + +#### Providers.register(name, options, getUser) + +Allows to register an OAuth Provider. + +- name - string that represents the name of an OAuth provider +- options - contains fields like _scope_ +- getUser - a function that returns fields: _id, email, username, name and avatar_ + +### Settings + +#### Settings.add(options) + +Defines a provider that is able for being used in OAuth. + +**options**: + +- enabled - __boolean__ - tells to `rocketchat:grant` if provider could be used +- provider - __string__ - id of a provider +- key - __string__ - client ID provided for your OAuth access +- secret - __string__ - secret key + +Example: + +```js + Settings.add({ + enabled: true, + provider: 'google', + key: 'CLIENT_ID', + secret: 'SECRET' + }); +``` + +#### Settings.apps.add(name, options) + +Defines an app that is able for using OAuth. + +**options**: + +- redirectUrl - __string__ - where to redirect if auth was succesful +- errorUrl - __string__ - place to redirect on failure + +Example: + +```js + + const redirectUrl = 'http://localhost:4200/login?service={provider}&access_token={accessToken}&refresh_token={refreshToken}'; + + const errorUrl = 'http://localhost:4200/login?service={provider}&error={error}' + + + Settings.apps.add('PWA', { + redirectUrl, + errorUrl + }); +``` + +About URLs: + +We use a parser to produce a URL. +There are few available variables for each type of redirect. + +- redirectUrl - provider, accessToken, refreshToken +- errorUrl - provider, error + +Example: + +``` +http://localhost:4200/login?provider={provider} +// outputs: http://localhost:4200/login?provider=google +``` diff --git a/packages/rocketchat-grant/package.js b/packages/rocketchat-grant/package.js new file mode 100644 index 000000000000..bec938b3cb22 --- /dev/null +++ b/packages/rocketchat-grant/package.js @@ -0,0 +1,25 @@ +Package.describe({ + name: 'rocketchat:grant', + version: '0.0.1', + summary: 'OAuth2', + git: '' +}); + +Package.onUse(function(api) { + api.use([ + 'webapp', + 'mongo', + 'check', + 'ecmascript', + 'rocketchat:lib', + 'rocketchat:accounts' + ]); + + api.mainModule('server/index.js', 'server'); +}); + +Npm.depends({ + 'express': '4.15.3', + 'express-session': '1.15.4', + 'grant-express': '3.8.0' +}); diff --git a/packages/rocketchat-grant/server/authenticate.js b/packages/rocketchat-grant/server/authenticate.js new file mode 100644 index 000000000000..7e5aae261e1f --- /dev/null +++ b/packages/rocketchat-grant/server/authenticate.js @@ -0,0 +1,111 @@ +import { AccountsServer } from 'meteor/rocketchat:accounts'; +import { RocketChat } from 'meteor/rocketchat:lib'; +import { Accounts } from 'meteor/accounts-base'; +import { Meteor } from 'meteor/meteor'; + +import { GrantError } from './error'; +import Providers from './providers'; + +const setAvatarFromUrl = (userId, url) => { + return new Promise((resolve, reject) => { + Meteor.runAsUser(userId, () => { + Meteor.call('setAvatarFromService', url, '', 'url', (err) => { + if (err) { + if (err.details.timeToReset && err.details.timeToReset) { + reject((t('error-too-many-requests', { + seconds: parseInt(err.details.timeToReset / 1000) + }))); + } else { + reject(t('Avatar_url_invalid_or_error')); + } + } else { + resolve(); + } + }); + }); + }); +}; + +const findUserByOAuthId = (providerName, id) => { + return RocketChat.models.Users.findOne({ [`settings.profile.oauth.${ providerName }`]: id }); +}; + +const addOAuthIdToUserProfile = (user, providerName, providerId) => { + const profile = Object.assign({}, user.settings.profile, { + oauth: { + ...user.settings.profile.oauth, + [providerName]: providerId + } + }); + + RocketChat.models.Users.setProfile(user.id, profile); +}; + +function getAccessToken(req) { + const i = req.url.indexOf('?'); + + if (i === -1) { + return; + } + + const barePath = req.url.substring(i + 1); + const splitPath = barePath.split('&'); + const token = splitPath.find(p => p.match(/access_token=[a-zA-Z0-9]+/)); + + if (token) { + return token.replace('access_token=', ''); + } +} + +export async function authenticate(providerName, req) { + let tokens; + const accessToken = getAccessToken(req); + const provider = Providers.get(providerName); + + if (!provider) { + throw new GrantError(`Provider '${ providerName }' not found`); + } + + const userData = provider.getUser(accessToken); + + let user = findUserByOAuthId(providerName, userData.id); + + if (user) { + user.id = user._id; + } else { + user = RocketChat.models.Users.findOneByEmailAddress(userData.email); + if (user) { + user.id = user._id; + } + } + + if (user) { + addOAuthIdToUserProfile(user, providerName, userData.id); + + const loginResult = await AccountsServer.loginWithUser({ id: user.id }); + + tokens = loginResult.tokens; + } else { + const id = Accounts.createUser({ + email: userData.email, + username: userData.username + }); + + RocketChat.models.Users.setProfile(id, { + avatar: userData.avatar, + oauth: { + [providerName]: userData.id + } + }); + RocketChat.models.Users.setName(id, userData.name); + RocketChat.models.Users.setEmailVerified(id, userData.email); + + await setAvatarFromUrl(id, userData.avatar); + + const loginResult = await AccountsServer.loginWithUser({ id }); + + tokens = loginResult.tokens; + } + + return tokens; +} diff --git a/packages/rocketchat-grant/server/error.js b/packages/rocketchat-grant/server/error.js new file mode 100644 index 000000000000..16ab38913db8 --- /dev/null +++ b/packages/rocketchat-grant/server/error.js @@ -0,0 +1,5 @@ +export class GrantError extends Error { + constructor(...args) { + super(...args); + } +} diff --git a/packages/rocketchat-grant/server/grant.js b/packages/rocketchat-grant/server/grant.js new file mode 100644 index 000000000000..b4adfd3081dd --- /dev/null +++ b/packages/rocketchat-grant/server/grant.js @@ -0,0 +1,53 @@ +import { RocketChat } from 'meteor/rocketchat:lib'; + +import Providers from './providers'; +import Settings from './settings'; +import { path, generateCallback, generateAppCallback } from './routes'; + +function addProviders(config) { + Settings.forEach((settings, providerName) => { + if (settings.enabled === true) { + const registeredProvider = Providers.get(providerName); + + if (!registeredProvider) { + console.error(`No configuration for '${ providerName }' provider`); + } + + // basic settings + const data = { + key: settings.key, + secret: settings.secret, + scope: registeredProvider.scope, + callback: generateCallback(providerName) + }; + + // set each app + Settings.apps.forEach((_, appName) => { + data[appName] = { + callback: generateAppCallback(providerName, appName) + }; + }); + + config[providerName] = data; + } + }); +} + +const config = {}; + +export function generateConfig() { + config['server'] = { + protocol: 'http', + host: RocketChat.hostname, + path, + state: true + }; + + addProviders(config); + + return config; +} + +export function getConfig() { + return config; +} diff --git a/packages/rocketchat-grant/server/index.js b/packages/rocketchat-grant/server/index.js new file mode 100644 index 000000000000..5aec92218200 --- /dev/null +++ b/packages/rocketchat-grant/server/index.js @@ -0,0 +1,57 @@ +import { WebApp } from 'meteor/webapp'; +import session from 'express-session'; +import Grant from 'grant-express'; +import fiber from 'fibers'; + +import { GrantError } from './error'; +import { generateConfig } from './grant'; +import { path, generateCallback, generateAppCallback } from './routes'; +import { middleware as redirect } from './redirect'; +import Providers, { middleware as providers } from './providers'; +import Settings from './settings'; + +let grant; + +WebApp.connectHandlers.use(session({ + secret: 'grant', + resave: true, + saveUninitialized: true +})); + +// grant +WebApp.connectHandlers.use(path, (req, res, next) => { + if (grant) { + grant(req, res, next); + } else { + next(); + } +}); + +// callbacks +WebApp.connectHandlers.use((req, res, next) => { + fiber(() => { + redirect(req, res, next); + }).run(); +}); + +// providers +WebApp.connectHandlers.use((req, res, next) => { + fiber(() => { + providers(req, res, next); + }).run(); +}); + +Meteor.startup(() => { + const config = generateConfig(); + + grant = new Grant(config); +}); + +export { + path, + generateCallback, + generateAppCallback, + Providers, + Settings, + GrantError +}; diff --git a/packages/rocketchat-grant/server/providers.js b/packages/rocketchat-grant/server/providers.js new file mode 100644 index 000000000000..debad8d091e8 --- /dev/null +++ b/packages/rocketchat-grant/server/providers.js @@ -0,0 +1,41 @@ +import { check } from 'meteor/check'; + +import { Storage } from './storage'; +import { routes } from './routes'; + +class Providers extends Storage { + register(name, options, getUser) { + check(name, String); + check(options, { + // eslint-disable-next-line + scope: Match.OneOf(String, [String]) + }); + check(getUser, Function); + + this._add(name.toLowerCase(), { + scope: options.scope, + getUser + }); + } +} + +const providers = new Providers; + +export default providers; + +export function middleware(req, res, next) { + const route = routes.providers(req); + + if (route) { + const list = []; + + providers.forEach((_, name) => list.push(name)); + + res.end(JSON.stringify({ + data: list + })); + return; + } + + next(); +} diff --git a/packages/rocketchat-grant/server/redirect.js b/packages/rocketchat-grant/server/redirect.js new file mode 100644 index 000000000000..2423758f48ca --- /dev/null +++ b/packages/rocketchat-grant/server/redirect.js @@ -0,0 +1,54 @@ +import { authenticate } from './authenticate'; +import Settings from './settings'; +import { routes } from './routes'; +import { GrantError } from './error'; + +function parseUrl(url, config) { + return url.replace(/\{[\ ]*(provider|accessToken|refreshToken|error)[\ ]*\}/g, (_, key) => config[key]); +} + +function getAppConfig(providerName, appName) { + const providerConfig = Settings.get(providerName); + + if (providerConfig) { + return Settings.apps.get(appName); + } +} + +export async function middleware(req, res, next) { + const route = routes.appCallback(req); + + // handle app callback + if (route) { + const config = { + provider: route.provider + }; + const appConfig = getAppConfig(route.provider, route.app); + + if (appConfig) { + const { + redirectUrl, + errorUrl + } = appConfig; + + try { + const tokens = await authenticate(route.provider, req); + + config.accessToken = tokens.accessToken; + config.refreshToken = tokens.refreshToken; + + res.redirect(parseUrl(redirectUrl, config)); + return; + } catch (error) { + config.error = error instanceof GrantError ? error.message : 'Something went wrong'; + + console.error(error); + + res.redirect(parseUrl(errorUrl, config)); + return; + } + } + } + + next(); +} diff --git a/packages/rocketchat-grant/server/routes.js b/packages/rocketchat-grant/server/routes.js new file mode 100644 index 000000000000..041156f2abca --- /dev/null +++ b/packages/rocketchat-grant/server/routes.js @@ -0,0 +1,48 @@ +export const path = '/_oauth_apps'; + +export function generateCallback(providerName) { + return `${ path }/${ providerName }/callback`; +} + +export function generateAppCallback(providerName, appName) { + return generateCallback(`${ providerName }/${ appName }`); +} + +export function getPaths(req) { + const i = req.url.indexOf('?'); + let barePath; + + if (i === -1) { + barePath = req.url; + } else { + barePath = req.url.substring(0, i); + } + + const splitPath = barePath.split('/'); + + // Any non-oauth request will continue down the default + // middlewares. + if (splitPath[1] === '_oauth_apps') { + return splitPath.slice(2); + } +} + +export const routes = { + // :path/:provider/:app/callback + appCallback: (req) => { + const paths = getPaths(req); + + if (paths && paths[2] === 'callback') { + return { + provider: paths[0], + app: paths[1] + }; + } + }, + // :path/providers + providers: (req) => { + const paths = getPaths(req); + + return paths && paths[0] === 'providers'; + } +}; diff --git a/packages/rocketchat-grant/server/settings.js b/packages/rocketchat-grant/server/settings.js new file mode 100644 index 000000000000..e53b466fa87f --- /dev/null +++ b/packages/rocketchat-grant/server/settings.js @@ -0,0 +1,42 @@ +import { check } from 'meteor/check'; + +import { Storage } from './storage'; + +class Apps extends Storage { + add(name, body) { + check(name, String); + check(body, { + redirectUrl: String, + errorUrl: String + }); + + this._add(name, body); + } +} + +class Settings extends Storage { + constructor() { + super(); + + this.apps = new Apps; + } + add(settings) { + check(settings, { + enabled: Match.Optional(Boolean), + provider: String, + key: String, + secret: String + }); + + this._add(settings.provider, { + enabled: settings.enabled === true, + provider: settings.provider, + key: settings.key, + secret: settings.secret + }); + } +} + +const settings = new Settings; + +export default settings; diff --git a/packages/rocketchat-grant/server/storage.js b/packages/rocketchat-grant/server/storage.js new file mode 100644 index 000000000000..90d506681a83 --- /dev/null +++ b/packages/rocketchat-grant/server/storage.js @@ -0,0 +1,33 @@ +export class Storage { + constructor() { + this._data = {}; + } + + all() { + return this._data; + } + + forEach(fn) { + Object.keys(this.all()) + .forEach((name) => { + fn(this.get(name), name); + }); + } + + get(name) { + return this.all()[name.toLowerCase()]; + } + + has(name) { + return !!this._data[name]; + } + + _add(name, body) { + if (this.has(name)) { + console.error(`'${ name }' have been already defined`); + return; + } + + this._data[name] = body; + } +} diff --git a/packages/rocketchat-graphql/.npm/package/.gitignore b/packages/rocketchat-graphql/.npm/package/.gitignore new file mode 100644 index 000000000000..3c3629e647f5 --- /dev/null +++ b/packages/rocketchat-graphql/.npm/package/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/packages/rocketchat-graphql/.npm/package/README b/packages/rocketchat-graphql/.npm/package/README new file mode 100644 index 000000000000..3d492553a438 --- /dev/null +++ b/packages/rocketchat-graphql/.npm/package/README @@ -0,0 +1,7 @@ +This directory and the files immediately inside it are automatically generated +when you change this package's NPM dependencies. Commit the files in this +directory (npm-shrinkwrap.json, .gitignore, and this README) to source control +so that others run the same versions of sub-dependencies. + +You should NOT check in the node_modules directory that Meteor automatically +creates; if you are using git, the .gitignore file tells git to ignore it. diff --git a/packages/rocketchat-graphql/.npm/package/npm-shrinkwrap.json b/packages/rocketchat-graphql/.npm/package/npm-shrinkwrap.json new file mode 100644 index 000000000000..ebd390267c54 --- /dev/null +++ b/packages/rocketchat-graphql/.npm/package/npm-shrinkwrap.json @@ -0,0 +1,590 @@ +{ + "lockfileVersion": 1, + "dependencies": { + "@accounts/common": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@accounts/common/-/common-0.0.4.tgz", + "integrity": "sha1-xaPs4coEYr38Au1JWWLeBhmiQ5Y=" + }, + "@accounts/graphql-api": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@accounts/graphql-api/-/graphql-api-0.1.1.tgz", + "integrity": "sha1-Dg6PHFumsZce9PIjnlnJRyWRtpo=" + }, + "@accounts/server": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@accounts/server/-/server-0.0.4.tgz", + "integrity": "sha1-5UU5kczficvmSVxuHK1BPEHgLJM=" + }, + "@types/graphql": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@types/graphql/-/graphql-0.9.4.tgz", + "integrity": "sha512-ob2dps4itT/Le5DbxjssBXtBnloDIRUbkgtAvaB42mJ8pVIWMRuURD9WjnhaEGZ4Ql/EryXMQWeU8Y0EU73QLw==" + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=" + }, + "apollo-cache-control": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.0.7.tgz", + "integrity": "sha512-DoMTr3uTC5Cx9ukSO63wlzHD15C37FwZuoOZEu+m/UTzVFKQ4PnlBKzwZ0H2+iIwcdSulV0xte6Z3wBe9lHAOA==" + }, + "apollo-server-core": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-1.3.0.tgz", + "integrity": "sha1-p50ppw6BUKqKAUMjThFZS6QczI0=" + }, + "apollo-server-express": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-1.1.2.tgz", + "integrity": "sha1-aTPHf+XfuafzDdOTI5rZlTphPNk=" + }, + "apollo-server-module-graphiql": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.3.0.tgz", + "integrity": "sha1-B3u4x78pL2EoxsltWcIJZEWwhO8=" + }, + "apollo-tracing": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.1.1.tgz", + "integrity": "sha512-OrL0SYpmwNs6R339y7Is6PppOkyooMB1iLSN+HAp1FdBycQ88SqVV5Dqjxb4Du+TrMyyJLHfR5BAENZSFQyWGQ==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "base64url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "body-parser": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", + "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=" + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=" + }, + "crypto": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-0.0.3.tgz", + "integrity": "sha1-RwqBuGvkxe4XrMggeh9TFa4g27A=" + }, + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "deprecated-decorator": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", + "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ecdsa-sig-formatter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", + "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "es6-promise": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.1.1.tgz", + "integrity": "sha512-OaU1hHjgJf+b0NzsxCg7NdIYERD6Hy/PEmFLTjw+b65scuisG3Kt4QoTvJ66BBkPZ581gr0kpoVzKnxniM8nng==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=" + }, + "express": { + "version": "4.15.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz", + "integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=", + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", + "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" + }, + "graphql": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.10.3.tgz", + "integrity": "sha1-wxOv1VGOZzNRvuGPtj4qDkh0B6s=" + }, + "graphql-extensions": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.0.5.tgz", + "integrity": "sha512-IbgYhKIyI60Nio/uJjkkiXaOZ2fI8ynAyzcA/okD0iuKzBdWX4Tn6tidMLgd16Bf2v3TtNnyXnN0F2BJDs6e4A==" + }, + "graphql-subscriptions": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-0.4.4.tgz", + "integrity": "sha512-hqfUsZv39qmK4SEoKMnTO05U4EVvIeAD4ai5ztE9gCl4hEdeaF2Q5gvF80ONQQAnkys4odzxWYd2tBLS/cWl8g==" + }, + "graphql-tag": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.6.0.tgz", + "integrity": "sha1-D7G59tZlEmPEejQg6CeRDm/tOVI=" + }, + "graphql-tools": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-1.2.2.tgz", + "integrity": "sha512-FBcpceJMOYq8PEI8c40S5vAiCtwWh9vSrJc4DoanAiQOLC8DOXaZ8nY+3+/AwHRur+R+zDprGoL14QqcWr0RrA==" + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=" + }, + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + }, + "isemail": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" + }, + "iterall": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.1.3.tgz", + "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==" + }, + "joi": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", + "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=" + }, + "jsonwebtoken": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz", + "integrity": "sha1-d/UCHeBYtgWheD+hKD6ZgS5kVjg=" + }, + "jwa": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=" + }, + "jws": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=" + }, + "jwt-decode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-2.2.0.tgz", + "integrity": "sha1-fYa9VmefWM5qhHBKZX3TkruoGnk=" + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lodash.property": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.property/-/lodash.property-4.4.2.tgz", + "integrity": "sha1-2gcSSCHGQJ0CXzDbjfhRMUUVv/4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-graphql-schemas": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/merge-graphql-schemas/-/merge-graphql-schemas-1.1.3.tgz", + "integrity": "sha512-1e5tkvITcq5EtnCoSmZz9i6YBBZYBn5/QBD1YIpiG1dSzyuz+YuZTU5RY1voocljrPYzr1Of2tWNRy+CYaRZTA==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=" + }, + "moment": { + "version": "2.19.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.4.tgz", + "integrity": "sha512-1xFTAknSLfc47DIxHDUbnJWC+UwgWxATmymaxIPQpmMh7LBm7ZbwVEsuushqwL2GYZU0jie4xO+TK44hJPjNSQ==" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=" + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", + "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "send": { + "version": "0.15.4", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.4.tgz", + "integrity": "sha1-mF+qPihLAnPHkzZKNcZze9k5Bbk=", + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "serve-static": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.4.tgz", + "integrity": "sha1-m2qpjutyU8Tu3Ewfb9vKYJkBqWE=" + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.0.tgz", + "integrity": "sha512-vUoN3I7fHQe0R/SJLKRdKYuEdRGogsviXFkHHo17AWaTGv17VLnxw+CFXvqy+y4ORZ3doWLQcxRYfwKrsd/H7Q==" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "subscriptions-transport-ws": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.8.2.tgz", + "integrity": "sha512-bp0XR7ccnOspEFUKnmvTRN2VtrFdB4PqCWe7eooTY2fMwjBcm1kYkikWW/lo/d37yQ/BYUA+v0GPsyBakpc0OQ==" + }, + "symbol-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.1.0.tgz", + "integrity": "sha512-dQoid9tqQ+uotGhuTKEY11X4xhyYePVnqGSoSm3OGKh2E8LZ6RPULp1uXTctk33IeERlrRJYoVSBglsL05F5Uw==" + }, + "topo": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", + "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=" + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=" + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ws": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.2.tgz", + "integrity": "sha512-t+WGpsNxhMR4v6EClXS8r8km5ZljKJzyGhJf7goJz9k5Ye3+b5Bvno5rjqPuIBn5mnn5GBb7o8IrIWHxX1qOLQ==" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} diff --git a/packages/rocketchat-graphql/README.md b/packages/rocketchat-graphql/README.md new file mode 100644 index 000000000000..712c36fd39ae --- /dev/null +++ b/packages/rocketchat-graphql/README.md @@ -0,0 +1,3 @@ +# rocketchat:graphql + +GraphQL API diff --git a/packages/rocketchat-graphql/package.js b/packages/rocketchat-graphql/package.js new file mode 100644 index 000000000000..e93877ee5814 --- /dev/null +++ b/packages/rocketchat-graphql/package.js @@ -0,0 +1,34 @@ +Package.describe({ + name: 'rocketchat:graphql', + version: '0.0.1', + summary: 'GraphQL API', + git: '' +}); + +Package.onUse(function(api) { + api.use([ + 'underscore', + 'ecmascript', + 'http', + 'rocketchat:lib', + 'rocketchat:api', + 'rocketchat:accounts', + 'swydo:graphql' + ]); + api.addFiles('server/settings.js', 'server'); + api.mainModule('server/api.js', 'server'); +}); + +Npm.depends({ + '@accounts/graphql-api': '0.1.1', + 'apollo-server-express': '1.1.2', + 'cors': '2.8.4', + 'body-parser': '1.17.2', + 'express': '4.15.4', + 'graphql': '0.10.3', + 'graphql-subscriptions': '0.4.4', + 'graphql-tools': '1.2.2', + 'lodash.property': '4.4.2', + 'merge-graphql-schemas': '1.1.3', + 'subscriptions-transport-ws': '0.8.2' +}); diff --git a/packages/rocketchat-graphql/server/api.js b/packages/rocketchat-graphql/server/api.js new file mode 100644 index 000000000000..ca1e6d30b8ae --- /dev/null +++ b/packages/rocketchat-graphql/server/api.js @@ -0,0 +1,77 @@ +import { graphqlExpress, graphiqlExpress } from 'apollo-server-express'; +import { JSAccountsContext as jsAccountsContext } from '@accounts/graphql-api'; +import { SubscriptionServer } from 'subscriptions-transport-ws'; +import { execute, subscribe } from 'graphql'; +import { Meteor } from 'meteor/meteor'; +import { WebApp } from 'meteor/webapp'; +import bodyParser from 'body-parser'; +import express from 'express'; +import cors from 'cors'; + +import { executableSchema } from './schema'; + +const subscriptionPort = RocketChat.settings.get('Graphql_Subscription_Port') || 3100; + +// the Meteor GraphQL server is an Express server +const graphQLServer = express(); + +if (RocketChat.settings.get('Graphql_CORS')) { + graphQLServer.use(cors()); +} + +graphQLServer.use('/api/graphql', (req, res, next) => { + if (RocketChat.settings.get('Graphql_Enabled')) { + next(); + } else { + res.status(400).send('Graphql is not enabled in this server'); + } +}); + +graphQLServer.use( + '/api/graphql', + bodyParser.json(), + graphqlExpress(request => { + return { + schema: executableSchema, + context: jsAccountsContext(request), + formatError: e => ({ + message: e.message, + locations: e.locations, + path: e.path + }), + debug: Meteor.isDevelopment + }; + }) +); + +graphQLServer.use( + '/graphiql', + graphiqlExpress({ + endpointURL: '/api/graphql', + subscriptionsEndpoint: `ws://localhost:${ subscriptionPort }` + }) +); + +const startSubscriptionServer = () => { + if (RocketChat.settings.get('Graphql_Enabled')) { + SubscriptionServer.create({ + schema: executableSchema, + execute, + subscribe, + onConnect: (connectionParams) => ({ authToken: connectionParams.Authorization }) + }, + { + port: subscriptionPort, + host: process.env.BIND_IP || '0.0.0.0' + }); + + console.log('GraphQL Subscription server runs on port:', subscriptionPort); + } +}; + +WebApp.onListening(() => { + startSubscriptionServer(); +}); + +// this binds the specified paths to the Express server running Apollo + GraphiQL +WebApp.connectHandlers.use(graphQLServer); diff --git a/packages/rocketchat-graphql/server/helpers/authenticated.js b/packages/rocketchat-graphql/server/helpers/authenticated.js new file mode 100644 index 000000000000..44c54e053996 --- /dev/null +++ b/packages/rocketchat-graphql/server/helpers/authenticated.js @@ -0,0 +1,7 @@ +import { AccountsServer } from 'meteor/rocketchat:accounts'; +//import { authenticated as _authenticated } from '@accounts/graphql-api'; +import { authenticated as _authenticated } from '../mocks/accounts/graphql-api'; + +export const authenticated = (resolver) => { + return _authenticated(AccountsServer, resolver); +}; diff --git a/packages/rocketchat-graphql/server/helpers/dateToFloat.js b/packages/rocketchat-graphql/server/helpers/dateToFloat.js new file mode 100644 index 000000000000..faf206706f1b --- /dev/null +++ b/packages/rocketchat-graphql/server/helpers/dateToFloat.js @@ -0,0 +1,5 @@ +export function dateToFloat(date) { + if (date) { + return new Date(date).getTime(); + } +} diff --git a/packages/rocketchat-graphql/server/mocks/accounts/graphql-api.js b/packages/rocketchat-graphql/server/mocks/accounts/graphql-api.js new file mode 100644 index 000000000000..b94a295187f9 --- /dev/null +++ b/packages/rocketchat-graphql/server/mocks/accounts/graphql-api.js @@ -0,0 +1,21 @@ +// Same as here: https://github.com/js-accounts/graphql/blob/master/packages/graphql-api/src/utils/authenticated-resolver.js +// except code below works +// It might be like that because of async/await, +// maybe Promise is not wrapped with Fiber +// See: https://github.com/meteor/meteor/blob/a362e20a37547362b581fed52f7171d022e83b62/packages/promise/server.js +// Opened issue: https://github.com/js-accounts/graphql/issues/16 +export const authenticated = (Accounts, func) => (async(root, args, context, info) => { + const authToken = context.authToken; + + if (!authToken || authToken === '' || authToken === null) { + throw new Error('Unable to find authorization token in request'); + } + + const userObject = await Accounts.resumeSession(authToken); + + if (userObject === null) { + throw new Error('Invalid or expired token!'); + } + + return await func(root, args, Object.assign(context, { user: userObject }), info); +}); diff --git a/packages/rocketchat-graphql/server/resolvers/accounts/OauthProvider-type.js b/packages/rocketchat-graphql/server/resolvers/accounts/OauthProvider-type.js new file mode 100644 index 000000000000..7cf39ff56139 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/accounts/OauthProvider-type.js @@ -0,0 +1,5 @@ +import schema from '../../schemas/accounts/OauthProvider-type.graphqls'; + +export { + schema +}; diff --git a/packages/rocketchat-graphql/server/resolvers/accounts/index.js b/packages/rocketchat-graphql/server/resolvers/accounts/index.js new file mode 100644 index 000000000000..e82a7077059b --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/accounts/index.js @@ -0,0 +1,21 @@ +import { createJSAccountsGraphQL } from '@accounts/graphql-api'; +import { AccountsServer } from 'meteor/rocketchat:accounts'; +import { mergeTypes, mergeResolvers } from 'merge-graphql-schemas'; + +// queries +import * as oauthProviders from './oauthProviders'; +// types +import * as OauthProviderType from './OauthProvider-type'; + +const accountsGraphQL = createJSAccountsGraphQL(AccountsServer); + +export const schema = mergeTypes([ + accountsGraphQL.schema, + oauthProviders.schema, + OauthProviderType.schema +]); + +export const resolvers = mergeResolvers([ + accountsGraphQL.extendWithResolvers({}), + oauthProviders.resolver +]); diff --git a/packages/rocketchat-graphql/server/resolvers/accounts/oauthProviders.js b/packages/rocketchat-graphql/server/resolvers/accounts/oauthProviders.js new file mode 100644 index 000000000000..de487b8f9265 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/accounts/oauthProviders.js @@ -0,0 +1,39 @@ +import { HTTP } from 'meteor/http'; +import { Meteor } from 'meteor/meteor'; + +import schema from '../../schemas/accounts/oauthProviders.graphqls'; + +function isJSON(obj) { + try { + JSON.parse(obj); + return true; + } catch (e) { + return false; + } +} + +const resolver = { + Query: { + oauthProviders: async() => { + // depends on rocketchat:grant package + try { + const result = HTTP.get(Meteor.absoluteUrl('_oauth_apps/providers')).content; + + if (isJSON(result)) { + const providers = JSON.parse(result).data; + + return providers.map((name) => ({ name })); + } else { + throw new Error('Could not parse the result'); + } + } catch (e) { + throw new Error('rocketchat:grant not installed'); + } + } + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/Channel-type.js b/packages/rocketchat-graphql/server/resolvers/channels/Channel-type.js new file mode 100644 index 000000000000..e16dffa8ab83 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/Channel-type.js @@ -0,0 +1,50 @@ +import { RocketChat } from 'meteor/rocketchat:lib'; +import property from 'lodash.property'; + +import schema from '../../schemas/channels/Channel-type.graphqls'; + +const resolver = { + Channel: { + id: property('_id'), + name: (root, args, { user }) => { + if (root.t === 'd') { + return root.usernames.find(u => u !== user.username); + } + + return root.name; + }, + members: (root) => { + return root.usernames.map( + username => RocketChat.models.Users.findOneByUsername(username) + ); + }, + owners: (root) => { + // there might be no owner + if (!root.u) { + return; + } + + return [RocketChat.models.Users.findOneByUsername(root.u.username)]; + }, + numberOfMembers: (root) => (root.usernames || []).length, + numberOfMessages: property('msgs'), + readOnly: (root) => root.ro === true, + direct: (root) => root.t === 'd', + privateChannel: (root) => root.t === 'p', + favourite: (root, args, { user }) => { + const room = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(root._id, user._id); + + return room && room.f === true; + }, + unseenMessages: (root, args, { user }) => { + const room = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(root._id, user._id); + + return (room || {}).unread; + } + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/ChannelFilter-input.js b/packages/rocketchat-graphql/server/resolvers/channels/ChannelFilter-input.js new file mode 100644 index 000000000000..cb1c26b0efa5 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/ChannelFilter-input.js @@ -0,0 +1,5 @@ +import schema from '../../schemas/channels/ChannelFilter-input.graphqls'; + +export { + schema +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/ChannelNameAndDirect-input.js b/packages/rocketchat-graphql/server/resolvers/channels/ChannelNameAndDirect-input.js new file mode 100644 index 000000000000..70cb2f18e6b6 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/ChannelNameAndDirect-input.js @@ -0,0 +1,5 @@ +import schema from '../../schemas/channels/ChannelNameAndDirect-input.graphqls'; + +export { + schema +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/ChannelSort-enum.js b/packages/rocketchat-graphql/server/resolvers/channels/ChannelSort-enum.js new file mode 100644 index 000000000000..39e2cfc9aef5 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/ChannelSort-enum.js @@ -0,0 +1,5 @@ +import schema from '../../schemas/channels/ChannelSort-enum.graphqls'; + +export { + schema +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/Privacy-enum.js b/packages/rocketchat-graphql/server/resolvers/channels/Privacy-enum.js new file mode 100644 index 000000000000..978a69b5ac0f --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/Privacy-enum.js @@ -0,0 +1,5 @@ +import schema from '../../schemas/channels/Privacy-enum.graphqls'; + +export { + schema +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/channelByName.js b/packages/rocketchat-graphql/server/resolvers/channels/channelByName.js new file mode 100644 index 000000000000..580280b549a2 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/channelByName.js @@ -0,0 +1,25 @@ +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import { roomPublicFields } from './settings'; +import schema from '../../schemas/channels/channelByName.graphqls'; + +const resolver = { + Query: { + channelByName: authenticated((root, { name }) => { + const query = { + name, + t: 'c' + }; + + return RocketChat.models.Rooms.findOne(query, { + fields: roomPublicFields + }); + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/channels.js b/packages/rocketchat-graphql/server/resolvers/channels/channels.js new file mode 100644 index 000000000000..04723ff5f5d4 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/channels.js @@ -0,0 +1,56 @@ +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import { roomPublicFields } from './settings'; +import schema from '../../schemas/channels/channels.graphqls'; + +const resolver = { + Query: { + channels: authenticated((root, args) => { + const query = {}; + const options = { + sort: { + name: 1 + }, + fields: roomPublicFields + }; + + // Filter + if (typeof args.filter !== 'undefined') { + // nameFilter + if (typeof args.filter.nameFilter !== undefined) { + query.name = { + $regex: new RegExp(args.filter.nameFilter, 'i') + }; + } + + // sortBy + if (args.filter.sortBy === 'NUMBER_OF_MESSAGES') { + options.sort = { + msgs: -1 + }; + } + + // privacy + switch (args.filter.privacy) { + case 'PRIVATE': + query.t = 'p'; + break; + case 'PUBLIC': + query.t = { + $ne: 'p' + }; + break; + } + } + + return RocketChat.models.Rooms.find(query, options).fetch(); + }) + } +}; + + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/channelsByUser.js b/packages/rocketchat-graphql/server/resolvers/channels/channelsByUser.js new file mode 100644 index 000000000000..4fdc6e15a309 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/channelsByUser.js @@ -0,0 +1,31 @@ +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import { roomPublicFields } from './settings'; +import schema from '../../schemas/channels/channelsByUser.graphqls'; + +const resolver = { + Query: { + channelsByUser: authenticated((root, { userId }) => { + const user = RocketChat.models.Users.findOneById(userId); + + if (!user) { + throw new Error('No user'); + } + + const rooms = RocketChat.models.Rooms.findByContainingUsername(user.username, { + sort: { + name: 1 + }, + fields: roomPublicFields + }).fetch(); + + return rooms; + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/createChannel.js b/packages/rocketchat-graphql/server/resolvers/channels/createChannel.js new file mode 100644 index 000000000000..59435add38bb --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/createChannel.js @@ -0,0 +1,40 @@ +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import schema from '../../schemas/channels/createChannel.graphqls'; + +const resolver = { + Mutation: { + createChannel: authenticated((root, args, { user }) => { + try { + RocketChat.API.channels.create.validate({ + user: { + value: user._id + }, + name: { + value: args.name, + key: 'name' + }, + members: { + value: args.membersId, + key: 'membersId' + } + }); + } catch (e) { + throw e; + } + + const { channel } = RocketChat.API.channels.create.execute(user._id, { + name: args.name, + members: args.membersId + }); + + return channel; + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/directChannel.js b/packages/rocketchat-graphql/server/resolvers/channels/directChannel.js new file mode 100644 index 000000000000..e18e39af19dc --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/directChannel.js @@ -0,0 +1,37 @@ +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import { roomPublicFields } from './settings'; +import schema from '../../schemas/channels/directChannel.graphqls'; + +const resolver = { + Query: { + directChannel: authenticated((root, { username, channelId }, { user }) => { + const query = { + t: 'd', + usernames: user.username + }; + + if (typeof username !== 'undefined') { + if (username === user.username) { + throw new Error('You cannot specify your username'); + } + + query.usernames = { $all: [ user.username, username ] }; + } else if (typeof channelId !== 'undefined') { + query.id = channelId; + } else { + throw new Error('Use one of those fields: username, channelId'); + } + + return RocketChat.models.Rooms.findOne(query, { + fields: roomPublicFields + }); + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/hideChannel.js b/packages/rocketchat-graphql/server/resolvers/channels/hideChannel.js new file mode 100644 index 000000000000..08c55efa7796 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/hideChannel.js @@ -0,0 +1,41 @@ +import { Meteor } from 'meteor/meteor'; +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import schema from '../../schemas/channels/hideChannel.graphqls'; + +const resolver = { + Mutation: { + hideChannel: authenticated((root, args, { user }) => { + const channel = RocketChat.models.Rooms.findOne({ + _id: args.channelId, + t: 'c' + }); + + if (!channel) { + throw new Error('error-room-not-found', 'The required "channelId" param provided does not match any channel'); + } + + const sub = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(channel._id, user._id); + + if (!sub) { + throw new Error(`The user/callee is not in the channel "${ channel.name }.`); + } + + if (!sub.open) { + throw new Error(`The channel, ${ channel.name }, is already closed to the sender`); + } + + Meteor.runAsUser(user._id, () => { + Meteor.call('hideRoom', channel._id); + }); + + return true; + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/index.js b/packages/rocketchat-graphql/server/resolvers/channels/index.js new file mode 100644 index 000000000000..063e9da41804 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/index.js @@ -0,0 +1,49 @@ +import { mergeTypes, mergeResolvers } from 'merge-graphql-schemas'; + +// queries +import * as channels from './channels'; +import * as channelByName from './channelByName'; +import * as directChannel from './directChannel'; +import * as channelsByUser from './channelsByUser'; +// mutations +import * as createChannel from './createChannel'; +import * as leaveChannel from './leaveChannel'; +import * as hideChannel from './hideChannel'; +// types +import * as ChannelType from './Channel-type'; +import * as ChannelSort from './ChannelSort-enum'; +import * as ChannelFilter from './ChannelFilter-input'; +import * as Privacy from './Privacy-enum'; +import * as ChannelNameAndDirect from './ChannelNameAndDirect-input'; + +export const schema = mergeTypes([ + // queries + channels.schema, + channelByName.schema, + directChannel.schema, + channelsByUser.schema, + // mutations + createChannel.schema, + leaveChannel.schema, + hideChannel.schema, + // types + ChannelType.schema, + ChannelSort.schema, + ChannelFilter.schema, + Privacy.schema, + ChannelNameAndDirect.schema +]); + +export const resolvers = mergeResolvers([ + // queries + channels.resolver, + channelByName.resolver, + directChannel.resolver, + channelsByUser.resolver, + // mutations + createChannel.resolver, + leaveChannel.resolver, + hideChannel.resolver, + // types + ChannelType.resolver +]); diff --git a/packages/rocketchat-graphql/server/resolvers/channels/leaveChannel.js b/packages/rocketchat-graphql/server/resolvers/channels/leaveChannel.js new file mode 100644 index 000000000000..46afd2a08940 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/leaveChannel.js @@ -0,0 +1,31 @@ +import { Meteor } from 'meteor/meteor'; +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import schema from '../../schemas/channels/leaveChannel.graphqls'; + +const resolver = { + Mutation: { + leaveChannel: authenticated((root, args, { user }) => { + const channel = RocketChat.models.Rooms.findOne({ + _id: args.channelId, + t: 'c' + }); + + if (!channel) { + throw new Error('error-room-not-found', 'The required "channelId" param provided does not match any channel'); + } + + Meteor.runAsUser(user._id, () => { + Meteor.call('leaveRoom', channel._id); + }); + + return true; + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/channels/settings.js b/packages/rocketchat-graphql/server/resolvers/channels/settings.js new file mode 100644 index 000000000000..7cace07a7cbc --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/channels/settings.js @@ -0,0 +1,12 @@ +export const roomPublicFields = { + t: 1, + name: 1, + description: 1, + announcement: 1, + topic: 1, + usernames: 1, + msgs: 1, + ro: 1, + u: 1, + archived: 1 +}; diff --git a/packages/rocketchat-graphql/server/resolvers/messages/Message-type.js b/packages/rocketchat-graphql/server/resolvers/messages/Message-type.js new file mode 100644 index 000000000000..362ce8b50b60 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/messages/Message-type.js @@ -0,0 +1,76 @@ +import { RocketChat } from 'meteor/rocketchat:lib'; +import property from 'lodash.property'; + +import { dateToFloat } from '../../helpers/dateToFloat'; +import schema from '../../schemas/messages/Message-type.graphqls'; + +const resolver = { + Message: { + id: property('_id'), + content: property('msg'), + creationTime: (root) => dateToFloat(root.ts), + author: (root) => { + const user = RocketChat.models.Users.findOne(root.u._id); + + return user || root.u; + }, + channel: (root) => { + return RocketChat.models.Rooms.findOne(root.rid); + }, + fromServer: (root) => typeof root.t !== 'undefined', // on a message sent by user `true` otherwise `false` + type: property('t'), + channelRef: (root) => { + if (!root.channels) { + return; + } + + return RocketChat.models.Rooms.find({ + _id: { + $in: root.channels.map(c => c._id) + } + }, { + sort: { + name: 1 + } + }).fetch(); + }, + userRef: (root) => { + if (!root.mentions) { + return; + } + + return RocketChat.models.Users.find({ + _id: { + $in: root.mentions.map(c => c._id) + } + }, { + sort: { + username: 1 + } + }).fetch(); + }, + reactions: (root) => { + if (!root.reactions || Object.keys(root.reactions).length === 0) { + return; + } + + const reactions = []; + + Object.keys(root.reactions).forEach(icon => { + root.reactions[icon].usernames.forEach(username => { + reactions.push({ + icon, + username + }); + }); + }); + + return reactions; + } + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/messages/MessageIdentifier-input.js b/packages/rocketchat-graphql/server/resolvers/messages/MessageIdentifier-input.js new file mode 100644 index 000000000000..bda12ad6ac68 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/messages/MessageIdentifier-input.js @@ -0,0 +1,5 @@ +import schema from '../../schemas/messages/MessageIdentifier-input.graphqls'; + +export { + schema +}; diff --git a/packages/rocketchat-graphql/server/resolvers/messages/MessagesWithCursor-type.js b/packages/rocketchat-graphql/server/resolvers/messages/MessagesWithCursor-type.js new file mode 100644 index 000000000000..02e630ff4589 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/messages/MessagesWithCursor-type.js @@ -0,0 +1,5 @@ +import schema from '../../schemas/messages/MessagesWithCursor-type.graphqls'; + +export { + schema +}; diff --git a/packages/rocketchat-graphql/server/resolvers/messages/Reaction-type.js b/packages/rocketchat-graphql/server/resolvers/messages/Reaction-type.js new file mode 100644 index 000000000000..37a9c7a71ef6 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/messages/Reaction-type.js @@ -0,0 +1,5 @@ +import schema from '../../schemas/messages/Reaction-type.graphqls'; + +export { + schema +}; diff --git a/packages/rocketchat-graphql/server/resolvers/messages/addReactionToMessage.js b/packages/rocketchat-graphql/server/resolvers/messages/addReactionToMessage.js new file mode 100644 index 000000000000..ee3e49843d52 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/messages/addReactionToMessage.js @@ -0,0 +1,24 @@ +import { Meteor } from 'meteor/meteor'; +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import schema from '../../schemas/messages/addReactionToMessage.graphqls'; + +const resolver = { + Mutation: { + addReactionToMessage: authenticated((root, { id, icon }, { user }) => { + return new Promise((resolve) => { + Meteor.runAsUser(user._id, () => { + Meteor.call('setReaction', id.messageId, icon, () => { + resolve(RocketChat.models.Messages.findOne(id.messageId)); + }); + }); + }); + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/messages/chatMessageAdded.js b/packages/rocketchat-graphql/server/resolvers/messages/chatMessageAdded.js new file mode 100644 index 000000000000..8a81c66a69b3 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/messages/chatMessageAdded.js @@ -0,0 +1,51 @@ +import { withFilter } from 'graphql-subscriptions'; +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { pubsub } from '../../subscriptions'; +import { authenticated } from '../../helpers/authenticated'; +import schema from '../../schemas/messages/chatMessageAdded.graphqls'; + +export const CHAT_MESSAGE_SUBSCRIPTION_TOPIC = 'CHAT_MESSAGE_ADDED'; + +export function publishMessage(message) { + pubsub.publish(CHAT_MESSAGE_SUBSCRIPTION_TOPIC, { chatMessageAdded: message }); +} + +function shouldPublish(message, { id, directTo }, username) { + if (id) { + return message.rid === id; + } else if (directTo) { + const room = RocketChat.models.Rooms.findOne({ + usernames: { $all: [directTo, username] }, + t: 'd' + }); + + return room && room._id === message.rid; + } + + return false; +} + +const resolver = { + Subscription: { + chatMessageAdded: { + subscribe: withFilter(() => pubsub.asyncIterator(CHAT_MESSAGE_SUBSCRIPTION_TOPIC), authenticated((payload, args, { user }) => { + const channel = { + id: args.channelId, + directTo: args.directTo + }; + + return shouldPublish(payload.chatMessageAdded, channel, user.username); + })) + } + } +}; + +RocketChat.callbacks.add('afterSaveMessage', (message) => { + publishMessage(message); +}, null, 'chatMessageAddedSubscription'); + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/messages/deleteMessage.js b/packages/rocketchat-graphql/server/resolvers/messages/deleteMessage.js new file mode 100644 index 000000000000..33225c02f282 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/messages/deleteMessage.js @@ -0,0 +1,32 @@ +import { Meteor } from 'meteor/meteor'; +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import schema from '../../schemas/messages/deleteMessage.graphqls'; + +const resolver = { + Mutation: { + deleteMessage: authenticated((root, { id }, { user }) => { + const msg = RocketChat.models.Messages.findOneById(id.messageId, { fields: { u: 1, rid: 1 }}); + + if (!msg) { + throw new Error(`No message found with the id of "${ id.messageId }".`); + } + + if (id.channelId !== msg.rid) { + throw new Error('The room id provided does not match where the message is from.'); + } + + Meteor.runAsUser(user._id, () => { + Meteor.call('deleteMessage', { _id: msg._id }); + }); + + return msg; + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/messages/editMessage.js b/packages/rocketchat-graphql/server/resolvers/messages/editMessage.js new file mode 100644 index 000000000000..0fabc8b34db9 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/messages/editMessage.js @@ -0,0 +1,34 @@ +import { Meteor } from 'meteor/meteor'; +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import schema from '../../schemas/messages/editMessage.graphqls'; + +const resolver = { + Mutation: { + editMessage: authenticated((root, { id, content }, { user }) => { + const msg = RocketChat.models.Messages.findOneById(id.messageId); + + //Ensure the message exists + if (!msg) { + throw new Error(`No message found with the id of "${ id.messageId }".`); + } + + if (id.channelId !== msg.rid) { + throw new Error('The channel id provided does not match where the message is from.'); + } + + //Permission checks are already done in the updateMessage method, so no need to duplicate them + Meteor.runAsUser(user._id, () => { + Meteor.call('updateMessage', { _id: msg._id, msg: content, rid: msg.rid }); + }); + + return RocketChat.models.Messages.findOneById(msg._id); + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/messages/index.js b/packages/rocketchat-graphql/server/resolvers/messages/index.js new file mode 100644 index 000000000000..fb9728b19815 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/messages/index.js @@ -0,0 +1,47 @@ +import { mergeTypes, mergeResolvers } from 'merge-graphql-schemas'; + +// queries +import * as messages from './messages'; +// mutations +import * as sendMessage from './sendMessage'; +import * as editMessage from './editMessage'; +import * as deleteMessage from './deleteMessage'; +import * as addReactionToMessage from './addReactionToMessage'; +// subscriptions +import * as chatMessageAdded from './chatMessageAdded'; +// types +import * as MessageType from './Message-type'; +import * as MessagesWithCursorType from './MessagesWithCursor-type'; +import * as MessageIdentifier from './MessageIdentifier-input'; +import * as ReactionType from './Reaction-type'; + +export const schema = mergeTypes([ + // queries + messages.schema, + // mutations + sendMessage.schema, + editMessage.schema, + deleteMessage.schema, + addReactionToMessage.schema, + // subscriptions + chatMessageAdded.schema, + // types + MessageType.schema, + MessagesWithCursorType.schema, + MessageIdentifier.schema, + ReactionType.schema +]); + +export const resolvers = mergeResolvers([ + // queries + messages.resolver, + // mutations + sendMessage.resolver, + editMessage.resolver, + deleteMessage.resolver, + addReactionToMessage.resolver, + // subscriptions + chatMessageAdded.resolver, + // types + MessageType.resolver +]); diff --git a/packages/rocketchat-graphql/server/resolvers/messages/messages.js b/packages/rocketchat-graphql/server/resolvers/messages/messages.js new file mode 100644 index 000000000000..a163ebefa406 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/messages/messages.js @@ -0,0 +1,91 @@ +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import schema from '../../schemas/messages/messages.graphqls'; + +const resolver = { + Query: { + messages: authenticated((root, args, { user }) => { + const messagesQuery = {}; + const messagesOptions = { + sort: { ts: -1 } + }; + const channelQuery = {}; + const isPagination = !!args.cursor || args.count > 0; + let cursor; + + if (args.channelId) { + // channelId + channelQuery._id = args.channelId; + } else if (args.directTo) { + // direct message where directTo is a user id + channelQuery.t = 'd'; + channelQuery.usernames = { $all: [args.directTo, user.username] }; + } else if (args.channelName) { + // non-direct channel + channelQuery.t = { $ne: 'd' }; + channelQuery.name = args.channelName; + } else { + console.error('messages query must be called with channelId or directTo'); + return null; + } + + const channel = RocketChat.models.Rooms.findOne(channelQuery); + + let messagesArray = []; + + if (channel) { + // cursor + if (isPagination && args.cursor) { + const cursorMsg = RocketChat.models.Messages.findOne(args.cursor, { fields: { ts: 1 } }); + messagesQuery.ts = { $lt: cursorMsg.ts }; + } + + // search + if (typeof args.searchRegex === 'string') { + messagesQuery.msg = { + $regex: new RegExp(args.searchRegex, 'i') + }; + } + + // count + if (isPagination && args.count) { + messagesOptions.limit = args.count; + } + + // exclude messages generated by server + if (args.excludeServer === true) { + messagesQuery.t = { $exists: false }; + } + + // look for messages that belongs to specific channel + messagesQuery.rid = channel._id; + + const messages = RocketChat.models.Messages.find(messagesQuery, messagesOptions); + + messagesArray = messages.fetch(); + + if (isPagination) { + // oldest first (because of findOne) + messagesOptions.sort.ts = 1; + + const firstMessage = RocketChat.models.Messages.findOne(messagesQuery, messagesOptions); + const lastId = (messagesArray[messagesArray.length - 1] || {})._id; + + cursor = !lastId || lastId === firstMessage._id ? null : lastId; + } + } + + return { + cursor, + channel, + messagesArray + }; + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/messages/sendMessage.js b/packages/rocketchat-graphql/server/resolvers/messages/sendMessage.js new file mode 100644 index 000000000000..7bbd20b71ec0 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/messages/sendMessage.js @@ -0,0 +1,28 @@ +/* global processWebhookMessage */ + +import { authenticated } from '../../helpers/authenticated'; +import schema from '../../schemas/messages/sendMessage.graphqls'; + +const resolver = { + Mutation: { + sendMessage: authenticated((root, { channelId, directTo, content }, { user }) => { + const options = { + text: content, + channel: channelId || directTo + }; + + const messageReturn = processWebhookMessage(options, user)[0]; + + if (!messageReturn) { + throw new Error('Unknown error'); + } + + return messageReturn.message; + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/users/User-type.js b/packages/rocketchat-graphql/server/resolvers/users/User-type.js new file mode 100644 index 000000000000..d768b78ab7f8 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/users/User-type.js @@ -0,0 +1,32 @@ +import { RocketChat } from 'meteor/rocketchat:lib'; +import property from 'lodash.property'; + +import schema from '../../schemas/users/User-type.graphqls'; + +const resolver = { + User: { + id: property('_id'), + status: ({status}) => status.toUpperCase(), + avatar: async({ _id }) => { + // XXX js-accounts/graphql#16 + const avatar = await RocketChat.models.Avatars.model.rawCollection().findOne({ + userId: _id + }, { fields: { url: 1 }}); + + if (avatar) { + return avatar.url; + } + }, + channels: Meteor.bindEnvironment(async({ _id }) => { + return await RocketChat.models.Rooms.findBySubscriptionUserId(_id).fetch(); + }), + directMessages: ({ username }) => { + return RocketChat.models.Rooms.findByTypeContainingUsername('d', username).fetch(); + } + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/resolvers/users/UserStatus-enum.js b/packages/rocketchat-graphql/server/resolvers/users/UserStatus-enum.js new file mode 100644 index 000000000000..d1d526338c1a --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/users/UserStatus-enum.js @@ -0,0 +1,5 @@ +import schema from '../../schemas/users/UserStatus-enum.graphqls'; + +export { + schema +}; diff --git a/packages/rocketchat-graphql/server/resolvers/users/index.js b/packages/rocketchat-graphql/server/resolvers/users/index.js new file mode 100644 index 000000000000..7647d5a5fdd6 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/users/index.js @@ -0,0 +1,22 @@ +import { mergeTypes, mergeResolvers } from 'merge-graphql-schemas'; + +// mutations +import * as setStatus from './setStatus'; +// types +import * as UserType from './User-type'; +import * as UserStatus from './UserStatus-enum'; + +export const schema = mergeTypes([ + // mutations + setStatus.schema, + // types + UserType.schema, + UserStatus.schema +]); + +export const resolvers = mergeResolvers([ + // mutations + setStatus.resolver, + // types + UserType.resolver +]); diff --git a/packages/rocketchat-graphql/server/resolvers/users/setStatus.js b/packages/rocketchat-graphql/server/resolvers/users/setStatus.js new file mode 100644 index 000000000000..ad6b4ebef6b6 --- /dev/null +++ b/packages/rocketchat-graphql/server/resolvers/users/setStatus.js @@ -0,0 +1,23 @@ +import { RocketChat } from 'meteor/rocketchat:lib'; + +import { authenticated } from '../../helpers/authenticated'; +import schema from '../../schemas/users/setStatus.graphqls'; + +const resolver = { + Mutation: { + setStatus: authenticated((root, { status }, { user }) => { + RocketChat.models.Users.update(user._id, { + $set: { + status: status.toLowerCase() + } + }); + + return RocketChat.models.Users.findOne(user._id); + }) + } +}; + +export { + schema, + resolver +}; diff --git a/packages/rocketchat-graphql/server/schema.js b/packages/rocketchat-graphql/server/schema.js new file mode 100644 index 000000000000..e8d3cbdd489e --- /dev/null +++ b/packages/rocketchat-graphql/server/schema.js @@ -0,0 +1,29 @@ +import { makeExecutableSchema } from 'graphql-tools'; +import { mergeTypes, mergeResolvers } from 'merge-graphql-schemas'; + +import * as channels from './resolvers/channels'; +import * as messages from './resolvers/messages'; +import * as accounts from './resolvers/accounts'; +import * as users from './resolvers/users'; + +const schema = mergeTypes([ + channels.schema, + messages.schema, + accounts.schema, + users.schema +]); + +const resolvers = mergeResolvers([ + channels.resolvers, + messages.resolvers, + accounts.resolvers, + users.resolvers +]); + +export const executableSchema = makeExecutableSchema({ + typeDefs: [schema], + resolvers, + logger: { + log: (e) => console.log(e) + } +}); diff --git a/packages/rocketchat-graphql/server/schemas/accounts/LoginResult-type.graphqls b/packages/rocketchat-graphql/server/schemas/accounts/LoginResult-type.graphqls new file mode 100644 index 000000000000..0bdf1ed7e00b --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/accounts/LoginResult-type.graphqls @@ -0,0 +1,4 @@ +type LoginResult { + accessToken: String! + refreshToken: String! +} diff --git a/packages/rocketchat-graphql/server/schemas/accounts/OauthProvider-type.graphqls b/packages/rocketchat-graphql/server/schemas/accounts/OauthProvider-type.graphqls new file mode 100644 index 000000000000..c91fe5e6379a --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/accounts/OauthProvider-type.graphqls @@ -0,0 +1,3 @@ +type OauthProvider { + name: String! +} diff --git a/packages/rocketchat-graphql/server/schemas/accounts/oauthProviders.graphqls b/packages/rocketchat-graphql/server/schemas/accounts/oauthProviders.graphqls new file mode 100644 index 000000000000..9ba76de8adb8 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/accounts/oauthProviders.graphqls @@ -0,0 +1,3 @@ +type Query { + oauthProviders: [OauthProvider] +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/Channel-type.graphqls b/packages/rocketchat-graphql/server/schemas/channels/Channel-type.graphqls new file mode 100644 index 000000000000..03c4557918df --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/Channel-type.graphqls @@ -0,0 +1,16 @@ +type Channel { + id: String! + name: String + description: String + announcement: String + topic: String + members: [User] + owners: [User] + numberOfMembers: Int + numberOfMessages: Int + readOnly: Boolean + direct: Boolean + privateChannel: Boolean + favourite: Boolean + unseenMessages: Int +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/ChannelFilter-input.graphqls b/packages/rocketchat-graphql/server/schemas/channels/ChannelFilter-input.graphqls new file mode 100644 index 000000000000..a00850e371cc --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/ChannelFilter-input.graphqls @@ -0,0 +1,6 @@ +input ChannelFilter { + nameFilter: String + privacy: Privacy + joinedChannels: Boolean + sortBy: ChannelSort +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/ChannelNameAndDirect-input.graphqls b/packages/rocketchat-graphql/server/schemas/channels/ChannelNameAndDirect-input.graphqls new file mode 100644 index 000000000000..139567e862e9 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/ChannelNameAndDirect-input.graphqls @@ -0,0 +1,4 @@ +input ChannelNameAndDirect { + name: String! + direct: Boolean! +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/ChannelSort-enum.graphqls b/packages/rocketchat-graphql/server/schemas/channels/ChannelSort-enum.graphqls new file mode 100644 index 000000000000..8a2c2902e6db --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/ChannelSort-enum.graphqls @@ -0,0 +1,4 @@ +enum ChannelSort { + NAME + NUMBER_OF_MESSAGES +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/Privacy-enum.graphqls b/packages/rocketchat-graphql/server/schemas/channels/Privacy-enum.graphqls new file mode 100644 index 000000000000..f28a57d51c28 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/Privacy-enum.graphqls @@ -0,0 +1,5 @@ +enum Privacy { + PRIVATE + PUBLIC + ALL +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/channelByName.graphqls b/packages/rocketchat-graphql/server/schemas/channels/channelByName.graphqls new file mode 100644 index 000000000000..e301ce38f7f6 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/channelByName.graphqls @@ -0,0 +1,3 @@ +type Query { + channelByName(name: String!): Channel +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/channels.graphqls b/packages/rocketchat-graphql/server/schemas/channels/channels.graphqls new file mode 100644 index 000000000000..6e4ac5608249 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/channels.graphqls @@ -0,0 +1,7 @@ +type Query { + channels(filter: ChannelFilter = { + privacy: ALL, + joinedChannels: false, + sortBy: NAME + }): [Channel] +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/channelsByUser.graphqls b/packages/rocketchat-graphql/server/schemas/channels/channelsByUser.graphqls new file mode 100644 index 000000000000..8dfe20a071c5 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/channelsByUser.graphqls @@ -0,0 +1,3 @@ +type Query { + channelsByUser(userId: String!): [Channel] +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/createChannel.graphqls b/packages/rocketchat-graphql/server/schemas/channels/createChannel.graphqls new file mode 100644 index 000000000000..85317c86603a --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/createChannel.graphqls @@ -0,0 +1,8 @@ +type Mutation { + createChannel( + name: String!, + private: Boolean = false, + readOnly: Boolean = false, + membersId: [String!] + ): Channel +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/directChannel.graphqls b/packages/rocketchat-graphql/server/schemas/channels/directChannel.graphqls new file mode 100644 index 000000000000..4e41994bce80 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/directChannel.graphqls @@ -0,0 +1,3 @@ +type Query { + directChannel(username: String, channelId: String): Channel +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/hideChannel.graphqls b/packages/rocketchat-graphql/server/schemas/channels/hideChannel.graphqls new file mode 100644 index 000000000000..5ea9517f5741 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/hideChannel.graphqls @@ -0,0 +1,3 @@ +type Mutation { + hideChannel(channelId: String!): Boolean +} diff --git a/packages/rocketchat-graphql/server/schemas/channels/leaveChannel.graphqls b/packages/rocketchat-graphql/server/schemas/channels/leaveChannel.graphqls new file mode 100644 index 000000000000..e6ceb4075c4e --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/channels/leaveChannel.graphqls @@ -0,0 +1,3 @@ +type Mutation { + leaveChannel(channelId: String!): Boolean +} diff --git a/packages/rocketchat-graphql/server/schemas/messages/Message-type.graphqls b/packages/rocketchat-graphql/server/schemas/messages/Message-type.graphqls new file mode 100644 index 000000000000..8ccfdebfbf1d --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/messages/Message-type.graphqls @@ -0,0 +1,15 @@ +type Message { + id: String + author: User + content: String + channel: Channel + creationTime: Float + # Message sent by server e.g. User joined channel + fromServer: Boolean + type: String + # List of mentioned users + userRef: [User] + # list of mentioned channels + channelRef: [Channel] + reactions: [Reaction] +} diff --git a/packages/rocketchat-graphql/server/schemas/messages/MessageIdentifier-input.graphqls b/packages/rocketchat-graphql/server/schemas/messages/MessageIdentifier-input.graphqls new file mode 100644 index 000000000000..88fbe90711cf --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/messages/MessageIdentifier-input.graphqls @@ -0,0 +1,4 @@ +input MessageIdentifier { + channelId: String! + messageId: String! +} diff --git a/packages/rocketchat-graphql/server/schemas/messages/MessagesWithCursor-type.graphqls b/packages/rocketchat-graphql/server/schemas/messages/MessagesWithCursor-type.graphqls new file mode 100644 index 000000000000..e890725f6efb --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/messages/MessagesWithCursor-type.graphqls @@ -0,0 +1,5 @@ +type MessagesWithCursor { + cursor: String + channel: Channel + messagesArray: [Message] +} diff --git a/packages/rocketchat-graphql/server/schemas/messages/Reaction-type.graphqls b/packages/rocketchat-graphql/server/schemas/messages/Reaction-type.graphqls new file mode 100644 index 000000000000..e6eedf75d1e1 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/messages/Reaction-type.graphqls @@ -0,0 +1,4 @@ +type Reaction { + username: String + icon: String +} diff --git a/packages/rocketchat-graphql/server/schemas/messages/addReactionToMessage.graphqls b/packages/rocketchat-graphql/server/schemas/messages/addReactionToMessage.graphqls new file mode 100644 index 000000000000..3b6be025a59b --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/messages/addReactionToMessage.graphqls @@ -0,0 +1,3 @@ +type Mutation { + addReactionToMessage(id: MessageIdentifier!, icon: String!): Message +} diff --git a/packages/rocketchat-graphql/server/schemas/messages/chatMessageAdded.graphqls b/packages/rocketchat-graphql/server/schemas/messages/chatMessageAdded.graphqls new file mode 100644 index 000000000000..d05c00afc3bc --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/messages/chatMessageAdded.graphqls @@ -0,0 +1,3 @@ +type Subscription { + chatMessageAdded(channelId: String, directTo: String): Message +} diff --git a/packages/rocketchat-graphql/server/schemas/messages/deleteMessage.graphqls b/packages/rocketchat-graphql/server/schemas/messages/deleteMessage.graphqls new file mode 100644 index 000000000000..f298a14ebf98 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/messages/deleteMessage.graphqls @@ -0,0 +1,3 @@ +type Mutation { + deleteMessage(id: MessageIdentifier!): Message +} diff --git a/packages/rocketchat-graphql/server/schemas/messages/editMessage.graphqls b/packages/rocketchat-graphql/server/schemas/messages/editMessage.graphqls new file mode 100644 index 000000000000..19900c58b272 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/messages/editMessage.graphqls @@ -0,0 +1,3 @@ +type Mutation { + editMessage(id: MessageIdentifier!, content: String!): Message +} diff --git a/packages/rocketchat-graphql/server/schemas/messages/messages.graphqls b/packages/rocketchat-graphql/server/schemas/messages/messages.graphqls new file mode 100644 index 000000000000..a81fe2186ca7 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/messages/messages.graphqls @@ -0,0 +1,11 @@ +type Query { + messages( + channelId: String, + channelName: String, + directTo: String, + cursor: String, + count: Int, + searchRegex: String, + excludeServer: Boolean + ): MessagesWithCursor +} diff --git a/packages/rocketchat-graphql/server/schemas/messages/sendMessage.graphqls b/packages/rocketchat-graphql/server/schemas/messages/sendMessage.graphqls new file mode 100644 index 000000000000..78933ec6a763 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/messages/sendMessage.graphqls @@ -0,0 +1,3 @@ +type Mutation { + sendMessage(channelId: String, directTo: String, content: String!): Message +} diff --git a/packages/rocketchat-graphql/server/schemas/users/User-type.graphqls b/packages/rocketchat-graphql/server/schemas/users/User-type.graphqls new file mode 100644 index 000000000000..2a345415227e --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/users/User-type.graphqls @@ -0,0 +1,8 @@ +extend type User { + status: UserStatus + avatar: String + name: String + lastLogin: String + channels: [Channel] + directMessages: [Channel] +} diff --git a/packages/rocketchat-graphql/server/schemas/users/UserStatus-enum.graphqls b/packages/rocketchat-graphql/server/schemas/users/UserStatus-enum.graphqls new file mode 100644 index 000000000000..a360cc2a72b9 --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/users/UserStatus-enum.graphqls @@ -0,0 +1,7 @@ +enum UserStatus { + ONLINE + AWAY + BUSY + INVISIBLE + OFFLINE +} diff --git a/packages/rocketchat-graphql/server/schemas/users/setStatus.graphqls b/packages/rocketchat-graphql/server/schemas/users/setStatus.graphqls new file mode 100644 index 000000000000..7beb3512a91b --- /dev/null +++ b/packages/rocketchat-graphql/server/schemas/users/setStatus.graphqls @@ -0,0 +1,3 @@ +type Mutation { + setStatus(status: UserStatus!): User +} diff --git a/packages/rocketchat-graphql/server/settings.js b/packages/rocketchat-graphql/server/settings.js new file mode 100644 index 000000000000..f7d06fb80fe4 --- /dev/null +++ b/packages/rocketchat-graphql/server/settings.js @@ -0,0 +1,7 @@ +RocketChat.settings.addGroup('General', function() { + this.section('GraphQL API', function() { + this.add('Graphql_Enabled', false, { type: 'boolean', public: false }); + this.add('Graphql_CORS', true, { type: 'boolean', public: false, enableQuery: { _id: 'Graphql_Enabled', value: true } }); + this.add('Graphql_Subscription_Port', 3100, { type: 'int', public: false, enableQuery: { _id: 'Graphql_Enabled', value: true } }); + }); +}); diff --git a/packages/rocketchat-graphql/server/subscriptions.js b/packages/rocketchat-graphql/server/subscriptions.js new file mode 100644 index 000000000000..d86d23f85d05 --- /dev/null +++ b/packages/rocketchat-graphql/server/subscriptions.js @@ -0,0 +1,3 @@ +import { PubSub } from 'graphql-subscriptions'; + +export const pubsub = new PubSub(); diff --git a/packages/rocketchat-i18n/i18n/ar.i18n.json b/packages/rocketchat-i18n/i18n/ar.i18n.json index 9cd9ad78dcd1..11d55b3b27a0 100644 --- a/packages/rocketchat-i18n/i18n/ar.i18n.json +++ b/packages/rocketchat-i18n/i18n/ar.i18n.json @@ -40,7 +40,7 @@ "Accounts_EmailVerification": "التحقق من البريد الإلكتروني", "Accounts_EmailVerification_Description": "تأكد أن لديك إعدادات SMTP الصحيحة لاستخدام هذه الميزة", "Accounts_Enrollment_Email": "البريد الإلكتروني E-التحاق", - "Accounts_Enrollment_Email_Default": "

مرحبا بكم في

[Site_Name]

الذهاب إلى [Site_URL] ومحاولة أفضل المصدر المفتوح دردشة الحلول المتاحة اليوم!

", + "Accounts_Enrollment_Email_Default": "

مرحبا بكم في

[Site_Name]

الذهاب إلى [Site_URL] ومحاولة أفضل المصدر المفتوح دردشة الحلول المتاحة اليوم!

", "Accounts_Enrollment_Email_Description": "يمكنك استخدام [name]، [fname]، [lname] عن الاسم الكامل للمستخدم، الاسم الأول أو اسم العائلة، على التوالي.
يمكنك استخدام [email] للبريد الإلكتروني الخاص بالمستخدم.", "Accounts_Enrollment_Email_Subject_Default": "مرحبا بكم في [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "مسح جلسة المستخدم وإغلاق النافذة", @@ -123,7 +123,7 @@ "Accounts_ShowFormLogin": "يستند النموذج مشاهدة الدخول", "Accounts_UseDefaultBlockedDomainsList": "استخدام الافتراضي محظور قائمة المجالات", "Accounts_UseDNSDomainCheck": "استخدام المجال DNS تحقق", - "Accounts_UserAddedEmail_Default": "

مرحبا بكم في

[Site_Name]

الذهاب إلى [Site_URL] ومحاولة أفضل المصدر المفتوح دردشة الحلول المتاحة اليوم!

تستطيع تسجيل الدخول باستخدام البريد الإلكتروني: [email] وكلمة المرور: [password]. قد تكون هناك حاجة لتغييره بعد تسجيل الدخول الخاص بك أولا.", + "Accounts_UserAddedEmail_Default": "

مرحبا بكم في

[Site_Name]

الذهاب إلى [Site_URL] ومحاولة أفضل المصدر المفتوح دردشة الحلول المتاحة اليوم!

تستطيع تسجيل الدخول باستخدام البريد الإلكتروني: [email] وكلمة المرور: [password]. قد تكون هناك حاجة لتغييره بعد تسجيل الدخول الخاص بك أولا.", "Accounts_UserAddedEmail_Description": "يمكنك استخدام العناصر النائبة التالية:

  • [name]، [fname]، [lname] لاسم المستخدم الكامل أو الاسم الأول أو اسم العائلة، على التوالي.
  • [email] للبريد الإلكتروني الخاص بالمستخدم.
  • [password] لكلمة المرور الخاصة بالمستخدم.
  • [Site_Name] و [Site_URL] لاسم التطبيق وعنوان URL على التوالي.
", "Accounts_UserAddedEmailSubject_Default": "لقد تم إضافتك إلى [Site_Name]", "Activate": "تفعيل", @@ -1671,4 +1671,4 @@ "your_message_optional": "رسالتك (اختياري)", "Your_password_is_wrong": "كلمة السر خاطئة", "Your_push_was_sent_to_s_devices": "وقد أرسلت دفعك إلى أجهزة٪ الصورة" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/ca.i18n.json b/packages/rocketchat-i18n/i18n/ca.i18n.json index 5b2f62f77d42..e4118ed13bff 100644 --- a/packages/rocketchat-i18n/i18n/ca.i18n.json +++ b/packages/rocketchat-i18n/i18n/ca.i18n.json @@ -46,7 +46,7 @@ "Accounts_EmailVerification": "Verificació de correu electrònic", "Accounts_EmailVerification_Description": "Assegura't que la configuració SMTP és correcta per fer servir aquesta funcionalitat", "Accounts_Enrollment_Email": "Missatge de correu electrònic d'inscripció", - "Accounts_Enrollment_Email_Default": "

Benvingut a

[Site_Name]

Vés a [Site_URL] i prova la millor eina de programari lliure per a treball a distància disponible actualment!

", + "Accounts_Enrollment_Email_Default": "

Benvingut a

[Site_Name]

Vés a [Site_URL] i prova la millor eina de programari lliure per a treball a distància disponible actualment!

", "Accounts_Enrollment_Email_Description": "És possible utilitzar els marcadors:
  • [name], [fname], [lname] per al nom complet de l'usuari, nom o cognom, respectivament.
  • [email] per a l'adreça de correu electrònic de l'usuari.
  • [Site_Name] i [Site_URL] pel nom del lloc web i de l'adreça URL, respectivament.
", "Accounts_Enrollment_Email_Subject_Default": "Benvingut a [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Oblida la sessió d'usuari en tancar la finestra", @@ -131,7 +131,7 @@ "Accounts_ShowFormLogin": "Mostra inici de sessió basat en formulari", "Accounts_UseDefaultBlockedDomainsList": "Utilitza la llista predeterminada de dominis bloquejats", "Accounts_UseDNSDomainCheck": "Utilitza la comprovació DNS de dominis", - "Accounts_UserAddedEmail_Default": "

Benvingut a

[Site_Name]

Vés a [Site_URL] i prova la millor eina de programari lliure per a treball a distància disponible actualment!

", + "Accounts_UserAddedEmail_Default": "

Benvingut a

[Site_Name]

Vés a [Site_URL] i prova la millor eina de programari lliure per a treball a distància disponible actualment!

", "Accounts_UserAddedEmail_Description": "És possible utilitzar els marcadors:
  • [name], [fname], [lname] per al nom complet de l'usuari, nom o cognom, respectivament.
  • [email] per a l'adreça de correu electrònic de l'usuari.
  • [password] per la contrasenya.
  • [Site_Name] i [Site_URL] pel nom del lloc web i de l'adreça URL, respectivament.
", "Accounts_UserAddedEmailSubject_Default": "Se t'ha afegit a [Site_Name]", "Activate": "Activa", @@ -212,7 +212,7 @@ "API_Enable_Direct_Message_History_EndPoint": "Activa la consulta de l'historial de missatges directes", "API_Enable_Direct_Message_History_EndPoint_Description": "Això activa el `/api/v1/im.history.others` que permet veure missatges directes enviats per altres usuaris tot i no formar-ne part.", "API_Enable_Shields": "Activa escuts", - "API_Enable_Shields_Description": "Activa els escuts disponibles a `/api/v1/shields.svg`", + "API_Enable_Shields_Description": "Activa els escuts disponibles a `/api/v1/shield.svg`", "API_GitHub_Enterprise_URL": "URL del servidor", "API_GitHub_Enterprise_URL_Description": "Exemple: http://domain.com (sense la barra final)", "API_Gitlab_URL": "URL de GitLab", diff --git a/packages/rocketchat-i18n/i18n/cs.i18n.json b/packages/rocketchat-i18n/i18n/cs.i18n.json index 1f8dfc177f56..e48647fdddba 100644 --- a/packages/rocketchat-i18n/i18n/cs.i18n.json +++ b/packages/rocketchat-i18n/i18n/cs.i18n.json @@ -47,7 +47,7 @@ "Accounts_EmailVerification": "Ověření e-mailu", "Accounts_EmailVerification_Description": "Pro použití této funkce se ujistěte, že máte správné nastavení SMTP", "Accounts_Enrollment_Email": "Úvodní E-mail", - "Accounts_Enrollment_Email_Default": "

Vítejte v

[Site_Name]

Přejděte na [Site_URL] a zkuste to nejlepší open source chat řešení na trhu!

", + "Accounts_Enrollment_Email_Default": "

Vítejte v

[Site_Name]

Přejděte na [Site_URL] a zkuste to nejlepší open source chat řešení na trhu!

", "Accounts_Enrollment_Email_Description": "Můžete použít [name], [fname], [lname] pro uživatelské jména, křestní jméno a příjmení,
pro e-mail uživatele, můžete použít [email].", "Accounts_Enrollment_Email_Subject_Default": "Vítejte na stránkách [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Zapomenout session uživatele při zavření okna", @@ -132,7 +132,7 @@ "Accounts_ShowFormLogin": "Zobrazit formulářové přihlášení", "Accounts_UseDefaultBlockedDomainsList": "Použít výchozí seznam blokovaných domén", "Accounts_UseDNSDomainCheck": "Použít ověření DNS domény", - "Accounts_UserAddedEmail_Default": "

Vítejte v

[Site_Name]

Přejděte na [Site_URL] a zkuste to nejlepší open source chat řešení na trhu!

Můžete se přihlásit pomocí e-mailu: [email] a hesla: [password]. Po přihlášení jej možná budete muset změnit.", + "Accounts_UserAddedEmail_Default": "

Vítejte v

[Site_Name]

Přejděte na [Site_URL] a zkuste to nejlepší open source chat řešení na trhu!

Můžete se přihlásit pomocí e-mailu: [email] a hesla: [password]. Po přihlášení jej možná budete muset změnit.", "Accounts_UserAddedEmail_Description": "Můžete použít:

  • [name], [fname], [lname] pro celé jméno, křestní nebo příjmení.
  • [email] pro email uživatele.
  • [password] pro heslo uživatele.
  • [Site_Name] a [Site_URL] pro jméno a URL aplikace.
", "Accounts_UserAddedEmailSubject_Default": "Vítejte na [Site_Name]", "Activate": "Aktivovat", @@ -214,7 +214,7 @@ "API_Enable_Direct_Message_History_EndPoint": "Povolit Endpoint přímých zpráv", "API_Enable_Direct_Message_History_EndPoint_Description": "Povolí endpoint `/api/v1/im.history.others` přes který lze stahovat přímé zprávy mezi všemi uživateli.", "API_Enable_Shields": "Povolit sdílecí ikony", - "API_Enable_Shields_Description": "Ikony dostupné na adrese `/api/v1/shields.svg`", + "API_Enable_Shields_Description": "Ikony dostupné na adrese `/api/v1/shield.svg`", "API_GitHub_Enterprise_URL": "Adresa URL serveru", "API_GitHub_Enterprise_URL_Description": "Příklad: http://domain.com (bez lomítka na konci)", "API_Gitlab_URL": "GitLab URL", diff --git a/packages/rocketchat-i18n/i18n/de-AT.i18n.json b/packages/rocketchat-i18n/i18n/de-AT.i18n.json index 6f7e56916076..5e723f4678fe 100644 --- a/packages/rocketchat-i18n/i18n/de-AT.i18n.json +++ b/packages/rocketchat-i18n/i18n/de-AT.i18n.json @@ -35,7 +35,7 @@ "Accounts_EmailVerification": "E-Mail-Verifizierung", "Accounts_EmailVerification_Description": "Um diese Funktion nutzen zu können, stellen Sie bitte sicher, dass ihre SMTP-Einstellungen korrekt sind.", "Accounts_Enrollment_Email": "Registrierungsmail", - "Accounts_Enrollment_Email_Default": "

Willkommen zu

[Site_Name]

Besuchen Sie [Site_URL] und probieren Sie noch heute die beste Open-Source-Chat-Lösung aus.

", + "Accounts_Enrollment_Email_Default": "

Willkommen zu

[Site_Name]

Besuchen Sie [Site_URL] und probieren Sie noch heute die beste Open-Source-Chat-Lösung aus.

", "Accounts_Enrollment_Email_Description": "Sie können die folgenden Platzhalter verwenden:
  • [name], [fname], [lname] für den vollständigen Namen des Benutzers, Vornamen oder Nachnamen.
  • [email] für die E-Mail-Adresse des Benutzers.
  • [Site_Name] und [Site_URL] für den Anwendungsname und die URL.
", "Accounts_Enrollment_Email_Subject_Default": "Willkommen zu [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Benutzer Session vergessen, wenn Fenster geschlossen wird", @@ -108,7 +108,7 @@ "Accounts_ShowFormLogin": "Anmeldeformular zeigen", "Accounts_UseDefaultBlockedDomainsList": "Standardliste für blockierte Domains verwenden", "Accounts_UseDNSDomainCheck": "DNS-Domain-Check verwenden", - "Accounts_UserAddedEmail_Default": "

Willkommen zu

[Site_Name]

Besuchen Sie [Site_URL] und probieren Sie noch heute die beste Open-Source-Chat-Lösung aus.

Sie können sich mit den folgenden Daten einloggen.

E-Mail-Adresse: [email]
Passwort: [password]

Sie müssen Ihr Passwort möglicherweise nach dem ersten Login ändern.

", + "Accounts_UserAddedEmail_Default": "

Willkommen zu

[Site_Name]

Besuchen Sie [Site_URL] und probieren Sie noch heute die beste Open-Source-Chat-Lösung aus.

Sie können sich mit den folgenden Daten einloggen.

E-Mail-Adresse: [email]
Passwort: [password]

Sie müssen Ihr Passwort möglicherweise nach dem ersten Login ändern.

", "Accounts_UserAddedEmail_Description": "Sie können die folgenden Platzhalter verwenden:
  • [name], [fname], [lname] für den vollständigen Namen des Benutzers, Vornamen oder Nachnamen.
  • [email] für die E-Mail-Adresse des Benutzers.
  • [password] für das Kennwort des Benutzers.
  • [Site_Name] und [Site_URL] für den Anwendungsname und die URL.
", "Accounts_UserAddedEmailSubject_Default": "Sie wurden auf [Site_Name] hinzugefügt", "Activate": "Aktivieren", @@ -1260,4 +1260,4 @@ "your_message_optional": "ihre optionale Nachricht", "Your_password_is_wrong": "Falsches Passwort", "Your_push_was_sent_to_s_devices": "Die Push-Nachricht wurde an %s Geräte gesendet." -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/de.i18n.json b/packages/rocketchat-i18n/i18n/de.i18n.json index ed7ca2010afe..195ab20cf67e 100644 --- a/packages/rocketchat-i18n/i18n/de.i18n.json +++ b/packages/rocketchat-i18n/i18n/de.i18n.json @@ -48,7 +48,7 @@ "Accounts_EmailVerification": "E-Mail-Verifizierung", "Accounts_EmailVerification_Description": "Um diese Funktion nutzen zu können, stellen Sie bitte sicher, dass Ihre SMTP-Einstellungen korrekt sind.", "Accounts_Enrollment_Email": "Registrierungsmail", - "Accounts_Enrollment_Email_Default": "

Willkommen zu

[Site_Name]

Besuche [Site_URL] und probiere noch heute die beste Open-Source-Chat-Lösung aus.

", + "Accounts_Enrollment_Email_Default": "

Willkommen zu

[Site_Name]

Besuche [Site_URL] und probiere noch heute die beste Open-Source-Chat-Lösung aus.

", "Accounts_Enrollment_Email_Description": "Sie können die folgenden Platzhalter verwenden:
  • [name], [fname], [lname] für den vollständigen Namen, Vornamen oder Nachnamen des Benutzers.
  • [email] für die E-Mail-Adresse des Benutzers.
  • [Site_Name] und [Site_URL] für den Anwendungsnamen und die URL.
", "Accounts_Enrollment_Email_Subject_Default": "Willkommen zu [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Benutzer Session beenden, wenn das Fenster geschlossen wird", @@ -133,7 +133,7 @@ "Accounts_ShowFormLogin": "Anmeldeformular zeigen", "Accounts_UseDefaultBlockedDomainsList": "Standardliste für blockierte Domains verwenden", "Accounts_UseDNSDomainCheck": "DNS-Domain-Check verwenden", - "Accounts_UserAddedEmail_Default": "

Willkommen zu

[Site_Name]

Besuche [Site_URL] und probiere noch heute die beste Open-Source-Chat-Lösung aus.

Du kannst Dich mit den folgenden Daten anmelden:

E-Mail-Adresse: [email]
Passwort: [password]

Es kann sein, dass Du Dein Passwort nach der ersten Anmeldung ändern musst

", + "Accounts_UserAddedEmail_Default": "

Willkommen zu

[Site_Name]

Besuche [Site_URL] und probiere noch heute die beste Open-Source-Chat-Lösung aus.

Du kannst Dich mit den folgenden Daten anmelden:

E-Mail-Adresse: [email]
Passwort: [password]

Es kann sein, dass Du Dein Passwort nach der ersten Anmeldung ändern musst

", "Accounts_UserAddedEmail_Description": "Sie können die folgenden Platzhalter verwenden:
  • [name], [fname], [lname] für den vollständigen Namen des Benutzers, Vornamen oder Nachnamen.
  • [email] für die E-Mail-Adresse des Benutzers.
  • [password] für das Kennwort des Benutzers.
  • [Site_Name] und [Site_URL] für den Anwendungsname und die URL.
", "Accounts_UserAddedEmailSubject_Default": "Du wurdest auf [Site_Name] hinzugefügt", "Activate": "Aktivieren", @@ -215,7 +215,7 @@ "API_Enable_Direct_Message_History_EndPoint": "Endpunkt für den Verlauf von Direktnachrichten", "API_Enable_Direct_Message_History_EndPoint_Description": "Aktiviere `/api/v1/im.history.others`. Hierüber ist es möglich, Direktnachrichten einzusehen, an denen der Benutzer nicht beteiligt ist.", "API_Enable_Shields": "Aktiviere Shields", - "API_Enable_Shields_Description": "Mache Shields über `/api/v1/shields.svg` abrufbar", + "API_Enable_Shields_Description": "Mache Shields über `/api/v1/shield.svg` abrufbar", "API_GitHub_Enterprise_URL": "Server-URL", "API_GitHub_Enterprise_URL_Description": "Beispiel: http://domain.com (ohne Schrägstrich am Ende)", "API_Gitlab_URL": "GitLab-URL", @@ -1545,6 +1545,9 @@ "SAML_Custom_Generate_Username": "Benutzernamen generieren", "SAML_Custom_IDP_SLO_Redirect_URL": "IDP SLO Redirect URL", "SAML_Custom_Issuer": "Benutzerdefinierter Aussteller", + "SAML_Custom_Logout_Behaviour": "Logout-Verhalten", + "SAML_Custom_Logout_Behaviour_Terminate_SAML_Session": "SAML-Session beenden", + "SAML_Custom_Logout_Behaviour_End_Only_RocketChat": "Nur von Rocket.Chat abmelden", "SAML_Custom_Private_Key": "Privater Schlüssel", "SAML_Custom_Provider": "Benutzerdefinierter Provider", "SAML_Custom_Public_Cert": "Öffentliches Zertifikat", diff --git a/packages/rocketchat-i18n/i18n/el.i18n.json b/packages/rocketchat-i18n/i18n/el.i18n.json index 40085eb0053c..27c08a19abfa 100644 --- a/packages/rocketchat-i18n/i18n/el.i18n.json +++ b/packages/rocketchat-i18n/i18n/el.i18n.json @@ -30,7 +30,7 @@ "Accounts_EmailVerification": "Επιβεβαίωση E-mail", "Accounts_EmailVerification_Description": "Βεβαιωθείτε ότι έχετε τις σωστές ρυθμίσεις SMTP για να χρησιμοποιήσετε αυτήν τη λειτουργία", "Accounts_Enrollment_Email": "Εγγραφή E-mail", - "Accounts_Enrollment_Email_Default": "

Καλωσήρθες στο

[Site_Name]

Πηγαίνετε στο [Site_URL] και δοκιμάστε την καλύτερη λύση συνομιλίας ανοικτού κώδικα που διατίθενται σήμερα!

", + "Accounts_Enrollment_Email_Default": "

Καλωσήρθες στο

[Site_Name]

Πηγαίνετε στο [Site_URL] και δοκιμάστε την καλύτερη λύση συνομιλίας ανοικτού κώδικα που διατίθενται σήμερα!

", "Accounts_Enrollment_Email_Description": "Μπορείτε να χρησιμοποιήσετε το [name], [fname], [lname] για το πλήρες όνομα του χρήστη, το όνομα ή το επώνυμο, αντίστοιχα.
Μπορείτε να χρησιμοποιήσετε το [email] για το ηλεκτρονικό ταχυδρομείο του χρήστη.", "Accounts_Enrollment_Email_Subject_Default": "Καλώς ήρθατε στο [Site_Name]", "Accounts_Iframe_api_method": "Μέθοδος Api", @@ -100,7 +100,7 @@ "Accounts_ShowFormLogin": "Εμφάνιση μορφής βασίζεται Σύνδεση", "Accounts_UseDefaultBlockedDomainsList": "Χρήση προεπιλεγμένων λίστα αποκλεισμένων τομέων", "Accounts_UseDNSDomainCheck": "Χρησιμοποιήστε DNS Τομέα Έλεγχος", - "Accounts_UserAddedEmail_Default": "

Καλωσήρθες στο

[Site_Name]

Πηγαίνετε στο [Site_URL] και δοκιμάστε την καλύτερη λύση συνομιλίας ανοικτού κώδικα που διατίθενται σήμερα!

Μπορείτε να συνδεθείτε χρησιμοποιώντας το email σας: [email] και τον κωδικό πρόσβασης: [password]. Μπορεί να σας ζητηθεί να το αλλάξετε μετά την πρώτη είσοδο σας.", + "Accounts_UserAddedEmail_Default": "

Καλωσήρθες στο

[Site_Name]

Πηγαίνετε στο [Site_URL] και δοκιμάστε την καλύτερη λύση συνομιλίας ανοικτού κώδικα που διατίθενται σήμερα!

Μπορείτε να συνδεθείτε χρησιμοποιώντας το email σας: [email] και τον κωδικό πρόσβασης: [password]. Μπορεί να σας ζητηθεί να το αλλάξετε μετά την πρώτη είσοδο σας.", "Accounts_UserAddedEmail_Description": "Μπορείτε να χρησιμοποιήσετε τις παρακάτω αντικαταστάτες:

  • [name], [fname], [lname] για το πλήρες όνομα του χρήστη, το όνομα ή το επώνυμο, αντίστοιχα.
  • [email] για το ηλεκτρονικό ταχυδρομείο του χρήστη.
  • [password] για τον κωδικό πρόσβασης του χρήστη.
  • [Site_Name] και [Site_URL] για το όνομα της εφαρμογής και τη διεύθυνση URL αντίστοιχα.
", "Accounts_UserAddedEmailSubject_Default": "Μπορείτε έχουν προστεθεί στο [Site_Name]", "Activate": "Θέτω εις ενέργειαν", @@ -1211,4 +1211,4 @@ "Your_mail_was_sent_to_s": "mail σας στάλθηκε στο %s", "Your_password_is_wrong": "Ο κωδικός πρόσβασής σας είναι λάθος!", "Your_push_was_sent_to_s_devices": "ώθηση σας στάλθηκε σε συσκευές %s" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index bb6a9c739901..706fefe310ed 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -45,13 +45,23 @@ "Accounts_Default_User_Preferences_audioNotifications": "Audio Notifications Default Alert", "Accounts_Default_User_Preferences_desktopNotifications": "Desktop Notifications Default Alert", "Accounts_Default_User_Preferences_mobileNotifications": "Mobile Notifications Default Alert", + "Accounts_Default_User_Preferences_not_available": "Failed to retrieve User Preferences because they haven't been set up by the user yet", "Accounts_denyUnverifiedEmail": "Deny unverified email", "Accounts_EmailVerification": "Email Verification", "Accounts_EmailVerification_Description": "Make sure you have correct SMTP settings to use this feature", + "Accounts_Email_Approved": "[name]

Your account was approved.

", + "Accounts_Email_Activated": "[name]

Your account was activated.

", + "Accounts_Email_Deactivated": "[name]

Your account was deactivated.

", + "Accounts_Email_Approved_Subject": "Account approved", + "Accounts_Email_Activated_Subject": "Account activated", + "Accounts_Email_Deactivated_Subject": "Account deactivated", "Accounts_Enrollment_Email": "Enrollment Email", - "Accounts_Enrollment_Email_Default": "

Welcome to

[Site_Name]

Go to [Site_URL] and try the best open source chat solution available today!

", + "Accounts_Enrollment_Email_Default": "

Welcome to

[Site_Name]

Go to [Site_URL] and try the best open source chat solution available today!

", "Accounts_Enrollment_Email_Description": "You may use the following placeholders:
  • [name], [fname], [lname] for the user's full name, first name or last name, respectively.
  • [email] for the user's email.
  • [Site_Name] and [Site_URL] for the Application Name and URL respectively.
", "Accounts_Enrollment_Email_Subject_Default": "Welcome to [Site_Name]", + "Accounts_Admin_Email_Approval_Needed_Default": "

The user [name] ([email]) has been registered.

Please check \"Administration -> Users\" to activate or delete it.

", + "Accounts_Admin_Email_Approval_Needed_With_Reason_Default": "

The user [name] ([email]) has been registered.

Reason: [reason]

Please check \"Administration -> Users\" to activate or delete it.

", + "Accounts_Admin_Email_Approval_Needed_Subject_Default": "A new user registered and needs approval", "Accounts_ForgetUserSessionOnWindowClose": "Forget User Session on Window Close", "Accounts_Iframe_api_method": "Api Method", "Accounts_Iframe_api_url": "API URL", @@ -139,7 +149,7 @@ "Accounts_ShowFormLogin": "Show Form-Based Login", "Accounts_UseDefaultBlockedDomainsList": "Use Default Blocked Domains List", "Accounts_UseDNSDomainCheck": "Use DNS Domain Check", - "Accounts_UserAddedEmail_Default": "

Welcome to

[Site_Name]

Go to [Site_URL] and try the best open source chat solution available today!

You may login using your email: [email] and password: [password]. You may be required to change it after your first login.", + "Accounts_UserAddedEmail_Default": "

Welcome to

[Site_Name]

Go to [Site_URL] and try the best open source chat solution available today!

You may login using your email: [email] and password: [password]. You may be required to change it after your first login.", "Accounts_UserAddedEmail_Description": "You may use the following placeholders:

  • [name], [fname], [lname] for the user's full name, first name or last name, respectively.
  • [email] for the user's email.
  • [password] for the user's password.
  • [Site_Name] and [Site_URL] for the Application Name and URL respectively.
", "Accounts_UserAddedEmailSubject_Default": "You have been added to [Site_Name]", "Activate": "Activate", @@ -189,6 +199,7 @@ "All_users_in_the_channel_can_write_new_messages": "All users in the channel can write new messages", "Allow_Invalid_SelfSigned_Certs": "Allow Invalid Self-Signed Certs", "Allow_Invalid_SelfSigned_Certs_Description": "Allow invalid and self-signed SSL certificate's for link validation and previews.", + "Alphabetical": "Alphabetical", "Allow_switching_departments": "Allow Visitor to Switch Departments", "Always_open_in_new_window": "Always Open in New Window", "Analytics_features_enabled": "Features Enabled", @@ -224,7 +235,7 @@ "API_Enable_Direct_Message_History_EndPoint": "Enable Direct Message History Endpoint", "API_Enable_Direct_Message_History_EndPoint_Description": "This enables the `/api/v1/im.history.others` which allows the viewing of direct messages sent by other users that the caller is not part of.", "API_Enable_Shields": "Enable Shields", - "API_Enable_Shields_Description": "Enable shields available at `/api/v1/shields.svg`", + "API_Enable_Shields_Description": "Enable shields available at `/api/v1/shield.svg`", "API_GitHub_Enterprise_URL": "Server URL", "API_GitHub_Enterprise_URL_Description": "Example: http://domain.com (excluding trailing slash)", "API_Gitlab_URL": "GitLab URL", @@ -267,6 +278,7 @@ "Audio_Notifications_Value": "Default Message Notification Audio", "Auth_Token": "Auth Token", "Author": "Author", + "Author_Information": "Author Information", "Authorization_URL": "Authorization URL", "Authorize": "Authorize", "auto-translate": "Auto Translate", @@ -305,6 +317,7 @@ "Back_to_integration_detail": "Back to the integration detail", "Back_to_integrations": "Back to integrations", "Back_to_login": "Back to login", + "Back_to_Manage_Apps": "Back to Manage Apps", "Back_to_permissions": "Back to permissions", "Backup_codes": "Backup codes", "ban-user": "Ban User", @@ -319,6 +332,7 @@ "Branch": "Branch", "Broadcast_Connected_Instances": "Broadcast Connected Instances", "Bugsnag_api_key": "Bugsnag API Key", + "Build_Environment": "Build Environment", "bulk-create-c": "Bulk Create Channels", "bulk-create-c_description": "Permission to create channels in bulk", "bulk-register-user": "Bulk Create Channels", @@ -407,6 +421,7 @@ "Closing_chat": "Closing chat", "Collapse_Embedded_Media_By_Default": "Collapse Embedded Media by Default", "Color": "Color", + "Contains_Security_Fixes": "Contains Security Fixes", "Commands": "Commands", "Comment_to_leave_on_closing_session": "Comment to Leave on Closing Session", "Common_Access": "Common Access", @@ -720,6 +735,8 @@ "FileUpload_GoogleStorage_AccessId_Description": "The Access Id is generally in an email format, for example: \"example-test@example.iam.gserviceaccount.com\"", "FileUpload_GoogleStorage_Bucket": "Google Storage Bucket Name", "FileUpload_GoogleStorage_Bucket_Description": "The name of the bucket which the files should be uploaded to.", + "FileUpload_GoogleStorage_Proxy": "Proxy", + "FileUpload_GoogleStorage_Proxy_Description": "Proxy all file transmissions through your server instead of direct access to the asset's URL", "FileUpload_GoogleStorage_Secret": "Google Storage Secret", "FileUpload_GoogleStorage_Secret_Description": "Please follow these instructions and paste the result here.", "FileUpload_MaxFileSize": "Maximum File Upload Size (in bytes)", @@ -735,6 +752,8 @@ "FileUpload_S3_BucketURL": "Bucket URL", "FileUpload_S3_CDN": "CDN Domain for Downloads", "FileUpload_S3_ForcePathStyle": "Force Path Style", + "FileUpload_S3_Proxy": "Proxy", + "FileUpload_S3_Proxy_Description": "Proxy all file transmissions through your server instead of direct access to the asset's URL", "FileUpload_S3_Region": "Region", "FileUpload_S3_SignatureVersion": "Signature Version", "FileUpload_S3_URLExpiryTimeSpan": "URLs Expiration Timespan", @@ -774,6 +793,7 @@ "Give_a_unique_name_for_the_custom_oauth": "Give a unique name for the custom oauth", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Give the application a name. This will be seen by your users.", "Global": "Global", + "Global_Search": "Global search", "Google_Vision_usage_limit_exceeded": "Google Vision usage limit exceeded", "GoogleCloudStorage": "Google Cloud Storage", "GoogleNaturalLanguage_ServiceAccount_Description": "Service account key JSON file. More information can be found [here](https://cloud.google.com/natural-language/docs/common/auth#set_up_a_service_account)", @@ -794,6 +814,8 @@ "GoogleVision_Type_Properties": "Properties (Color) Detection", "GoogleVision_Type_SafeSearch": "SafeSearch Detection", "GoogleVision_Type_Similar": "Search Similar Images", + "Group_by_Type": "Group by Type", + "Group_favorites": "Group favorites", "Group_mentions_only": "Group mentions only", "Guest_Pool": "Guest Pool", "Hash": "Hash", @@ -877,6 +899,7 @@ "Install_FxOs_done": "Great! You can now use Rocket.Chat via the icon on your homescreen. Have fun with Rocket.Chat!", "Install_FxOs_error": "Sorry, that did not work as intended! The following error appeared:", "Install_FxOs_follow_instructions": "Please confirm the app installation on your device (press \"Install\" when prompted).", + "Install_package": "Install package", "Installation": "Installation", "Installed_at": "Installed at", "Instance_Record": "Instance Record", @@ -926,6 +949,9 @@ "InternalHubot_ScriptsToLoad": "Scripts to Load", "InternalHubot_ScriptsToLoad_Description": "Please enter a comma separated list of scripts to load from your custom folder", "InternalHubot_Username_Description": "This must be a valid username of a bot registered on your server.", + "InternalHubot_EnableForChannels": "Enable for Public Channels", + "InternalHubot_EnableForDirectMessages": "Enable for Direct Messages", + "InternalHubot_EnableForPrivateGroups": "Enable for Private Channels", "Invalid_confirm_pass": "The password confirmation does not match password", "Invalid_email": "The email entered is invalid", "Invalid_Export_File": "The file uploaded isn't a valid %s export file.", @@ -933,6 +959,7 @@ "Invalid_name": "The name must not be empty", "Invalid_notification_setting_s": "Invalid notification setting: %s", "Invalid_pass": "The password must not be empty", + "Invalid_reason": "The reason to join must not be empty", "Invalid_room_name": "%s is not a valid room name", "Invalid_secret_URL_message": "The URL provided is invalid.", "Invalid_setting_s": "Invalid setting: %s", @@ -1136,6 +1163,14 @@ "Livechat_title": "Livechat Title", "Livechat_title_color": "Livechat Title Background Color", "Livechat_Users": "Livechat Users", + "Livestream_close": "Close Livestream", + "Livestream_not_found": "Livestream not available", + "Livestream_popout": "Open Livestream", + "Livestream_url": "Livestream source url", + "Livestream_url_incorrect": "Livestream url is incorrect", + "Livestream_source_changed_succesfully": "Livestream source changed successfully", + "Livestream_switch_to_room": "Switch to current room's livestream", + "Livestream_enable_audio_only": "Enable only audio mode", "Load_more": "Load more", "Loading...": "Loading...", "Loading_more_from_history": "Loading more from history", @@ -1177,6 +1212,8 @@ "manage-own-integrations_description": "Permition to allow users to create and edit their own integration or webhooks", "manage-sounds": "Manage Sounds", "manage-sounds_description": "Permission to manage the server sounds", + "Manage_Apps": "Manage Apps", + "Manage_the_App": "Manage the App", "Manager_added": "Manager added", "Manager_removed": "Manager removed", "Managing_assets": "Managing assets", @@ -1206,6 +1243,7 @@ "Mentions": "Mentions", "Mentions_default": "Mentions (default)", "Mentions_only": "Mentions only", + "Merge_Channels": "Merge Channels", "Message": "Message", "Message_AllowBadWordsFilter": "Allow Message bad words filtering", "Message_AllowDeleting": "Allow Message Deleting", @@ -1233,6 +1271,7 @@ "Message_DateFormat_Description": "See also: Moment.js", "Message_deleting_blocked": "This message cannot be deleted anymore", "Message_editing": "Message editing", + "Message_GlobalSearch": "Global Search", "Message_GroupingPeriod": "Grouping Period (in seconds)", "Message_GroupingPeriodDescription": "Messages will be grouped with previous message if both are from the same user and the elapsed time was less than the informed time in seconds.", "Message_HideType_au": "Hide \"User Added\" messages", @@ -1240,11 +1279,15 @@ "Message_HideType_ru": "Hide \"User Removed\" messages", "Message_HideType_uj": "Hide \"User Join\" messages", "Message_HideType_ul": "Hide \"User Leave\" messages", + "Message_info": "Message info", "Message_KeepHistory": "Keep Per Message Editing History", "Message_MaxAll": "Maximum Channel Size for ALL Message", "Message_MaxAllowedSize": "Maximum Allowed Characters Per Message", "Message_pinning": "Message pinning", "Message_QuoteChainLimit": "Maximum Number of Chained Quotes", + "Message_Read_Receipt_Enabled": "Show Read Receipts", + "Message_Read_Receipt_Store_Users": "Detailed Read Receipts", + "Message_Read_Receipt_Store_Users_Description": "Shows each user's read receipts", "Message_removed": "Message removed", "Message_sent_by_email": "Message sent by Email", "Message_SetNameToAliasEnabled": "Set a User Name to Alias in Message", @@ -1288,6 +1331,7 @@ "Mute_all_notifications": "Mute all notifications", "mute-user": "Mute User", "mute-user_description": "Permission to mute other users in the same channel", + "Mute_Focused_Conversations": "Mute Focused Conversations", "Mute_someone_in_room": "Mute someone in the room", "Mute_user": "Mute user", "Muted": "Muted", @@ -1314,6 +1358,7 @@ "New_role": "New role", "New_Room_Notification": "New Room Notification", "New_Trigger": "New Trigger", + "New_version_available_(s)": "New version available (%s)", "New_videocall_request": "New Video Call Request", "No_available_agents_to_transfer": "No available agents to transfer", "No_channel_with_name_%s_was_found": "No channel with name \"%s\" was found!", @@ -1509,10 +1554,12 @@ "React_when_read_only_changed_successfully": "Allow reacting when read only changed successfully", "Reacted_with": "Reacted with", "Reactions": "Reactions", + "Read_by": "Read by", "Read_only": "Read Only", "Read_only_changed_successfully": "Read only changed successfully", "Read_only_channel": "Read Only Channel", "Read_only_group": "Read Only Group", + "Reason_To_Join": "Reason to Join", "RealName_Change_Disabled": "Your Rocket.Chat administrator has disabled the changing of names", "Receive_alerts": "Receive alerts", "Record": "Record", @@ -1557,6 +1604,10 @@ "Restart": "Restart", "Restart_the_server": "Restart the server", "Retry_Count": "Retry Count", + "Apps": "Apps", + "App_Information": "App Information", + "App_Installation": "App Installation", + "Apps_Settings": "App's Settings", "Role": "Role", "Role_Editing": "Role Editing", "Role_removed": "Role removed", @@ -1596,6 +1647,7 @@ "run-migration": "Run Migration", "run-migration_description": "Permission to run the migrations", "Running_Instances": "Running Instances", + "Runtime_Environment": "Runtime Environment", "S_new_messages_since_s": "%s new messages since %s", "Same_As_Token_Sent_Via": "Same as \"Token Sent Via\"", "Same_Style_For_Mentions": "Same style for mentions", @@ -1605,6 +1657,9 @@ "SAML_Custom_Generate_Username": "Generate Username", "SAML_Custom_IDP_SLO_Redirect_URL": "IDP SLO Redirect URL", "SAML_Custom_Issuer": "Custom Issuer", + "SAML_Custom_Logout_Behaviour": "Logout Behaviour", + "SAML_Custom_Logout_Behaviour_Terminate_SAML_Session": "Terminate SAML-session", + "SAML_Custom_Logout_Behaviour_End_Only_RocketChat": "Only log out from Rocket.Chat", "SAML_Custom_Private_Key": "Private Key Contents", "SAML_Custom_Provider": "Custom Provider", "SAML_Custom_Public_Cert": "Public Cert Contents", @@ -1681,6 +1736,7 @@ "Should_exists_a_user_with_this_username": "The user must already exist.", "Show_agent_email": "Show agent email", "Show_all": "Show All", + "Show_Avatars": "Show Avatars", "Show_counter": "Show counter", "Show_room_counter_on_sidebar": "Show room counter on sidebar", "Show_more": "Show more", @@ -1743,7 +1799,6 @@ "Sort_by_activity": "Sort by Activity", "Sound": "Sound", "Sound_File_mp3": "Sound File (mp3)", - "Split_by_categories": "Split by categories", "SSL": "SSL", "Star_Message": "Star Message", "Starred_Messages": "Starred Messages", @@ -1792,6 +1847,7 @@ "Success": "Success", "Success_message": "Success message", "Sunday": "Sunday", + "Support": "Support", "Survey": "Survey", "Survey_instructions": "Rate each question according to your satisfaction, 1 meaning you are completely unsatisfied and 5 meaning you are completely satisfied.", "Symbols": "Symbols", @@ -1931,10 +1987,12 @@ "unarchive-room": "Unarchive Room", "unarchive-room_description": "Permission to unarchive channels", "Unblock_User": "Unblock User", + "Uninstall": "Uninstall", "Unmute_someone_in_room": "Unmute someone in the room", "Unmute_user": "Unmute user", "Unnamed": "Unnamed", "Unpin_Message": "Unpin Message", + "Unread_on_top" : "Unread on top", "Unread_Count": "Unread Count", "Unread_Count_DM": "Unread Count for Direct Messages", "Unread_Messages": "Unread Messages", @@ -1943,6 +2001,7 @@ "Unread_Tray_Icon_Alert": "Unread Tray Icon Alert", "Unstar_Message": "Remove Star", "Updated_at": "Updated at", + "Update_your_RocketChat": "Update your Rocket.Chat", "Upload_user_avatar": "Upload avatar", "Upload_file_description": "File description", "Upload_file_name": "File name", @@ -2023,6 +2082,7 @@ "Username_is_already_in_here": "`@%s` is already in here.", "Username_is_not_in_this_room": "The user `#%s` is not in this room.", "Username_Placeholder": "Please enter usernames...", + "Username_already_exist": "Username already exists. Please try another username.", "User_sent_a_message_on_channel": "__username__ sent a message on __channel__:", "User_uploaded_a_file_on_channel": "__username__ uploaded a file on __channel__:", "User_sent_a_message_to_you": "__username__ sent you a message:", @@ -2106,6 +2166,7 @@ "WebRTC_Enable_Private": "Enable for Private Channels", "WebRTC_Servers": "STUN/TURN Servers", "WebRTC_Servers_Description": "A list of STUN and TURN servers separated by comma.
Username, password and port are allowed in the format `username:password@stun:host:port` or `username:password@turn:host:port`.", + "Website": "Website", "Wednesday": "Wednesday", "Welcome": "Welcome %s.", "Welcome_to_the": "Welcome to the", @@ -2157,4 +2218,4 @@ "your_message_optional": "your message (optional)", "Your_password_is_wrong": "Your password is wrong!", "Your_push_was_sent_to_s_devices": "Your push was sent to %s devices" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/es.i18n.json b/packages/rocketchat-i18n/i18n/es.i18n.json index ad3f4d799fe1..a485b292475a 100644 --- a/packages/rocketchat-i18n/i18n/es.i18n.json +++ b/packages/rocketchat-i18n/i18n/es.i18n.json @@ -43,7 +43,7 @@ "Accounts_EmailVerification": "Verificación de correo electrónico", "Accounts_EmailVerification_Description": "Asegúrese de que tiene la configuración SMTP correcta para usar esta característica", "Accounts_Enrollment_Email": "Correo Electrónico de Inscripción ", - "Accounts_Enrollment_Email_Default": "

Bienvenido a

 [Site_Name]

 Ve a [Site_URL] y prueba la mejor solución de chat de código abierto disponible en la actualidad!

", + "Accounts_Enrollment_Email_Default": "

Bienvenido a

 [Site_Name]

 Ve a [Site_URL] y prueba la mejor solución de chat de código abierto disponible en la actualidad!

", "Accounts_Enrollment_Email_Description": "Puedes utilizar los siguientes marcadores:
  • [name], [fname], [lname] para el nombre completo, nombre o apellidos, respectivamente.
  • [email] para el correo electrónico del usuario
  • [Site_Name] y [Site_URL] para el nombre del sitio web y la URL, respectivamente.
", "Accounts_Enrollment_Email_Subject_Default": "Bienvenido a [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Olvidar la sesión de usuario al cerrar la ventana", @@ -125,7 +125,7 @@ "Accounts_ShowFormLogin": "Mostrar Inicio de sesión basado en formulario", "Accounts_UseDefaultBlockedDomainsList": "Usar lista predeterminada de dominios bloqueados", "Accounts_UseDNSDomainCheck": "Utilizar la comprobación de dominio DNS", - "Accounts_UserAddedEmail_Default": "

Bienvenido a

[Site_Name]

Ve a [Site_URL] y prueba la mejor solución de chat de código abierto disponible en la actualidad!

Puede iniciar sesión utilizando su correo electrónico: [email] y contraseña: [password]. Se le puede solicitar que lo cambie al iniciar sesion por primera vez.

", + "Accounts_UserAddedEmail_Default": "

Bienvenido a

[Site_Name]

Ve a [Site_URL] y prueba la mejor solución de chat de código abierto disponible en la actualidad!

Puede iniciar sesión utilizando su correo electrónico: [email] y contraseña: [password]. Se le puede solicitar que lo cambie al iniciar sesion por primera vez.

", "Accounts_UserAddedEmail_Description": "Es posible utilizar los siguientes marcadores:
  • [name], [fname], [lname] para el nombre completo del usuario, el nombre o el apellido, respectivamente.
  • [email] para el correo electrónico del usuario.
  • [password] para la contraseña del usuario.
  • [Site_Name] y [Site_URL] para el nombre de la aplicación y la URL, respectivamente.
", "Accounts_UserAddedEmailSubject_Default": "Has sido añadido a [Site_Name]", "Activate": "Activar", @@ -1422,4 +1422,4 @@ "Your_mail_was_sent_to_s": "Su correo electrónico fue enviado a %s", "Your_password_is_wrong": "¡Su contraseña es incorrecta!", "Your_push_was_sent_to_s_devices": "Su push fue enviado a los dispositivos %s" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/fa.i18n.json b/packages/rocketchat-i18n/i18n/fa.i18n.json index 798467212464..a3d27daec5a5 100644 --- a/packages/rocketchat-i18n/i18n/fa.i18n.json +++ b/packages/rocketchat-i18n/i18n/fa.i18n.json @@ -37,7 +37,7 @@ "Accounts_EmailVerification": "تأیید پست الکترونیکی", "Accounts_EmailVerification_Description": "برای استفاده از این ویژگی SMTP باید تنظیم شده باشد", "Accounts_Enrollment_Email": "ثبت نام با ایمیل", - "Accounts_Enrollment_Email_Default": "

خوش آمدید به

[Site_Name]

به [Site_URL] بروید و بهترین راه حل چت منبع باز را که امروزه در دسترس است امتحان کنید!

", + "Accounts_Enrollment_Email_Default": "

خوش آمدید به

[Site_Name]

به [Site_URL] بروید و بهترین راه حل چت منبع باز را که امروزه در دسترس است امتحان کنید!

", "Accounts_Enrollment_Email_Description": "می توانید از این مکان نماها استفاده کنید:
  • [name], [fname], [lname] به ترتیب برای نام کامل، نام کوچک و نام بزرگ کاربر.
  • [email] برای ایمیل کاربر.
  • [Site_Name] و [Site_URL] به ترتیب برای نام و آدرس برنامه.", "Accounts_Enrollment_Email_Subject_Default": "به [Site_Name] خوش آمدید", "Accounts_Iframe_api_method": "متد API", @@ -106,7 +106,7 @@ "Accounts_ShowFormLogin": "نمایش فرم لاگین", "Accounts_UseDefaultBlockedDomainsList": "استفاده از لیست پیش فرض دامنه های مسدود شده", "Accounts_UseDNSDomainCheck": "استفاده از امکان بررسی دامنه DNS", - "Accounts_UserAddedEmail_Default": "

    خوش آمدید به

    [Site_Name]

    برو به [Site_URL] و سعی کنید بهترین راه حل چت منبع باز امروز در دسترس است!

    [email] و رمز عبور: [password] شما ممکن است با استفاده از ایمیل خود وارد شوید. شما ممکن است لازم باشد به آن پس از اولین ورود خود را تغییر دهید.", + "Accounts_UserAddedEmail_Default": "

    خوش آمدید به

    [Site_Name]

    برو به [Site_URL] و سعی کنید بهترین راه حل چت منبع باز امروز در دسترس است!

    [email] و رمز عبور: [password] شما ممکن است با استفاده از ایمیل خود وارد شوید. شما ممکن است لازم باشد به آن پس از اولین ورود خود را تغییر دهید.", "Accounts_UserAddedEmail_Description": "شما ممکن است متغیرهایی زیر استفاده کنید:

    • [name]، [fname]، [lname] برای نام کاربر کامل، نام اول یا نام خانوادگی، به ترتیب.
    • [email] برای ایمیل کاربر.
    • [password] برای رمز عبور کاربر است.
    • [Site_Name] و [Site_URL] برای نام نرم افزار و URL است.
    ", "Accounts_UserAddedEmailSubject_Default": "شما به [Site_Name] اضافه شده اید", "Activate": "فعال کردن", @@ -1290,4 +1290,4 @@ "your_message_optional": "پیام شما(انتخابی)", "Your_password_is_wrong": "رمز عبور خود را اشتباه است!", "Your_push_was_sent_to_s_devices": "فشار خود را به دستگاه %s را ارسال شد" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/fi.i18n.json b/packages/rocketchat-i18n/i18n/fi.i18n.json index 6268b181d533..e668e2364117 100644 --- a/packages/rocketchat-i18n/i18n/fi.i18n.json +++ b/packages/rocketchat-i18n/i18n/fi.i18n.json @@ -37,7 +37,7 @@ "Accounts_EmailVerification": "Sähköpostiosoitteen vahvistaminen", "Accounts_EmailVerification_Description": "Varmista, että käytät oikeita SMTP-asetuksia tätä ominaisuutta varten", "Accounts_Enrollment_Email": "Kirjautumissähköposti", - "Accounts_Enrollment_Email_Default": "

    Tervetuloa sivustolle

    [Site_Name]

    Siirry osoitteeseen [Site_URL] ja kokeile parasta avoimen lähdekoodin chat ratkaisua tänään!

    ", + "Accounts_Enrollment_Email_Default": "

    Tervetuloa sivustolle

    [Site_Name]

    Siirry osoitteeseen [Site_URL] ja kokeile parasta avoimen lähdekoodin chat ratkaisua tänään!

    ", "Accounts_Enrollment_Email_Description": "Voit käyttää seuraavia placeholdereita
    • [name], [fname], [lname] käyttäjän koko nimen, etunimen tai sukunimen paikalla.
    • [Site_Name] ja [Site_URL] sivuston nimen ja osoitteen paikalla
    ", "Accounts_Enrollment_Email_Subject_Default": "Tervetuloa sivustolle [Site_Name]", "Accounts_Iframe_api_method": "API metodi", @@ -106,7 +106,7 @@ "Accounts_ShowFormLogin": "Näytä lomakepohjainen kirjautuminen", "Accounts_UseDefaultBlockedDomainsList": "Käytä Estettyjen Verkkotunnusten Oletuslistaa", "Accounts_UseDNSDomainCheck": "Varmista Toimialueen DNS", - "Accounts_UserAddedEmail_Default": "

    Tervetuloa sivustolle

     [Site_Name]

     Mene [Site_URL] ja kokeile parasta avoimen lähdekoodin chat ratkaisua tänään!

     Voit kirjautua käyttäen sähköpostiasi: [email] ja salasanaa: [password]. Voit joutua muuttamaan salasanasi ensimmäisen kirjautumisen jälkeen.

    ", + "Accounts_UserAddedEmail_Default": "

    Tervetuloa sivustolle

     [Site_Name]

     Mene [Site_URL] ja kokeile parasta avoimen lähdekoodin chat ratkaisua tänään!

     Voit kirjautua käyttäen sähköpostiasi: [email] ja salasanaa: [password]. Voit joutua muuttamaan salasanasi ensimmäisen kirjautumisen jälkeen.

    ", "Accounts_UserAddedEmail_Description": "Voit käyttää seuraavia placeholdereita:
    • [name], [fname], [lname] käyttäjän koko nimen, etunimen tai sukunimen paikalla.
    •  [email] käyttäjän sähköpostiosoitteena.
    •  [password] käyttäjän salasanana.
    •  [Site_Name] ja [Site_URL] sivuston nimen ja osoitteen paikalla.
    ", "Accounts_UserAddedEmailSubject_Default": "Sinut on lisätty sivustolle [Site_Name]", "Activate": "Aktivoi", @@ -468,6 +468,7 @@ "Give_a_unique_name_for_the_custom_oauth": "Anna yksilöllinen nimi mukautettua oauth varten", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Anna sovelluksen nimi. Käyttäjät näkevät tämän.", "Global": "Yleinen", + "Global_Search": "Hae kaikilta kanavilta", "GoogleTagManager_id": "Google Tag Manager Id", "Guest_Pool": "Vieraspooli", "Hash": "Hash", @@ -1264,4 +1265,4 @@ "Your_mail_was_sent_to_s": "Sähköpostisi lähetettiin, vastaanottajana %s", "Your_password_is_wrong": "Salasanasi on väärin!", "Your_push_was_sent_to_s_devices": "Push-viestisi lähetettiin %s laitteeseen" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/fr.i18n.json b/packages/rocketchat-i18n/i18n/fr.i18n.json index 946ab07c68f9..eb28f22ecb89 100644 --- a/packages/rocketchat-i18n/i18n/fr.i18n.json +++ b/packages/rocketchat-i18n/i18n/fr.i18n.json @@ -40,7 +40,7 @@ "Accounts_EmailVerification": "Vérification de l'adresse e-mail", "Accounts_EmailVerification_Description": "Vous devez avoir des paramètres SMTP corrects pour utiliser cette fonctionnalité", "Accounts_Enrollment_Email": "E-mail d'inscription", - "Accounts_Enrollment_Email_Default": "

    Bienvenue à

    [Site_Name]

    Allez sur [Site_URL] et essayer la meilleure solution de chat open source disponible aujourd'hui!

    ", + "Accounts_Enrollment_Email_Default": "

    Bienvenue à

    [Site_Name]

    Allez sur [Site_URL] et essayer la meilleure solution de chat open source disponible aujourd'hui!

    ", "Accounts_Enrollment_Email_Description": "Vous pouvez utiliser, respectivement,
    • [name], [fname], [lname] pour le nom complet , le prénom et le nom de famille de l'utilisateur.
    • Vous pouvez utiliser [email] pour l'adresse e-mail de l'utilisateur.
    • [Site_Name] et [Site_URL] pour les noms de l'application et l'URL.
    ", "Accounts_Enrollment_Email_Subject_Default": "Bienvenue sur [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Ne pas se souvenir de la session utilisateur lors de la fermeture de la fenêtre", @@ -119,7 +119,7 @@ "Accounts_ShowFormLogin": "Afficher le formulaire de connexion", "Accounts_UseDefaultBlockedDomainsList": "Utiliser la liste de domaines bloqués par défaut ", "Accounts_UseDNSDomainCheck": "Utiliser la vérification de Domaine du DNS", - "Accounts_UserAddedEmail_Default": "

    Bienvenue sur

    [Site_Name]

    Allez sur [Site_URL] et essayer la meilleure solution de chat open source disponible aujourd'hui!

    Vous pouvez vous connecter en utilisant votre email: [email] et mot de passe: [password]. Vous pouvez être amené à le changer après votre première connexion.

    ", + "Accounts_UserAddedEmail_Default": "

    Bienvenue sur

    [Site_Name]

    Allez sur [Site_URL] et essayer la meilleure solution de chat open source disponible aujourd'hui!

    Vous pouvez vous connecter en utilisant votre email: [email] et mot de passe: [password]. Vous pouvez être amené à le changer après votre première connexion.

    ", "Accounts_UserAddedEmail_Description": "Vous pouvez utiliser les variables suivantes :
    • [name], [fname], [lname] respectivement pour le nom complet de l'utilisateur, son prénom ou son nom,
    • [email] pour son adresse e-mail de l'utilisateur,
    • [password] pour sson mot de passe,
    • [Site_Name] et [Site_URL] pour le nom de l'application et son URL respectivement.
    ", "Accounts_UserAddedEmailSubject_Default": "Vous avez été ajouté à [Site_Name]", "Activate": "Activer", @@ -1042,7 +1042,7 @@ "Only_On_Desktop": "Mode Bureau (envoyé seulement quand Entrée sur le bureau)", "Only_you_can_see_this_message": "Vous seul pouvez voir ce message", "Oops!": "Oups", - "Open": "Ouvrerture", + "Open": "Ouverture", "Open_days_of_the_week": "Jours d'ouverture", "Open_Livechats": "Ouvrir les chats en direct", "Opened": "Ouvert", diff --git a/packages/rocketchat-i18n/i18n/he.i18n.json b/packages/rocketchat-i18n/i18n/he.i18n.json index 1406c294e0be..10f6619bd9c5 100644 --- a/packages/rocketchat-i18n/i18n/he.i18n.json +++ b/packages/rocketchat-i18n/i18n/he.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "אימות דוא״ל", "Accounts_EmailVerification_Description": "בדוק שיש לך הגדרות SMTP נכונות כדי להשתמש בתכונה זו", "Accounts_Enrollment_Email": "אימייל הרשמה", - "Accounts_Enrollment_Email_Default": "

    ברוך הבא ל

    [Site_Name]

    עבור אל [Site_URL] ולנסות פתרון הצ'אט פתוח המקור הטוב ביותר הזמינים כיום!

    ", + "Accounts_Enrollment_Email_Default": "

    ברוך הבא ל

    [Site_Name]

    עבור אל [Site_URL] ולנסות פתרון הצ'אט פתוח המקור הטוב ביותר הזמינים כיום!

    ", "Accounts_Enrollment_Email_Description": "אתה יכול להשתמש [name], [fname], [lname] עבור השם המלא של המשתמש, שם פרטי או שם משפחה, בהתאמה.
    אתה יכול להשתמש [email] עבור הדוא\"ל של המשתמש.", "Accounts_Enrollment_Email_Subject_Default": "ברוכים הבאים [Site_name]", "Accounts_Iframe_api_method": "שיטת Api", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "טופס מבוסס צג כניסה", "Accounts_UseDefaultBlockedDomainsList": "השתמש בברירת מחדל רשימת Domains חסימה", "Accounts_UseDNSDomainCheck": "הסימון השתמש דומיין DNS", - "Accounts_UserAddedEmail_Default": "

    ברוך הבא ל

    [Site_Name]

    עבור אל [Site_URL] ולנסות פתרון הצ'אט פתוח המקור הטוב ביותר הזמינים כיום!

    אתה יכול להתחבר באמצעות הדוא\"ל שלך: [email] וסיסמא: [סיסמא]. ייתכן שתידרש לשנות את זה לאחר ההתחברות הראשונה שלך.", + "Accounts_UserAddedEmail_Default": "

    ברוך הבא ל

    [Site_Name]

    עבור אל [Site_URL] ולנסות פתרון הצ'אט פתוח המקור הטוב ביותר הזמינים כיום!

    אתה יכול להתחבר באמצעות הדוא\"ל שלך: [email] וסיסמא: [סיסמא]. ייתכן שתידרש לשנות את זה לאחר ההתחברות הראשונה שלך.", "Accounts_UserAddedEmail_Description": "הנך רשאי להשתמש המשתנים הבאים:

    • [name], [fname], [lname] עבור השם המלא של המשתמש, שם פרטי או שם משפחה, בהתאמה.
    • [email] עבור הדוא\"ל של המשתמש.
    • [password] להזין את הסיסמה של המשתמש.
    • [Site_Name] ו [Site_URL] עבור שם היישום וה- URL בהתאמה.
    ", "Accounts_UserAddedEmailSubject_Default": "אתה נוספת [Site_Name]", "Activate": "הפעל", @@ -1216,4 +1216,4 @@ "Your_mail_was_sent_to_s": "הדואר שלך נשלח אל %s", "Your_password_is_wrong": "הסיסמה שלך היא לא בסדר!", "Your_push_was_sent_to_s_devices": "הודעת ה-push נשלח בהצלחה ל-%s מכשירים" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/hr.i18n.json b/packages/rocketchat-i18n/i18n/hr.i18n.json index 755eb94f1233..2ad403bf80e3 100644 --- a/packages/rocketchat-i18n/i18n/hr.i18n.json +++ b/packages/rocketchat-i18n/i18n/hr.i18n.json @@ -36,7 +36,7 @@ "Accounts_EmailVerification": "E-mail Verifikacija", "Accounts_EmailVerification_Description": "Provjerite imate li ispravne postavke SMTP kako bi koristili ovu mogućnost", "Accounts_Enrollment_Email": "Email dobrodošlice", - "Accounts_Enrollment_Email_Default": "

    Dobrodošli u

     [Site_Name]

     Idite na [Site_URL] i pokušajte najbolje open source chat rješenje danas!

    ", + "Accounts_Enrollment_Email_Default": "

    Dobrodošli u

     [Site_Name]

     Idite na [Site_URL] i pokušajte najbolje open source chat rješenje danas!

    ", "Accounts_Enrollment_Email_Description": "Možete koristiti sljedeće oznake:
    • [name], [fname], [lname] za korisničko ime, ime te prezime.
    • [email] za korisnikov email.
    • [Site_Name] i [Site_URL] za naziv aplikacije i URL.\n
    ", "Accounts_Enrollment_Email_Subject_Default": "Dobro došli na [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Zaboravi korisnikovu prijavu pri zatvaranju prozora", @@ -112,7 +112,7 @@ "Accounts_ShowFormLogin": "Prikaži obrazac za prijavu", "Accounts_UseDefaultBlockedDomainsList": "Koristi zadanu listu blokiranih domena", "Accounts_UseDNSDomainCheck": "Koristi DNS provjeru domena", - "Accounts_UserAddedEmail_Default": "

    Dobrodošli na

    [Site_Name]

     Idi na [Site_URL] i isprobaj najbolje open source chat rješenje danas!

     

    Možete se prijaviti preko emaila: [email] i lozinke: [password]. Moguće je da će vas tražiti da zamijenite lozinku nakon prijave.

    ", + "Accounts_UserAddedEmail_Default": "

    Dobrodošli na

    [Site_Name]

     Idi na [Site_URL] i isprobaj najbolje open source chat rješenje danas!

     

    Možete se prijaviti preko emaila: [email] i lozinke: [password]. Moguće je da će vas tražiti da zamijenite lozinku nakon prijave.

    ", "Accounts_UserAddedEmail_Description": "Možete koristiti sljedeće oznake:
    • [name], [fname], [lname] za korisničko ime, ime, te prezime.
    •  [email] za email korisnika.
    •  [password] korisnikovu lozinku.
    •  [Site_Name] i [Site_URL] za ime i URL stranice.
    ", "Accounts_UserAddedEmailSubject_Default": "Dodani ste na [Site_Name]", "Activate": "Aktiviraj", @@ -1433,4 +1433,4 @@ "your_message_optional": "tvoja poruka (opcionalno)", "Your_password_is_wrong": "Vaša lozinka je pogrešna!", "Your_push_was_sent_to_s_devices": "Push obavijest je poslana %s uređaje" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/hu.i18n.json b/packages/rocketchat-i18n/i18n/hu.i18n.json index b1059c77237e..c4f26287970b 100644 --- a/packages/rocketchat-i18n/i18n/hu.i18n.json +++ b/packages/rocketchat-i18n/i18n/hu.i18n.json @@ -35,7 +35,7 @@ "Accounts_EmailVerification": "Email megerősítése", "Accounts_EmailVerification_Description": "Győződjön meg róla, hogy az SMTP megfelelően be van állítva", "Accounts_Enrollment_Email": "Beiratkozás E-mail", - "Accounts_Enrollment_Email_Default": "

    Isten hozott a

    [Site_Name]

    Tovább a [Site_URL], és próbálja a legjobb nyílt forráskódú chat megoldást ma elérhető!

    ", + "Accounts_Enrollment_Email_Default": "

    Isten hozott a

    [Site_Name]

    Tovább a [Site_URL], és próbálja a legjobb nyílt forráskódú chat megoldást ma elérhető!

    ", "Accounts_Enrollment_Email_Description": "Lehet használni [name], [fname], [lname] a felhasználó teljes nevét, keresztnevét vagy vezetéknevét, ill.
    Lehet használni [email] A felhasználó e-mail.", "Accounts_Enrollment_Email_Subject_Default": "Üdvözöljük a [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Elfelejtett felhasználói munkamenet bezárása", @@ -111,7 +111,7 @@ "Accounts_ShowFormLogin": "Megmutatása űrlap alapú bejelentkezés", "Accounts_UseDefaultBlockedDomainsList": "Use Default blokkolt domainek listája", "Accounts_UseDNSDomainCheck": "DNS használata Domain ellenőrzése", - "Accounts_UserAddedEmail_Default": "

    Isten hozott a

    [Site_Name]

    Tovább a [Site_URL], és próbálja a legjobb nyílt forráskódú chat megoldást ma elérhető!

    Beléphet használja az e-mail: [email] és jelszót [password]. Szükség lehet változtatni, miután az első bejelentkezés.", + "Accounts_UserAddedEmail_Default": "

    Isten hozott a

    [Site_Name]

    Tovább a [Site_URL], és próbálja a legjobb nyílt forráskódú chat megoldást ma elérhető!

    Beléphet használja az e-mail: [email] és jelszót [password]. Szükség lehet változtatni, miután az első bejelentkezés.", "Accounts_UserAddedEmail_Description": "Használhatja a következő szimbólumokat:

    • [name], [fname], [lname] a felhasználó teljes nevét, keresztnevét vagy vezetéknevét, ill.
    • [email] A felhasználó e-mail.
    • [password] a felhasználó jelszavát.
    • [Site_Name] és [Site_URL] Az Alkalmazás neve és URL ill.
    ", "Accounts_UserAddedEmailSubject_Default": "Akkor kerültek fel [Site_Name]", "Activate": "Aktiválja", @@ -1274,4 +1274,4 @@ "Your_mail_was_sent_to_s": "A mail-ben küldött %s", "Your_password_is_wrong": "A jelszó rossz!", "Your_push_was_sent_to_s_devices": "Push küldték %s eszközök" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/id.i18n.json b/packages/rocketchat-i18n/i18n/id.i18n.json index 44b70dc1fa07..e3dd41f3af25 100644 --- a/packages/rocketchat-i18n/i18n/id.i18n.json +++ b/packages/rocketchat-i18n/i18n/id.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "Verifikasi Email", "Accounts_EmailVerification_Description": "Pastikan Anda memiliki pengaturan SMTP yang benar untuk menggunakan fitur ini", "Accounts_Enrollment_Email": "Email Pendaftaran ", - "Accounts_Enrollment_Email_Default": "

    Selamat Datang di

    [Nama situs]

    Pergi ke [Site_URL] dan mencoba yang terbaik open source solusi chatting yang tersedia saat ini!

    ", + "Accounts_Enrollment_Email_Default": "

    Selamat Datang di

    [Nama situs]

    Pergi ke [Site_URL] dan mencoba yang terbaik open source solusi chatting yang tersedia saat ini!

    ", "Accounts_Enrollment_Email_Description": "Anda dapat menggunakan placeholder berikut:
    • [Nama], [fname], [lname] untuk nama pengguna penuh, nama depan atau nama belakang, masing-masing.
    • [email] untuk email pengguna.
    • [Site_Name] dan [Site_URL] untuk Nama Aplikasi dan URL masing-masing.
    ", "Accounts_Enrollment_Email_Subject_Default": "Selamat Datang [Site_Name]", "Accounts_Iframe_api_method": "Metode Api", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "berbasis bentuk acara Login", "Accounts_UseDefaultBlockedDomainsList": "Gunakan Default Diblokir Daftar Domain", "Accounts_UseDNSDomainCheck": "Gunakan DNS Domain Periksa", - "Accounts_UserAddedEmail_Default": "

    Selamat Datang di

    [Nama situs]

    Pergi ke [Site_URL] dan mencoba yang terbaik open source solusi chatting yang tersedia saat ini!

    Anda dapat login menggunakan email Anda: [email] dan password: [password]. Anda mungkin diminta untuk mengubahnya setelah login pertama Anda.", + "Accounts_UserAddedEmail_Default": "

    Selamat Datang di

    [Nama situs]

    Pergi ke [Site_URL] dan mencoba yang terbaik open source solusi chatting yang tersedia saat ini!

    Anda dapat login menggunakan email Anda: [email] dan password: [password]. Anda mungkin diminta untuk mengubahnya setelah login pertama Anda.", "Accounts_UserAddedEmail_Description": "Anda dapat menggunakan placeholder berikut:

    • [Nama], [fname], [lname] untuk nama pengguna penuh, nama depan atau nama belakang, masing-masing.
    • [email] untuk email pengguna.
    • [password] untuk password pengguna.
    • [Site_Name] dan [Site_URL] untuk Nama Aplikasi dan URL masing-masing.
    ", "Accounts_UserAddedEmailSubject_Default": "Anda telah ditambahkan ke [Site_Name]", "Activate": "Aktifkan", @@ -1204,4 +1204,4 @@ "Your_mail_was_sent_to_s": "email Anda dikirim ke% s", "Your_password_is_wrong": "password Anda salah!", "Your_push_was_sent_to_s_devices": "push dikirim ke% s perangkat" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/it.i18n.json b/packages/rocketchat-i18n/i18n/it.i18n.json index 16a96e64ebbd..136325e7451a 100644 --- a/packages/rocketchat-i18n/i18n/it.i18n.json +++ b/packages/rocketchat-i18n/i18n/it.i18n.json @@ -39,7 +39,7 @@ "Accounts_EmailVerification": "Verifica email", "Accounts_EmailVerification_Description": "Assicurati di aver impostato SMTP in modo corretto per utilizzare questa funzione", "Accounts_Enrollment_Email": "Iscrizione email", - "Accounts_Enrollment_Email_Default": "

    Benvenuto su

    [Site_Name]

    Vai su [Site_URL] e prova la miglior chat open source disponibile!

    ", + "Accounts_Enrollment_Email_Default": "

    Benvenuto su

    [Site_Name]

    Vai su [Site_URL] e prova la miglior chat open source disponibile!

    ", "Accounts_Enrollment_Email_Description": "Puoi utilizzarei seguenti marcatori:
    • [name], [fname], [lname] rispettivamente per il nome utente completo, nome o cognome.
    • [email] per l'email dell'utente.
    • [Site_Name] e [Site_URL] rispettivamente per il nome dell'applicazione e URL.
    ", "Accounts_Enrollment_Email_Subject_Default": "Benvenuti su [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Dimentica la sessione utente alla chiusura della finestra", @@ -123,7 +123,7 @@ "Accounts_ShowFormLogin": "Mostra il modulo d'accesso", "Accounts_UseDefaultBlockedDomainsList": "Utilizza l'elenco dei domini bloccati", "Accounts_UseDNSDomainCheck": "Utilizza la verifica del dominio DNS", - "Accounts_UserAddedEmail_Default": "

    Benvenuto a

    [Site_Name]

    Vai a [Site_URL] e prova la chat open source migliore disponibile!

    Puoi effettuare il login usando la tua email: [email] e la password: [password]. Ti potrà essere richiesto di cambiarla dopo il primo accesso.", + "Accounts_UserAddedEmail_Default": "

    Benvenuto a

    [Site_Name]

    Vai a [Site_URL] e prova la chat open source migliore disponibile!

    Puoi effettuare il login usando la tua email: [email] e la password: [password]. Ti potrà essere richiesto di cambiarla dopo il primo accesso.", "Accounts_UserAddedEmail_Description": "È possibile utilizzare i seguenti marcatori:

    • [name], [fname], [lname] per il nome completo dell'utente, nome o cognome, rispettivamente.
    • [email] per l'e-mail dell'utente.
    • [password] per la password dell'utente.
    • [Site_Name] e [Site_URL] per il Nome applicazione e l'URL, rispettivamente.
    ", "Accounts_UserAddedEmailSubject_Default": "Sei stato aggiunto su [Site_Name]", "Activate": "Attiva", @@ -190,7 +190,7 @@ "API_Enable_Direct_Message_History_EndPoint": "Abilita l'endpoint per lo storico dei messaggi diretti", "API_Enable_Direct_Message_History_EndPoint_Description": "Questo abilita `/api/v1/im.history.others` che permette di vedere i messaggi diretti inviati dagli altri utenti di cui il chiamante non è parte.", "API_Enable_Shields": "Abilita Shield", - "API_Enable_Shields_Description": "Abilita gli shield disponibili a `/api/v1/shields.svg`", + "API_Enable_Shields_Description": "Abilita gli shield disponibili a `/api/v1/shield.svg`", "API_GitHub_Enterprise_URL": "URL del server", "API_GitHub_Enterprise_URL_Description": "Esempio: http://domain.com (escludendo lo slash finale)", "API_Gitlab_URL": "URL GitLab", @@ -1689,4 +1689,4 @@ "your_message_optional": "il tuo messaggio (opzionale)", "Your_password_is_wrong": "La password è sbagliata!", "Your_push_was_sent_to_s_devices": "La tua richiesta è stata inviata ai %s dispositivi." -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/ja.i18n.json b/packages/rocketchat-i18n/i18n/ja.i18n.json index 82d835f5b8a7..9ddc55c8a4a4 100644 --- a/packages/rocketchat-i18n/i18n/ja.i18n.json +++ b/packages/rocketchat-i18n/i18n/ja.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "メール認証をする", "Accounts_EmailVerification_Description": "この機能を使う前に、SMTP が正しく設定されているか確認してください", "Accounts_Enrollment_Email": "登録メール", - "Accounts_Enrollment_Email_Default": "

    ようこそ

    [Site_Name]

    [Site_URL]に移動し、今日利用可能な最高のオープンソースのチャットソリューションを試してみてください!

    ", + "Accounts_Enrollment_Email_Default": "

    ようこそ

    [Site_Name]

    [Site_URL]に移動し、今日利用可能な最高のオープンソースのチャットソリューションを試してみてください!

    ", "Accounts_Enrollment_Email_Description": "ユーザーのフルネームに [name], [fname], [lname] を使用できます。姓 または 名 にも対応しています。
    メールアドレスには、 [email] を使用できます。", "Accounts_Enrollment_Email_Subject_Default": "[Site_Name]へようこそ", "Accounts_Iframe_api_method": "API メソッド", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "ログインフォームを表示する", "Accounts_UseDefaultBlockedDomainsList": "既定のブロックされたドメイン一覧を利用する", "Accounts_UseDNSDomainCheck": "DNS ドメイン検証を利用する", - "Accounts_UserAddedEmail_Default": "

    ようこそ

    [Site_Name]

    [Site_URL]に移動し、今日利用可能な最高のオープンソースのチャットソリューションを試してみてください!

    [email]とパスワード:[password]あなたはあなたの電子メールを使用してログインすることができます。あなたはあなたの最初のログイン後に変更する必要があります。", + "Accounts_UserAddedEmail_Default": "

    ようこそ

    [Site_Name]

    [Site_URL]に移動し、今日利用可能な最高のオープンソースのチャットソリューションを試してみてください!

    [email]とパスワード:[password]あなたはあなたの電子メールを使用してログインすることができます。あなたはあなたの最初のログイン後に変更する必要があります。", "Accounts_UserAddedEmail_Description": "あなたは、次のプレースホルダを使用することがあります。

    • [name]、[fname]、[lname]ユーザのフルネーム、姓または名の、それぞれ。
    • ユーザーの電子メールのための[email]。
    • ユーザーのパスワードの[password]。
    • [Site_Name]と[Site_URL]アプリケーション名とURLのそれぞれ。
    ", "Accounts_UserAddedEmailSubject_Default": "あなたは[Site_Name]に追加されました", "Activate": "有効化", @@ -1230,4 +1230,4 @@ "Your_mail_was_sent_to_s": "メールは %s へを送信されました", "Your_password_is_wrong": "パスワードが間違っています!", "Your_push_was_sent_to_s_devices": "プッシュ通知が %s 台のデバイスへ送信されました" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/km.i18n.json b/packages/rocketchat-i18n/i18n/km.i18n.json index c44f468c7c34..6e4dd7132102 100644 --- a/packages/rocketchat-i18n/i18n/km.i18n.json +++ b/packages/rocketchat-i18n/i18n/km.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "ការ​ផ្ទៀងផ្ទាត់​តាម​​អ៊ី​ម៉ែ​ល", "Accounts_EmailVerification_Description": "សូមប្រាកដថាអ្នកមានការកំណត់របស់ SMTP ត្រឹមត្រូវដើម្បីប្រើលក្ខណៈពិសេសនេះ", "Accounts_Enrollment_Email": "ការចូលអ៊ីមែល", - "Accounts_Enrollment_Email_Default": "

    ស្វាគមន៍​មកកាន់

    [Site_Name]

    ចូរទៅទៅ [Site_URL] និងព្យាយាមដំណោះស្រាយប្រភពបើកចំហជជែកកំសាន្តដែលអាចប្រើបានល្អបំផុតនាពេលបច្ចុប្បន្ននេះ!

    ", + "Accounts_Enrollment_Email_Default": "

    ស្វាគមន៍​មកកាន់

    [Site_Name]

    ចូរទៅទៅ [Site_URL] និងព្យាយាមដំណោះស្រាយប្រភពបើកចំហជជែកកំសាន្តដែលអាចប្រើបានល្អបំផុតនាពេលបច្ចុប្បន្ននេះ!

    ", "Accounts_Enrollment_Email_Description": "អ្នកប្រហែលប្រើ [name], [fname], [lname] ពីឈ្មោះពេញរបស់អ្នកប្រើប្រាស់ គោត្តនាម ឬនាមខ្លួន។
    អ្នកប្រហែលប្រើប្រាស់ [email] ពីអ៊ីមែលរបស់អញនកប្រើប្រាស់។", "Accounts_Enrollment_Email_Subject_Default": "សូមស្វាគមន៍មកកាន់ [Site_Name]", "Accounts_Iframe_api_method": "វិធីសាស្រ្ត API", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "ការចូលជាទម្រង់ដែលមានមូលដ្ឋានបង្ហាញ", "Accounts_UseDefaultBlockedDomainsList": "បញ្ជីដែនប្រើលំនាំដើម", "Accounts_UseDNSDomainCheck": "ប្រើដែនឈ្មោះ DNS ពិនិត្យ", - "Accounts_UserAddedEmail_Default": "

    ស្វាគមន៍​មកកាន់

    [Site_Name]

    ចូរទៅទៅ [Site_URL] និងព្យាយាមដំណោះស្រាយប្រភពបើកចំហជជែកកំសាន្តដែលអាចប្រើបានល្អបំផុតនាពេលបច្ចុប្បន្ននេះ!

    អ្នកអាចចូលប្រើអ៊ីម៉ែលរបស់អ្នក: [email] និងពាក្យសម្ងាត់: [password] ។ អ្នកអាចត្រូវបានទាមទារឱ្យផ្លាស់ប្តូរវាបន្ទាប់ពីការចូលលើកដំបូងរបស់អ្នក។", + "Accounts_UserAddedEmail_Default": "

    ស្វាគមន៍​មកកាន់

    [Site_Name]

    ចូរទៅទៅ [Site_URL] និងព្យាយាមដំណោះស្រាយប្រភពបើកចំហជជែកកំសាន្តដែលអាចប្រើបានល្អបំផុតនាពេលបច្ចុប្បន្ននេះ!

    អ្នកអាចចូលប្រើអ៊ីម៉ែលរបស់អ្នក: [email] និងពាក្យសម្ងាត់: [password] ។ អ្នកអាចត្រូវបានទាមទារឱ្យផ្លាស់ប្តូរវាបន្ទាប់ពីការចូលលើកដំបូងរបស់អ្នក។", "Accounts_UserAddedEmail_Description": "អ្នកអាចប្រើកន្លែងដាក់ខាងក្រោម:

    • [name], [fname] [lname] សម្រាប់ឈ្មោះអ្នកប្រើពេញលេញ, ឈ្មោះជាលើកដំបូងឬឈ្មោះចុងក្រោយ, រៀងគ្នា។
    • [email] សម្រាប់អ៊ីម៉ែលរបស់អ្នកប្រើ។
    • [password] ពាក្យសម្ងាត់របស់អ្នកប្រើ។
    • [Site_Name] និង [Site_URL] សម្រាប់ឈ្មោះកម្មវិធីនិង URL រៀងគ្នា។
    ", "Accounts_UserAddedEmailSubject_Default": "អ្នកត្រូវបានបន្ថែមទៅ [Site_Name]", "Activate": "ធ្វើ​ឱ្យ​សកម្ម", @@ -1204,4 +1204,4 @@ "Your_mail_was_sent_to_s": "សំបុត្ររបស់អ្នកត្រូវបានបញ្ជូនទៅកាន់ %s", "Your_password_is_wrong": "ពាក្យសម្ងាត់របស់អ្នកគឺខុស!", "Your_push_was_sent_to_s_devices": "ការជំរុញរបស់អ្នកត្រូវបានបញ្ជូនទៅកាន់ឧបករណ៍ %s បាន" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/ko.i18n.json b/packages/rocketchat-i18n/i18n/ko.i18n.json index eeae161e4811..28ff18bf5dc6 100644 --- a/packages/rocketchat-i18n/i18n/ko.i18n.json +++ b/packages/rocketchat-i18n/i18n/ko.i18n.json @@ -39,7 +39,7 @@ "Accounts_EmailVerification": "이메일 확인", "Accounts_EmailVerification_Description": "이 기능을 사용하려면 SMTP설정이 올바르게 되어있는지 확인해주십시오.", "Accounts_Enrollment_Email": "등록된 이메일", - "Accounts_Enrollment_Email_Default": "

    에 오신 것을 환영합니다

    [Site_Name]

    [Site_URL]로 이동하여 오늘날 최고의 오픈 소스 채팅 솔루션을보십시오!

    ", + "Accounts_Enrollment_Email_Default": "

    에 오신 것을 환영합니다

    [Site_Name]

    [Site_URL]로 이동하여 오늘날 최고의 오픈 소스 채팅 솔루션을보십시오!

    ", "Accounts_Enrollment_Email_Description": "다음의 기호를 사용할 수 있습니다:
    • [lname] - 성, [name] - 이름, [fname] - 전체이름(성+이름)
    • [email] - 이메일
    • [Site_Name] - 응용프로그램의 이름, [Site_URL] - URL
    ", "Accounts_Enrollment_Email_Subject_Default": "[Site_Name] 에 오신 것을 환영합니다 ", "Accounts_ForgetUserSessionOnWindowClose": "창을 닫을때 사용자 세션을 삭제합니다", @@ -123,7 +123,7 @@ "Accounts_ShowFormLogin": "폼방식 로그인 보기", "Accounts_UseDefaultBlockedDomainsList": "기본 차단 도메인리스트 사용", "Accounts_UseDNSDomainCheck": "DNS 도메인 확인 사용", - "Accounts_UserAddedEmail_Default": "

    [Site_Name]

    에 오신 것을 환영합니다\n

    [Site_URL]로 이동하여 오늘날 최고의 오픈 소스 채팅 솔루션을 경험 해 보십시오!

    \n

    이메일:[email] 과 비밀번호 : [password] 로 로그인 할 수 있습니다. 로그인 후에는 변경하셔야 합니다.", + "Accounts_UserAddedEmail_Default": "

    [Site_Name]

    에 오신 것을 환영합니다\n

    [Site_URL]로 이동하여 오늘날 최고의 오픈 소스 채팅 솔루션을 경험 해 보십시오!

    \n

    이메일:[email] 과 비밀번호 : [password] 로 로그인 할 수 있습니다. 로그인 후에는 변경하셔야 합니다.", "Accounts_UserAddedEmail_Description": "다음의 기호를 사용할 수 있습니다:

    • [lname] - 성, [name] - 이름, [fname] - 전체이름(성+이름)
    • [email] - 사용자 이메일
    • [password] - 사용자 암호
    • [Site_Name] - 응용프로그램의 이름, [Site_URL] - URL
    ", "Accounts_UserAddedEmailSubject_Default": "당신이은 [Site_Name] 에 추가되었습니다", "Activate": "활성화", @@ -190,7 +190,7 @@ "API_Enable_Direct_Message_History_EndPoint": "Direct Message History Endpoint 활성화", "API_Enable_Direct_Message_History_EndPoint_Description": "소속되지 않은 다른 유저로 부터 보내진 다이렉트메시지를 보기를 허용하는 'api/v1/im.history.others' 를 활성화 합니다.", "API_Enable_Shields": "쉴드 활성화", - "API_Enable_Shields_Description": "'/api/v1/shields.svg' 에 있는 쉴드를 활성화", + "API_Enable_Shields_Description": "'/api/v1/shield.svg' 에 있는 쉴드를 활성화", "API_GitHub_Enterprise_URL": "Server URL", "API_GitHub_Enterprise_URL_Description": "예: http://domain.com (마지막 슬래시 제외)", "API_Gitlab_URL": "GitLab URL", @@ -1312,4 +1312,4 @@ "Your_mail_was_sent_to_s": "메일은 %s의 전송되었습니다", "Your_password_is_wrong": "암호가 잘못되었습니다!", "Your_push_was_sent_to_s_devices": "귀하의 푸시는 %의 기기에 전송" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/ku.i18n.json b/packages/rocketchat-i18n/i18n/ku.i18n.json index 63adca296667..3ba4638ec858 100644 --- a/packages/rocketchat-i18n/i18n/ku.i18n.json +++ b/packages/rocketchat-i18n/i18n/ku.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "Verification E-mail", "Accounts_EmailVerification_Description": "Piştrast tu settings SMTP correct ji bo bikaranîna vê funksîyonê", "Accounts_Enrollment_Email": "Kînge E-mail", - "Accounts_Enrollment_Email_Default": "

    bi xêr bên

    [Site_Name]

    Go to [Site_URL] û hewl baştirîn çareserî chat çavkaniya vekirî ya îro tune!

    ", + "Accounts_Enrollment_Email_Default": "

    bi xêr bên

    [Site_Name]

    Go to [Site_URL] û hewl baştirîn çareserî chat çavkaniya vekirî ya îro tune!

    ", "Accounts_Enrollment_Email_Description": "Dibe ku tu [name], [fname] ji bo navê bikarhêner, nav an paşnav, bi rêzê ve bi kar tînin, [lname].
    Dibe ku tu [email] ji bo email bikarhêner bi kar tînin.", "Accounts_Enrollment_Email_Subject_Default": "Bi xêr hatî [Site_Name]", "Accounts_Iframe_api_method": "Method Api", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "Login-bingeha forma nîşan", "Accounts_UseDefaultBlockedDomainsList": "Use Default astengkirin Lîsteya Domain", "Accounts_UseDNSDomainCheck": "Bi kar bîne Check DNS Domain", - "Accounts_UserAddedEmail_Default": "

    bi xêr bên

    [Site_Name]

    Go to [Site_URL] û hewl baştirîn çareserî chat çavkaniya vekirî ya îro tune!

    [email] û şîfreya:: [password] Hûn dikarin bi bikaranîna email te (login). Te pêwîst be ji bo ku ew piştî yekem login xwe biguherînî.", + "Accounts_UserAddedEmail_Default": "

    bi xêr bên

    [Site_Name]

    Go to [Site_URL] û hewl baştirîn çareserî chat çavkaniya vekirî ya îro tune!

    [email] û şîfreya:: [password] Hûn dikarin bi bikaranîna email te (login). Te pêwîst be ji bo ku ew piştî yekem login xwe biguherînî.", "Accounts_UserAddedEmail_Description": "Dibe ku divê tu guhêrbaran li jêr bi kar tînin:

    • [name], [fname], [lname] ji bo navê bikarhêner full, nav an paşnav, bi rêzê ve.
    • [email] ji bo email bikarhêner.
    • [password] ji bo şîfreya bikarhêner.
    • [Site_Name] û [Site_URL] ji bo Name Application û URL rêzê.
    ", "Accounts_UserAddedEmailSubject_Default": "Hûn hatine zêdekirin [Site_Name]", "Activate": "de çalak bike", @@ -1204,4 +1204,4 @@ "Your_mail_was_sent_to_s": "nameya te ji bo %s hate şandin", "Your_password_is_wrong": "Te şîfreya xwe ji xelet e!", "Your_push_was_sent_to_s_devices": "push xwe ji bo cîhazên %s hate şandin" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/lo.i18n.json b/packages/rocketchat-i18n/i18n/lo.i18n.json index 3070db9ec3d2..51ed88769763 100644 --- a/packages/rocketchat-i18n/i18n/lo.i18n.json +++ b/packages/rocketchat-i18n/i18n/lo.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "ການກວດສອບອີເມລ໌", "Accounts_EmailVerification_Description": "ເຮັດໃຫ້ແນ່ໃຈວ່າທ່ານມີການຕັ້ງຄ່າ SMTP ທີ່ຖືກຕ້ອງທີ່ຈະນໍາໃຊ້ຄຸນນະສົມບັດນີ້", "Accounts_Enrollment_Email": "ການລົງທະບຽນ E-mail", - "Accounts_Enrollment_Email_Default": "

    ຍິນ​ດີ​ຕ້ອນ​ຮັບ​ສູ່

    [Site_Name]

    ໄປທີ່ [Site_URL] ແລະພະຍາຍາມມາເປີດການແກ້ໄຂທີ່ດີທີ່ສຸດສົນທະຢູ່ໃນມື້ນີ້!

    ", + "Accounts_Enrollment_Email_Default": "

    ຍິນ​ດີ​ຕ້ອນ​ຮັບ​ສູ່

    [Site_Name]

    ໄປທີ່ [Site_URL] ແລະພະຍາຍາມມາເປີດການແກ້ໄຂທີ່ດີທີ່ສຸດສົນທະຢູ່ໃນມື້ນີ້!

    ", "Accounts_Enrollment_Email_Description": "ທ່ານອາດຈະນໍາໃຊ້ [name], [fname], [lname] ສໍາລັບຊື່ເຕັມຂອງຜູ້ໃຊ້ໄດ້, ຊື່ທໍາອິດຫຼືຊື່ສຸດທ້າຍ, ຕາມລໍາດັບ.
    ທ່ານອາດຈະນໍາໃຊ້ [email] ສໍາລັບອີເມລຂອງຜູ້ໃຊ້ໄດ້.", "Accounts_Enrollment_Email_Subject_Default": "ຍິນດີຕ້ອນຮັບ [Site_Name]", "Accounts_Iframe_api_method": "ວິທີການ Api", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "ສະແດງໃຫ້ເຫັນຮູບແບບທີ່ເຂົ້າສູ່ລະບົບ", "Accounts_UseDefaultBlockedDomainsList": "ການນໍາໃຊ້ມາດຕະຖານສະກັດຊີ Domains", "Accounts_UseDNSDomainCheck": "ການນໍາໃຊ້ Check DNS ໂດເມນ", - "Accounts_UserAddedEmail_Default": "

    ຍິນ​ດີ​ຕ້ອນ​ຮັບ​ສູ່

    [Site_Name]

    ໄປທີ່ [Site_URL] ແລະພະຍາຍາມມາເປີດການແກ້ໄຂທີ່ດີທີ່ສຸດສົນທະຢູ່ໃນມື້ນີ້!

    ທ່ານອາດຈະເຂົ້າສູ່ລະບົບການນໍາໃຊ້ອີເມວຂອງທ່ານ: [email] ແລະລະຫັດຜ່ານ: [password]. ທ່ານອາດຈະຖືກຮຽກຮ້ອງໃຫ້ມີການປ່ຽນແປງມັນຫຼັງຈາກເຂົ້າສູ່ລະບົບຄັ້ງທໍາອິດຂອງທ່ານ.", + "Accounts_UserAddedEmail_Default": "

    ຍິນ​ດີ​ຕ້ອນ​ຮັບ​ສູ່

    [Site_Name]

    ໄປທີ່ [Site_URL] ແລະພະຍາຍາມມາເປີດການແກ້ໄຂທີ່ດີທີ່ສຸດສົນທະຢູ່ໃນມື້ນີ້!

    ທ່ານອາດຈະເຂົ້າສູ່ລະບົບການນໍາໃຊ້ອີເມວຂອງທ່ານ: [email] ແລະລະຫັດຜ່ານ: [password]. ທ່ານອາດຈະຖືກຮຽກຮ້ອງໃຫ້ມີການປ່ຽນແປງມັນຫຼັງຈາກເຂົ້າສູ່ລະບົບຄັ້ງທໍາອິດຂອງທ່ານ.", "Accounts_UserAddedEmail_Description": "ທ່ານອາດຈະນໍາໃຊ້ຕົວຍຶດຕໍາແຫນ່ງດັ່ງຕໍ່ໄປນີ້:

    • [name], [fname], [lname] ສໍາລັບຊື່ຜູ້ໃຊ້ຂອງໄດ້ຢ່າງເຕັມທີ່, ຊື່ທໍາອິດຫຼືຊື່ສຸດທ້າຍ, ຕາມລໍາດັບ.
    • [email] ສໍາລັບອີເມລຂອງຜູ້ໃຊ້ໄດ້.
    • [password] ສໍາລັບການລະຫັດຜ່ານຂອງຜູ້ໃຊ້ໄດ້.
    • [Site_Name] ແລະ [Site_URL] ສໍາລັບຄໍາຮ້ອງສະຫມັກຊື່ແລະ URL ຕາມລໍາດັບ.
    ", "Accounts_UserAddedEmailSubject_Default": "ທ່ານໄດ້ຮັບການເພີ່ມ [Site_Name]", "Activate": "ກະຕຸ້ນ", @@ -1204,4 +1204,4 @@ "Your_mail_was_sent_to_s": "ອີເມລຂອງທ່ານໄດ້ຖືກສົ່ງໄປ %s", "Your_password_is_wrong": "ລະຫັດຜ່ານຂອງທ່ານແມ່ນຜິດພາດ!", "Your_push_was_sent_to_s_devices": "ການຊຸກຍູ້ຂອງທ່ານໄດ້ຖືກສົ່ງໄປອຸປະກອນ %s" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/ms-MY.i18n.json b/packages/rocketchat-i18n/i18n/ms-MY.i18n.json index b7d956455719..b14714b0d388 100644 --- a/packages/rocketchat-i18n/i18n/ms-MY.i18n.json +++ b/packages/rocketchat-i18n/i18n/ms-MY.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "Pengesahan E-mel", "Accounts_EmailVerification_Description": "Pastikan anda mempunyai tetapan SMTP betul untuk menggunakan ciri-ciri ini", "Accounts_Enrollment_Email": "Pendaftaran E-mel", - "Accounts_Enrollment_Email_Default": "

    Selamat datang ke

    [Site_Name]

    Pergi ke [Site_URL] dan cuba yang terbaik penyelesaian chat sumber terbuka yang ada hari ini!

    ", + "Accounts_Enrollment_Email_Default": "

    Selamat datang ke

    [Site_Name]

    Pergi ke [Site_URL] dan cuba yang terbaik penyelesaian chat sumber terbuka yang ada hari ini!

    ", "Accounts_Enrollment_Email_Description": "Anda boleh menggunakan [nama], [fname], [lname] bagi nama penuh pengguna, nama pertama atau nama akhir, masing-masing.
    Anda boleh menggunakan [email] untuk e-mel pengguna.", "Accounts_Enrollment_Email_Subject_Default": "Selamat datang ke [Site_Name]", "Accounts_Iframe_api_method": "Kaedah Api", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "berasaskan Tunjukkan bentuk Login", "Accounts_UseDefaultBlockedDomainsList": "Penggunaan Lalai Disekat Senarai Domain", "Accounts_UseDNSDomainCheck": "Gunakan DNS Domain Daftar", - "Accounts_UserAddedEmail_Default": "

    Selamat datang ke

    [Site_Name]

    Pergi ke [Site_URL] dan cuba yang terbaik penyelesaian chat sumber terbuka yang ada hari ini!

    Anda boleh log masuk menggunakan e-mel anda: [email] dan kata laluan: [password]. Anda mungkin dikehendaki untuk mengubahnya selepas log masuk pertama anda.", + "Accounts_UserAddedEmail_Default": "

    Selamat datang ke

    [Site_Name]

    Pergi ke [Site_URL] dan cuba yang terbaik penyelesaian chat sumber terbuka yang ada hari ini!

    Anda boleh log masuk menggunakan e-mel anda: [email] dan kata laluan: [password]. Anda mungkin dikehendaki untuk mengubahnya selepas log masuk pertama anda.", "Accounts_UserAddedEmail_Description": "Anda boleh menggunakan pemegang tempat berikut:

    • [name], [fname], [lname] untuk nama pengguna penuh, nama pertama atau nama akhir, masing-masing.
    • [email] untuk e-mel pengguna.
    • [password] bagi kata laluan pengguna.
    • [Site_Name] dan [Site_URL] untuk Nama Permohonan dan URL masing-masing.
    ", "Accounts_UserAddedEmailSubject_Default": "Anda telah ditambahkan pada [Site_Name]", "Activate": "Aktifkan", @@ -1204,4 +1204,4 @@ "Your_mail_was_sent_to_s": "mel anda telah dihantar ke %s", "Your_password_is_wrong": "Kata laluan anda adalah salah!", "Your_push_was_sent_to_s_devices": "push anda telah dihantar ke peranti %s" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/nl.i18n.json b/packages/rocketchat-i18n/i18n/nl.i18n.json index c5361d90ee0f..e3baf213e6b0 100644 --- a/packages/rocketchat-i18n/i18n/nl.i18n.json +++ b/packages/rocketchat-i18n/i18n/nl.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "E-mail verificatie", "Accounts_EmailVerification_Description": "Zorg ervoor dat u de juiste SMTP-instellingen om deze functie te gebruiken", "Accounts_Enrollment_Email": "Registratie E-mail", - "Accounts_Enrollment_Email_Default": "

    Welkom bij

    [Site naam]

    Ga naar [Site_URL] en probeer de beste open source chat-oplossing die vandaag beschikbaar zijn!

    ", + "Accounts_Enrollment_Email_Default": "

    Welkom bij

    [Site naam]

    Ga naar [Site_URL] en probeer de beste open source chat-oplossing die vandaag beschikbaar zijn!

    ", "Accounts_Enrollment_Email_Description": "You may use [name], [fname], [lname] for the user's full name, first name or last name, respectively.
    You may use [email] for the user's e-mail.", "Accounts_Enrollment_Email_Subject_Default": "Welkom bij [Site_Name]", "Accounts_Iframe_api_method": "API-methode", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "Laat formulier-gebaseerd loginscherm zien", "Accounts_UseDefaultBlockedDomainsList": "Gebruik Default geblokkeerde domeinen List", "Accounts_UseDNSDomainCheck": "Gebruik DNS-domein controleren", - "Accounts_UserAddedEmail_Default": "

    Welkom bij

    [Site_Name]

    Ga naar [Site_URL] en probeer de beste open source chat-oplossing die vandaag beschikbaar zijn!

    U kunt inloggen met uw e-mail: [email] en wachtwoord: [password]. U kan nodig zijn om het te veranderen na uw eerste login.", + "Accounts_UserAddedEmail_Default": "

    Welkom bij

    [Site_Name]

    Ga naar [Site_URL] en probeer de beste open source chat-oplossing die vandaag beschikbaar zijn!

    U kunt inloggen met uw e-mail: [email] en wachtwoord: [password]. U kan nodig zijn om het te veranderen na uw eerste login.", "Accounts_UserAddedEmail_Description": "U mag de volgende plaatshouders gebruiken:

    • [name], [fname], [lname] voor de volledige naam van de gebruiker, voornaam of achternaam, respectievelijk.
    • [email] voor e-mail van de gebruiker.
    • [password] voor het wachtwoord van de gebruiker.
    • [Site_Name] en [Site_URL] voor de toepassing Naam en URL respectievelijk.
    ", "Accounts_UserAddedEmailSubject_Default": "Je hebt toegevoegd aan [Site_Name]", "Activate": "Activeren", diff --git a/packages/rocketchat-i18n/i18n/pl.i18n.json b/packages/rocketchat-i18n/i18n/pl.i18n.json index 8577b053459e..0bf33bccf791 100644 --- a/packages/rocketchat-i18n/i18n/pl.i18n.json +++ b/packages/rocketchat-i18n/i18n/pl.i18n.json @@ -38,7 +38,7 @@ "Accounts_EmailVerification": "Weryfikacja adresu email", "Accounts_EmailVerification_Description": "Upewnij się, że masz odpowiednie ustawienia SMTP by korzystać z tej funkcji", "Accounts_Enrollment_Email": "Adres e-mail do rekrutacji", - "Accounts_Enrollment_Email_Default": "

    Witamy w

     [Site_Name]

     Przejdź do [Site_URL] i spróbuj najlepszego rozwiązanie czat open source dostępne już dziś!

    ", + "Accounts_Enrollment_Email_Default": "

    Witamy w

     [Site_Name]

     Przejdź do [Site_URL] i spróbuj najlepszego rozwiązanie czat open source dostępne już dziś!

    ", "Accounts_Enrollment_Email_Description": "Możesz użyć znaczników [name], [fname], [lname] by wstawić odpowiednio pełną nazwę użytkownika, jego imię, nazwisko.
    \nMożesz użyć znacznika [email] by wstawić adres email użytkownika.", "Accounts_Enrollment_Email_Subject_Default": "Witamy w [Site_Name]", "Accounts_Iframe_api_method": "Metoda Api", @@ -113,7 +113,7 @@ "Accounts_ShowFormLogin": "Pokaż formularz logowania", "Accounts_UseDefaultBlockedDomainsList": "Użyj domyślnego Lista zablokowanych domen", "Accounts_UseDNSDomainCheck": "Użyj DNS domeny Check", - "Accounts_UserAddedEmail_Default": "

    Witamy w

     [Site_Name]

     Przejdź do [Site_URL] i spróbuj najlepsze rozwiązanie czat open source dostępne już dziś!

     Możesz zalogować się przy użyciu adresu e-mail: [email] i hasło: [hasło]. Może być konieczne, aby go zmienić po pierwszym logowaniu.

    ", + "Accounts_UserAddedEmail_Default": "

    Witamy w

     [Site_Name]

     Przejdź do [Site_URL] i spróbuj najlepsze rozwiązanie czat open source dostępne już dziś!

     Możesz zalogować się przy użyciu adresu e-mail: [email] i hasło: [hasło]. Może być konieczne, aby go zmienić po pierwszym logowaniu.

    ", "Accounts_UserAddedEmail_Description": "Możesz użyć następujących symboli zastępczych:
    • [name], [fname] [lname] dla pełnej nazwy użytkownika, imienia lub nazwiska, odpowiednio.
    •  [email] przez e-mail użytkownika.
    •  [password] o hasło użytkownika.
    •  [Site_Name] i [Site_URL] dla nazwy aplikacji i zawartości odpowiednio.
    ", "Accounts_UserAddedEmailSubject_Default": "Zostałeś dodany do [Site_Name]", "Activate": "Aktywuj", diff --git a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json index 82369be9693a..d869357e085b 100644 --- a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json +++ b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json @@ -41,7 +41,7 @@ "Accounts_EmailVerification": "Verificação de E-mail", "Accounts_EmailVerification_Description": "Certifique-se de que as configurações de SMTP estão corretas para usar este recurso", "Accounts_Enrollment_Email": "E-mail de inscrição", - "Accounts_Enrollment_Email_Default": "

    Bem-vindo ao

    [Site_Name]

    Vá para [Site_URL] e tente a melhor solução de bate-papo aberta fonte disponível hoje!

    ", + "Accounts_Enrollment_Email_Default": "

    Bem-vindo ao

    [Site_Name]

    Vá para [Site_URL] e tente a melhor solução de bate-papo aberta fonte disponível hoje!

    ", "Accounts_Enrollment_Email_Description": "Você pode usar [name], [fname], [lname] para o nome completo, primeiro nome ou último nome do usuário, respectivamente.
    Você pode usar [email] para o email do usuário.", "Accounts_Enrollment_Email_Subject_Default": "Bem-vindo ao [Site_Name]", "Accounts_Iframe_api_method": "Método Api", @@ -113,7 +113,7 @@ "Accounts_ShowFormLogin": "Mostrar formulário de login", "Accounts_UseDefaultBlockedDomainsList": "Use Lista Padrão de Domínios Bloqueados", "Accounts_UseDNSDomainCheck": "Use verificação de Domínio DNS", - "Accounts_UserAddedEmail_Default": "

    Bem-vindo ao

    [Site_Name]

    Vá para [Site_URL] e tente a melhor solução de bate-papo aberta fonte disponível hoje!

    Você pode fazer o login usando seu e-mail: [email] e password: [password]. Você pode ser obrigado a mudá-lo após o seu primeiro login.", + "Accounts_UserAddedEmail_Default": "

    Bem-vindo ao

    [Site_Name]

    Vá para [Site_URL] e tente a melhor solução de bate-papo aberta fonte disponível hoje!

    Você pode fazer o login usando seu e-mail: [email] e password: [password]. Você pode ser obrigado a mudá-lo após o seu primeiro login.", "Accounts_UserAddedEmail_Description": "Você pode usar os seguintes espaços reservados:

    • [name], [fname], [lname] para o nome do usuário completo, primeiro nome ou sobrenome, respectivamente.
    • [email] para e-mail do usuário.
    • [Senha] para a senha do usuário.
    • [Site_Name] e [Site_URL] para o nome do aplicativo e URL, respectivamente.
    ", "Accounts_UserAddedEmailSubject_Default": "Você foi adicionado para [Site_Name]", "Activate": "Ativar", diff --git a/packages/rocketchat-i18n/i18n/pt.i18n.json b/packages/rocketchat-i18n/i18n/pt.i18n.json index 3e7bdafcccb7..7e5d014c8bd1 100644 --- a/packages/rocketchat-i18n/i18n/pt.i18n.json +++ b/packages/rocketchat-i18n/i18n/pt.i18n.json @@ -40,7 +40,7 @@ "Accounts_EmailVerification": "Verificação de E-mail", "Accounts_EmailVerification_Description": "Certifique-se de que as configurações de SMTP estão corretas para usar este recurso", "Accounts_Enrollment_Email": "E-mail de inscrição", - "Accounts_Enrollment_Email_Default": "

    Bem-vindo ao

    [Site_Name]

    Vá para [Site_URL] e tente a melhor solução de bate-papo aberta fonte disponível hoje!

    ", + "Accounts_Enrollment_Email_Default": "

    Bem-vindo ao

    [Site_Name]

    Vá para [Site_URL] e tente a melhor solução de bate-papo aberta fonte disponível hoje!

    ", "Accounts_Enrollment_Email_Description": "Você pode usar [name], [fname], [lname] para o nome completo, primeiro nome ou último nome do usuário, respectivamente.
    Você pode usar [email] para o email do usuário.", "Accounts_Enrollment_Email_Subject_Default": "Bem-vindo ao [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Esquecer sessão de utilizador ao fechar a janela", @@ -117,7 +117,7 @@ "Accounts_ShowFormLogin": "Mostrar formulário de login", "Accounts_UseDefaultBlockedDomainsList": "Use Lista Padrão de Domínios Bloqueados", "Accounts_UseDNSDomainCheck": "Use verificação de Domínio DNS", - "Accounts_UserAddedEmail_Default": "

    Bem-vindo ao

    [Site_Name]

    Vá para [Site_URL] e tente a melhor solução de bate-papo aberta fonte disponível hoje!

    Você pode fazer o login usando seu e-mail: [email] e password: [password]. Você pode ser obrigado a mudá-lo após o seu primeiro login.", + "Accounts_UserAddedEmail_Default": "

    Bem-vindo ao

    [Site_Name]

    Vá para [Site_URL] e tente a melhor solução de bate-papo aberta fonte disponível hoje!

    Você pode fazer o login usando seu e-mail: [email] e password: [password]. Você pode ser obrigado a mudá-lo após o seu primeiro login.", "Accounts_UserAddedEmail_Description": "Você pode usar os seguintes espaços reservados:

    • [name], [fname], [lname] para o nome do usuário completo, primeiro nome ou sobrenome, respectivamente.
    • [email] para e-mail do usuário.
    • [Senha] para a senha do usuário.
    • [Site_Name] e [Site_URL] para o nome do aplicativo e URL, respectivamente.
    ", "Accounts_UserAddedEmailSubject_Default": "Você foi adicionado para [Site_Name]", "Activate": "Ativar", diff --git a/packages/rocketchat-i18n/i18n/ro.i18n.json b/packages/rocketchat-i18n/i18n/ro.i18n.json index 802046f59565..6ea3bb57a3d8 100644 --- a/packages/rocketchat-i18n/i18n/ro.i18n.json +++ b/packages/rocketchat-i18n/i18n/ro.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "Verificarea email-ului", "Accounts_EmailVerification_Description": "Asigurați-vă că aveți setările SMT corecte pentru a utiliza această funcționalitate", "Accounts_Enrollment_Email": "E-mail de înscriere ", - "Accounts_Enrollment_Email_Default": "

    Bun venit la

    [Site_Name]

    Du-te la [Site_URL] și să încercați cea mai bună soluție de chat open source disponibile astăzi!

    ", + "Accounts_Enrollment_Email_Default": "

    Bun venit la

    [Site_Name]

    Du-te la [Site_URL] și să încercați cea mai bună soluție de chat open source disponibile astăzi!

    ", "Accounts_Enrollment_Email_Description": "Puteți utiliza [name], [fname], [lname] pentru numele complet al utilizatorului, prenumele respectiv numele de familie.
    Puteți folosi [email] pentru e-mailul utilizatorului.", "Accounts_Enrollment_Email_Subject_Default": "Bine ati venit la [Site_Name]", "Accounts_Iframe_api_method": "Metodă API", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "Arată formularul pentru autentificare", "Accounts_UseDefaultBlockedDomainsList": "Implicit utilizare blocate Listă Domenii", "Accounts_UseDNSDomainCheck": "DNS Verificați domeniu utilizați", - "Accounts_UserAddedEmail_Default": "

    Bun venit la

    [Site_Name]

    Du-te la [Site_URL] și să încercați cea mai bună soluție de chat open source disponibile astăzi!

    Te poți loga utilizând un e-mail: [email] și parola: [password]. Vi se poate cere să-l schimbe după prima conectare.", + "Accounts_UserAddedEmail_Default": "

    Bun venit la

    [Site_Name]

    Du-te la [Site_URL] și să încercați cea mai bună soluție de chat open source disponibile astăzi!

    Te poți loga utilizând un e-mail: [email] și parola: [password]. Vi se poate cere să-l schimbe după prima conectare.", "Accounts_UserAddedEmail_Description": "Aveți dreptul să utilizați următoarele Placeholder:

    • [name], [fname], [lname] pentru numele utilizatorului completă, prenumele sau numele de familie, respectiv.
    • [email] pentru e-mail a utilizatorului.
    • [password] pentru parola utilizatorului.
    • [Site_Name] și [Site_URL] pentru Nume aplicație și, respectiv, URL-ul.
    ", "Accounts_UserAddedEmailSubject_Default": "Ați fost adăugat la [Site_Name]", "Activate": "Activează", @@ -1204,4 +1204,4 @@ "Your_mail_was_sent_to_s": "E-mail-ul a fost trimis la %s", "Your_password_is_wrong": "Parola dvs. este greșită!", "Your_push_was_sent_to_s_devices": "Mesajul Push a fost trimis la %s dispozitive" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/ru.i18n.json b/packages/rocketchat-i18n/i18n/ru.i18n.json index a2f433fb727e..4a2838d47511 100644 --- a/packages/rocketchat-i18n/i18n/ru.i18n.json +++ b/packages/rocketchat-i18n/i18n/ru.i18n.json @@ -45,7 +45,7 @@ "Accounts_EmailVerification": "Подтверждение адреса электронной почты", "Accounts_EmailVerification_Description": "Убедитесь, что у вас верные настройки SMTP для использования этой функции", "Accounts_Enrollment_Email": "Электронное сообщение при регистрации", - "Accounts_Enrollment_Email_Default": "

    Добро пожаловать на

    [Site_Name]

    Посетите [Site_URL] и попробуйте лучшее решение с открытым исходным кодом для общения на сегодняшний день!

    ", + "Accounts_Enrollment_Email_Default": "

    Добро пожаловать на

    [Site_Name]

    Посетите [Site_URL] и попробуйте лучшее решение с открытым исходным кодом для общения на сегодняшний день!

    ", "Accounts_Enrollment_Email_Description": "Вы можете использовать следующие подстановки:
    • [name], [fname] и [lname] (полное имя пользователя, только имя, только фамилия).
    • \n
    • [email] - адрес электронной почты пользователя
    • \n
    • [Site_Name] и [Site_URL] - название вашего приложения и его URL
    • \n
    ", "Accounts_Enrollment_Email_Subject_Default": "Добро пожаловать на [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Забыть сессию пользователя при закрытии окна", @@ -130,7 +130,7 @@ "Accounts_ShowFormLogin": "Показать логин на основе формы", "Accounts_UseDefaultBlockedDomainsList": "Использовать список запрещённых доменов по умолчанию", "Accounts_UseDNSDomainCheck": "Использовать DNS проверку доменов", - "Accounts_UserAddedEmail_Default": "

    Добро пожаловать в

    [Site_Name]

    Посетите [Site_URL] и попробуйте лучшее решение для чатов с открытым исходным кодом на сегодняшний день!

    Вы можете войти в систему, используя адрес электронной почты: [email] и пароль: [password]. Возможно, вам потребуется изменить его после первого входа в систему.", + "Accounts_UserAddedEmail_Default": "

    Добро пожаловать в

    [Site_Name]

    Посетите [Site_URL] и попробуйте лучшее решение для чатов с открытым исходным кодом на сегодняшний день!

    Вы можете войти в систему, используя адрес электронной почты: [email] и пароль: [password]. Возможно, вам потребуется изменить его после первого входа в систему.", "Accounts_UserAddedEmail_Description": "Вы можете использовать следующие подстановки:

    • [name], [fname], [lname] (полное имя пользователя, только имя или только фамилию, соответственно).
    • [email] - адрес электронной почты пользователя.
    • [password] - пароля пользователя.
    • [Site_Name] и [Site_URL] - название вашего приложения и его URL.
    ", "Accounts_UserAddedEmailSubject_Default": "Вы были добавлены в [Site_Name]", "Activate": "Активировать", @@ -212,7 +212,7 @@ "API_Enable_Direct_Message_History_EndPoint": "Включить конечную точку истории сообщений", "API_Enable_Direct_Message_History_EndPoint_Description": "Эта настройка включает `/api/v1/im.history.others`. Это разрешает просмотр сообщений из личных диалогов, в которых не участвует вызывающий.", "API_Enable_Shields": "Включить щиты", - "API_Enable_Shields_Description": "Включить щиты, доступные в `/api/v1/shields.svg`", + "API_Enable_Shields_Description": "Включить щиты, доступные в `/api/v1/shield.svg`", "API_GitHub_Enterprise_URL": "URL-адрес сервера", "API_GitHub_Enterprise_URL_Description": "Пример: http://domain.com (без завершающего слеша)", "API_Gitlab_URL": "GitLab URL", diff --git a/packages/rocketchat-i18n/i18n/sq.i18n.json b/packages/rocketchat-i18n/i18n/sq.i18n.json index 98c124cc6579..cfe1972721e4 100644 --- a/packages/rocketchat-i18n/i18n/sq.i18n.json +++ b/packages/rocketchat-i18n/i18n/sq.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "E-mail Verifikimi", "Accounts_EmailVerification_Description": "Sigurohuni që keni cilësimet e duhura SMTP për të përdorur këtë funksion", "Accounts_Enrollment_Email": "Regjistrimi E-mail", - "Accounts_Enrollment_Email_Default": "

    Mire se erdhet ne

    [Site_Name]

    Shko tek [Site_URL] dhe të përpiqet të mirë të burimit të hapur chat zgjidhje në dispozicion sot!

    ", + "Accounts_Enrollment_Email_Default": "

    Mire se erdhet ne

    [Site_Name]

    Shko tek [Site_URL] dhe të përpiqet të mirë të burimit të hapur chat zgjidhje në dispozicion sot!

    ", "Accounts_Enrollment_Email_Description": "Ju mund të përdorni [name], [fname], [lname] për emrin e plotë të përdoruesit, emrin e parë ose emrin e fundit, respektivisht.
    Ju mund të përdorni [email] për email të përdoruesit.", "Accounts_Enrollment_Email_Subject_Default": "Mirë se vini në [Site_Name]", "Accounts_Iframe_api_method": "Metoda api", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "Tregojnë formë të bazuar Login", "Accounts_UseDefaultBlockedDomainsList": "Përdorimi Default Blocked Lista Domains", "Accounts_UseDNSDomainCheck": "Përdorni DNS Domain Kontrollo", - "Accounts_UserAddedEmail_Default": "

    Mire se erdhet ne

    [Site_Name]

    Shko tek [Site_URL] dhe të përpiqet të mirë të burimit të hapur chat zgjidhje në dispozicion sot!

    Ju mund të identifikoheni duke përdorur email: [email] dhe fjalëkalimin: [password]. Ju mund të kërkohet për të ndryshuar atë pas hyrjes tuaj të parë.", + "Accounts_UserAddedEmail_Default": "

    Mire se erdhet ne

    [Site_Name]

    Shko tek [Site_URL] dhe të përpiqet të mirë të burimit të hapur chat zgjidhje në dispozicion sot!

    Ju mund të identifikoheni duke përdorur email: [email] dhe fjalëkalimin: [password]. Ju mund të kërkohet për të ndryshuar atë pas hyrjes tuaj të parë.", "Accounts_UserAddedEmail_Description": "Ju mund të përdorni placeholders e mëposhtme:

    • [name], [fname], [lname] për emrin e përdoruesit të plotë, emrin e parë ose emrin e fundit, respektivisht.
    • [email] për email të përdoruesit.
    • [password] për fjalëkalimin e përdoruesit.
    • [Site_Name] dhe [Site_URL] në emër Aplikimit dhe URL respektivisht.
    ", "Accounts_UserAddedEmailSubject_Default": "Ju janë shtuar në [Site_Name]", "Activate": "Aktivizoj", @@ -1205,4 +1205,4 @@ "Your_mail_was_sent_to_s": "maili juaj u dërgua në %s", "Your_password_is_wrong": "Fjalëkalimi juaj është e gabuar!", "Your_push_was_sent_to_s_devices": "shtytje juaj u dërgua në pajisjet %s" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/sr.i18n.json b/packages/rocketchat-i18n/i18n/sr.i18n.json index 4f3a2b792224..967a110e385d 100644 --- a/packages/rocketchat-i18n/i18n/sr.i18n.json +++ b/packages/rocketchat-i18n/i18n/sr.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "Е-маил Верификација", "Accounts_EmailVerification_Description": "Направи сте сигурни имали исправне поставке СМТП да користе ову функцију", "Accounts_Enrollment_Email": "Упис е-маил", - "Accounts_Enrollment_Email_Default": "

    Добродошли у

    [Site_Name]

    Иди на [Site_URL] и покушати решење најбољи опен соурце цхат доступан данас!

    ", + "Accounts_Enrollment_Email_Default": "

    Добродошли у

    [Site_Name]

    Иди на [Site_URL] и покушати решење најбољи опен соурце цхат доступан данас!

    ", "Accounts_Enrollment_Email_Description": "Можете користити [name], [fname], [lname] за пуно име корисника, имену или презимену, респективно.
    Можете користити [email] е-поште корисника.", "Accounts_Enrollment_Email_Subject_Default": "Велцоме то [Site_Name]", "Accounts_Iframe_api_method": "апи Метод", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "Схов образац заснован Пријава", "Accounts_UseDefaultBlockedDomainsList": "Употреба Уобичајено блокираних домена Листа", "Accounts_UseDNSDomainCheck": "Користи ДНС Домаин Цхецк", - "Accounts_UserAddedEmail_Default": "

    Добродошли у

    [Site_Name]

    Иди на [Site_URL] и покушати решење најбољи опен соурце цхат доступан данас!

    Можете да се пријавите користећи свој емаил: [email] и лозинку: [password]. Можда ће бити потребно да га променимо после прве пријаве.", + "Accounts_UserAddedEmail_Default": "

    Добродошли у

    [Site_Name]

    Иди на [Site_URL] и покушати решење најбољи опен соурце цхат доступан данас!

    Можете да се пријавите користећи свој емаил: [email] и лозинку: [password]. Можда ће бити потребно да га променимо после прве пријаве.", "Accounts_UserAddedEmail_Description": "Можете користити следеће симболе:

    • [name], [fname], [lname] за пуно име корисника, имену или презимену, респективно.
    • [email] е-поште корисника.
    • [password] за лозинку корисника.
    • [Site_Name] и [Site_URL] за апликације Име и УРЛ респективно.
    ", "Accounts_UserAddedEmailSubject_Default": "Додати сте у [Site_Name]", "Activate": "Активирати", @@ -1204,4 +1204,4 @@ "Your_mail_was_sent_to_s": "Ваш маил је послат на% с", "Your_password_is_wrong": "Ваша лозинка није у реду!", "Your_push_was_sent_to_s_devices": "Ваш притиском је послат на% с уређајима" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/sv.i18n.json b/packages/rocketchat-i18n/i18n/sv.i18n.json index 74ed9b744765..4d7dccb0ef01 100644 --- a/packages/rocketchat-i18n/i18n/sv.i18n.json +++ b/packages/rocketchat-i18n/i18n/sv.i18n.json @@ -35,7 +35,7 @@ "Accounts_EmailVerification": "E-postverifiering", "Accounts_EmailVerification_Description": "Se till att du har korrekta SMTP-inställningar för att använda denna funktion", "Accounts_Enrollment_Email": "Skriv i e-post", - "Accounts_Enrollment_Email_Default": "

    Välkommen till

    [Site_Name]

    Gå till [Site_URL] och prova bästa chatt lösning på öppen källkod som finns idag!

    ", + "Accounts_Enrollment_Email_Default": "

    Välkommen till

    [Site_Name]

    Gå till [Site_URL] och prova bästa chatt lösning på öppen källkod som finns idag!

    ", "Accounts_Enrollment_Email_Description": "Du kan använda [namn], [fname], [lname] för användarens fullständiga namn, förnamn eller efternamn, respektive.
    Du kan använda [email] för användarens e-post.", "Accounts_Enrollment_Email_Subject_Default": "Välkommen till [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Glöm bort användarsession när fönstret stängs ner", @@ -107,7 +107,7 @@ "Accounts_ShowFormLogin": "Visa formbaserad inloggning", "Accounts_UseDefaultBlockedDomainsList": "Använd standardlista för blockerade domäner", "Accounts_UseDNSDomainCheck": "Använd DNS Domain Check", - "Accounts_UserAddedEmail_Default": "

    Välkommen till

    [Site_Name]

    Gå till [Site_URL] och prova den bästa öppen källkod chattlösningen som finns idag!

    Du kan logga in med din e-post: [email] och lösenord: [password]. Du kan bli tvungen att ändra den efter första inloggning.", + "Accounts_UserAddedEmail_Default": "

    Välkommen till

    [Site_Name]

    Gå till [Site_URL] och prova den bästa öppen källkod chattlösningen som finns idag!

    Du kan logga in med din e-post: [email] och lösenord: [password]. Du kan bli tvungen att ändra den efter första inloggning.", "Accounts_UserAddedEmail_Description": "Du kan använda följande platsmarkörer:

    • [name], [fname], [lname] för användarens fullständiga namn, förnamn eller efternamn, respektive.
    • [email] för användarens e-post.
    • [password] för användarens lösenord.
    • [Site_Name] och [Site_URL] för Programnamn och webbadress respektive.
    ", "Accounts_UserAddedEmailSubject_Default": "Du har lagts till [Site_Name]", "Activate": "Aktivera", @@ -1376,4 +1376,4 @@ "your_message_optional": "ditt meddelande (valfri)", "Your_password_is_wrong": "Ditt lösenord är fel!", "Your_push_was_sent_to_s_devices": "Din push skickades till %s enheter" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/ta-IN.i18n.json b/packages/rocketchat-i18n/i18n/ta-IN.i18n.json index 7896f6162517..eaebb11a2b95 100644 --- a/packages/rocketchat-i18n/i18n/ta-IN.i18n.json +++ b/packages/rocketchat-i18n/i18n/ta-IN.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "மின்னஞ்சல் சரிபார்ப்பு", "Accounts_EmailVerification_Description": "நிச்சயமாக நீங்கள் இந்த வசதியை பயன்படுத்த சரியான SMTP அமைப்புகளை வைத்து கொள்ளுங்கள்", "Accounts_Enrollment_Email": "பதிவு மின்னஞ்சல்", - "Accounts_Enrollment_Email_Default": "

    வரவேற்கிறோம்

    [Site_Name]

    [Site_URL] போய், இன்றைக்கும் கிடைக்க சிறந்த திறந்த மூல அரட்டை தீர்வு முயற்சி!

    ", + "Accounts_Enrollment_Email_Default": "

    வரவேற்கிறோம்

    [Site_Name]

    [Site_URL] போய், இன்றைக்கும் கிடைக்க சிறந்த திறந்த மூல அரட்டை தீர்வு முயற்சி!

    ", "Accounts_Enrollment_Email_Description": "முறையே பயனர் முழு பெயர், முதல் பெயர் அல்லது கடைசி பெயரை நீங்கள் [name], [fname], பயன்படுத்தலாம் [lname].
    நீங்கள் பயனர் மின்னஞ்சல் ஐந்து [email] பயன்படுத்தலாம்.", "Accounts_Enrollment_Email_Subject_Default": "வரவேற்கிறோம் [Site_Name]", "Accounts_Iframe_api_method": "API முறை", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "காட்டு-சார்ந்த தேதி", "Accounts_UseDefaultBlockedDomainsList": "பயன்பாட்டு இயல்புநிலை தடுக்கப்பட்ட களங்கள் பட்டியல்", "Accounts_UseDNSDomainCheck": "டிஎன்எஸ் இணைய சோதனை பயன்படுத்தவும்", - "Accounts_UserAddedEmail_Default": "

    வரவேற்கிறோம்

    [Site_Name]

    [Site_URL] போய், இன்றைக்கும் கிடைக்க சிறந்த திறந்த மூல அரட்டை தீர்வு முயற்சி!

    [email] மற்றும் கடவுச்சொல்லை: [password] நீங்கள் உங்கள் மின்னஞ்சல் பயன்படுத்தி உள்நுழையலாம் இருக்கலாம். நீங்கள் உங்கள் முதல் உள்நுழைவு பின்னர் அதை மாற்ற தேவைப்படலாம்.", + "Accounts_UserAddedEmail_Default": "

    வரவேற்கிறோம்

    [Site_Name]

    [Site_URL] போய், இன்றைக்கும் கிடைக்க சிறந்த திறந்த மூல அரட்டை தீர்வு முயற்சி!

    [email] மற்றும் கடவுச்சொல்லை: [password] நீங்கள் உங்கள் மின்னஞ்சல் பயன்படுத்தி உள்நுழையலாம் இருக்கலாம். நீங்கள் உங்கள் முதல் உள்நுழைவு பின்னர் அதை மாற்ற தேவைப்படலாம்.", "Accounts_UserAddedEmail_Description": "நீங்கள் கீழ்கண்ட இடப்பயனர்கள் பயன்படுத்தலாம்:

    • [name], [fname], [lname] முறையே பயனர் முழு பெயர், முதல் பெயர் அல்லது கடைசி பெயர், ஐந்து.
    • பயனர் மின்னஞ்சல் ஐந்து [email].
    • பயனரின் கடவுச்சொல்லை [password].
    • [Site_Name] மற்றும் [Site_URL] முறையே விண்ணப்ப பெயர் மற்றும் URL க்கான.
    ", "Accounts_UserAddedEmailSubject_Default": "நீங்கள் சேர்க்கப் பட்டுள்ளது [Site_Name]", "Activate": "செயல்படுத்த", @@ -1204,4 +1204,4 @@ "Your_mail_was_sent_to_s": "உங்கள் மெயில்% கள் அனுப்பப்பட்டது", "Your_password_is_wrong": "உங்கள் கடவுச்சொல் தவறு!", "Your_push_was_sent_to_s_devices": "உங்கள் மிகுதி% கள் சாதனங்கள் அனுப்பப்பட்டது" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/th-TH.i18n.json b/packages/rocketchat-i18n/i18n/th-TH.i18n.json index b9f129f5288f..d5aa81b5427b 100644 --- a/packages/rocketchat-i18n/i18n/th-TH.i18n.json +++ b/packages/rocketchat-i18n/i18n/th-TH.i18n.json @@ -39,7 +39,7 @@ "Accounts_EmailVerification": "การตรวจสอบอีเมล์", "Accounts_EmailVerification_Description": "ต้องตั้งค่า SMTP เพื่อใช้งานฟีเจอร์นี้", "Accounts_Enrollment_Email": "การลงทะเบียนอีเมล์", - "Accounts_Enrollment_Email_Default": "

    ยินดีต้อนรับสูง

    [Site_Name]

    ไปที่ [Site_URL] และทดลองใช้งานโปรแกรมแชทที่ดีที่สุดที่มี ณ ปัจจุบัน

    ", + "Accounts_Enrollment_Email_Default": "

    ยินดีต้อนรับสูง

    [Site_Name]

    ไปที่ [Site_URL] และทดลองใช้งานโปรแกรมแชทที่ดีที่สุดที่มี ณ ปัจจุบัน

    ", "Accounts_Enrollment_Email_Subject_Default": "ยินดีต้อนรับสูง [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "ลืม session เมื่อปิดหน้าต่าง", "Accounts_Iframe_api_method": "Api Method", @@ -54,4 +54,4 @@ "Accounts_OAuth_Custom_Button_Label_Text": "ตัวหนังสือบนปุ่ม", "Accounts_OAuth_Custom_Enable": "เปิดใช้งาน", "Accounts_OAuth_Custom_id": "Id" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/tr.i18n.json b/packages/rocketchat-i18n/i18n/tr.i18n.json index 532f5fc50c24..ea6faebde1b9 100644 --- a/packages/rocketchat-i18n/i18n/tr.i18n.json +++ b/packages/rocketchat-i18n/i18n/tr.i18n.json @@ -45,7 +45,7 @@ "Accounts_EmailVerification": "E-Posta Doğrulama", "Accounts_EmailVerification_Description": "Bu özelliği kullanmak için doğru SMTP ayarlarına sahip olduğunuza emin olun", "Accounts_Enrollment_Email": "Kayıt E-Postası", - "Accounts_Enrollment_Email_Default": "

    [Site_Name]

    sitesine hoşgeldiniz!

    [Site_URL] 'a gidin ve şu an mevcut en iyi açık kaynak sohbet çözümünü deneyin!

    ", + "Accounts_Enrollment_Email_Default": "

    [Site_Name]

    sitesine hoşgeldiniz!

    [Site_URL] 'a gidin ve şu an mevcut en iyi açık kaynak sohbet çözümünü deneyin!

    ", "Accounts_Enrollment_Email_Description": "Kullanıcının tam adı, ad veya soyadı için sırayla, [lname], [name], [fname] kullanabilirsiniz.
    Kullanıcının e-postası için [email] kullanabilirsiniz.", "Accounts_Enrollment_Email_Subject_Default": "[Site_Name] sitesine hoşgeldiniz!", "Accounts_ForgetUserSessionOnWindowClose": "Pencere kapandığında kullanıcı oturumunu unut", @@ -129,7 +129,7 @@ "Accounts_ShowFormLogin": "Form-tabanlı Girişi Göster", "Accounts_UseDefaultBlockedDomainsList": "Standart Engelli Domain Listesini Kullan", "Accounts_UseDNSDomainCheck": "DNS Alan Adı Kontrolü'nü Kullan", - "Accounts_UserAddedEmail_Default": "

    [Site_Name]

    sitesine hoşgeldiniz!

    [Site_URL] 'a gidin ve şu an mevcut en iyi açık kaynak sohbet çözümünü deneyin!

    E-mail [email] ve Şifre: [password] 'nizi kullanarak giriş yapabilirsiniz. İlk girişinizden sonra bunları değiştirmeniz gerekebilir.", + "Accounts_UserAddedEmail_Default": "

    [Site_Name]

    sitesine hoşgeldiniz!

    [Site_URL] 'a gidin ve şu an mevcut en iyi açık kaynak sohbet çözümünü deneyin!

    E-mail [email] ve Şifre: [password] 'nizi kullanarak giriş yapabilirsiniz. İlk girişinizden sonra bunları değiştirmeniz gerekebilir.", "Accounts_UserAddedEmail_Description": "

    • Kullanıcının tam adı, ad veya soyadı için sırasıyla [name], [fname], [lname] kullanabilirsiniz.
    •  Kullanıcının e-posta'sı için [email].
    •  Kullanıcının parolası için [password].
    • Site adı ve Site URL'si için de [Site_Name] ve [Site_URL] kullanabilirsiniz.  
    ", "Accounts_UserAddedEmailSubject_Default": "[Site_Name] Sitesine Eklendiniz", "Activate": "Etkinleştir", diff --git a/packages/rocketchat-i18n/i18n/ug.i18n.json b/packages/rocketchat-i18n/i18n/ug.i18n.json index 4256519d4c4f..876231c3ddef 100644 --- a/packages/rocketchat-i18n/i18n/ug.i18n.json +++ b/packages/rocketchat-i18n/i18n/ug.i18n.json @@ -29,7 +29,7 @@ "Accounts_EmailVerification": "ئاكونت ئىلخەت تەكشۈرۈپ ئىسپاتلاش", "Accounts_EmailVerification_Description": "نىڭ توغرا تەڭشەكلىرىنى جەزىملەشتۈرۈڭSTP،بۇ ئىقتىدارنى ئىشلىتىش ئۈچۈن", "Accounts_Enrollment_Email": "ئىلخەتكە تىزىملىتىش", - "Accounts_Enrollment_Email_Default": "

    كەلگىنىڭىزنى قارشى ئالىمىز

    [Site_Name]

    بۇنىڭغا ئۆتۈش[Site_URL] ، ھەمدە ھازىرقى ئەڭ ئىلغار بولغان ئورۇق كود پاراڭلىشىشنى ھەل قىلىش پىلانىنى سىناپ بېقىڭ !

    ", + "Accounts_Enrollment_Email_Default": "

    كەلگىنىڭىزنى قارشى ئالىمىز

    [Site_Name]

    بۇنىڭغا ئۆتۈش[Site_URL] ، ھەمدە ھازىرقى ئەڭ ئىلغار بولغان ئورۇق كود پاراڭلىشىشنى ھەل قىلىش پىلانىنى سىناپ بېقىڭ !

    ", "Accounts_Enrollment_Email_Description": "سىز تۆۋەندىكى ئورۇن ئىگىلەش بەلگىلەرنى ئىشلىتەلەيسىز :
    • ئىسىم_فامىلىسى [name]、ئىسمى [fname] ياكى فامىلىسى[lname]。
    • ئىلخەت[email]。
    • تور بېكەت ئىسمى[Site_Name] ۋە توربېكەت ئادرېسى [Site_URL]。
    ", "Accounts_Enrollment_Email_Subject_Default": "زىيارەت قىلغىنىڭىزنى قارشى ئالىمىز [Site_Name]", "Accounts_Iframe_api_method": "API ئۇسۇلى", @@ -98,7 +98,7 @@ "Accounts_ShowFormLogin": "جەدۋەلنى ئاساس قىلغاندىكى كىرىش يۈزىنى كۆرسىتىدۇ", "Accounts_UseDefaultBlockedDomainsList": "بەلگىلەنگەن دائىرە نامى توسۇش تىزىملىكىنى ئىشلىتىش", "Accounts_UseDNSDomainCheck": "دائىرە نامىنى دەلىللەشنى ئىشلىتىشDNS", - "Accounts_UserAddedEmail_Default": "

    زىيارەت قىلغىنىڭىزنى قارشى ئالىمىز

    [Site_Name]

    يۆتكىلىپ[Site_URL] ، ھەمدە ھازىرقى ئەڭ ئىلغار بولغان ئوچۇق كود پاراڭلىشىشنى ھەل قىلىش پىلانىنى سىناپ كۆرۈڭ !

    سىز ئۆزىڭىزنىڭ ئىلخەت ئادرېسنى ئىشلەتسىڭىز بولىدۇ:[email] ۋە مەخپىي نومۇر:[password] سىز تۇنجى قېتىم كىرگەندە مەخپىي نومۇرنى ئالماشتۇرۇشقا موھتاج بولىسىز .", + "Accounts_UserAddedEmail_Default": "

    زىيارەت قىلغىنىڭىزنى قارشى ئالىمىز

    [Site_Name]

    يۆتكىلىپ[Site_URL] ، ھەمدە ھازىرقى ئەڭ ئىلغار بولغان ئوچۇق كود پاراڭلىشىشنى ھەل قىلىش پىلانىنى سىناپ كۆرۈڭ !

    سىز ئۆزىڭىزنىڭ ئىلخەت ئادرېسنى ئىشلەتسىڭىز بولىدۇ:[email] ۋە مەخپىي نومۇر:[password] سىز تۇنجى قېتىم كىرگەندە مەخپىي نومۇرنى ئالماشتۇرۇشقا موھتاج بولىسىز .", "Accounts_UserAddedEmail_Description": "سىز تۆۋەنكى ئورۇن ئىگىلەش بەلگىسى ئىشلىتەلەيسىز:

    • [name], [fname], [lname] ئايرىم ھالدا ئابونتنىڭ تولۇق ئىسمى ، ئىسمى ياكى فامىلىسى بولىدۇ.
    • [email] ئابونتنىڭ ئىلخىتى بولىدۇ
    • [password] ئابونتنىڭ مەخپىي نومۇرى بولىدۇ
    • [Site_Name] ۋە [Site_URL] ئايرىم ھالدا توربەت ئىسمى ۋە تور بەر ئادرېسى بولىدۇ
    ", "Accounts_UserAddedEmailSubject_Default": "گە قاچىلاندىڭىز [Site_Name] سىز", "Activate": "قوزغىتىش", @@ -1204,4 +1204,4 @@ "Your_mail_was_sent_to_s": "يوللاندى %s سىزنىڭ ئىلخىتىڭىز ئاللىبۇرۇن", "Your_password_is_wrong": "پارول خاتا !", "Your_push_was_sent_to_s_devices": "ئۈسكىنىگە يوللاندى %s سىزنىڭ ئىتتىرگىنىڭىز" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/uk.i18n.json b/packages/rocketchat-i18n/i18n/uk.i18n.json index 4111ca764fd0..3da72b75a825 100644 --- a/packages/rocketchat-i18n/i18n/uk.i18n.json +++ b/packages/rocketchat-i18n/i18n/uk.i18n.json @@ -33,7 +33,7 @@ "Accounts_EmailVerification": "Підтвердження електронної пошти", "Accounts_EmailVerification_Description": "Переконайтеся, що у вас є правильні налаштування SMTP, щоб використовувати цю функцію", "Accounts_Enrollment_Email": "Зарахування Електронна пошта", - "Accounts_Enrollment_Email_Default": "

    Ласкаво просимо до

    [Site_Name]

    Перейти до [Site_URL] і спробувати краще рішення чат з відкритим вихідним кодом на сьогоднішній день!

    ", + "Accounts_Enrollment_Email_Default": "

    Ласкаво просимо до

    [Site_Name]

    Перейти до [Site_URL] і спробувати краще рішення чат з відкритим вихідним кодом на сьогоднішній день!

    ", "Accounts_Enrollment_Email_Description": "Ви можете використовувати [name], [fname], [lname] повне ім'я користувача, ім'я або прізвище, відповідно.
    Ви можете використовувати [email] для електронної пошти користувача.", "Accounts_Enrollment_Email_Subject_Default": "Ласкаво просимо на [Site_Name]", "Accounts_Iframe_api_method": "метод Апі", @@ -102,7 +102,7 @@ "Accounts_ShowFormLogin": "Показати на основі форм Ввійти", "Accounts_UseDefaultBlockedDomainsList": "Використовувати за замовчуванням Заблоковані Список доменів", "Accounts_UseDNSDomainCheck": "Використання домену DNS Перевірка", - "Accounts_UserAddedEmail_Default": "

    Ласкаво просимо до

    [Site_Name]

    Перейти до [Site_URL] і спробувати краще рішення чат з відкритим вихідним кодом на сьогоднішній день!

    Ви можете увійти в систему, використовуючи адресу електронної пошти: [email] і пароль: [password]. Можливо, вам буде потрібно змінити його після першого входу в систему.", + "Accounts_UserAddedEmail_Default": "

    Ласкаво просимо до

    [Site_Name]

    Перейти до [Site_URL] і спробувати краще рішення чат з відкритим вихідним кодом на сьогоднішній день!

    Ви можете увійти в систему, використовуючи адресу електронної пошти: [email] і пароль: [password]. Можливо, вам буде потрібно змінити його після першого входу в систему.", "Accounts_UserAddedEmail_Description": "Ви можете використовувати наступні наповнювачі:

    • [name], [fname], [lname] повне ім'я користувача, ім'я або прізвище, відповідно.
    • [email] для електронної пошти користувача.
    • [password] для пароля користувача.
    • [Site_Name] і [Site_URL] для імені додатки і URL відповідно.
    ", "Accounts_UserAddedEmailSubject_Default": "Ви були додані [Site_Name]", "Activate": "активувати", @@ -1208,4 +1208,4 @@ "Your_mail_was_sent_to_s": "Ваш лист було відправлено в %s", "Your_password_is_wrong": "Ваш невірний пароль!", "Your_push_was_sent_to_s_devices": "Ваш поштовх був відправлений в %s пристроїв" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/vi-VN.i18n.json b/packages/rocketchat-i18n/i18n/vi-VN.i18n.json index a2770021f817..ecd61bf39cb8 100644 --- a/packages/rocketchat-i18n/i18n/vi-VN.i18n.json +++ b/packages/rocketchat-i18n/i18n/vi-VN.i18n.json @@ -41,7 +41,7 @@ "Accounts_EmailVerification": "Xác thực email", "Accounts_EmailVerification_Description": "Chắc chắn rằng bạn đã cấu hình thông tin SMTP chính xác trước khi sử dụng tính năng này", "Accounts_Enrollment_Email": "Email đăng ký", - "Accounts_Enrollment_Email_Default": "

    Chào mừng đến

    [Site_Name]

    Truy cập [Site_URL] và trải nghiệm nền tảng chat trực tuyến tốt nhất hiện nay!

    ", + "Accounts_Enrollment_Email_Default": "

    Chào mừng đến

    [Site_Name]

    Truy cập [Site_URL] và trải nghiệm nền tảng chat trực tuyến tốt nhất hiện nay!

    ", "Accounts_Enrollment_Email_Description": "Bạn có thể các sử dụng quy tắc sau:
    • [name], [fname], [lname] tương ứng với họ và tên, tên hoặc họ của người dùng.
    • [email] là địa chỉ email của người dùng.
    • [Site_Name] và [Site_URL] là tên và URL của ứng dụng.
    ", "Accounts_Enrollment_Email_Subject_Default": "Chào mừng đến [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "Xóa phiên đăng nhập của người dùng khi đóng cửa sổ", @@ -92,7 +92,7 @@ "Accounts_ShowFormLogin": "Hiện form-based đăng nhập", "Accounts_UseDefaultBlockedDomainsList": "Sử dụng danh sách tên miền bị chặn mặc định", "Accounts_UseDNSDomainCheck": "Sử dụng DNS Domain Check", - "Accounts_UserAddedEmail_Default": "

    Chào mừng đến

    [Site_Name]

    Hãy truy cập [Site_URL] và trải nghiệm giải pháp mã nguồn mở tuyệt vời nhất hiện nay!

    Bạn có thể đăng nhập sử dụng hòm thư: [email] và mật khẩu: [password]. Bạn có thể được yêu cầu thay đổi nó sau lần đăng nhập đầu tiên.", + "Accounts_UserAddedEmail_Default": "

    Chào mừng đến

    [Site_Name]

    Hãy truy cập [Site_URL] và trải nghiệm giải pháp mã nguồn mở tuyệt vời nhất hiện nay!

    Bạn có thể đăng nhập sử dụng hòm thư: [email] và mật khẩu: [password]. Bạn có thể được yêu cầu thay đổi nó sau lần đăng nhập đầu tiên.", "Accounts_UserAddedEmailSubject_Default": "Bạn đã được thêm vào [Site_Name]", "Activate": "Đang hoạt động", "Activity": "Hoạt động", @@ -122,4 +122,4 @@ "Welcome_to_the": "Chào mừng đến", "Why_do_you_want_to_report_question_mark": "Tại sao bạn muốn báo cáo?", "Your_push_was_sent_to_s_devices": "Đã được gửi tới % thiết bị" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/zh-TW.i18n.json b/packages/rocketchat-i18n/i18n/zh-TW.i18n.json index 6486719d0344..78444df1c0e8 100644 --- a/packages/rocketchat-i18n/i18n/zh-TW.i18n.json +++ b/packages/rocketchat-i18n/i18n/zh-TW.i18n.json @@ -33,7 +33,7 @@ "Accounts_EmailVerification": "Email驗證", "Accounts_EmailVerification_Description": "確定 SMTP 設定無誤以使用本功能", "Accounts_Enrollment_Email": "註冊郵箱", - "Accounts_Enrollment_Email_Default": "

    歡迎來到

    [Site_Name]

    轉到[Site_URL],並嘗試了當今最先進的開源聊天解決方案!

    ", + "Accounts_Enrollment_Email_Default": "

    歡迎來到

    [Site_Name]

    轉到[Site_URL],並嘗試了當今最先進的開源聊天解決方案!

    ", "Accounts_Enrollment_Email_Description": "您可以分別使用[name],[fname],[lname]作為用戶的全名,名字或姓氏。
    您可以使用[email]作為用戶的電子郵件。", "Accounts_Enrollment_Email_Subject_Default": "歡迎來到 [Site_Name]", "Accounts_Iframe_api_method": "API 方法", @@ -103,7 +103,7 @@ "Accounts_ShowFormLogin": "顯示基於表單的登入", "Accounts_UseDefaultBlockedDomainsList": "使用預設的黑名單網域列表", "Accounts_UseDNSDomainCheck": "使用DNS域名查詢", - "Accounts_UserAddedEmail_Default": "

    歡迎來到

    [Site_Name]

    轉到[Site_URL],並嘗試了當今最先進的開源聊天解決方案!

    您可以登陸使用您的電子郵件:[email]和密碼:[password]。您可能需要您首次登錄後更改。", + "Accounts_UserAddedEmail_Default": "

    歡迎來到

    [Site_Name]

    轉到[Site_URL],並嘗試了當今最先進的開源聊天解決方案!

    您可以登陸使用您的電子郵件:[email]和密碼:[password]。您可能需要您首次登錄後更改。", "Accounts_UserAddedEmail_Description": "您可以使用以下佔位符:

    • [name],[fname],[lname]為用戶的全名,名字或姓氏,分別。
    • [email]為用戶的電子郵件。
    • [password]為用戶的密碼。
    • [Site_Name]和[Site_URL]分別為應用程序的名稱和網址。
    ", "Accounts_UserAddedEmailSubject_Default": "您已被添加到[Site_Name]", "Activate": "啟用", @@ -1209,4 +1209,4 @@ "Your_mail_was_sent_to_s": "您的郵件已發送到%s", "Your_password_is_wrong": "您的密碼是錯誤的!", "Your_push_was_sent_to_s_devices": "你的推播被送到 %s 裝置" -} \ No newline at end of file +} diff --git a/packages/rocketchat-i18n/i18n/zh.i18n.json b/packages/rocketchat-i18n/i18n/zh.i18n.json index df866b486299..3b68fe80ff9f 100644 --- a/packages/rocketchat-i18n/i18n/zh.i18n.json +++ b/packages/rocketchat-i18n/i18n/zh.i18n.json @@ -38,7 +38,7 @@ "Accounts_EmailVerification": "Email 验证", "Accounts_EmailVerification_Description": "要使用该功能,请确保 SMTP 设置正确", "Accounts_Enrollment_Email": "注册邮件", - "Accounts_Enrollment_Email_Default": "

    欢迎来到

    [Site_Name]

    转到 [Site_URL] 并尝试当今最先进的开源聊天解决方案!

    ", + "Accounts_Enrollment_Email_Default": "

    欢迎来到

    [Site_Name]

    转到 [Site_URL] 并尝试当今最先进的开源聊天解决方案!

    ", "Accounts_Enrollment_Email_Description": "你可以使用以下占位符:
    • 姓名[name]、名字[fname]或者姓氏 [lname]。
    • 邮箱[email]。
    • 网站名称[Site_Name]和网站地址[Site_URL]。
    ", "Accounts_Enrollment_Email_Subject_Default": "欢迎访问 [Site_Name]", "Accounts_ForgetUserSessionOnWindowClose": "关闭窗口后忘记用户会话", @@ -118,7 +118,7 @@ "Accounts_ShowFormLogin": "显示基于表单的登录界面", "Accounts_UseDefaultBlockedDomainsList": "使用默认的屏蔽域名列表", "Accounts_UseDNSDomainCheck": "使用 DNS 域名检查", - "Accounts_UserAddedEmail_Default": "

    欢迎访问

    [Site_Name]

    转到 [Site_URL] 并尝试当今最先进的开源聊天解决方案!

    您可以使用您的电子邮件地址:[email] 和密码:[password] 进行登陆。您可能需要在您首次登录后更改密码。

    ", + "Accounts_UserAddedEmail_Default": "

    欢迎访问

    [Site_Name]

    转到 [Site_URL] 并尝试当今最先进的开源聊天解决方案!

    您可以使用您的电子邮件地址:[email] 和密码:[password] 进行登陆。您可能需要在您首次登录后更改密码。

    ", "Accounts_UserAddedEmail_Description": "您可以使用以下占位符:
    • 全名 [name],名字 [fname],姓氏 [lname]。
    • [email] 为用户的email。
    • [password] 为用户的密码。
    • [Site_Name] 和 [Site_URL] 分别作为网站名称和网站地址。
    ", "Accounts_UserAddedEmailSubject_Default": "您已被添加到 [Site_Name]", "Activate": "激活", @@ -1477,4 +1477,4 @@ "your_message_optional": "你的消息(可选)", "Your_password_is_wrong": "密码错误!", "Your_push_was_sent_to_s_devices": "您的推送已被送到 %s 台设备" -} \ No newline at end of file +} diff --git a/packages/rocketchat-importer/server/classes/ImporterBase.js b/packages/rocketchat-importer/server/classes/ImporterBase.js index 2d4bd5930d30..09ef4063052d 100644 --- a/packages/rocketchat-importer/server/classes/ImporterBase.js +++ b/packages/rocketchat-importer/server/classes/ImporterBase.js @@ -191,7 +191,7 @@ export class Base { RocketChat.models.Settings.updateValueById('Accounts_AllowUsernameChange', true); this.oldSettings.FileUpload_MaxFileSize = RocketChat.models.Settings.findOneById('FileUpload_MaxFileSize').value; - RocketChat.models.Settings.updateValueById('FileUpload_MaxFileSize', 0); + RocketChat.models.Settings.updateValueById('FileUpload_MaxFileSize', -1); break; case ProgressStep.DONE: case ProgressStep.ERROR: diff --git a/packages/rocketchat-internal-hubot/hubot.js b/packages/rocketchat-internal-hubot/hubot.js index e34cf1dfe217..62e4c7987733 100644 --- a/packages/rocketchat-internal-hubot/hubot.js +++ b/packages/rocketchat-internal-hubot/hubot.js @@ -173,8 +173,16 @@ const InternalHubotReceiver = (message) => { if (DEBUG) { console.log(message); } if (message.u.username !== InternalHubot.name) { const room = RocketChat.models.Rooms.findOneById(message.rid); + const enabledForC = RocketChat.settings.get('InternalHubot_EnableForChannels'); + const enabledForD = RocketChat.settings.get('InternalHubot_EnableForDirectMessages'); + const enabledForP = RocketChat.settings.get('InternalHubot_EnableForPrivateGroups'); + const subscribedToP = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(room._id, InternalHubot.user._id); - if (room.t === 'c') { + if ( + (room.t === 'c' && enabledForC) + || (room.t === 'd' && enabledForD) + || (room.t === 'p' && enabledForP && subscribedToP) + ) { const InternalHubotUser = new Hubot.User(message.u.username, {room: message.rid}); const InternalHubotTextMessage = new Hubot.TextMessage(InternalHubotUser, message.msg, message._id); InternalHubot.adapter.receive(InternalHubotTextMessage); diff --git a/packages/rocketchat-internal-hubot/settings.js b/packages/rocketchat-internal-hubot/settings.js index 31c6f07c9719..73f0f29035d3 100644 --- a/packages/rocketchat-internal-hubot/settings.js +++ b/packages/rocketchat-internal-hubot/settings.js @@ -3,6 +3,9 @@ RocketChat.settings.addGroup('InternalHubot', function() { this.add('InternalHubot_Username', 'rocket.cat', { type: 'string', i18nLabel: 'Username', i18nDescription: 'InternalHubot_Username_Description', 'public': true }); this.add('InternalHubot_ScriptsToLoad', '', { type: 'string'}); this.add('InternalHubot_PathToLoadCustomScripts', '', { type: 'string' }); + this.add('InternalHubot_EnableForChannels', true, { type: 'boolean' }); + this.add('InternalHubot_EnableForDirectMessages', false, { type: 'boolean' }); + this.add('InternalHubot_EnableForPrivateGroups', false, { type: 'boolean' }); // this.add('InternalHubot_reload', 'reloadInternalHubot', { // type: 'action', // actionText: 'reload' diff --git a/packages/rocketchat-katex/package-lock.json b/packages/rocketchat-katex/package-lock.json index d231c49fee9b..6ea79500d6c9 100644 --- a/packages/rocketchat-katex/package-lock.json +++ b/packages/rocketchat-katex/package-lock.json @@ -5,8 +5,7 @@ "requires": true, "dependencies": { "katex": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.7.1.tgz", + "version": "https://registry.npmjs.org/katex/-/katex-0.7.1.tgz", "integrity": "sha1-BrtSmO+tBeHnIoA1uo4VkfMGG48=", "requires": { "match-at": "0.1.1" diff --git a/packages/rocketchat-lib/client/lib/ChannelActions.js b/packages/rocketchat-lib/client/lib/ChannelActions.js new file mode 100644 index 000000000000..6f9a6d2e7f66 --- /dev/null +++ b/packages/rocketchat-lib/client/lib/ChannelActions.js @@ -0,0 +1,93 @@ +import { call, UiTextContext } from 'meteor/rocketchat:lib'; + +export function hide(type, rid, name) { + const warnText = RocketChat.roomTypes.roomTypes[type].getUiText(UiTextContext.HIDE_WARNING); + + modal.open({ + title: t('Are_you_sure'), + text: warnText ? t(warnText, name) : '', + type: 'warning', + showCancelButton: true, + confirmButtonColor: '#DD6B55', + confirmButtonText: t('Yes_hide_it'), + cancelButtonText: t('Cancel'), + closeOnConfirm: true, + html: false + }, function() { + if (['channel', 'group', 'direct'].includes(FlowRouter.getRouteName()) && (Session.get('openedRoom') === rid)) { + FlowRouter.go('home'); + } + + Meteor.call('hideRoom', rid, function(err) { + if (err) { + handleError(err); + } else if (rid === Session.get('openedRoom')) { + Session.delete('openedRoom'); + } + }); + }); + + return false; +} + +export function leave(type, rid, name) { + const warnText = RocketChat.roomTypes.roomTypes[type].getUiText(UiTextContext.LEAVE_WARNING); + + modal.open({ + title: t('Are_you_sure'), + text: warnText ? t(warnText, name) : '', + type: 'warning', + showCancelButton: true, + confirmButtonColor: '#DD6B55', + confirmButtonText: t('Yes_leave_it'), + cancelButtonText: t('Cancel'), + closeOnConfirm: false, + html: false + }, function(isConfirm) { + if (isConfirm) { + Meteor.call('leaveRoom', rid, function(err) { + if (err) { + modal.open({ + title: t('Warning'), + text: handleError(err, false), + type: 'warning', + html: false + }); + } else { + modal.close(); + if (['channel', 'group', 'direct'].includes(FlowRouter.getRouteName()) && (Session.get('openedRoom') === rid)) { + FlowRouter.go('home'); + } + + RoomManager.close(rid); + } + }); + } + }); + + return false; +} + +export function erase(rid) { + modal.open({ + title: t('Are_you_sure'), + text: t('Delete_Room_Warning'), + type: 'warning', + showCancelButton: true, + confirmButtonColor: '#DD6B55', + confirmButtonText: t('Yes_delete_it'), + cancelButtonText: t('Cancel'), + closeOnConfirm: false, + html: false + }, () => { + call('eraseRoom', rid).then(() => { + modal.open({ + title: t('Deleted'), + text: t('Room_has_been_deleted'), + type: 'success', + timer: 2000, + showConfirmButton: false + }); + }); + }); +} diff --git a/packages/rocketchat-lib/client/lib/RestApiClient.js b/packages/rocketchat-lib/client/lib/RestApiClient.js index 1f1b2492cf4d..cadcbaed02e7 100644 --- a/packages/rocketchat-lib/client/lib/RestApiClient.js +++ b/packages/rocketchat-lib/client/lib/RestApiClient.js @@ -1,15 +1,33 @@ RocketChat.API = { + delete(endpoint, params) { + return RocketChat.API._jqueryCall('DELETE', endpoint, params); + }, + get(endpoint, params) { return RocketChat.API._jqueryCall('GET', endpoint, params); }, post(endpoint, params, body) { + if (!body) { + body = params; + params = {}; + } + return RocketChat.API._jqueryCall('POST', endpoint, params, body); }, - _jqueryCall(method, endpoint, params, body) { + upload(endpoint, params, formData) { + if (!formData) { + formData = params; + params = {}; + } + + return RocketChat.API._jqueryFormDataCall(endpoint, params, formData); + }, + + _generateQueryFromParams(params) { let query = ''; - if (params) { + if (params && typeof params === 'object') { Object.keys(params).forEach((key) => { query += query === '' ? '?' : '&'; @@ -17,10 +35,16 @@ RocketChat.API = { }); } + return query; + }, + + _jqueryCall(method, endpoint, params, body) { + const query = RocketChat.API._generateQueryFromParams(params); + return new Promise(function _rlRestApiGet(resolve, reject) { jQuery.ajax({ method, - url: `${ Meteor.absoluteUrl() }api/${ endpoint }${ query }`, + url: `${ window.location.origin }/api/${ endpoint }${ query }`, headers: { 'Content-Type': 'application/json', 'X-User-Id': localStorage['Meteor.userId'], @@ -37,13 +61,49 @@ RocketChat.API = { }); }, + _jqueryFormDataCall(endpoint, params, formData) { + const query = RocketChat.API._generateQueryFromParams(params); + + if (!(formData instanceof FormData)) { + throw new Error('The formData parameter MUST be an instance of the FormData class.'); + } + + return new Promise(function _jqueryFormDataPromise(resolve, reject) { + jQuery.ajax({ + url: `${ Meteor.absoluteUrl() }api/${ endpoint }${ query }`, + headers: { + 'X-User-Id': localStorage['Meteor.userId'], + 'X-Auth-Token': localStorage['Meteor.loginToken'] + }, + data: formData, + processData: false, + contentType: false, + type: 'POST', + success: function _jqueryFormDataSuccess(result) { + resolve(result); + }, + error: function _jqueryFormDataError(xhr, status, errorThrown) { + reject(new Error(errorThrown)); + } + }); + }); + }, + v1: { + delete(endpoint, params) { + return RocketChat.API.delete(`v1/${ endpoint }`, params); + }, + get(endpoint, params) { return RocketChat.API.get(`v1/${ endpoint }`, params); }, post(endpoint, params, body) { return RocketChat.API.post(`v1/${ endpoint }`, params, body); + }, + + upload(endpoint, params, formData) { + return RocketChat.API.upload(`v1/${ endpoint }`, params, formData); } } }; diff --git a/packages/rocketchat-lib/client/lib/callMethod.js b/packages/rocketchat-lib/client/lib/callMethod.js new file mode 100644 index 000000000000..cd92e9a83f3a --- /dev/null +++ b/packages/rocketchat-lib/client/lib/callMethod.js @@ -0,0 +1,17 @@ +/** + * Wraps a Meteor method into a Promise. + * This is particularly useful for creating information dialogs after execution of a Meteor method + * @param {The Meteor method to be calls} method + * @param {the method's parameters} params + */ +export const call = (method, ...params) => { + return new Promise((resolve, reject) => { + Meteor.call(method, ...params, (err, result) => { + if (err) { + handleError(err); + return reject(err); + } + return resolve(result); + }); + }); +}; diff --git a/packages/rocketchat-lib/client/lib/index.js b/packages/rocketchat-lib/client/lib/index.js index 908b583d61af..11697b503cbc 100644 --- a/packages/rocketchat-lib/client/lib/index.js +++ b/packages/rocketchat-lib/client/lib/index.js @@ -8,9 +8,14 @@ import { RocketChatTabBar } from './RocketChatTabBar'; import { RoomSettingsEnum, RoomTypeConfig, RoomTypeRouteConfig, UiTextContext } from '../../lib/RoomTypeConfig'; - +import { hide, leave, erase } from './ChannelActions'; +import { call } from './callMethod'; export { + call, + erase, + hide, + leave, RocketChatTabBar, RoomSettingsEnum, RoomTypeConfig, diff --git a/packages/rocketchat-lib/client/lib/startup/commands.js b/packages/rocketchat-lib/client/lib/startup/commands.js new file mode 100644 index 000000000000..91456a9eed65 --- /dev/null +++ b/packages/rocketchat-lib/client/lib/startup/commands.js @@ -0,0 +1,17 @@ +//Track logins and when they login, get the commands +(() => { + let oldUserId = null; + + Meteor.autorun(() => { + const newUserId = Meteor.userId(); + if (oldUserId === null && newUserId) { + RocketChat.API.v1.get('commands.list').then(function _loadedCommands(result) { + result.commands.forEach((command) => { + RocketChat.slashCommands.commands[command.command] = command; + }); + }); + } + + oldUserId = Meteor.userId(); + }); +})(); diff --git a/packages/rocketchat-lib/client/methods/sendMessage.js b/packages/rocketchat-lib/client/methods/sendMessage.js index 5138c696f9cd..6fa83bfbb2c2 100644 --- a/packages/rocketchat-lib/client/methods/sendMessage.js +++ b/packages/rocketchat-lib/client/methods/sendMessage.js @@ -15,6 +15,9 @@ Meteor.methods({ message.u.name = user.name; } message.temp = true; + if (RocketChat.settings.get('Message_Read_Receipt_Enabled')) { + message.unread = true; + } message = RocketChat.callbacks.run('beforeSaveMessage', message); RocketChat.promises.run('onClientMessageReceived', message).then(function(message) { ChatMessage.insert(message); diff --git a/packages/rocketchat-lib/lib/placeholders.js b/packages/rocketchat-lib/lib/placeholders.js index 8c3907b567fa..45f996e86173 100644 --- a/packages/rocketchat-lib/lib/placeholders.js +++ b/packages/rocketchat-lib/lib/placeholders.js @@ -16,6 +16,7 @@ RocketChat.placeholders.replace = function(str, data) { str = str.replace(/\[lname\]/g, s.strRightBack(data.name, ' ') || ''); str = str.replace(/\[email\]/g, data.email || ''); str = str.replace(/\[password\]/g, data.password || ''); + str = str.replace(/\[reason\]/g, data.reason || ''); str = str.replace(/\[User\]/g, data.user || ''); str = str.replace(/\[Room\]/g, data.room || ''); diff --git a/packages/rocketchat-lib/lib/roomTypes/channels.js b/packages/rocketchat-lib/lib/roomTypes/channels.js deleted file mode 100644 index 4d0fbcc1a837..000000000000 --- a/packages/rocketchat-lib/lib/roomTypes/channels.js +++ /dev/null @@ -1,18 +0,0 @@ -import { RoomTypeConfig } from '../RoomTypeConfig'; - -export class ChannelsRoomType extends RoomTypeConfig { - constructor() { - super({ - identifier: 'channels', - order: 30, - label: 'Channels' - }); - } - - condition() { - const user = Meteor.user(); - const roomsListExhibitionMode = RocketChat.getUserPreference(user, 'roomsListExhibitionMode'); - const mergeChannels = RocketChat.getUserPreference(user, 'mergeChannels'); - return ['unread', 'category'].includes(roomsListExhibitionMode) && mergeChannels; - } -} diff --git a/packages/rocketchat-lib/lib/roomTypes/conversation.js b/packages/rocketchat-lib/lib/roomTypes/conversation.js index 009dbf59ccbf..6f7caa07bdc5 100644 --- a/packages/rocketchat-lib/lib/roomTypes/conversation.js +++ b/packages/rocketchat-lib/lib/roomTypes/conversation.js @@ -3,7 +3,7 @@ import { RoomTypeConfig } from '../RoomTypeConfig'; export class ConversationRoomType extends RoomTypeConfig { constructor() { super({ - identifier: 'activity', + identifier: 'merged', order: 30, label: 'Conversations' }); @@ -11,6 +11,6 @@ export class ConversationRoomType extends RoomTypeConfig { condition() { const user = Meteor.user(); - return RocketChat.getUserPreference(user, 'roomsListExhibitionMode') === 'activity'; + return RocketChat.getUserPreference(user, 'mergeChannels'); } } diff --git a/packages/rocketchat-lib/lib/roomTypes/direct.js b/packages/rocketchat-lib/lib/roomTypes/direct.js index 3a8c6c8455f4..44078e0e9190 100644 --- a/packages/rocketchat-lib/lib/roomTypes/direct.js +++ b/packages/rocketchat-lib/lib/roomTypes/direct.js @@ -62,8 +62,8 @@ export class DirectMessageRoomType extends RoomTypeConfig { condition() { const user = Meteor.user(); - const roomsListExhibitionMode = RocketChat.getUserPreference(user, 'roomsListExhibitionMode'); - return !roomsListExhibitionMode || ['unread', 'category'].includes(roomsListExhibitionMode) && RocketChat.authz.hasAtLeastOnePermission(['view-d-room', 'view-joined-room']); + const mergeChannels = RocketChat.getUserPreference(user, 'mergeChannels'); + return !mergeChannels && RocketChat.authz.hasAtLeastOnePermission(['view-d-room', 'view-joined-room']); } getUserStatus(roomId) { diff --git a/packages/rocketchat-lib/lib/roomTypes/favorite.js b/packages/rocketchat-lib/lib/roomTypes/favorite.js index 55e061547d75..2b927c0767ad 100644 --- a/packages/rocketchat-lib/lib/roomTypes/favorite.js +++ b/packages/rocketchat-lib/lib/roomTypes/favorite.js @@ -10,4 +10,8 @@ export class FavoriteRoomType extends RoomTypeConfig { label: 'Favorites' }); } + condition() { + const user = Meteor.user(); + return RocketChat.settings.get('Favorite_Rooms') && RocketChat.getUserPreference(user, 'sidebarShowFavorites'); + } } diff --git a/packages/rocketchat-lib/lib/roomTypes/index.js b/packages/rocketchat-lib/lib/roomTypes/index.js index 739421c89b38..4c0fd94d732d 100644 --- a/packages/rocketchat-lib/lib/roomTypes/index.js +++ b/packages/rocketchat-lib/lib/roomTypes/index.js @@ -1,4 +1,3 @@ -import { ChannelsRoomType } from './channels'; import { ConversationRoomType } from './conversation'; import { DirectMessageRoomType } from './direct'; import { FavoriteRoomType } from './favorite'; @@ -7,7 +6,6 @@ import { PublicRoomType } from './public'; import { UnreadRoomType } from './unread'; export { - ChannelsRoomType, ConversationRoomType, DirectMessageRoomType, FavoriteRoomType, diff --git a/packages/rocketchat-lib/lib/roomTypes/private.js b/packages/rocketchat-lib/lib/roomTypes/private.js index c0a3fdbfe2f4..5522d95a8110 100644 --- a/packages/rocketchat-lib/lib/roomTypes/private.js +++ b/packages/rocketchat-lib/lib/roomTypes/private.js @@ -44,9 +44,8 @@ export class PrivateRoomType extends RoomTypeConfig { condition() { const user = Meteor.user(); - const roomsListExhibitionMode = RocketChat.getUserPreference(user, 'roomsListExhibitionMode'); const mergeChannels = RocketChat.getUserPreference(user, 'mergeChannels'); - return !roomsListExhibitionMode || ['unread', 'category'].includes(roomsListExhibitionMode) && !mergeChannels && RocketChat.authz.hasAllPermission('view-p-room'); + return !mergeChannels && RocketChat.authz.hasAllPermission('view-p-room'); } isGroupChat() { diff --git a/packages/rocketchat-lib/lib/roomTypes/public.js b/packages/rocketchat-lib/lib/roomTypes/public.js index 442423364c9d..fb9c9e277ad3 100644 --- a/packages/rocketchat-lib/lib/roomTypes/public.js +++ b/packages/rocketchat-lib/lib/roomTypes/public.js @@ -42,9 +42,9 @@ export class PublicRoomType extends RoomTypeConfig { condition() { const user = Meteor.user(); - const roomsListExhibitionMode = RocketChat.getUserPreference(user, 'roomsListExhibitionMode'); + // const roomsListExhibitionMode = RocketChat.getUserPreference(user, 'roomsListExhibitionMode'); const mergeChannels = RocketChat.getUserPreference(user, 'mergeChannels'); - return !roomsListExhibitionMode || ['unread', 'category'].includes(roomsListExhibitionMode) && !mergeChannels && (RocketChat.authz.hasAtLeastOnePermission(['view-c-room', 'view-joined-room']) || RocketChat.settings.get('Accounts_AllowAnonymousRead') === true); + return !mergeChannels && (RocketChat.authz.hasAtLeastOnePermission(['view-c-room', 'view-joined-room']) || RocketChat.settings.get('Accounts_AllowAnonymousRead') === true); } showJoinLink(roomId) { diff --git a/packages/rocketchat-lib/lib/roomTypes/unread.js b/packages/rocketchat-lib/lib/roomTypes/unread.js index 395036c65088..0e15cf0aa6fa 100644 --- a/packages/rocketchat-lib/lib/roomTypes/unread.js +++ b/packages/rocketchat-lib/lib/roomTypes/unread.js @@ -13,6 +13,6 @@ export class UnreadRoomType extends RoomTypeConfig { condition() { const user = Meteor.user(); - return RocketChat.getUserPreference(user, 'roomsListExhibitionMode') === 'unread'; + return RocketChat.getUserPreference(user, 'sidebarShowUnread'); } } diff --git a/packages/rocketchat-lib/lib/slashCommand.js b/packages/rocketchat-lib/lib/slashCommand.js index 0a07065a15dc..69bb56b56b48 100644 --- a/packages/rocketchat-lib/lib/slashCommand.js +++ b/packages/rocketchat-lib/lib/slashCommand.js @@ -8,6 +8,7 @@ RocketChat.slashCommands.add = function(command, callback, options = {}, result) callback, params: options.params, description: options.description, + permission: options.permission, clientOnly: options.clientOnly || false, result }; @@ -26,6 +27,7 @@ Meteor.methods({ method: 'slashCommand' }); } + return RocketChat.slashCommands.run(command.cmd, command.params, command.msg); } }); diff --git a/packages/rocketchat-lib/package.js b/packages/rocketchat-lib/package.js index 9bf1ad59f8d4..6cdea174f1f7 100644 --- a/packages/rocketchat-lib/package.js +++ b/packages/rocketchat-lib/package.js @@ -22,6 +22,7 @@ Package.onUse(function(api) { api.use('matb33:collection-hooks'); api.use('service-configuration'); api.use('check'); + api.use('rocketchat:accounts'); api.use('modules'); api.use('rocketchat:i18n'); api.use('rocketchat:streamer'); @@ -42,7 +43,6 @@ Package.onUse(function(api) { // ROOM TYPES api.addFiles('lib/RoomTypeConfig.js'); api.addFiles([ - 'lib/roomTypes/channels.js', 'lib/roomTypes/conversation.js', 'lib/roomTypes/direct.js', 'lib/roomTypes/favorite.js', @@ -196,6 +196,7 @@ Package.onUse(function(api) { // CLIENT LIB api.addFiles('client/Notifications.js', 'client'); api.addFiles('client/OAuthProxy.js', 'client'); + api.addFiles('client/lib/RestApiClient.js', 'client'); api.addFiles('client/lib/TabBar.js', 'client'); api.addFiles('client/lib/RocketChatTabBar.js', 'client'); api.addFiles('client/lib/RestApiClient.js', 'client'); @@ -207,6 +208,9 @@ Package.onUse(function(api) { api.addFiles('client/lib/userRoles.js', 'client'); api.addFiles('client/lib/Layout.js', 'client'); + // CLIENT LIB STARTUP + api.addFiles('client/lib/startup/commands.js', 'client'); + // CLIENT METHODS api.addFiles('client/methods/sendMessage.js', 'client'); api.addFiles('client/AdminBox.js', 'client'); diff --git a/packages/rocketchat-lib/rocketchat.info b/packages/rocketchat-lib/rocketchat.info index 0599a6e3b200..f0e2ac51dabe 100644 --- a/packages/rocketchat-lib/rocketchat.info +++ b/packages/rocketchat-lib/rocketchat.info @@ -1,3 +1,3 @@ { - "version": "0.61.2" + "version": "0.62.0" } diff --git a/packages/rocketchat-lib/server/functions/getFullUserData.js b/packages/rocketchat-lib/server/functions/getFullUserData.js index 7bc9c9893fbf..056c4643d90f 100644 --- a/packages/rocketchat-lib/server/functions/getFullUserData.js +++ b/packages/rocketchat-lib/server/functions/getFullUserData.js @@ -9,7 +9,8 @@ RocketChat.getFullUserData = function({userId, filter, limit}) { status: 1, utcOffset: 1, type: 1, - active: 1 + active: 1, + reason: 1 }; if (RocketChat.authz.hasPermission(userId, 'view-full-other-user-info')) { diff --git a/packages/rocketchat-lib/server/functions/saveCustomFieldsWithoutValidation.js b/packages/rocketchat-lib/server/functions/saveCustomFieldsWithoutValidation.js index d0f6ec896d1d..4b76441089d1 100644 --- a/packages/rocketchat-lib/server/functions/saveCustomFieldsWithoutValidation.js +++ b/packages/rocketchat-lib/server/functions/saveCustomFieldsWithoutValidation.js @@ -13,6 +13,9 @@ RocketChat.saveCustomFieldsWithoutValidation = function(userId, formData) { Object.keys(customFieldsMeta).forEach(key => customFields[key] = formData[key]); RocketChat.models.Users.setCustomFields(userId, customFields); + // Update customFields of all Direct Messages' Rooms for userId + RocketChat.models.Subscriptions.setCustomFieldsDirectMessagesByUserId(userId, customFields); + Object.keys(customFields).forEach((fieldName) => { if (!customFieldsMeta[fieldName].modifyRecordField) { return; diff --git a/packages/rocketchat-lib/server/functions/saveUser.js b/packages/rocketchat-lib/server/functions/saveUser.js index ed727b385fa5..9f45ed155c33 100644 --- a/packages/rocketchat-lib/server/functions/saveUser.js +++ b/packages/rocketchat-lib/server/functions/saveUser.js @@ -72,7 +72,8 @@ RocketChat.saveUser = function(userId, userData) { const updateUser = { $set: { name: userData.name, - roles: userData.roles || ['user'] + roles: userData.roles || ['user'], + settings: userData.settings } }; @@ -163,6 +164,10 @@ RocketChat.saveUser = function(userId, userData) { updateUser.$set.roles = userData.roles; } + if (userData.settings) { + updateUser.$set.settings = { preferences: userData.settings.preferences }; + } + if (typeof userData.requirePasswordChange !== 'undefined') { updateUser.$set.requirePasswordChange = userData.requirePasswordChange; } diff --git a/packages/rocketchat-lib/server/functions/sendMessage.js b/packages/rocketchat-lib/server/functions/sendMessage.js index 46b44edd90c1..197ca28729fd 100644 --- a/packages/rocketchat-lib/server/functions/sendMessage.js +++ b/packages/rocketchat-lib/server/functions/sendMessage.js @@ -31,6 +31,11 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) { }); } } + + if (RocketChat.settings.get('Message_Read_Receipt_Enabled')) { + message.unread = true; + } + message = RocketChat.callbacks.run('beforeSaveMessage', message); if (message) { // Avoid saving sandstormSessionId to the database diff --git a/packages/rocketchat-lib/server/lib/metrics.js b/packages/rocketchat-lib/server/lib/metrics.js index 136263832f16..43cf6590f7b2 100644 --- a/packages/rocketchat-lib/server/lib/metrics.js +++ b/packages/rocketchat-lib/server/lib/metrics.js @@ -6,4 +6,4 @@ RocketChat.metrics = {}; // one sample metrics only - a counter -RocketChat.metrics.messagesSent = new client.Counter('messages_sent', 'cumulated number of messages sent'); +RocketChat.metrics.messagesSent = new client.Counter({'name': 'message_sent', 'help': 'cumulated number of messages sent'}); diff --git a/packages/rocketchat-lib/server/models/Messages.js b/packages/rocketchat-lib/server/models/Messages.js index 90f8bf068765..a52fcdaa1843 100644 --- a/packages/rocketchat-lib/server/models/Messages.js +++ b/packages/rocketchat-lib/server/models/Messages.js @@ -519,6 +519,10 @@ RocketChat.models.Messages = new class extends RocketChat.models._Base { groupable: false }; + if (RocketChat.settings.get('Message_Read_Receipt_Enabled')) { + record.unread = true; + } + _.extend(record, extraData); record._id = this.insertOrUpsert(record); @@ -622,4 +626,45 @@ RocketChat.models.Messages = new class extends RocketChat.models._Base { getMessageByFileId(fileID) { return this.findOne({ 'file._id': fileID }); } + + setAsRead(rid, until) { + return this.update({ + rid, + unread: true, + ts: { $lt: until } + }, { + $unset: { + unread: 1 + } + }, { + multi: true + }); + } + + setAsReadById(_id) { + return this.update({ + _id + }, { + $unset: { + unread: 1 + } + }); + } + + findUnreadMessagesByRoomAndDate(rid, after) { + const query = { + unread: true, + rid + }; + + if (after) { + query.ts = { $gt: after }; + } + + return this.find(query, { + fields: { + _id: 1 + } + }); + } }; diff --git a/packages/rocketchat-lib/server/models/Rooms.js b/packages/rocketchat-lib/server/models/Rooms.js index 1d7273febd1c..cc7806c8e152 100644 --- a/packages/rocketchat-lib/server/models/Rooms.js +++ b/packages/rocketchat-lib/server/models/Rooms.js @@ -127,8 +127,8 @@ class ModelRooms extends RocketChat.models._Base { return item._room; } console.log('Empty Room for Subscription', item); - return {}; }); + data = data.filter(item => item); return this.arrayToCursor(this.processQueryOptionsOnResult(data, options)); } @@ -152,9 +152,8 @@ class ModelRooms extends RocketChat.models._Base { return item._room; } console.log('Empty Room for Subscription', item); - return {}; }); - data = data.filter(item => item._updatedAt > _updatedAt); + data = data.filter(item => item && item._updatedAt > _updatedAt); return this.arrayToCursor(this.processQueryOptionsOnResult(data, options)); } @@ -247,6 +246,16 @@ class ModelRooms extends RocketChat.models._Base { return this.find(query, options); } + findByNameAndType(name, type, options) { + const query = { + t: type, + name + }; + + // do not use cache + return this._db.find(query, options); + } + findByNameAndTypeNotDefault(name, type, options) { const query = { t: type, diff --git a/packages/rocketchat-lib/server/models/Subscriptions.js b/packages/rocketchat-lib/server/models/Subscriptions.js index 4c59e26add7f..726a0b4299c2 100644 --- a/packages/rocketchat-lib/server/models/Subscriptions.js +++ b/packages/rocketchat-lib/server/models/Subscriptions.js @@ -182,6 +182,19 @@ class ModelSubscriptions extends RocketChat.models._Base { return this.find(query, { fields: { unread: 1 } }); } + getMinimumLastSeenByRoomId(rid) { + return this.db.findOne({ + rid + }, { + sort: { + ls: 1 + }, + fields: { + ls: 1 + } + }); + } + // UPDATE archiveByRoomId(roomId) { const query = @@ -281,6 +294,22 @@ class ModelSubscriptions extends RocketChat.models._Base { return this.update(query, update); } + setCustomFieldsDirectMessagesByUserId(userId, fields) { + const values = {}; + Object.keys(fields).forEach(key => { + values[`customFields.${ key }`] = fields[key]; + }); + + const query = { + 'u._id': userId, + 't': 'd' + }; + const update = { $set: values }; + const options = { 'multi': true }; + + return this.update(query, update, options); + } + setFavoriteByRoomIdAndUserId(roomId, userId, favorite) { if (favorite == null) { favorite = true; } const query = { @@ -557,6 +586,7 @@ class ModelSubscriptions extends RocketChat.models._Base { rid: room._id, name: room.name, fname: room.fname, + customFields: room.customFields, t: room.t, u: { _id: user._id, diff --git a/packages/rocketchat-lib/server/models/Users.js b/packages/rocketchat-lib/server/models/Users.js index 5381c8f7ce4d..41ed1fe2926a 100644 --- a/packages/rocketchat-lib/server/models/Users.js +++ b/packages/rocketchat-lib/server/models/Users.js @@ -436,10 +436,15 @@ class ModelUsers extends RocketChat.models._Base { } setPreferences(_id, preferences) { + const settings = Object.assign( + {}, + ...Object.keys(preferences).map(key => { + return {[`settings.preferences.${ key }`]: preferences[key]}; + }) + ); + const update = { - $set: { - 'settings.preferences': preferences - } + $set: settings }; return this.update(_id, update); @@ -507,6 +512,46 @@ class ModelUsers extends RocketChat.models._Base { return this.update({ _id }, update); } + setReason(_id, reason) { + const update = { + $set: { + reason + } + }; + + return this.update(_id, update); + } + + unsetReason(_id) { + const update = { + $unset: { + reason: true + } + }; + + return this.update(_id, update); + } + + addBannerById(_id, banner) { + const update = { + $set: { + [`banners.${ banner.id }`]: banner + } + }; + + return this.update({ _id }, update); + } + + removeBannerById(_id, banner) { + const update = { + $unset: { + [`banners.${ banner.id }`]: true + } + }; + + return this.update({ _id }, update); + } + // INSERT create(data) { const user = { diff --git a/packages/rocketchat-lib/server/models/_BaseDb.js b/packages/rocketchat-lib/server/models/_BaseDb.js index 9597c010b33e..60dee3248d2b 100644 --- a/packages/rocketchat-lib/server/models/_BaseDb.js +++ b/packages/rocketchat-lib/server/models/_BaseDb.js @@ -160,21 +160,7 @@ class ModelsBaseDb extends EventEmitter { } updateHasPositionalOperator(update) { - for (const key in update) { - if (key.includes('.$')) { - return true; - } - - const value = update[key]; - - if (Match.test(value, Object)) { - if (this.updateHasPositionalOperator(value) === true) { - return true; - } - } - } - - return false; + return Object.keys(update).some(key => key.includes('.$') || (!Match.test(update[key], Object) && this.updateHasPositionalOperator(update[key]))); } processOplogRecord(action) { diff --git a/packages/rocketchat-lib/server/startup/settings.js b/packages/rocketchat-lib/server/startup/settings.js index 2271edd7005c..771d298bc0b3 100644 --- a/packages/rocketchat-lib/server/startup/settings.js +++ b/packages/rocketchat-lib/server/startup/settings.js @@ -107,6 +107,7 @@ RocketChat.settings.addGroup('Accounts', function() { } }); this.add('Accounts_ManuallyApproveNewUsers', false, { + 'public': true, type: 'boolean' }); this.add('Accounts_AllowedDomainsList', '', { @@ -314,6 +315,16 @@ RocketChat.settings.addGroup('Accounts', function() { 'public': true, i18nLabel: 'UI_Merge_Channels_Groups' }); + this.add('Accounts_Default_User_Preferences_sidebarShowUnread', false, { + type: 'boolean', + 'public': true, + i18nLabel: 'Unread_on_top' + }); + this.add('Accounts_Default_User_Preferences_sidebarShowFavorites', true, { + type: 'boolean', + 'public': true, + i18nLabel: 'Group_favorites' + }); this.add('Accounts_Default_User_Preferences_sendOnEnter', 'normal', { type: 'select', values: [ @@ -402,6 +413,11 @@ RocketChat.settings.addGroup('Accounts', function() { 'public': true, i18nLabel: 'New_Message_Notification' }); + this.add('Accounts_Default_User_Preferences_muteFocusedConversations', true, { + type: 'boolean', + 'public': true, + i18nLabel: 'Mute_Focused_Conversations' + }); this.add('Accounts_Default_User_Preferences_notificationsSoundVolume', 100, { type: 'int', 'public': true, @@ -1313,10 +1329,16 @@ RocketChat.settings.addGroup('Message', function() { 'public': true }); - return this.add('Message_HideType_mute_unmute', false, { + this.add('Message_HideType_mute_unmute', false, { type: 'boolean', 'public': true }); + + this.add('Message_GlobalSearch', false, { + type: 'boolean', + 'public': true, + alert: 'This feature is currently in beta and could decrease the application performance! Please report bugs to github.com/RocketChat/Rocket.Chat/issues' + }); }); RocketChat.settings.addGroup('Meta', function() { @@ -1444,7 +1466,7 @@ RocketChat.settings.addGroup('Layout', function() { type: 'string', 'public': true }); - this.add('Layout_Home_Body', 'Welcome to Rocket.Chat
    Go to APP SETTINGS -> Layout to customize this intro.', { + this.add('Layout_Home_Body', '

    Welcome to Rocket.Chat!

    \n

    The Rocket.Chat desktops apps for Windows, macOS and Linux are available to download here.

    The native mobile app, Rocket.Chat+,\n for Android and iOS is available from Google Play and the App Store.

    \n

    For further help, please consult the documentation.

    \n

    If you\'re an admin, feel free to change this content via Administration -> Layout -> Home Body. Or clicking here.

    ', { type: 'code', code: 'text/html', multiline: true, diff --git a/packages/rocketchat-lib/startup/defaultRoomTypes.js b/packages/rocketchat-lib/startup/defaultRoomTypes.js index 3bb90fc29299..9f9e006f1324 100644 --- a/packages/rocketchat-lib/startup/defaultRoomTypes.js +++ b/packages/rocketchat-lib/startup/defaultRoomTypes.js @@ -1,5 +1,4 @@ import { - ChannelsRoomType, ConversationRoomType, DirectMessageRoomType, FavoriteRoomType, @@ -11,7 +10,6 @@ import { RocketChat.roomTypes.add(new UnreadRoomType()); RocketChat.roomTypes.add(new FavoriteRoomType()); RocketChat.roomTypes.add(new ConversationRoomType()); -RocketChat.roomTypes.add(new ChannelsRoomType()); RocketChat.roomTypes.add(new PublicRoomType()); RocketChat.roomTypes.add(new PrivateRoomType()); RocketChat.roomTypes.add(new DirectMessageRoomType()); diff --git a/packages/rocketchat-livechat/.app/.meteor/packages b/packages/rocketchat-livechat/.app/.meteor/packages index f688a528da4f..f656261d6cc1 100644 --- a/packages/rocketchat-livechat/.app/.meteor/packages +++ b/packages/rocketchat-livechat/.app/.meteor/packages @@ -4,22 +4,22 @@ # 'meteor add' and 'meteor remove' will edit this file for you, # but you can also edit it by hand. -meteor@1.8.0 -webapp@1.4.0 +meteor@1.8.2 +webapp@1.5.0 logging@1.1.19 tracker@1.1.3 deps@1.0.12 session@1.1.7 ddp@1.4.0 livedata@1.0.18 -mongo@1.3.1 +mongo@1.4.2 blaze ui spacebars templating -check@1.2.5 +check@1.3.0 jquery@1.11.10 -random@1.0.10 +random@1.1.0 ejson@1.1.0 rocketchat:streamer kadira:flow-router @@ -32,11 +32,11 @@ reactive-var@1.0.11 accounts-password@1.5.0 tap:i18n smoral:sweetalert -ecmascript@0.9.0 -es5-shim@4.6.15 -standard-minifier-css@1.3.5 -standard-minifier-js@2.2.0 -shell-server@0.3.0 -dynamic-import@0.2.0 +ecmascript@0.10.0 +es5-shim@4.7.0 +standard-minifier-css@1.4.0 +standard-minifier-js@2.3.1 +shell-server@0.3.1 +dynamic-import@0.3.0 konecty:user-presence diff --git a/packages/rocketchat-livechat/.app/.meteor/release b/packages/rocketchat-livechat/.app/.meteor/release index 56a7a07fee76..d502dc0d921a 100644 --- a/packages/rocketchat-livechat/.app/.meteor/release +++ b/packages/rocketchat-livechat/.app/.meteor/release @@ -1 +1 @@ -METEOR@1.6.0.1 +METEOR@1.6.1 diff --git a/packages/rocketchat-livechat/.app/.meteor/versions b/packages/rocketchat-livechat/.app/.meteor/versions index 28e37949e539..784906b61781 100644 --- a/packages/rocketchat-livechat/.app/.meteor/versions +++ b/packages/rocketchat-livechat/.app/.meteor/versions @@ -2,86 +2,89 @@ accounts-base@1.4.2 accounts-password@1.5.0 aldeed:simple-schema@1.5.3 allow-deny@1.1.0 -babel-compiler@6.24.7 -babel-runtime@1.1.1 -base64@1.0.10 +babel-compiler@7.0.4 +babel-runtime@1.2.2 +base64@1.0.11 binary-heap@1.0.10 blaze@2.3.2 blaze-tools@1.0.10 -boilerplate-generator@1.3.1 -caching-compiler@1.1.9 +boilerplate-generator@1.4.0 +caching-compiler@1.1.11 caching-html-compiler@1.1.2 -callback-hook@1.0.10 +callback-hook@1.1.0 cfs:http-methods@0.0.32 -check@1.2.5 -coffeescript@1.12.7_3 -coffeescript-compiler@1.12.7_3 +check@1.3.0 +coffeescript@1.0.17 ddp@1.4.0 -ddp-client@2.2.0 -ddp-common@1.3.0 +ddp-client@2.3.1 +ddp-common@1.4.0 ddp-rate-limiter@1.0.7 -ddp-server@2.1.1 +ddp-server@2.1.2 deps@1.0.12 -diff-sequence@1.0.7 -dynamic-import@0.2.1 -ecmascript@0.9.0 +diff-sequence@1.1.0 +dynamic-import@0.3.0 +ecmascript@0.10.4 ecmascript-runtime@0.5.0 -ecmascript-runtime-client@0.5.0 +ecmascript-runtime-client@0.6.2 ecmascript-runtime-server@0.5.0 ejson@1.1.0 email@1.2.3 -es5-shim@4.6.15 +es5-shim@4.7.3 geojson-utils@1.0.10 html-tools@1.0.11 htmljs@1.0.11 -http@1.3.0 -id-map@1.0.9 -jquery@1.11.10 +http@1.4.0 +id-map@1.1.0 +jquery@1.11.11 kadira:blaze-layout@2.3.0 kadira:flow-router@2.12.1 konecty:nrr@2.0.2 konecty:user-presence@2.0.1 -less@2.7.11 +less@2.7.12 livedata@1.0.18 localstorage@1.2.0 logging@1.1.19 mdg:validation-error@0.5.1 meteor@1.8.2 meteorspark:util@0.2.0 -minifier-css@1.2.16 -minifier-js@2.2.2 +minifier-css@1.3.1 +minifier-js@2.3.2 minimongo@1.4.3 mizzao:timesync@0.5.0 -modules@0.11.2 -modules-runtime@0.9.1 +modules@0.11.4 +modules-runtime@0.9.2 momentjs:moment@2.20.1 -mongo@1.3.1 +mongo@1.4.3 mongo-dev-server@1.1.0 mongo-id@1.0.6 nooitaf:colors@1.1.2_1 npm-bcrypt@0.9.3 -npm-mongo@2.2.33 +npm-mongo@2.2.34 observe-sequence@1.0.16 -ordered-dict@1.0.9 -promise@0.10.1 +ordered-dict@1.1.0 +promise@0.10.2 raix:eventemitter@0.1.3 -random@1.0.10 -rate-limit@1.0.8 +random@1.1.0 +rate-limit@1.0.9 reactive-dict@1.2.0 reactive-var@1.0.11 -retry@1.0.9 +reload@1.2.0 +retry@1.1.0 rocketchat:streamer@0.6.1 routepolicy@1.0.12 +server-render@0.3.0 service-configuration@1.0.11 session@1.1.7 sha@1.0.9 shell-server@0.3.1 +shim-common@0.1.0 smoral:sweetalert@1.1.1 +socket-stream-client@0.1.0 spacebars@1.0.15 spacebars-compiler@1.1.3 srp@1.0.10 -standard-minifier-css@1.3.5 -standard-minifier-js@2.2.3 +standard-minifier-css@1.4.1 +standard-minifier-js@2.3.2 tap:i18n@1.8.2 templating@1.3.2 templating-compiler@1.3.3 @@ -90,6 +93,6 @@ templating-tools@1.1.2 tracker@1.1.3 ui@1.0.13 underscore@1.0.10 -url@1.1.0 -webapp@1.4.0 +url@1.2.0 +webapp@1.5.0 webapp-hashing@1.0.9 diff --git a/packages/rocketchat-livechat/.app/client/lib/tapi18n.js b/packages/rocketchat-livechat/.app/client/lib/tapi18n.js index 65a7357566e6..c1ded6b86050 100644 --- a/packages/rocketchat-livechat/.app/client/lib/tapi18n.js +++ b/packages/rocketchat-livechat/.app/client/lib/tapi18n.js @@ -23,6 +23,6 @@ this.tr = function(key, options, ...replaces) { }; this.isRtl = (lang) => { - const language = lang ? lang : localStorage.getItem('userLanguage'); + const language = lang ? lang : localStorage.getItem('userLanguage') ? localStorage.getItem('userLanguage') : 'en-US'; return ['ar', 'dv', 'fa', 'he', 'ku', 'ps', 'sd', 'ug', 'ur', 'yi'].includes(language.split('-').shift().toLowerCase()); }; diff --git a/packages/rocketchat-livechat/.app/client/views/livechatWindow.js b/packages/rocketchat-livechat/.app/client/views/livechatWindow.js index 7651415e6b48..c0fdf8f2d18f 100644 --- a/packages/rocketchat-livechat/.app/client/views/livechatWindow.js +++ b/packages/rocketchat-livechat/.app/client/views/livechatWindow.js @@ -71,6 +71,8 @@ Template.livechatWindow.events({ Template.livechatWindow.onCreated(function() { Session.set({sound: true}); + TAPi18n.conf.i18n_files_route = Meteor._relativeToSiteRootUrl('/tap-i18n'); + const availableLanguages = TAPi18n.getLanguages(); const defaultAppLanguage = () => { diff --git a/packages/rocketchat-livechat/.app/client/views/main.html b/packages/rocketchat-livechat/.app/client/views/main.html index fa39318af8be..5b65e57c29ce 100644 --- a/packages/rocketchat-livechat/.app/client/views/main.html +++ b/packages/rocketchat-livechat/.app/client/views/main.html @@ -9,8 +9,8 @@ + + diff --git a/packages/rocketchat-livechat/.app/client/views/poweredBy.html b/packages/rocketchat-livechat/.app/client/views/poweredBy.html index 7e3e337a34a6..f327d98cecbe 100644 --- a/packages/rocketchat-livechat/.app/client/views/poweredBy.html +++ b/packages/rocketchat-livechat/.app/client/views/poweredBy.html @@ -2,7 +2,7 @@

    {{_ "Powered_by"}} - +

    diff --git a/packages/rocketchat-livechat/.app/package.json b/packages/rocketchat-livechat/.app/package.json index 2c22f70a08f4..9b02fe8f32e5 100644 --- a/packages/rocketchat-livechat/.app/package.json +++ b/packages/rocketchat-livechat/.app/package.json @@ -20,11 +20,11 @@ "email": "support@rocket.chat" }, "dependencies": { - "autolinker": "^1.6.0", - "jquery": "^3.2.1", - "babel-runtime": "^6.26.0", + "@babel/runtime": "^7.0.0-beta.40", + "autolinker": "^1.6.2", "bcrypt": "^1.0.3", "core-js": "^2.5.3", + "jquery": "^3.3.1", "moment": "^2.20.1", "toastr": "^2.1.4", "underscore": "^1.8.3", diff --git a/packages/rocketchat-livechat/app/i18n/af.i18n.json b/packages/rocketchat-livechat/app/i18n/af.i18n.json deleted file mode 100644 index bb2c6a63ae4a..000000000000 --- a/packages/rocketchat-livechat/app/i18n/af.i18n.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "Additional_Feedback": "Bykomende terugvoer", - "No": "Nee" -} \ No newline at end of file diff --git a/packages/rocketchat-livechat/app/i18n/mn.i18n.json b/packages/rocketchat-livechat/app/i18n/mn.i18n.json deleted file mode 100644 index 394fd9205b89..000000000000 --- a/packages/rocketchat-livechat/app/i18n/mn.i18n.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "Additional_Feedback": "Нэмэлт санал хүсэлт" -} \ No newline at end of file diff --git a/packages/rocketchat-livechat/app/i18n/sl-SI.i18n.json b/packages/rocketchat-livechat/app/i18n/sl-SI.i18n.json deleted file mode 100644 index 0a41ba267f6b..000000000000 --- a/packages/rocketchat-livechat/app/i18n/sl-SI.i18n.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "Additional_Feedback": "Dodatne povratne informacije", - "Appearance": "Videz" -} \ No newline at end of file diff --git a/packages/rocketchat-livechat/app/i18n/th-TH.i18n.json b/packages/rocketchat-livechat/app/i18n/th-TH.i18n.json deleted file mode 100644 index 62037b972178..000000000000 --- a/packages/rocketchat-livechat/app/i18n/th-TH.i18n.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "Additional_Feedback": "ความคิดเห็นเพิ่มเติม", - "Appearance": "ลักษณะภายนอก", - "Are_you_sure_do_you_want_end_this_chat": "คุณต้องการที่จะจบการสนทนาไช่หรือไม่", - "Are_you_sure_do_you_want_end_this_chat_and_switch_department": "คุณต้องการที่จะจบการสนทนาและเปลี่ยนแผนกไช่หรือไม่", - "Cancel": "ยกเลิก", - "Change": "เปลี่ยน", - "Chat_ended": "การสนทนาจบสิ้นแล้ว!", - "Choose_a_new_department": "เลือกแผนกใหม่", - "Close_menu": "ปิดตัวเลือก", - "Conversation_finished": "การสนทนาเสร็จสิ้นแล้ว", - "End_chat": "จบการสนทนา", - "How_friendly_was_the_chat_agent": "Chat agent เป็นมิตรแค่ไหน?", - "How_knowledgeable_was_the_chat_agent": "Chat agent มีความฉลาดแค่ไหน?", - "How_responsive_was_the_chat_agent": "Chat agent ตอบสนองดีแค่ไหน?", - "How_satisfied_were_you_with_this_chat": "คุณพึงพอใจใน Chat นี้แค่ไหน?", - "Installation": "การติดตั้ง", - "New_messages": "ข้อความใหม่", - "No": "ไม่", - "Options": "ตัวเลือก", - "Please_answer_survey": "กรุณาสละเวลาตอบแบบสอบถามเกี่ยวกับ Chat นี้", - "Please_choose_a_department": "กรุณาเลือกแผนก", - "Please_fill_name_and_email": "กรุณากรอกชื่อและอีเมล์", - "Powered_by": "ถูกสร้างโดย", - "Request_video_chat": "ร้องขอการสนทนาแบบวีดีโอ", - "Select_a_department": "เลือกแผนก", - "Switch_department": "เปลี่ยนแผนก", - "Department_switched": "แผนกถูกเปลี่ยนแล้ว", - "Send": "ส่ง", - "Skip": "ข้าม", - "Start_Chat": "เริ่มการสนทนา", - "Survey": "แบบสอบถาม", - "Survey_instructions": "ให้คะแนนคำถามตามความพอใจ, 1 แปลว่าไม่พอใจอย่างมากและ 5 แปลว่าพอใจอย่างที่สุด", - "Thank_you_for_your_feedback": "ขอบคุณสำหรับความคิดเห็น", - "Thanks_We_ll_get_back_to_you_soon": "ขอบคุณ! เราจะติดต่อกลับโดยเร็ว", - "transcript_sent": "สำเนาถูกส่งแล้ว", - "Type_your_email": "พิมอีเมล์ของคุณ", - "Type_your_message": "พิมข้อความของคุณ", - "Type_your_name": "พิมชื่อของคุณ", - "User_joined": "ผู้ใช้งานเข้าร่วมแล้ว", - "User_left": "ผู้ใช้งานออกแล้ว", - "We_are_offline_Sorry_for_the_inconvenience": "เรากำลังออฟไลน์ ขออภัยในความไม่สะดวก", - "Yes": "ไช่", - "You": "คุณ", - "You_must_complete_all_fields": "คุณต้องกรอกข้อมูลทุกช่อง" -} \ No newline at end of file diff --git a/packages/rocketchat-livechat/app/i18n/vi-VN.i18n.json b/packages/rocketchat-livechat/app/i18n/vi-VN.i18n.json deleted file mode 100644 index 95bc9c76326e..000000000000 --- a/packages/rocketchat-livechat/app/i18n/vi-VN.i18n.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "Additional_Feedback": "Phản hồi bổ sung", - "Appearance": "Kiểu hiển thị", - "Are_you_sure_do_you_want_end_this_chat": "Bạn có chắc muốn kết thúc cuộc nói chuyện này?", - "Are_you_sure_do_you_want_end_this_chat_and_switch_department": "Bạn muốn kết thúc cuộc nói chuyện này và chuyển sang bộ phận khác?", - "Cancel": "Hủy", - "Change": "Thay đổi", - "Chat_ended": "Cuộc nói chuyện đã kết thúc!", - "Choose_a_new_department": "Chọn bộ phận mới", - "Close_menu": "Đóng", - "Conversation_finished": "Cuộc hội thoại đã kết thúc", - "End_chat": "Kết thúc nói chuyện", - "How_friendly_was_the_chat_agent": "Độ thân thiện của nhân viên hỗ trợ như thế nào?", - "How_knowledgeable_was_the_chat_agent": "Độ hiểu biết của nhân viên hỗ trợ như thế nào?", - "How_responsive_was_the_chat_agent": "Phản hồi của nhân viên tư vấn như thế nào?", - "How_satisfied_were_you_with_this_chat": "Mức độ thỏa mãn của bạn với cuộc nói chuyện vừa xong?", - "Installation": "Cài đặt", - "New_messages": "Tin nhắn mới", - "No": "Không", - "Options": "Tùy chọn", - "Please_answer_survey": "Vui lòng dành ít thời gian để trả lời một khảo sát ngắn về cuộc nói chuyện vừa xong", - "Please_choose_a_department": "Vui lòng chọn bộ phận", - "Please_fill_name_and_email": "Vui lòng nhập tên và email", - "Powered_by": "Được hỗ trợ bởi", - "Request_video_chat": "Yêu cầu đàm thoại video", - "Select_a_department": "Chọn một bộ phận", - "Switch_department": "Chuyển bộ phận", - "Department_switched": "Bộ phận đã chuyển", - "Send": "Gửi", - "Skip": "Bỏ qua", - "Start_Chat": "Bắt đầu trò chuyện", - "Survey": "Khảo sát", - "Survey_instructions": "Đánh giá mức độ hài lòng cho mỗi câu hỏi, 1 tức là hoàn toàn thất vọng và 5 tức là tuyệt đối hài lòng", - "Thank_you_for_your_feedback": "Cảm ơn sự phản hồi của bạn", - "Thanks_We_ll_get_back_to_you_soon": "Xin cảm ơn! Chúng tôi sẽ phản hồi bạn sớm.", - "transcript_sent": "Bản dịch đã được gửi", - "Type_your_email": "Gõ email của bạn", - "Type_your_message": "Gõ tin nhắn của bạn", - "Type_your_name": "Gõ tên của bạn", - "User_joined": "Người dùng đã tham gia", - "User_left": "Người dùng rời đi", - "We_are_offline_Sorry_for_the_inconvenience": "Chúng tôi đang offline. Rất tiếc vì sự bất tiện này.", - "Yes": "Có", - "You": "Bạn", - "You_must_complete_all_fields": "Bạn phải điền hết các ô" -} \ No newline at end of file diff --git a/packages/rocketchat-livechat/app/package-lock.json b/packages/rocketchat-livechat/app/package-lock.json deleted file mode 100644 index 5fef930bdf66..000000000000 --- a/packages/rocketchat-livechat/app/package-lock.json +++ /dev/null @@ -1,879 +0,0 @@ -{ - "name": "rocketchat-livechat", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "ajv": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", - "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "autolinker": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-1.6.0.tgz", - "integrity": "sha1-utN2t62OQV8i8QL8Dzf2QOZPHL8=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "bcrypt": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-1.0.3.tgz", - "integrity": "sha512-pRyDdo73C8Nim3jwFJ7DWe3TZCgwDfWZ6nHS5LSdU77kWbj1frruvdndP02AOavtD4y8v6Fp2dolbHgp4SDrfg==", - "requires": { - "nan": "2.6.2", - "node-pre-gyp": "0.6.36" - } - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.2.0" - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "5.3.0", - "har-schema": "2.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.1.0" - } - }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jquery": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", - "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "moment": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", - "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nan": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=" - }, - "node-pre-gyp": { - "version": "0.6.36", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", - "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.2", - "request": "2.83.0", - "rimraf": "2.6.2", - "semver": "5.4.1", - "tar": "2.2.1", - "tar-pack": "3.4.1" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "rc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", - "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "util-deprecate": "1.0.2" - } - }, - "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" - }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "requires": { - "hoek": "4.2.0" - } - }, - "sprintf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=" - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, - "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.1.tgz", - "integrity": "sha512-PPRybI9+jM5tjtCbN2cxmmRU7YmqT3Zv/UDy48tAh2XRkLa9bAORtSWLkVc13+GJF+cdTh1yEnHEk3cpTaL5Kg==", - "requires": { - "debug": "2.6.9", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.3", - "rimraf": "2.6.2", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "toastr": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/toastr/-/toastr-2.1.4.tgz", - "integrity": "sha1-i0O+ZPudDEFIcURvLbjoyk6V8YE=", - "requires": { - "jquery": "3.2.1" - } - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" - }, - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" - }, - "underscore.string": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", - "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", - "requires": { - "sprintf-js": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - } - } -} diff --git a/packages/rocketchat-livechat/client/stylesheets/livechat.less b/packages/rocketchat-livechat/client/stylesheets/livechat.less index 7d2e34e95075..626d12b3cead 100644 --- a/packages/rocketchat-livechat/client/stylesheets/livechat.less +++ b/packages/rocketchat-livechat/client/stylesheets/livechat.less @@ -623,7 +623,7 @@ } .livechat-section { - margin-bottom: 32px; + margin-bottom: 22px; } .livechat-status { diff --git a/packages/rocketchat-livechat/client/views/sideNav/livechat.html b/packages/rocketchat-livechat/client/views/sideNav/livechat.html index a895584a1ef3..d92756fbbb70 100644 --- a/packages/rocketchat-livechat/client/views/sideNav/livechat.html +++ b/packages/rocketchat-livechat/client/views/sideNav/livechat.html @@ -15,8 +15,6 @@

      {{#each room in inquiries}} {{> chatRoomItem room }} - {{else}} -

      {{_ "No_livechats" }}

      {{/each}}
    {{/if}} @@ -32,8 +30,6 @@

    {{/if}} {{#each room in rooms}} {{> chatRoomItem room }} - {{else}} -

    {{_ "No_livechats" }}

    {{/each}}

diff --git a/packages/rocketchat-livechat/client/views/sideNav/livechatFlex.html b/packages/rocketchat-livechat/client/views/sideNav/livechatFlex.html index bdf541b8e6c6..d64cd13bdf9c 100644 --- a/packages/rocketchat-livechat/client/views/sideNav/livechatFlex.html +++ b/packages/rocketchat-livechat/client/views/sideNav/livechatFlex.html @@ -1,5 +1,5 @@