Merge pull request #887 from theseyi/purge-policy-read

purge policy readonly view
This commit is contained in:
Seyi Adebajo 2017-11-30 14:20:19 -08:00 committed by GitHub
commit b84a55a2c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 302 additions and 62 deletions

View File

@ -11,10 +11,6 @@ import {
import noop from 'wherehows-web/utils/noop';
export default Component.extend({
tagName: 'ul',
classNames: ['purge-policy-list'],
exemptPolicy,
purgePolicyProps,

View File

@ -98,18 +98,20 @@
{{partial "datasets/dataset-compliance/dataset-classification"}}
{{/if}}
{{#if (or isReadOnly (eq editStepIndex 0))}}
{{partial "datasets/dataset-compliance/dataset-compliance-entities"}}
{{/if}}
{{#if (eq editStepIndex 1)}}
{{#if (or isReadOnly (eq editStepIndex 1))}}
{{purge-policy
isEditable=(not isReadOnly)
platform=platform
purgeNote=complianceInfo.compliancePurgeNote
purgePolicy=(readonly complianceInfo.complianceType)
onPolicyChange=(action "onDatasetPurgePolicyChange")
}}
{{/if}}
{{#if (or isReadOnly (eq editStepIndex 0))}}
{{partial "datasets/dataset-compliance/dataset-compliance-entities"}}
{{/if}}
</div>
{{yield}}

View File

@ -1,32 +1,62 @@
{{#each-in purgePolicyProps as |purgeType prop|}}
<li
class="purge-policy-list__item {{unless (contains (uppercase platform) prop.platforms) 'purge-policy-list__item--disabled'}}">
<section class="metadata-prompt">
<header class="metadata-prompt__header">
<p>
Compliance Purge Policy
</p>
</header>
</section>
{{#radio-button-composer
name="dataset-purge-policy"
value=(if (contains (uppercase platform) prop.platforms) purgeType null)
disabled=(if (contains (uppercase platform) prop.platforms) false true)
groupValue=(readonly purgePolicy)
changed=(action "onChange")
}}
{{prop.displayAs}}
{{/radio-button-composer}}
<ul class="purge-policy-list">
{{#if isEditable}}
{{#unless (contains (uppercase platform) prop.platforms)}}
<p class="purge-policy-list__availability">
Purge policy not available for <span class="purge-policy-list__platform--unavailable">{{lowercase platform}}</span>
</p>
{{/unless}}
{{#each-in purgePolicyProps as |purgeType prop|}}
<li
class="purge-policy-list__item {{unless (contains (uppercase platform) prop.platforms)
'purge-policy-list__item--disabled'}}">
<p>{{prop.desc}}</p>
{{#radio-button-composer
name="dataset-purge-policy"
value=(if (contains (uppercase platform) prop.platforms) purgeType null)
disabled=(if (contains (uppercase platform) prop.platforms) false true)
groupValue=(readonly purgePolicy)
changed=(action "onChange")
}}
{{prop.displayAs}}
{{/radio-button-composer}}
{{#if (and requestExemptionReason (eq purgeType exemptPolicy))}}
{{#unless (contains (uppercase platform) prop.platforms)}}
<p class="purge-policy-list__availability">
Purge policy not available for <span class="purge-policy-list__platform--unavailable">
{{lowercase platform}}</span>
</p>
{{/unless}}
{{medium-content-editable
value=purgeNote
options=editorOptions
class="comment-new__content"}}
<p>{{prop.desc}}</p>
{{#if (and requestExemptionReason (eq purgeType exemptPolicy))}}
{{medium-content-editable
value=purgeNote
options=editorOptions
class="comment-new__content"}}
{{/if}}
</li>
{{/each-in}}
{{else}}
{{#if purgeType}}
<li class="purge-policy-list__item">
<strong>
{{get (get purgePolicyProps purgeType) "displayAs"}}
</strong>
</li>
{{else}}
<p>This dataset does not have a current compliance purge policy.</p>
<sub>To update, click edit and follow the steps</sub>
{{/if}}
</li>
{{/each-in}}
{{/if}}
</ul>

View File

@ -28,7 +28,7 @@ const baseFetchHeaders = (headers: FetchConfig['headers']) => ({
* @param {object} fetchConfig
* @returns {Promise<T>}
*/
const json = <T>(url: string, fetchConfig: object): Promise<T> =>
const json = <T>(url: string = '', fetchConfig: object = {}): Promise<T> =>
fetch(url, fetchConfig).then<T>(response => response.json());
/**
@ -50,7 +50,9 @@ const getJSON = <T>(config: FetchConfig): Promise<T> => {
* @returns {Promise<T>}
*/
const postJSON = <T>(config: FetchConfig): Promise<T> => {
const requestBody = config.data ? { body: JSON.stringify(config.data) } : {};
const fetchConfig = Object.assign(
requestBody,
config.data && { body: JSON.stringify(config.data) },
baseFetchHeaders(config.headers),
{ method: 'POST' }
@ -66,11 +68,8 @@ const postJSON = <T>(config: FetchConfig): Promise<T> => {
* @return {Promise<T>}
*/
const deleteJSON = <T>(config: FetchConfig): Promise<T> => {
const fetchConfig = Object.assign(
config.data && { body: JSON.stringify(config.data) },
baseFetchHeaders(config.headers),
{ method: 'DELETE' }
);
const requestBody = config.data ? { body: JSON.stringify(config.data) } : {};
const fetchConfig = Object.assign(requestBody, baseFetchHeaders(config.headers), { method: 'DELETE' });
return json<T>(config.url, fetchConfig);
};
@ -82,11 +81,9 @@ const deleteJSON = <T>(config: FetchConfig): Promise<T> => {
* @return {Promise<T>}
*/
const putJSON = <T>(config: FetchConfig): Promise<T> => {
const fetchConfig = Object.assign(
config.data && { body: JSON.stringify(config.data) },
baseFetchHeaders(config.headers),
{ method: 'PUT' }
);
const requestBody = config.data ? { body: JSON.stringify(config.data) } : {};
const fetchConfig = Object.assign(requestBody, baseFetchHeaders(config.headers), { method: 'PUT' });
return json<T>(config.url, fetchConfig);
};
@ -111,17 +108,19 @@ const getHeaders = async (config: FetchConfig): Promise<Headers> => {
};
/**
* Wraps a request Promise, passthrough response if successful, otherwise handle the error and rethrow if not api error
* Wraps a request Promise, pass-through response if successful, otherwise handle the error and rethrow if not api error
* @template T
* @param {Promise<T>} fetcher the api request to wrap
* @param {K} defaultValue
* @return {Promise<K | T>}
* @param {T} defaultValue
* @returns {Promise<T|null>}
*/
const fetchAndHandleIfApiError = async <T, K>(fetcher: Promise<T>, defaultValue: K): Promise<T | K | null> => {
let result: T | K | null = typeof defaultValue === 'undefined' ? null : defaultValue;
const fetchAndHandleIfApiError = async <T>(fetcher: Promise<T>, defaultValue: T): Promise<T | null> => {
let result = typeof defaultValue === 'undefined' ? null : defaultValue;
try {
result = await fetcher;
} catch (e) {
//handle error
// TODO: if error is an api error, display notification and allow default return
// otherwise throw
}
return result;
};

View File

@ -67,6 +67,8 @@
"ember-redux-shim": "^1.1.1",
"ember-redux-thunk-shim": "^1.1.2",
"ember-resolver": "^4.5.0",
"ember-sinon": "^1.0.1",
"ember-sinon-qunit": "^2.1.0",
"ember-source": "~2.16.0",
"ember-symbol-observable": "^0.1.2",
"eslint": "^4.9.0",

View File

@ -1,8 +1,32 @@
import { getJSON } from 'wherehows-web/utils/api/fetcher';
import {
getJSON,
postJSON,
deleteJSON,
putJSON,
getHeaders,
fetchAndHandleIfApiError
} from 'wherehows-web/utils/api/fetcher';
import { module, test } from 'qunit';
import sinon from 'sinon';
module('Unit | Utility | api/fetcher');
module('Unit | Utility | api/fetcher', {
beforeEach() {
this.xhr = sinon.useFakeXMLHttpRequest();
},
test('it has a function getJSON', function(assert) {
assert.ok(typeof getJSON === 'function');
afterEach() {
this.xhr.restore();
}
});
test('each http request function exists', function(assert) {
[getJSON, postJSON, deleteJSON, putJSON, getHeaders, fetchAndHandleIfApiError].forEach(httpRequest =>
assert.ok(typeof httpRequest === 'function', `${httpRequest} is a function`)
);
});
test('each http request function returns a Promise / thennable', function(assert) {
[getJSON, postJSON, deleteJSON, putJSON, getHeaders].forEach(httpRequest =>
assert.ok(typeof httpRequest({}).then === 'function', `${httpRequest} returns a Promise object or thennable`)
);
});

View File

@ -459,6 +459,10 @@ async@~0.2.9:
version "0.2.10"
resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
async@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@ -1788,6 +1792,21 @@ bser@^2.0.0:
dependencies:
node-int64 "^0.4.0"
build@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/build/-/build-0.1.4.tgz#707fe026ffceddcacbfdcdf356eafda64f151046"
dependencies:
cssmin "0.3.x"
jsmin "1.x"
jxLoader "*"
moo-server "*"
promised-io "*"
timespan "2.x"
uglify-js "1.x"
walker "1.x"
winston "*"
wrench "1.3.x"
builtin-modules@^1.0.0, builtin-modules@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
@ -2067,7 +2086,7 @@ color-name@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
colors@1.0.3:
colors@1.0.3, colors@1.0.x:
version "1.0.3"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
@ -2295,12 +2314,20 @@ cson-parser@^1.1.0:
dependencies:
coffee-script "^1.10.0"
cssmin@0.3.x:
version "0.3.2"
resolved "https://registry.yarnpkg.com/cssmin/-/cssmin-0.3.2.tgz#ddce4c547b510ae0d594a8f1fbf8aaf8e2c5c00d"
currently-unhandled@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
dependencies:
array-find-index "^1.0.1"
cycle@1.0.x:
version "1.0.3"
resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
dag-map@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/dag-map/-/dag-map-2.0.2.tgz#9714b472de82a1843de2fba9b6876938cab44c68"
@ -2432,7 +2459,7 @@ detective@^4.3.1:
acorn "^4.0.3"
defined "^1.0.0"
diff@^3.2.0:
diff@^3.1.0, diff@^3.2.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
@ -2548,6 +2575,24 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be
clone "^2.0.0"
ember-cli-version-checker "^2.0.0"
ember-cli-babel@^6.7.2:
version "6.10.0"
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.10.0.tgz#81424acd1d97fb13658168121eeb2007d6edee84"
dependencies:
amd-name-resolver "0.0.7"
babel-plugin-debug-macros "^0.1.11"
babel-plugin-ember-modules-api-polyfill "^2.0.1"
babel-plugin-transform-es2015-modules-amd "^6.24.0"
babel-polyfill "^6.16.0"
babel-preset-env "^1.5.1"
broccoli-babel-transpiler "^6.1.2"
broccoli-debug "^0.6.2"
broccoli-funnel "^1.0.0"
broccoli-source "^1.1.0"
clone "^2.0.0"
ember-cli-version-checker "^2.1.0"
semver "^5.4.1"
ember-cli-bootstrap-sassy@^0.5.6:
version "0.5.6"
resolved "https://registry.yarnpkg.com/ember-cli-bootstrap-sassy/-/ember-cli-bootstrap-sassy-0.5.6.tgz#d4a557c91acdcac3241f53d7fd14005a714d1217"
@ -2568,8 +2613,8 @@ ember-cli-broccoli-sane-watcher@^2.0.4:
sane "^1.1.1"
ember-cli-code-coverage@theseyi/ember-cli-code-coverage:
version "0.4.2"
resolved "https://codeload.github.com/theseyi/ember-cli-code-coverage/tar.gz/75acde3febdbf7da87153d98e12343b54115b3f4"
version "0.5.0"
resolved "https://codeload.github.com/theseyi/ember-cli-code-coverage/tar.gz/368fc520ff1f00d2390cc9818bd4225772e7d834"
dependencies:
babel-core "^6.24.1"
babel-plugin-transform-async-to-generator "^6.24.1"
@ -2891,7 +2936,7 @@ ember-cli-version-checker@^1.0.2, ember-cli-version-checker@^1.1.6, ember-cli-ve
dependencies:
semver "^5.3.0"
ember-cli-version-checker@^2.0.0:
ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.0.tgz#fc79a56032f3717cf844ada7cbdec1a06fedb604"
dependencies:
@ -3312,6 +3357,22 @@ ember-simple-auth@^1.4.0:
ember-getowner-polyfill "^1.1.0"
silent-error "^1.0.0"
ember-sinon-qunit@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ember-sinon-qunit/-/ember-sinon-qunit-2.1.0.tgz#85fd64e73db40148816a46a64f9f78b170b72cb2"
dependencies:
ember-cli-babel "^6.7.2"
ember-sinon "~1.0.0"
ember-sinon@^1.0.1, ember-sinon@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ember-sinon/-/ember-sinon-1.0.1.tgz#056390eacc9367b4c3955ce1cb5a04246f8197f5"
dependencies:
broccoli-funnel "^2.0.0"
broccoli-merge-trees "^2.0.0"
ember-cli-babel "^6.3.0"
sinon "^3.2.1"
ember-source@~2.16.0:
version "2.16.0"
resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-2.16.0.tgz#2becd7966278fe453046b91178ede665c2cf241a"
@ -3834,6 +3895,10 @@ eyeglass@^1.3.0:
node-sass-utils "^1.1.2"
semver "^5.0.3"
eyes@0.1.x:
version "0.1.8"
resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
fake-xml-http-request@^1.4.0, fake-xml-http-request@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.6.0.tgz#bd0ac79ae3e2660098282048a12c730a6f64d550"
@ -4021,6 +4086,12 @@ form-data@~2.3.1:
combined-stream "^1.0.5"
mime-types "^2.1.12"
formatio@1.2.0, formatio@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb"
dependencies:
samsam "1.x"
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@ -4798,7 +4869,7 @@ isobject@^2.0.0:
dependencies:
isarray "1.0.0"
isstream@~0.1.2:
isstream@0.1.x, isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@ -4866,6 +4937,10 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
js-yaml@0.3.x:
version "0.3.7"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-0.3.7.tgz#d739d8ee86461e54b354d6a7d7d1f2ad9a167f62"
js-yaml@3.x, js-yaml@^3.2.5, js-yaml@^3.2.7, js-yaml@^3.3.0, js-yaml@^3.4.3, js-yaml@^3.6.1, js-yaml@^3.9.1:
version "3.10.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
@ -4893,6 +4968,10 @@ jsesc@~0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
jsmin@1.x:
version "1.0.1"
resolved "https://registry.yarnpkg.com/jsmin/-/jsmin-1.0.1.tgz#e7bd0dcd6496c3bf4863235bf461a3d98aa3b98c"
json-schema-traverse@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
@ -4948,6 +5027,19 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.10.0"
just-extend@^1.1.26:
version "1.1.27"
resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905"
jxLoader@*:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jxLoader/-/jxLoader-0.1.1.tgz#0134ea5144e533b594fc1ff25ff194e235c53ecd"
dependencies:
js-yaml "0.3.x"
moo-server "1.3.x"
promised-io "*"
walker "1.x"
kind-of@^3.0.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@ -5353,6 +5445,10 @@ lodash.forown@~2.3.0:
lodash._objecttypes "~2.3.0"
lodash.keys "~2.3.0"
lodash.get@^4.4.2:
version "4.4.2"
resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
lodash.identity@~2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-2.3.0.tgz#6b01a210c9485355c2a913b48b6711219a173ded"
@ -5523,6 +5619,14 @@ log-update@^1.0.2:
ansi-escapes "^1.0.0"
cli-cursor "^1.0.2"
lolex@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6"
lolex@^2.1.2:
version "2.3.1"
resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.1.tgz#3d2319894471ea0950ef64692ead2a5318cff362"
longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
@ -5745,6 +5849,10 @@ moment@2.x, "moment@>= 2.6.0", "moment@>= 2.9.0", moment@^2.18.1:
version "2.19.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167"
moo-server@*, moo-server@1.3.x:
version "1.3.0"
resolved "https://registry.yarnpkg.com/moo-server/-/moo-server-1.3.0.tgz#5dc79569565a10d6efed5439491e69d2392e58f1"
morgan@^1.8.1:
version "1.9.0"
resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051"
@ -5783,6 +5891,10 @@ nan@^2.0.7, nan@^2.3.0, nan@^2.3.2:
version "2.7.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46"
native-promise-only@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11"
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@ -5791,6 +5903,16 @@ negotiator@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
nise@^1.0.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/nise/-/nise-1.2.0.tgz#079d6cadbbcb12ba30e38f1c999f36ad4d6baa53"
dependencies:
formatio "^1.2.0"
just-extend "^1.1.26"
lolex "^1.6.0"
path-to-regexp "^1.7.0"
text-encoding "^0.6.4"
node-dir@^0.1.16:
version "0.1.17"
resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5"
@ -6180,6 +6302,12 @@ path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
path-to-regexp@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
dependencies:
isarray "0.0.1"
path-type@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
@ -6306,6 +6434,10 @@ promise-map-series@^0.2.1:
dependencies:
rsvp "^3.0.14"
promised-io@*:
version "0.3.5"
resolved "https://registry.yarnpkg.com/promised-io/-/promised-io-0.3.5.tgz#4ad217bb3658bcaae9946b17a8668ecd851e1356"
proxy-addr@~2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec"
@ -6799,6 +6931,10 @@ safe-json-parse@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57"
samsam@1.x, samsam@^1.1.3:
version "1.3.0"
resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50"
sane@^1.1.1, sane@^1.6.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30"
@ -6926,6 +7062,22 @@ simple-is@~0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0"
sinon@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/sinon/-/sinon-3.3.0.tgz#9132111b4bbe13c749c2848210864250165069b1"
dependencies:
build "^0.1.4"
diff "^3.1.0"
formatio "1.2.0"
lodash.get "^4.4.2"
lolex "^2.1.2"
native-promise-only "^0.8.1"
nise "^1.0.1"
path-to-regexp "^1.7.0"
samsam "^1.1.3"
text-encoding "0.6.4"
type-detect "^4.0.0"
slash@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
@ -7123,6 +7275,10 @@ stable@~0.1.3:
version "0.1.6"
resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.6.tgz#910f5d2aed7b520c6e777499c1f32e139fdecb10"
stack-trace@0.0.x:
version "0.0.10"
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
staged-git-files@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35"
@ -7375,6 +7531,10 @@ tether@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/tether/-/tether-1.4.0.tgz#0f9fa171f75bf58485d8149e94799d7ae74d1c1a"
text-encoding@0.6.4, text-encoding@^0.6.4:
version "0.6.4"
resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19"
text-table@~0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@ -7387,6 +7547,10 @@ through@^2.3.6, through@^2.3.8, through@~2.3.8:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
timespan@2.x:
version "2.3.0"
resolved "https://registry.yarnpkg.com/timespan/-/timespan-2.3.0.tgz#4902ce040bd13d845c8f59b27e9d59bad6f39929"
tiny-lr@^1.0.3:
version "1.0.5"
resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.0.5.tgz#21f40bf84ebd1f853056680375eef1670c334112"
@ -7478,6 +7642,10 @@ type-check@~0.3.2:
dependencies:
prelude-ls "~1.1.2"
type-detect@^4.0.0:
version "4.0.5"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.5.tgz#d70e5bc81db6de2a381bcaca0c6e0cbdc7635de2"
type-is@~1.6.15:
version "1.6.15"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
@ -7504,6 +7672,10 @@ uglify-es@^3.1.3:
commander "~2.11.0"
source-map "~0.6.1"
uglify-js@1.x:
version "1.3.5"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-1.3.5.tgz#4b5bfff9186effbaa888e4c9e94bd9fc4c94929d"
uglify-js@^2.6:
version "2.8.29"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
@ -7630,7 +7802,7 @@ walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2:
ensure-posix-path "^1.0.0"
matcher-collection "^1.0.0"
walker@~1.0.5:
walker@1.x, walker@~1.0.5:
version "1.0.7"
resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
dependencies:
@ -7679,6 +7851,17 @@ window-size@^0.1.2:
version "0.1.4"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876"
winston@*:
version "2.4.0"
resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.0.tgz#808050b93d52661ed9fb6c26b3f0c826708b0aee"
dependencies:
async "~1.0.0"
colors "1.0.x"
cycle "1.0.x"
eyes "0.1.x"
isstream "0.1.x"
stack-trace "0.0.x"
wordwrap@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
@ -7708,6 +7891,10 @@ wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
wrench@1.3.x:
version "1.3.9"
resolved "https://registry.yarnpkg.com/wrench/-/wrench-1.3.9.tgz#6f13ec35145317eb292ca5f6531391b244111411"
write-file-atomic@^2.0.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"