Commit 593f2c73 authored by Nacim Goura's avatar Nacim Goura

add statistique

parent 40d432f3
......@@ -20,7 +20,8 @@ caching-compiler@1.1.9
caching-html-compiler@1.1.2
callback-hook@1.0.10
check@1.2.5
coffeescript@1.12.6_1
coffeescript@1.12.7_1
coffeescript-compiler@1.12.7_1
cosmos:browserify@0.10.0
dburles:collection-helpers@1.1.0
ddp@1.3.0
......@@ -57,14 +58,14 @@ livedata@1.0.18
localstorage@1.1.1
logging@1.1.17
matb33:collection-hooks@0.8.4
meteor@1.7.0
meteor@1.7.1
meteor-base@1.1.0
minifier-css@1.2.16
minifier-js@2.1.1
minimongo@1.2.1
mobile-experience@1.0.4
mobile-status-bar@1.0.14
modules@0.9.2
modules@0.9.4
modules-runtime@0.8.0
momentjs:moment@2.18.1
mongo@1.1.22
......@@ -74,7 +75,7 @@ npm-mongo@2.2.30
observe-sequence@1.0.16
ordered-dict@1.0.9
ostrio:cookies@2.2.2
ostrio:files@1.8.0
ostrio:files@1.8.2
percolate:synced-cron@1.3.2
practicalmeteor:chai@2.1.0_1
practicalmeteor:loglevel@1.2.0_2
......@@ -94,7 +95,7 @@ service-configuration@1.0.11
session@1.1.7
sha@1.0.9
spacebars@1.0.15
spacebars-compiler@1.1.2
spacebars-compiler@1.1.3
srp@1.0.10
standard-minifier-css@1.3.4
standard-minifier-js@2.1.1
......
......@@ -3,7 +3,7 @@ import SimpleSchema from 'simpl-schema';
import { Mongo } from 'meteor/mongo';
/**
* this collection keep tracks of all notification of this application
* this collection keep tracks of all jobs of this application
* @type {Mongo.Collection}
*/
const jobsCollection = new Mongo.Collection('jobs');
......
......@@ -4,6 +4,7 @@ import { Meteor } from 'meteor/meteor';
import _ from 'lodash';
import Search from '/imports/api/search/server/search';
import formSearchSchema from '/imports/api/search/formSearchSchema';
import statCollection from '/imports/api/statistique/statCollection';
export async function searchWebsite(data, userId) {
check(data, Object);
......@@ -11,8 +12,16 @@ export async function searchWebsite(data, userId) {
const search = new Search(userId);
try {
const results = await search.searchWebsite(data.searchTerm);
const responseTime = results.took ? results.took / 1000 : null;
statCollection.rawCollection().insert({
term: data.searchTerm,
numberResult: results.hits.total,
responseTime,
userId,
createdAt: new Date(),
});
return {
time: results.took ? results.took / 1000 : null,
time: responseTime,
total: results.hits.total,
list: _.map(results.hits.hits, '_source'),
};
......
import { Meteor } from 'meteor/meteor';
import statCollection from '../statCollection';
Meteor.publish('stats', () => statCollection.find({ userId: Meteor.userId() }));
import SimpleSchema from 'simpl-schema';
import { Mongo } from 'meteor/mongo';
/**
* this collection keep tracks of all stats of this application
* @type {Mongo.Collection}
*/
const statsCollection = new Mongo.Collection('stats');
SimpleSchema.statsCollection = new SimpleSchema({
term: {
type: String,
},
numberResult: {
type: Number,
defaultValue: 0,
},
responseTime: {
type: Number,
},
createdAt: {
type: Date,
},
userId: {
type: String,
},
});
statsCollection.attachSchema(SimpleSchema.statsCollection);
export default statsCollection;
......@@ -39,22 +39,6 @@ adminSection.route('/account', {
}],
});
adminSection.route('/stat', {
name: 'statistique',
action() {
BlazeLayout.render('mainLayoutTpl', {
sidebar: 'sidebarLayoutTpl',
main: 'statTpl',
navbar: 'navbarLayoutTpl',
});
},
triggersEnter: [(context, redirect) => {
if (Meteor.user() && Meteor.user().roles && Meteor.user().roles[0] !== 'admin') {
redirect('home');
}
}],
});
adminSection.route('/notif', {
name: 'notif',
action() {
......
......@@ -16,7 +16,7 @@ import '/imports/ui/pages/login/login';
import '/imports/ui/pages/not-found/not-found';
import '/imports/ui/pages/admin/indexation/indexation';
import '/imports/ui/pages/admin/account/account';
import '/imports/ui/pages/admin/statistique/statistique';
import '/imports/ui/pages/statistique/statistique';
import '/imports/ui/pages/notif/notif';
import '/imports/ui/components/testSearch/testSearch';
......@@ -58,6 +58,20 @@ FlowRouter.route('/login', {
},
});
FlowRouter.route('/stat', {
name: 'statistique',
action() {
BlazeLayout.render('mainLayoutTpl', {
sidebar: 'sidebarLayoutTpl',
main: 'statTpl',
navbar: 'navbarLayoutTpl',
});
},
subscriptions() {
this.register('stats', Meteor.subscribe('stats'));
},
});
FlowRouter.route('/logout', {
name: 'logout',
action() {
......
......@@ -9,8 +9,9 @@ import '/imports/api/testSearch/methods';
import '/imports/api/search/methods';
// publications
import '/imports/api/crawl/publications';
import '/imports/api/config/publications';
import '/imports/api/crawl/server/publications';
import '/imports/api/config/server/publications';
import '/imports/api/statistique/server/publications';
// tabular
import '/imports/tabular/tabularUser';
......
......@@ -18,7 +18,7 @@
<a href="/admin/account"><i class="fa fa-fw fa-user fa-20px" aria-hidden="true"></i> Comptes</a>
</li>
<li>
<a href="/admin/stat"><i class="fa fa-fw fa-bar-chart-o fa-20px" aria-hidden="true"></i> Statistiques</a>
<a href="/stat"><i class="fa fa-fw fa-bar-chart-o fa-20px" aria-hidden="true"></i> Statistiques</a>
</li>
{{/if}}
<li>
......
<template name="statTpl">
<div class="row">
<h3 class="text-center">Page des statistiques</h3>
<div class="panel panel-default">
<div class="panel-body">
<div class="row">
<select name="selectDateChart" id="selectDateChart" class="form-control">
<option value="day">Jour</option>
<option value="week">Semaine</option>
<option value="month">Mois</option>
</select>
<div class="col-md-6">
<canvas id="termFrequencyChart"></canvas>
</div>
<div class="col-md-6">
<canvas id="responseTimeChart"></canvas>
</div>
</div>
</div>
</div>
</div>
</template>
import _ from 'lodash';
import { Template } from 'meteor/templating';
import moment from 'moment';
import statCollection from '/imports/api/statistique/statCollection';
import Chart from 'chart.js';
import './statistique.html';
function countOccurrence(arr) {
const a = [];
const b = [];
let prev = null;
arr.sort();
for (let i = 0; i < arr.length; i++) {
if (arr[i] !== prev) {
a.push(arr[i]);
b.push(1);
} else {
b[b.length - 1]++;
}
prev = arr[i];
}
return [a, b];
}
function defineFrequencyTerm(stats) {
const listTerm = _.map(stats, 'term');
const data = countOccurrence(listTerm);
const ctx = document.getElementById('termFrequencyChart').getContext('2d');
new Chart(ctx, {
type: 'horizontalBar',
data: {
labels: data[0],
datasets: [{
backgroundColor: ['#3e95cd', '#8e5ea2', '#3cba9f', '#e8c3b9', '#c45850'],
data: data[1],
}],
},
options: {
legend: { display: false },
title: {
display: true,
text: 'Fréquence des termes',
},
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
callback(value) { if (value % 1 === 0) { return value; } },
},
}],
},
},
});
}
function defineResponseTime(stats, filter) {
const format = filter === 'day' ? 'LT' : 'L';
const ctx = document.getElementById('responseTimeChart').getContext('2d');
const data = {};
_.forEach(stats, (item) => {
item.createdAt = moment(item.createdAt).format(format);
if (data[item.createdAt]) {
data[item.createdAt].number++;
data[item.createdAt].responseTime += item.responseTime;
} else {
data[item.createdAt] = {
number: 1,
responseTime: item.responseTime,
};
}
});
_.forOwn(data, (item) => {
item.responseTime /= item.number;
});
new Chart(ctx, {
type: 'line',
data: {
labels: _.keys(data),
datasets: [{
data: _.map(data, 'responseTime'),
borderColor: '#3e95cd',
fill: false,
}],
},
options: {
legend: { display: false },
title: {
display: true,
text: 'Temps de réponse (en seconde)',
},
scales: {
yAxes: [{
stacked: true,
}],
},
},
});
}
Template.statTpl.hooks({
rendered() {
this.autorun(() => {
const stats = statCollection.find({}).fetch();
if (stats && stats.length) {
defineResponseTime(stats, 'day');
defineFrequencyTerm(stats);
}
});
},
});
Template.statTpl.events({
'change #selectDateChart': (event) => {
const filter = event.currentTarget.value;
if (filter) {
const stats = statCollection.find({
createdAt: {
$gte: moment().startOf(filter).toDate(),
$lte: moment().endOf(filter).toDate(),
},
}).fetch();
if (stats && stats.length) {
defineResponseTime(stats, filter);
defineFrequencyTerm(stats);
}
}
},
});
......@@ -24,9 +24,9 @@ acorn@^3.0.4:
version "3.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
acorn@^5.0.1:
version "5.0.3"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
acorn@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75"
agentkeepalive@^2.2.0:
version "2.2.0"
......@@ -43,6 +43,15 @@ ajv@^4.7.0:
co "^4.6.0"
json-stable-stringify "^1.0.1"
ajv@^5.2.0:
version "5.2.2"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39"
dependencies:
co "^4.6.0"
fast-deep-equal "^1.0.0"
json-schema-traverse "^0.3.0"
json-stable-stringify "^1.0.1"
align-text@^0.1.1, align-text@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
......@@ -55,18 +64,28 @@ amdefine@>=0.0.4:
version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
ansi-escapes@^1.1.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
ansi-escapes@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b"
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
ansi-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
ansi-styles@^3.1.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88"
dependencies:
color-convert "^1.9.0"
aproba@^1.0.3:
version "1.1.2"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1"
......@@ -171,7 +190,7 @@ axobject-query@^0.1.0:
dependencies:
ast-types-flow "0.0.7"
babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
babel-code-frame@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
dependencies:
......@@ -179,29 +198,37 @@ babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
esutils "^2.0.2"
js-tokens "^3.0.0"
babel-core@^6.16.0, babel-core@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83"
babel-code-frame@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
dependencies:
babel-code-frame "^6.22.0"
babel-generator "^6.24.1"
chalk "^1.1.3"
esutils "^2.0.2"
js-tokens "^3.0.2"
babel-core@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
dependencies:
babel-code-frame "^6.26.0"
babel-generator "^6.26.0"
babel-helpers "^6.24.1"
babel-messages "^6.23.0"
babel-register "^6.24.1"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-traverse "^6.24.1"
babel-types "^6.24.1"
babylon "^6.11.0"
convert-source-map "^1.1.0"
debug "^2.1.1"
json5 "^0.5.0"
lodash "^4.2.0"
minimatch "^3.0.2"
path-is-absolute "^1.0.0"
private "^0.1.6"
babel-register "^6.26.0"
babel-runtime "^6.26.0"
babel-template "^6.26.0"
babel-traverse "^6.26.0"
babel-types "^6.26.0"
babylon "^6.18.0"
convert-source-map "^1.5.0"
debug "^2.6.8"
json5 "^0.5.1"
lodash "^4.17.4"
minimatch "^3.0.4"
path-is-absolute "^1.0.1"
private "^0.1.7"
slash "^1.0.0"
source-map "^0.5.0"
source-map "^0.5.6"
babel-eslint@^7.2.3:
version "7.2.3"
......@@ -212,17 +239,17 @@ babel-eslint@^7.2.3:
babel-types "^6.23.0"
babylon "^6.17.0"
babel-generator@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497"
babel-generator@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5"
dependencies:
babel-messages "^6.23.0"
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-runtime "^6.26.0"
babel-types "^6.26.0"
detect-indent "^4.0.0"
jsesc "^1.3.0"
lodash "^4.2.0"
source-map "^0.5.0"
lodash "^4.17.4"
source-map "^0.5.6"
trim-right "^1.0.1"
babel-helpers@^6.24.1:
......@@ -238,39 +265,26 @@ babel-messages@^6.23.0:
dependencies:
babel-runtime "^6.22.0"
babel-register@6.16.3:
version "6.16.3"
resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.16.3.tgz#7b0c0ca7bfdeb9188ba4c27e5fcb7599a497c624"
babel-register@6.26.0, babel-register@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
dependencies:
babel-core "^6.16.0"
babel-runtime "^6.11.6"
core-js "^2.4.0"
home-or-tmp "^1.0.0"
lodash "^4.2.0"
mkdirp "^0.5.1"
path-exists "^1.0.0"
source-map-support "^0.4.2"
babel-register@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f"
dependencies:
babel-core "^6.24.1"
babel-runtime "^6.22.0"
core-js "^2.4.0"
babel-core "^6.26.0"
babel-runtime "^6.26.0"
core-js "^2.5.0"
home-or-tmp "^2.0.0"
lodash "^4.2.0"
lodash "^4.17.4"
mkdirp "^0.5.1"
source-map-support "^0.4.2"
source-map-support "^0.4.15"
babel-runtime@6.11.6:
version "6.11.6"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.11.6.tgz#6db707fef2d49c49bfa3cb64efdb436b518b8222"
babel-runtime@6.26.0, babel-runtime@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
dependencies:
core-js "^2.4.0"
regenerator-runtime "^0.9.5"
regenerator-runtime "^0.11.0"
babel-runtime@^6.11.6, babel-runtime@^6.22.0, babel-runtime@^6.23.0:
babel-runtime@^6.22.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
dependencies:
......@@ -287,6 +301,16 @@ babel-template@^6.24.1:
babylon "^6.11.0"
lodash "^4.2.0"
babel-template@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
dependencies:
babel-runtime "^6.26.0"
babel-traverse "^6.26.0"
babel-types "^6.26.0"
babylon "^6.18.0"
lodash "^4.17.4"
babel-traverse@^6.23.1, babel-traverse@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695"
......@@ -301,6 +325,20 @@ babel-traverse@^6.23.1, babel-traverse@^6.24.1:
invariant "^2.2.0"
lodash "^4.2.0"
babel-traverse@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
dependencies:
babel-code-frame "^6.26.0"
babel-messages "^6.23.0"
babel-runtime "^6.26.0"
babel-types "^6.26.0"
babylon "^6.18.0"
debug "^2.6.8"
globals "^9.18.0"
invariant "^2.2.2"
lodash "^4.17.4"
babel-types@^6.23.0, babel-types@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975"
......@@ -310,10 +348,23 @@ babel-types@^6.23.0, babel-types@^6.24.1:
lodash "^4.2.0"
to-fast-properties "^1.0.1"
babel-types@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
dependencies:
babel-runtime "^6.26.0"
esutils "^2.0.2"
lodash "^4.17.4"
to-fast-properties "^1.0.3"
babylon@^6.11.0, babylon@^6.15.0, babylon@^6.17.0:
version "6.17.2"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.2.tgz#201d25ef5f892c41bae49488b08db0dd476e9f5c"
babylon@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
balanced-match@^0.4.1:
version "0.4.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
......@@ -527,10 +578,38 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
chalk@^2.0.0, chalk@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e"
dependencies:
ansi-styles "^3.1.0"
escape-string-regexp "^1.0.5"
supports-color "^4.0.0"
charset-parser@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/charset-parser/-/charset-parser-0.2.0.tgz#230901088f5f6cb1659a8b5aaad2572db7a75b6b"
chart.js@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.6.0.tgz#308f9a4b0bfed5a154c14f5deb1d9470d22abe71"
dependencies:
chartjs-color "^2.1.0"
moment "^2.10.6"
chartjs-color-string@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.4.0.tgz#57748d4530ae28d8db0a5492182ba06dfdf2f468"
dependencies:
color-name "^1.0.0"
chartjs-color@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.1.0.tgz#9c39ac830ccd98996ae80c9f11086ff12c98a756"
dependencies:
chartjs-color-string "^0.4.0"
color-convert "^0.5.3"
check-types-mini@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/check-types-mini/-/check-types-mini-2.2.1.tgz#c2e20c2af323afd5680a3d8659884002119666b3"
......@@ -575,11 +654,11 @@ circular-json@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d"
cli-cursor@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
cli-cursor@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
dependencies:
restore-cursor "^1.0.1"
restore-cursor "^2.0.0"
cli-width@^2.0.0:
version "2.1.0"
......@@ -593,9 +672,9 @@ cliui@^2.1.0:
right-align "^0.1.1"
wordwrap "0.0.2"
clone@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
clone@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
co@^4.6.0:
version "4.6.0"
......@@ -605,6 +684,20 @@ code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"