├── .gitignore ├── .env.sample ├── sample.csv ├── index.js ├── .yarnclean ├── lib ├── course.js ├── module.js ├── assignment.js ├── helpers.js ├── rubric.js ├── sis.js └── endpoint.js ├── config.js ├── tests ├── helpers.js ├── course.js ├── endpoint.js ├── rubric.js ├── cmodule.js └── assignment.js ├── package.json ├── LEGACY.md ├── README.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | .DS_Store 4 | *.swp 5 | -------------------------------------------------------------------------------- /.env.sample: -------------------------------------------------------------------------------- 1 | 2 | # Remove this line -- replace your API info here 3 | CANVAS_API_VERSION=v1 4 | CANVAS_API_DOMAIN= 5 | CANVAS_API_KEY= 6 | 7 | -------------------------------------------------------------------------------- /sample.csv: -------------------------------------------------------------------------------- 1 | TERM_ID,NAME,STATUS,START_DATE,END_DATE 2 | 2016_year_7-11,2016 Year 7-11,active,2016-01-29 00:00:00,2016-12-07 23:59:00 3 | 2016_year_12,2016 Year 12,active,2015-10-06 00:00:00,2016-12-07 23:59:00 4 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const helpers = require('./lib/helpers'); 2 | const endpoint = require('./lib/endpoint'); 3 | const sis = require('./lib/sis'); 4 | const course = require('./lib/course'); 5 | const assignment = require('./lib/assignment'); 6 | const cmodule = require('./lib/module'); 7 | 8 | let canvas = { helpers, endpoint, sis, course, assignment, cmodule }; 9 | 10 | module.exports = canvas; 11 | 12 | -------------------------------------------------------------------------------- /.yarnclean: -------------------------------------------------------------------------------- 1 | # test directories 2 | __tests__ 3 | test 4 | tests 5 | powered-test 6 | 7 | # asset directories 8 | docs 9 | doc 10 | website 11 | images 12 | assets 13 | 14 | # examples 15 | example 16 | examples 17 | 18 | # code coverage directories 19 | coverage 20 | .nyc_output 21 | 22 | # build scripts 23 | Makefile 24 | Gulpfile.js 25 | Gruntfile.js 26 | 27 | # configs 28 | .tern-project 29 | .gitattributes 30 | .editorconfig 31 | .*ignore 32 | .eslintrc 33 | .jshintrc 34 | .flowconfig 35 | .documentup.json 36 | .yarn-metadata.json 37 | .*.yml 38 | *.yml 39 | 40 | # misc 41 | *.gz 42 | *.md 43 | -------------------------------------------------------------------------------- /lib/course.js: -------------------------------------------------------------------------------- 1 | const tiny = require('tiny-json-http'); 2 | const endpoint = require('./endpoint'); 3 | const config = require('../config'); 4 | 5 | let course = {}; 6 | 7 | course.migrate = (source, destination, callback) => { 8 | tiny.post({ 9 | url: endpoint.course.migrate(destination), 10 | headers: config.headers, 11 | data: { 12 | migration_type: 'course_copy_importer', 13 | settings: { source_course_id: source }, 14 | date_shift_options: { remove_dates: true } 15 | } 16 | }, callback); 17 | }; 18 | 19 | course.discuss = (course,params,callback) => { 20 | return tiny.post({ 21 | url: endpoint.course.discuss(course), 22 | headers: config.headers, 23 | data: params 24 | }, callback); 25 | }; 26 | module.exports = course; 27 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | // Try to load default .env variables. Note: These settings are not overwritten 2 | const dotenv = require('dotenv').config(); 3 | 4 | 5 | // Test if runtime env, or .env file variables have been assigned. If not, exit 6 | if( process.env.CANVAS_API_VERSION === undefined || process.env.CANVAS_API_KEY === undefined || process.env.CANVAS_API_KEY === undefined ){ 7 | console.log('Missing Version, API Key or Domain in .env file or runtime environment variables'); 8 | process.exit(); 9 | 10 | } 11 | 12 | 13 | module.exports = { 14 | apiVersion: process.env.CANVAS_API_VERSION, 15 | diffing_drop_status: process.CANVAS_API_DIFFING_DROP_STATUS, 16 | domain: process.env.CANVAS_API_DOMAIN, 17 | headers: { 'Authorization': `Bearer ${process.env.CANVAS_API_KEY}` }, 18 | throttle: process.env.CANVAS_API_THROTTLE 19 | }; 20 | -------------------------------------------------------------------------------- /tests/helpers.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'); 2 | const endpoint = require('../lib/endpoint'); 3 | const helpers = require('../lib/helpers'); 4 | var nock = require('nock'); 5 | const config = require('../config'); 6 | 7 | // Dummy data used for Mocks 8 | let source = 1; 9 | let destination = 2; 10 | let id = 3; 11 | let courseid = 4; 12 | let assignmentid = 5; 13 | let nameresponse = 'Canvas API - Test Suite Assignment'; 14 | let res; 15 | 16 | 17 | // Mock http calls 18 | 19 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 20 | .get('/accounts/1/sub_accounts') 21 | .query(true) 22 | .reply(200, { id: id }); 23 | 24 | 25 | let options = { 26 | url: `${endpoint.base()}/accounts/1/sub_accounts`, 27 | data: { 28 | per_page: 2 29 | } 30 | }; 31 | 32 | test('Common Helpers - Get All Resources', (t) => { 33 | t.plan(1); 34 | helpers.getAllResources(options, (error, results) => { 35 | if (error) { 36 | t.fail(error); 37 | } else { 38 | t.ok(results.length > 0); 39 | } 40 | }); 41 | }); 42 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "canvas-api", 3 | "version": "3.6.0", 4 | "description": "A Promise-based collection of helper methods for the Canvas LMS API.", 5 | "main": "index.js", 6 | "dependencies": { 7 | "date-fns": "1.29.0", 8 | "dotenv": "^5.0.1", 9 | "parse-link-header": "1.0.1", 10 | "tiny-json-http": "7.0.0" 11 | }, 12 | "devDependencies": { 13 | "dateformat": "3.0.2", 14 | "nock": "^9.2.5", 15 | "semistandard": "11.0.0", 16 | "tap-spec": "^4.1.1", 17 | "tape": "4.8.0" 18 | }, 19 | "engines": { 20 | "node": ">=4" 21 | }, 22 | "scripts": { 23 | "test": "tape tests/*.js | node_modules/.bin/tap-spec" 24 | }, 25 | "repository": { 26 | "type": "git", 27 | "url": "https://github.com/neurotech/canvas-api.git" 28 | }, 29 | "keywords": [ 30 | "canvas", 31 | "api", 32 | "instructure", 33 | "lms" 34 | ], 35 | "author": "Tim Douglas", 36 | "license": "ISC", 37 | "bugs": { 38 | "url": "https://github.com/neurotech/canvas-api/issues" 39 | }, 40 | "homepage": "https://github.com/neurotech/canvas-api#readme" 41 | } 42 | -------------------------------------------------------------------------------- /lib/module.js: -------------------------------------------------------------------------------- 1 | const tiny = require('tiny-json-http'); 2 | const endpoint = require('./endpoint'); 3 | const config = require('../config'); 4 | 5 | let cmodule = {}; 6 | 7 | cmodule.searchbyname = function(course,name,callback){ 8 | return tiny.get({ 9 | url: endpoint.cmodule.search(course), 10 | headers: config.headers, 11 | data: {search_term: name 12 | }},callback); 13 | } 14 | cmodule.get = (course, id, callback) => { 15 | return tiny.get({ 16 | url: endpoint.cmodule.modify(course, id), 17 | headers: config.headers 18 | }, callback); 19 | }; 20 | 21 | cmodule.create = (course, params, callback) => { 22 | return tiny.post({ 23 | url: endpoint.cmodule.create(course), 24 | headers: config.headers, 25 | data: params 26 | }, callback); 27 | }; 28 | 29 | cmodule.edit = (course, id, params, callback) => { 30 | return tiny.put({ 31 | url: endpoint.cmodule.modify(course, id), 32 | headers: config.headers, 33 | data: params 34 | }, callback); 35 | }; 36 | 37 | cmodule.delete = (course, id, callback) => { 38 | return tiny.del({ 39 | url: endpoint.cmodule.modify(course, id), 40 | headers: config.headers 41 | }, callback); 42 | }; 43 | 44 | module.exports = cmodule; 45 | 46 | -------------------------------------------------------------------------------- /lib/assignment.js: -------------------------------------------------------------------------------- 1 | const tiny = require('tiny-json-http'); 2 | const endpoint = require('./endpoint'); 3 | const config = require('../config'); 4 | 5 | let assignment = {}; 6 | 7 | assignment.searchbyname = function(course,name,callback){ 8 | return tiny.get({ 9 | url: endpoint.assignment.search(course), 10 | headers: config.headers, 11 | data: {search_term: name 12 | }},callback); 13 | } 14 | assignment.get = (course, id, callback) => { 15 | return tiny.get({ 16 | url: endpoint.assignment.modify(course, id), 17 | headers: config.headers 18 | }, callback); 19 | }; 20 | 21 | assignment.create = (course, params, callback) => { 22 | return tiny.post({ 23 | url: endpoint.assignment.create(course), 24 | headers: config.headers, 25 | data: params 26 | }, callback); 27 | }; 28 | 29 | assignment.edit = (course, id, params, callback) => { 30 | return tiny.put({ 31 | url: endpoint.assignment.modify(course, id), 32 | headers: config.headers, 33 | data: params 34 | }, callback); 35 | }; 36 | 37 | assignment.delete = (course, id, callback) => { 38 | return tiny.del({ 39 | url: endpoint.assignment.modify(course, id), 40 | headers: config.headers 41 | }, callback); 42 | }; 43 | 44 | module.exports = assignment; 45 | 46 | -------------------------------------------------------------------------------- /tests/course.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'); 2 | const course = require('../lib/course'); 3 | var nock = require('nock'); 4 | const config = require('../config'); 5 | 6 | // Dummy data used for Mocks 7 | let source = 1; 8 | let destination = 2; 9 | let id = 3; 10 | let courseid = 4; 11 | let res; 12 | 13 | // Mock http calls 14 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 15 | .post('/courses/'+destination+'/content_migrations') 16 | .reply(200, { id: id }); 17 | 18 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 19 | .post('/courses/'+courseid+'/discussion_topics') 20 | .reply(200, { id: id }); 21 | 22 | test('Course - Migration', (t) => { 23 | t.plan(1); 24 | course.migrate(source, destination, (error, results) => { 25 | if (error) { 26 | t.fail('Failed... '+error.statusCode); 27 | } else { 28 | t.equal(results.body.id,id,'Passed..successfully retrieved data'); 29 | } 30 | }); 31 | }); 32 | 33 | 34 | test('Course - Announcement', (t) => { 35 | t.plan(1); 36 | let params = {}; 37 | course.discuss(courseid,params, (error, results) => { 38 | if (error) { 39 | t.fail('Failed... '+error.statusCode); 40 | } else { 41 | t.equal(results.body.id, id,'Passed..successfully retrieved data'); 42 | } 43 | }); 44 | }); 45 | -------------------------------------------------------------------------------- /lib/helpers.js: -------------------------------------------------------------------------------- 1 | const tiny = require('tiny-json-http'); 2 | const parse = require('parse-link-header'); 3 | const config = require('../config'); 4 | 5 | let helpers = {}; 6 | 7 | helpers.getAllResources = (options, callback) => { 8 | var collection = []; 9 | options.headers = config.headers; 10 | const _get = (options) => { 11 | setTimeout(() => { 12 | tiny.get(options, (error, result) => { 13 | var pages = {}; 14 | if (error) { 15 | error.url = options.url; 16 | callback(error, null); 17 | } 18 | if (!result) { 19 | callback(null, collection); 20 | } else { 21 | if (result.body instanceof Array) { 22 | result.body.forEach((element) => { 23 | collection.push(element); 24 | }); 25 | } else { 26 | collection.push(result.body); 27 | } 28 | 29 | if (result.headers.link) { 30 | pages = parse(result.headers.link); 31 | } 32 | 33 | if (pages.next) { 34 | options.url = pages.next.url; 35 | options.data = null; 36 | _get(options); 37 | } else { 38 | callback(null, collection); 39 | } 40 | } 41 | }); 42 | }, config.throttle); 43 | }; 44 | _get(options); 45 | }; 46 | 47 | module.exports = helpers; 48 | -------------------------------------------------------------------------------- /lib/rubric.js: -------------------------------------------------------------------------------- 1 | const tiny = require('tiny-json-http'); 2 | const endpoint = require('./endpoint'); 3 | const helpers = require('./helpers'); 4 | const config = require('../config'); 5 | 6 | let rubric = {}; 7 | 8 | rubric.list = (course, params, callback) => { 9 | let options = { 10 | url: endpoint.rubric.list(course), 11 | headers: config.headers, 12 | data: params 13 | }; 14 | 15 | helpers.getAllResources(options, (error, results) => { 16 | if (error) { 17 | callback(error, null); 18 | } else { 19 | callback(null, results); 20 | } 21 | }); 22 | }; 23 | 24 | rubric.detail = (course, assignment, params, callback) => { 25 | let options = { 26 | url: endpoint.rubric.detail(course, assignment), 27 | headers: config.headers, 28 | data: params 29 | }; 30 | 31 | tiny.get(options, (error, results) => { 32 | if (error) { 33 | callback(error, null); 34 | } else { 35 | let detail = { 36 | assignment: { 37 | course_id: results.body.course_id, 38 | assignment_id: results.body.id, 39 | integration_data: results.body.integration_data, 40 | integration_id: results.body.integration_id 41 | }, 42 | rubric: results.body.rubric, 43 | rubric_settings: results.body.rubric_settings 44 | }; 45 | callback(null, detail); 46 | } 47 | }); 48 | }; 49 | 50 | module.exports = rubric; 51 | -------------------------------------------------------------------------------- /lib/sis.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const tiny = require('tiny-json-http'); 3 | const FormData = require('form-data'); 4 | const format = require('date-fns/format'); 5 | const endpoint = require('./endpoint'); 6 | const config = require('../config'); 7 | 8 | let sis = {}; 9 | 10 | sis.status = (scope, callback) => { 11 | if (scope === 'all') { scope = ''; } 12 | tiny.get({ 13 | url: `${endpoint.sis.imports()}${scope}`, 14 | headers: config.headers 15 | }, callback); 16 | }; 17 | 18 | sis.upload = (options, callback) => { 19 | var form = new FormData(); 20 | var contents = { 21 | method: 'POST', 22 | protocol: 'https:', 23 | host: `${config.domain}`, 24 | path: `${endpoint.sis.upload()}&diffing_drop_status=${config.diffing_drop_status || 'completed'}&diffing_data_set_identifier=${options.dataset}${format(new Date(), '_MMMM-YYYY').toLowerCase()}`, 25 | headers: config.headers 26 | }; 27 | form.append('attachment', fs.createReadStream(options.csv)); 28 | form.submit(contents, (err, res) => { 29 | var body = []; 30 | if (err) { return callback(err, null); } 31 | res.on('data', (data) => { 32 | body.push(data); 33 | }); 34 | res.on('end', () => { 35 | var error = null; 36 | var result = null; 37 | try { 38 | result = JSON.parse(Buffer.concat(body).toString()); 39 | } catch (e) { 40 | error = e; 41 | } 42 | callback(error, result); 43 | }); 44 | }); 45 | }; 46 | 47 | module.exports = sis; 48 | -------------------------------------------------------------------------------- /lib/endpoint.js: -------------------------------------------------------------------------------- 1 | const config = require('../config'); 2 | 3 | let _baseUrl = () => { 4 | return `https://${config.domain}/api/${config.apiVersion}`; 5 | }; 6 | 7 | module.exports = { 8 | base: () => { 9 | return _baseUrl(); 10 | }, 11 | sis: { 12 | imports: () => { 13 | return `${_baseUrl()}/accounts/self/sis_imports/`; 14 | }, 15 | upload: () => { 16 | return `/api/${config.apiVersion}/accounts/self/sis_imports.json?import_type=instructure_csv`; 17 | } 18 | }, 19 | course: { 20 | migrate: (destination) => { 21 | return `${_baseUrl()}/courses/${destination}/content_migrations`; 22 | }, 23 | discuss: (course) => { 24 | return `${_baseUrl()}/courses/${course}/discussion_topics`; 25 | } 26 | }, 27 | assignment: { 28 | create: (course) => { 29 | return `${_baseUrl()}/courses/${course}/assignments`; 30 | }, 31 | search: (course) => { 32 | return `${_baseUrl()}/courses/${course}/assignments`; 33 | }, 34 | modify: (course, assignment) => { 35 | return `${_baseUrl()}/courses/${course}/assignments/${assignment}`; 36 | } 37 | }, 38 | cmodule: { 39 | create: (course) => { 40 | return `${_baseUrl()}/courses/${course}/modules`; 41 | }, 42 | search: (course) => { 43 | return `${_baseUrl()}/courses/${course}/modules`; 44 | }, 45 | modify: (course, cmodule) => { 46 | return `${_baseUrl()}/courses/${course}/modules/${cmodule}`; 47 | } 48 | }, 49 | rubric: { 50 | list: (course) => { 51 | return `${_baseUrl()}/courses/${course}/rubrics`; 52 | }, 53 | detail: (course, assignment) => { 54 | return `${_baseUrl()}/courses/${course}/assignments/${assignment}`; 55 | } 56 | } 57 | }; 58 | -------------------------------------------------------------------------------- /tests/endpoint.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'); 2 | const endpoint = require('../lib/endpoint'); 3 | 4 | // Base URL 5 | test('Endpoints - Base URL', (t) => { 6 | t.plan(1); 7 | t.equal(typeof endpoint.base(), 'string'); 8 | }); 9 | 10 | // SIS 11 | test('Endpoints - SIS - Imports', (t) => { 12 | t.plan(1); 13 | t.equal(typeof endpoint.sis.imports(), 'string'); 14 | }); 15 | 16 | test('Endpoints - SIS - Upload', (t) => { 17 | t.plan(1); 18 | t.equal(typeof endpoint.sis.upload(), 'string'); 19 | }); 20 | 21 | // Course 22 | test('Endpoints - Course - Migrate', (t) => { 23 | t.plan(1); 24 | t.equal(typeof endpoint.course.migrate(123), 'string'); 25 | }); 26 | 27 | test('Endpoints - Course - Discuss', (t) => { 28 | t.plan(1); 29 | t.equal(typeof endpoint.course.discuss(123), 'string'); 30 | }); 31 | // Assignment 32 | test('Endpoints - Assignment - Create', (t) => { 33 | t.plan(1); 34 | t.equal(typeof endpoint.assignment.create(123), 'string'); 35 | }); 36 | 37 | test('Endpoints - Assignment - Modify', (t) => { 38 | t.plan(1); 39 | t.equal(typeof endpoint.assignment.modify(123, 45678), 'string'); 40 | }); 41 | 42 | test('Endpoints - Assignment - Search', (t) => { 43 | t.plan(1); 44 | t.equal(typeof endpoint.assignment.search(123, 45678), 'string'); 45 | }); 46 | 47 | 48 | // Assignment 49 | test('Endpoints - Modules - Create', (t) => { 50 | t.plan(1); 51 | t.equal(typeof endpoint.cmodule.create(123), 'string'); 52 | }); 53 | 54 | test('Endpoints - Modules- Modify', (t) => { 55 | t.plan(1); 56 | t.equal(typeof endpoint.cmodule.modify(123, 45678), 'string'); 57 | }); 58 | 59 | test('Endpoints - Modules - Search', (t) => { 60 | t.plan(1); 61 | t.equal(typeof endpoint.cmodule.search(123, 45678), 'string'); 62 | }); -------------------------------------------------------------------------------- /tests/rubric.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'); 2 | const rubric = require('../lib/rubric'); 3 | var nock = require('nock'); 4 | const config = require('../config'); 5 | 6 | // Dummy data used for Mocks 7 | let source = 1; 8 | let destination = 2; 9 | let id = 3; 10 | let courseid = 4; 11 | let assignmentid = 5; 12 | let nameresponse = 'Canvas API - Test Suite Assignment'; 13 | let res; 14 | 15 | let params = { 16 | data: { 17 | per_page: 100 18 | } 19 | }; 20 | // Mock http calls 21 | 22 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 23 | .get('/courses/'+courseid+'/rubrics') 24 | .query(true) 25 | .reply(200, { id: id }); 26 | 27 | 28 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 29 | .get('/courses/'+courseid+'/assignments/'+assignmentid) 30 | .query(true) 31 | .reply(200, { rubric_settings: { 32 | id: id}} 33 | ); 34 | 35 | 36 | /* 37 | 38 | rubric: { 39 | list: (course) => { 40 | return `${_baseUrl()}/courses/${course}/rubrics`; 41 | }, 42 | detail: (course, assignment) => { 43 | return `${_baseUrl()}/courses/${course}/assignments/${assignment}`; 44 | } 45 | 46 | */ 47 | 48 | 49 | 50 | test('Rubric - List', (t) => { 51 | t.plan(1); 52 | rubric.list(courseid, params, (error, results) => { 53 | if (error) { 54 | t.fail(error); 55 | } else { 56 | console.log(`${results.length} Rubrics returned.`); 57 | t.ok(typeof results[0].id, 'number'); 58 | } 59 | }); 60 | }); 61 | 62 | test('Rubric - Detail', (t) => { 63 | t.plan(1); 64 | rubric.detail(courseid, assignmentid, params, (error, results) => { 65 | if (error) { 66 | t.fail(error); 67 | } else { 68 | t.ok(typeof results.rubric_settings.id, 'number'); 69 | } 70 | }); 71 | }); 72 | -------------------------------------------------------------------------------- /tests/cmodule.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'); 2 | const dateFormat = require('dateformat'); 3 | const cmodule = require('../lib/module'); 4 | var nock = require('nock'); 5 | const config = require('../config'); 6 | 7 | // Dummy data used for Mocks 8 | let source = 1; 9 | let destination = 2; 10 | let id = 3; 11 | let courseid = 4; 12 | let cmoduleid = 5; 13 | let nameresponse = 'Canvas API - Test Suite Assignment'; 14 | let res; 15 | 16 | // Mock http calls 17 | 18 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 19 | .post('/courses/'+courseid+'/modules') 20 | .reply(200, { id: id }); 21 | 22 | 23 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 24 | .put('/courses/'+courseid+'/modules/'+cmoduleid) 25 | .reply(200, { name: nameresponse}); 26 | 27 | 28 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 29 | .get('/courses/'+courseid+'/modules/'+cmoduleid) 30 | .reply(200, { name: nameresponse}); 31 | 32 | 33 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 34 | .intercept('/courses/'+courseid+'/modules/'+cmoduleid,'DELETE') 35 | .reply(200, { id: id }); 36 | 37 | 38 | 39 | let now = new Date(); 40 | let createParams = { 41 | module: { 42 | name: 'Canvas API - Test Suite Module', 43 | } 44 | }; 45 | let editParams = { 46 | module: { 47 | name: 'Canvas API - Test Suite Module (Edited)', 48 | description: 'This is an example module generated by the canvas-api , which has now been edited.' 49 | } 50 | }; 51 | 52 | test('Assignment - Create', (t) => { 53 | t.plan(1); 54 | cmodule.create(courseid, createParams, (error, results) => { 55 | if (error) { 56 | t.fail(error.statusCode); 57 | } else { 58 | id = results.body.id; 59 | t.ok(typeof results.body.id, 'number'); 60 | } 61 | }); 62 | }); 63 | 64 | test('Assignment - Edit', (t) => { 65 | t.plan(1); 66 | cmodule.edit(courseid, cmoduleid, editParams, (error, results) => { 67 | if (error) { 68 | t.fail(error.statusCode); 69 | } else { 70 | t.ok(results.body.name, editParams.module.name); 71 | } 72 | }); 73 | }); 74 | 75 | test('Assignment - Get', (t) => { 76 | t.plan(1); 77 | cmodule.get(courseid, cmoduleid, (error, results) => { 78 | if (error) { 79 | t.fail(error.statusCode); 80 | } else { 81 | t.ok(results.body.name, editParams.module.name); 82 | } 83 | }); 84 | }); 85 | 86 | test('Assignment - Delete', (t) => { 87 | t.plan(1); 88 | cmodule.delete(courseid, cmoduleid, (error, results) => { 89 | if (error) { 90 | t.fail(error.statusCode); 91 | } else { 92 | t.ok(typeof results.body.id, id); 93 | } 94 | }); 95 | }); 96 | -------------------------------------------------------------------------------- /LEGACY.md: -------------------------------------------------------------------------------- 1 | # Legacy README 2 | 3 | ## Versions <= 2.0.0 4 | 5 | ### SIS Imports 6 | 7 | #### sis.status([config]) 8 | 9 | Return [SIS Import](https://canvas.instructure.com/doc/api/sis_imports.html#SisImport) status information. 10 | 11 | Available options for `config` are: 12 | 13 | ##### config.domain 14 | 15 | (Optional) Overrides the `CANVAS_API_DOMAIN` environment variable. 16 | 17 | ##### config.scope 18 | 19 | - If `latest` or if no `scope` is supplied, the latest SIS Import object will be returned. 20 | - If a SIS Import `id` is supplied, the SIS Import object with that id will be returned. 21 | - If `'all'` is supplied, all SIS Import objects will be returned. 22 | 23 | ###### Example 24 | 25 | ``` javascript 26 | canvas.sis.status({scope: 5}) 27 | .then(function (res) { 28 | // Log the SIS Import object with the ID of 5 to the console. 29 | console.log(res); 30 | }, function (err) { 31 | console.error(err); 32 | }); 33 | ``` 34 | 35 | #### sis.upload([config]) 36 | 37 | POSTs a CSV file to the SIS Import endpoint that is formatted to match Instructure's [SIS CSV Format](https://canvas.instructure.com/doc/api/file.sis_csv.html). Upon success, a [SIS Import](https://canvas.instructure.com/doc/api/sis_imports.html#SisImport) is returned. 38 | 39 | Available options for `config` are: 40 | 41 | ##### config.domain 42 | 43 | (Optional) Overrides the `CANVAS_API_DOMAIN` environment variable. 44 | 45 | ##### config.csv 46 | 47 | Must be a valid path to a CSV file, i.e. `'./csv/enrolments.csv'`. 48 | 49 | ##### config.dataset 50 | 51 | A string that is used to apply the `diffing_data_set_identifier` to the POST request, i.e. `'enrolments'`. 52 | 53 | ###### Example 54 | 55 | ``` javascript 56 | canvas.sis.upload({ 57 | csv: './csv/enrolments.csv', 58 | dataset: 'enrolments' 59 | }) 60 | .then(function (res) { 61 | // Log the SIS Import object returned by Canvas to the console. 62 | console.log(res); 63 | }, function (err) { 64 | console.error(err); 65 | }); 66 | ``` 67 | 68 | ### Course Migration 69 | 70 | #### migration.migrate([config]) 71 | 72 | Migrates the content of one course to another using the `course_copy_importer` migration type. 73 | 74 | Available options for `config` are: 75 | 76 | ##### config.domain 77 | 78 | (Optional) Overrides the `CANVAS_API_DOMAIN` environment variable. 79 | 80 | ##### config.from_id 81 | 82 | ID number of the course that will be copied _**from**_. 83 | 84 | ##### config.to_id 85 | 86 | ID number of the course that will be copied _**to**_. 87 | 88 | ###### Example 89 | 90 | ``` javascript 91 | canvas.migration.migrate({ 92 | from_id: 5, 93 | to_id: 42 94 | }) 95 | .then(function (res) { 96 | // Log the ContentMigration object returned by Canvas to the console. 97 | console.log(res); 98 | }, function (err) { 99 | console.error(err); 100 | }); 101 | ``` 102 | 103 | --- 104 | 105 | ## Breaking Changes 106 | 107 | ### > v1.0.3 108 | 109 | 110 | #### SIS Imports 111 | 112 | `sisStatus` and `sisUpload` are now subsumed into the `sis` object that this module exports. 113 | 114 | i.e. `sisStatus` becomes `sis.status` 115 | 116 | #### Authorization Keys 117 | 118 | The ability to override the authorization key has been removed in favour of keeping sensitive credentials like that stored as environment variables. 119 | -------------------------------------------------------------------------------- /tests/assignment.js: -------------------------------------------------------------------------------- 1 | const test = require('tape'); 2 | const dateFormat = require('dateformat'); 3 | const assignment = require('../lib/assignment'); 4 | var nock = require('nock'); 5 | const config = require('../config'); 6 | 7 | // Dummy data used for Mocks 8 | let source = 1; 9 | let destination = 2; 10 | let id = 3; 11 | let courseid = 4; 12 | let assignmentid = 5; 13 | let nameresponse = 'Canvas API - Test Suite Assignment'; 14 | let res; 15 | 16 | // Mock http calls 17 | 18 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 19 | .post('/courses/'+courseid+'/assignments') 20 | .reply(200, { id: id }); 21 | 22 | 23 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 24 | .put('/courses/'+courseid+'/assignments/'+assignmentid) 25 | .reply(200, { name: nameresponse}); 26 | 27 | 28 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 29 | .get('/courses/'+courseid+'/assignments/'+assignmentid) 30 | .reply(200, { name: nameresponse}); 31 | 32 | 33 | res = nock('https://'+config.domain+'/api/'+config.apiVersion) 34 | .intercept('/courses/'+courseid+'/assignments/'+assignmentid,'DELETE') 35 | .reply(200, { id: id }); 36 | 37 | 38 | 39 | let now = new Date(); 40 | let createParams = { 41 | assignment: { 42 | name: 'Canvas API - Test Suite Assignment', 43 | integration_id: 'EXAMPLE_ID_123', 44 | submission_types: 'online_text_entry', 45 | points_possible: 100, 46 | grading_type: 'points', 47 | due_at: dateFormat(now.setDate(now.getDate() + 7), 'isoUtcDateTime'), 48 | lock_at: dateFormat(now, 'isoUtcDateTime'), 49 | unlock_at: dateFormat(now.setDate(now.getDate() + 1), 'isoUtcDateTime'), 50 | description: '

This is an example assignment generated by the canvas-api module, which has now been edited.

For more information, please visit: https://www.npmjs.com/package/canvas-api

', 51 | muted: true, 52 | published: false 53 | } 54 | }; 55 | let editParams = { 56 | assignment: { 57 | name: 'Canvas API - Test Suite Assignment (Edited)', 58 | description: 'This is an example assignment generated by the canvas-api module, which has now been edited.' 59 | } 60 | }; 61 | 62 | test('Assignment - Create', (t) => { 63 | t.plan(1); 64 | assignment.create(courseid, createParams, (error, results) => { 65 | if (error) { 66 | t.fail(error.statusCode); 67 | } else { 68 | id = results.body.id; 69 | t.ok(typeof results.body.id, 'number'); 70 | } 71 | }); 72 | }); 73 | 74 | test('Assignment - Edit', (t) => { 75 | t.plan(1); 76 | assignment.edit(courseid, assignmentid, editParams, (error, results) => { 77 | if (error) { 78 | t.fail(error.statusCode); 79 | } else { 80 | t.ok(results.body.name, editParams.assignment.name); 81 | } 82 | }); 83 | }); 84 | 85 | test('Assignment - Get', (t) => { 86 | t.plan(1); 87 | assignment.get(courseid, assignmentid, (error, results) => { 88 | if (error) { 89 | t.fail(error.statusCode); 90 | } else { 91 | t.ok(results.body.name, editParams.assignment.name); 92 | } 93 | }); 94 | }); 95 | 96 | test('Assignment - Delete', (t) => { 97 | t.plan(1); 98 | assignment.delete(courseid, assignmentid, (error, results) => { 99 | if (error) { 100 | t.fail(error.statusCode); 101 | } else { 102 | t.ok(typeof results.body.id, id); 103 | } 104 | }); 105 | }); 106 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # :panda_face: canvas-api 2 | 3 | *A collection of helper methods for the [Canvas LMS](http://www.canvaslms.com/) API.* 4 | 5 | ## Installation 6 | 7 | ### Using [npm](https://www.npmjs.com/): 8 | 9 | `npm install canvas-api --save` 10 | 11 | ### Using [Yarn](https://yarnpkg.com/): 12 | 13 | `yarn add canvas-api` 14 | 15 | ## Configuration and Authorization 16 | 17 | `canvas-api` requires some credentials for authenticating with your organization's Canvas instance - an API key and the domain of your Canvas instance, as well as some operational settings. You can provide these credentials by setting the following environment variables accordingly: 18 | 19 | Environment Variable | Example | Description 20 | ---------------------------------|--------------------------------|--- 21 | `CANVAS_API_VERSION` | `v1` | API version 22 | `CANVAS_API_DIFFING_DROP_STATUS` | 'completed' | [Parameter for Import SIS Data endpoint](https://canvas.instructure.com/doc/api/sis_imports.html#method.sis_imports_api.create) 23 | `CANVAS_API_DOMAIN` | `organisation.instructure.com` | Your organisation's Canvas domain 24 | `CANVAS_API_KEY` | `secret` | Your API key 25 | `CANVAS_API_THROTTLE` | `1000` | Delay in `ms` between requests for `helpers.getAllResources()` 26 | 27 | ## Usage 28 | 29 | `require` the module in your node.js application and invoke methods accordingly. 30 | 31 | ```javascript 32 | const canvas = require('canvas-api'); 33 | ``` 34 | 35 | ## Methods 36 | 37 | ### Common Helpers 38 | 39 | #### `helpers.getAllResources(options, callback)` 40 | 41 | > Iterates over the pagination URLs returned by the Canvas API, captures the results from each iteration, and then returns an array of results once complete. 42 | 43 | Values for `options` are: 44 | 45 | ##### options.url 46 | 47 | **(Required)** API endpoint URL 48 | 49 | ##### options.data 50 | 51 | **(Optional)** Query string variables 52 | 53 | ##### Example: 54 | 55 | ```javascript 56 | let options = { 57 | url: `https://organisation.instructure.com/api/v1/accounts/1/courses`, 58 | data: { 59 | per_page: 100 60 | } 61 | }; 62 | 63 | canvas.helpers.getAllResources(options, (error, results) => { 64 | if (error) { 65 | console.error(error); 66 | // Error! 67 | } else { 68 | console.log(results); 69 | // [ results ... ] 70 | } 71 | }); 72 | ``` 73 | 74 | ### Courses 75 | 76 | #### `course.migrate(source, destination, callback)` 77 | 78 | > Migrates the content of one course to another using the `course_copy_importer` migration type. 79 | 80 | ##### source 81 | 82 | **(Required)** `course_id` of the course that will be copied **from**. 83 | 84 | ##### destination 85 | 86 | **(Required)** `course_id` of the course that will be copied **to**. 87 | 88 | ##### Example: 89 | 90 | ```javascript 91 | canvas.course.migrate(1, 110, (error, results) => { 92 | if (error) { 93 | console.error(error); 94 | // Error! 95 | } else { 96 | console.log(results.body); 97 | // { 98 | // id: 401, 99 | // ... 100 | // } 101 | } 102 | }); 103 | ``` 104 | 105 | 106 | #### `course.discuss(course, params, callback)` 107 | 108 | > Create a discussion topic in the desired course. 109 | 110 | `course` is the ID of the Canvas course that you wish to create the discussion topic in. 111 | 112 | `params` must be an object containing any of the parameters listed [here](https://canvas.instructure.com/doc/api/discussion_topics.html). nment[name]`. 113 | 114 | ##### Example: 115 | 116 | ```javascript 117 | var createParams = { 118 | title: ' This is the subject message title', 119 | message: 'This is a message' 120 | } 121 | }; 122 | 123 | course.discuss(123, createParams, (error, results) => { 124 | if (error) { 125 | // Error! 126 | } else { 127 | // [ results ... ] 128 | } 129 | }); 130 | ``` 131 | 132 | ### SIS Imports 133 | 134 | #### `sis.upload(options, callback)` 135 | 136 | > POSTs a CSV file to the SIS Import endpoint that is formatted to match Instructure's [SIS CSV Format](https://canvas.instructure.com/doc/api/file.sis_csv.html). Upon success, a [SIS Import](https://canvas.instructure.com/doc/api/sis_imports.html#SisImport) Object is returned. 137 | 138 | `options` should be an object containing the following information: 139 | 140 | Key | Required | Description | Example 141 | ----------|----------|--------------------------------|-------- 142 | `csv` | yes | Path to CSV | `'./path/to/file.csv'` 143 | `dataset` | yes | Dataset that is being imported | `'courses'` 144 | 145 | ##### Example: 146 | 147 | ```javascript 148 | canvas.sis.upload({ 149 | csv: './csv/courses.csv', 150 | dataset: 'courses' 151 | }, (error, results) => { 152 | if (error) { 153 | console.error(error); 154 | // Error! 155 | } else { 156 | console.log(results); 157 | // [ results ... ] 158 | } 159 | }); 160 | ``` 161 | 162 | #### `sis.status(scope, callback)` 163 | 164 | > Return [SIS Import](https://canvas.instructure.com/doc/api/sis_imports.html#SisImport) status information. 165 | 166 | `scope` can either be: 167 | 168 | - `'all'` - returns the latest `10` SIS Import objects. 169 | - `Number` - returns the SIS Import with the ID corresponding to the supplied `Number`. 170 | 171 | If `scope` is *not* supplied, the latest `10` SIS Import objects are returned. 172 | 173 | ##### Example: 174 | 175 | ```javascript 176 | canvas.sis.status(10, (error, results) => { 177 | if (error) { 178 | console.error(error); 179 | // Error! 180 | } else { 181 | console.log(results); 182 | // [ results ... ] 183 | } 184 | }); 185 | ``` 186 | 187 | ### Assignments 188 | 189 | #### `assignment.get(course, id, callback)` 190 | 191 | > Get an existing assignment by id in the desired course. 192 | 193 | `course` is the ID of the Canvas course that you wish to get the assignment from. 194 | 195 | `id` is the ID of the Assignment that you wish to get. 196 | 197 | ##### Example: 198 | 199 | ```javascript 200 | assignment.create(123, 1001, (error, results) => { 201 | if (error) { 202 | // Error! 203 | } else { 204 | // [ results ... ] 205 | } 206 | }); 207 | ``` 208 | 209 | #### `assignment.create(course, params, callback)` 210 | 211 | > Create an assignment in the desired course. 212 | 213 | `course` is the ID of the Canvas course that you wish to create the assignment in. 214 | 215 | `params` must be an object containing any of the parameters listed [here](https://canvas.instructure.com/doc/api/assignments.html#method.assignments_api.create). The only **required** parameter is `assignment[name]`. The object must be structured as shown in the example below: 216 | 217 | ##### Example: 218 | 219 | ```javascript 220 | var createParams = { 221 | assignment: { 222 | name: 'Assignment Name', 223 | points_possible: 100 224 | } 225 | }; 226 | 227 | assignment.create(123, createParams, (error, results) => { 228 | if (error) { 229 | // Error! 230 | } else { 231 | // [ results ... ] 232 | } 233 | }); 234 | ``` 235 | 236 | #### `assignment.edit(course, id, params, callback)` 237 | 238 | > Edit an existing assignment by ID in the desired course. 239 | 240 | `course` is the ID of the Canvas course that contains the assignment that you wish to edit. 241 | 242 | `id` is the ID of the assignment that you wish to edit. 243 | 244 | `params` must be an object containing any of the parameters listed [here](https://canvas.instructure.com/doc/api/assignments.html#method.assignments_api.update). The object must be structured as shown in the example below: 245 | 246 | ##### Example: 247 | 248 | ```javascript 249 | var editParams = { 250 | assignment: { 251 | name: 'Assignment Name (Edited)', 252 | points_possible: 50 253 | } 254 | }; 255 | 256 | assignment.edit(123, 4567, editParams, (error, results) => { 257 | if (error) { 258 | // Error! 259 | } else { 260 | // [ results ... ] 261 | } 262 | }); 263 | ``` 264 | 265 | #### `assignment.searchbyname(course, name, callback)` 266 | 267 | > Search for an existing assignment by name in the desired course. 268 | 269 | `course` is the ID of the Canvas course that contains the assignment that you wish to edit. 270 | 271 | `name` is the substring of the name of the assignment that you wish to find. 272 | 273 | ##### Example: 274 | 275 | ```javascript 276 | 277 | assignment.searchbyname(123, name, (error, results) => { 278 | if (error) { 279 | // Error! 280 | } else { 281 | // [ results ... ] 282 | } 283 | }); 284 | ``` 285 | 286 | #### `assignment.delete(course, id, callback)` 287 | 288 | > Delete an assignment in the desired course. 289 | 290 | `course` is the ID of the Canvas course that contains the assignment that you wish to delete. 291 | 292 | `id` is the ID of the assignment that you wish to delete. 293 | 294 | ##### Example: 295 | 296 | ```javascript 297 | assignment.delete(123, 4567, (error, results) => { 298 | if (error) { 299 | // Error! 300 | } else { 301 | // [ results ... ] 302 | } 303 | }); 304 | ``` 305 | 306 | 307 | ### Modules 308 | 309 | #### `cmodule.get(course, id, callback)` 310 | 311 | > Get an existing cmodule by id in the desired course. 312 | 313 | `course` is the ID of the Canvas course that you wish to get the cmodule from. 314 | 315 | `id` is the ID of the cmodule that you wish to get. 316 | 317 | ##### Example: 318 | 319 | ```javascript 320 | cmodule.create(123, 1001, (error, results) => { 321 | if (error) { 322 | // Error! 323 | } else { 324 | // [ results ... ] 325 | } 326 | }); 327 | ``` 328 | 329 | #### `cmodule.create(course, params, callback)` 330 | 331 | > Create an cmodule in the desired course. 332 | 333 | `course` is the ID of the Canvas course that you wish to create the cmodule in. 334 | 335 | `params` must be an object containing any of the parameters listed [here](https://canvas.instructure.com/doc/api/modules.html). 336 | 337 | ##### Example: 338 | 339 | ```javascript 340 | var createParams = { 341 | module: { 342 | name: 'cmodule Name' 343 | } 344 | }; 345 | 346 | cmodule.create(123, createParams, (error, results) => { 347 | if (error) { 348 | // Error! 349 | } else { 350 | // [ results ... ] 351 | } 352 | }); 353 | ``` 354 | 355 | #### `cmodule.edit(course, id, params, callback)` 356 | 357 | > Edit an existing cmodule by ID in the desired course. 358 | 359 | `course` is the ID of the Canvas course that contains the cmodule that you wish to edit. 360 | 361 | `id` is the ID of the cmodule that you wish to edit. 362 | 363 | `params` must be an object containing any of the parameters listed [here](https://canvas.instructure.com/doc/api/modules.html#method.modules_api.update). The object must be structured as shown in the example below: 364 | 365 | ##### Example: 366 | 367 | ```javascript 368 | var editParams = { 369 | module: { 370 | name: 'cmodule Name (Edited)' 371 | 372 | } 373 | }; 374 | 375 | cmodule.edit(123, 4567, editParams, (error, results) => { 376 | if (error) { 377 | // Error! 378 | } else { 379 | // [ results ... ] 380 | } 381 | }); 382 | ``` 383 | 384 | #### `cmodule.searchbyname(course, name, callback)` 385 | 386 | > Search for an existing cmodule by name in the desired course. 387 | 388 | `course` is the ID of the Canvas course that contains the cmodule that you wish to edit. 389 | 390 | `name` is the substring of the name of the cmodule that you wish to find. 391 | 392 | ##### Example: 393 | 394 | ```javascript 395 | 396 | cmodule.searchbyname(123, name, (error, results) => { 397 | if (error) { 398 | // Error! 399 | } else { 400 | // [ results ... ] 401 | } 402 | }); 403 | ``` 404 | 405 | #### `cmodule.delete(course, id, callback)` 406 | 407 | > Delete an cmodule in the desired course. 408 | 409 | `course` is the ID of the Canvas course that contains the cmodule that you wish to delete. 410 | 411 | `id` is the ID of the cmodule that you wish to delete. 412 | 413 | ##### Example: 414 | 415 | ```javascript 416 | cmodule.delete(123, 4567, (error, results) => { 417 | if (error) { 418 | // Error! 419 | } else { 420 | // [ results ... ] 421 | } 422 | }); 423 | ``` 424 | 425 | 426 | ### Rubrics 427 | 428 | #### `rubric.list(course, params, (callback)` 429 | 430 | > List rubrics used in the desired course. 431 | 432 | ##### Example: 433 | 434 | ```javascript 435 | var params = { 436 | data: { 437 | per_page: 100 438 | } 439 | }; 440 | 441 | rubric.list(123, params, (error, results) => { 442 | if (error) { 443 | // Error! 444 | } else { 445 | // [ results ... ] 446 | } 447 | }); 448 | ``` 449 | 450 | #### `rubric.detail(course, assignment, params, (callback)` 451 | 452 | > List rubric details for a desired assignment in a course. 453 | 454 | ##### Example: 455 | 456 | ```javascript 457 | var params = { 458 | data: { 459 | per_page: 100 460 | } 461 | }; 462 | 463 | rubric.detail(123, 4567, params, (error, results) => { 464 | if (error) { 465 | // Error! 466 | } else { 467 | // [ results ... ] 468 | } 469 | }); 470 | ``` 471 | 472 | ## Tests 473 | 474 | The `canvas-api` test suite requires some environment variables to be set: 475 | 476 | Environment Variable | Description | Example 477 | -------------------------------------|-------------|-------- 478 | CANVAS_API_TEST_MIGRATION_SRC_ID | `course_id` of the 'source' course to test Course Migration | `1` 479 | CANVAS_API_TEST_MIGRATION_DEST_ID | `course_id` of the 'destination' course to test Course Migration | `110` 480 | CANVAS_API_TEST_COURSE_ID | `course_id` of the course to use for creating, editing, deleting assignments | `123` 481 | CANVAS_API_TEST_RUBRIC_COURSE_ID | `course_id` of the course to use for getting Rubric detail | `123` 482 | CANVAS_API_TEST_RUBRIC_ASSIGNMENT_ID | `assignment_id` of the assignment to use for getting Rubric detail | `4567` 483 | 484 | The suite can be run by executing the `test` script contained in `package.json`: 485 | 486 | ### Using [npm](https://www.npmjs.com/): 487 | 488 | `npm run test` 489 | 490 | ### Using [Yarn](https://yarnpkg.com/): 491 | 492 | `yarn run test` 493 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: 6 | version "3.0.1" 7 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 8 | dependencies: 9 | acorn "^3.0.4" 10 | 11 | acorn@4.0.4: 12 | version "4.0.4" 13 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" 14 | 15 | acorn@^3.0.4: 16 | version "3.3.0" 17 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 18 | 19 | ajv-keywords@^1.0.0: 20 | version "1.2.0" 21 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.2.0.tgz#676c4f087bfe1e8b12dca6fda2f3c74f417b099c" 22 | 23 | ajv@^4.7.0: 24 | version "4.9.1" 25 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.9.1.tgz#08e1b0a5fddc8b844d28ca7b03510e78812ee3a0" 26 | dependencies: 27 | co "^4.6.0" 28 | json-stable-stringify "^1.0.1" 29 | 30 | ansi-escapes@^1.1.0: 31 | version "1.4.0" 32 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 33 | 34 | ansi-regex@^2.0.0: 35 | version "2.0.0" 36 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 37 | 38 | ansi-styles@^2.2.1: 39 | version "2.2.1" 40 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 41 | 42 | argparse@^1.0.7: 43 | version "1.0.9" 44 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 45 | dependencies: 46 | sprintf-js "~1.0.2" 47 | 48 | array-union@^1.0.1: 49 | version "1.0.2" 50 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 51 | dependencies: 52 | array-uniq "^1.0.1" 53 | 54 | array-uniq@^1.0.1: 55 | version "1.0.3" 56 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 57 | 58 | array.prototype.find@^2.0.1: 59 | version "2.0.3" 60 | resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.3.tgz#08c3ec33e32ec4bab362a2958e686ae92f59271d" 61 | dependencies: 62 | define-properties "^1.1.2" 63 | es-abstract "^1.7.0" 64 | 65 | arrify@^1.0.0: 66 | version "1.0.1" 67 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 68 | 69 | asynckit@^0.4.0: 70 | version "0.4.0" 71 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 72 | 73 | babel-code-frame@^6.16.0: 74 | version "6.16.0" 75 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" 76 | dependencies: 77 | chalk "^1.1.0" 78 | esutils "^2.0.2" 79 | js-tokens "^2.0.0" 80 | 81 | balanced-match@^0.4.1: 82 | version "0.4.2" 83 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 84 | 85 | brace-expansion@^1.0.0: 86 | version "1.1.6" 87 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 88 | dependencies: 89 | balanced-match "^0.4.1" 90 | concat-map "0.0.1" 91 | 92 | buffer-shims@^1.0.0: 93 | version "1.0.0" 94 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 95 | 96 | caller-path@^0.1.0: 97 | version "0.1.0" 98 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 99 | dependencies: 100 | callsites "^0.2.0" 101 | 102 | callsites@^0.2.0: 103 | version "0.2.0" 104 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 105 | 106 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: 107 | version "1.1.3" 108 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 109 | dependencies: 110 | ansi-styles "^2.2.1" 111 | escape-string-regexp "^1.0.2" 112 | has-ansi "^2.0.0" 113 | strip-ansi "^3.0.0" 114 | supports-color "^2.0.0" 115 | 116 | circular-json@^0.3.0: 117 | version "0.3.1" 118 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 119 | 120 | cli-cursor@^1.0.1: 121 | version "1.0.2" 122 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 123 | dependencies: 124 | restore-cursor "^1.0.1" 125 | 126 | cli-width@^2.0.0: 127 | version "2.1.0" 128 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 129 | 130 | co@^4.6.0: 131 | version "4.6.0" 132 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 133 | 134 | code-point-at@^1.0.0: 135 | version "1.1.0" 136 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 137 | 138 | combined-stream@^1.0.5: 139 | version "1.0.5" 140 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 141 | dependencies: 142 | delayed-stream "~1.0.0" 143 | 144 | concat-map@0.0.1: 145 | version "0.0.1" 146 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 147 | 148 | concat-stream@^1.4.6: 149 | version "1.5.2" 150 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" 151 | dependencies: 152 | inherits "~2.0.1" 153 | readable-stream "~2.0.0" 154 | typedarray "~0.0.5" 155 | 156 | core-util-is@~1.0.0: 157 | version "1.0.2" 158 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 159 | 160 | d@^0.1.1, d@~0.1.1: 161 | version "0.1.1" 162 | resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" 163 | dependencies: 164 | es5-ext "~0.10.2" 165 | 166 | date-fns@1.28.0: 167 | version "1.28.0" 168 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.0.tgz#3b12f54b66467807bb95e5930caf7bfb4170bc1a" 169 | 170 | dateformat@2.0.0: 171 | version "2.0.0" 172 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" 173 | 174 | debug-log@^1.0.0: 175 | version "1.0.1" 176 | resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" 177 | 178 | debug@^2.1.1: 179 | version "2.3.3" 180 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" 181 | dependencies: 182 | ms "0.7.2" 183 | 184 | deep-equal@~1.0.1: 185 | version "1.0.1" 186 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 187 | 188 | deep-is@~0.1.3: 189 | version "0.1.3" 190 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 191 | 192 | define-properties@^1.1.2: 193 | version "1.1.2" 194 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 195 | dependencies: 196 | foreach "^2.0.5" 197 | object-keys "^1.0.8" 198 | 199 | defined@~1.0.0: 200 | version "1.0.0" 201 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 202 | 203 | deglob@^2.1.0: 204 | version "2.1.0" 205 | resolved "https://registry.yarnpkg.com/deglob/-/deglob-2.1.0.tgz#4d44abe16ef32c779b4972bd141a80325029a14a" 206 | dependencies: 207 | find-root "^1.0.0" 208 | glob "^7.0.5" 209 | ignore "^3.0.9" 210 | pkg-config "^1.1.0" 211 | run-parallel "^1.1.2" 212 | uniq "^1.0.1" 213 | 214 | del@^2.0.2: 215 | version "2.2.2" 216 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 217 | dependencies: 218 | globby "^5.0.0" 219 | is-path-cwd "^1.0.0" 220 | is-path-in-cwd "^1.0.0" 221 | object-assign "^4.0.1" 222 | pify "^2.0.0" 223 | pinkie-promise "^2.0.0" 224 | rimraf "^2.2.8" 225 | 226 | delayed-stream@~1.0.0: 227 | version "1.0.0" 228 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 229 | 230 | doctrine@^1.2.2: 231 | version "1.5.0" 232 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 233 | dependencies: 234 | esutils "^2.0.2" 235 | isarray "^1.0.0" 236 | 237 | duplexer@^0.1.1: 238 | version "0.1.1" 239 | resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" 240 | 241 | error-ex@^1.2.0: 242 | version "1.3.1" 243 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 244 | dependencies: 245 | is-arrayish "^0.2.1" 246 | 247 | es-abstract@^1.5.0, es-abstract@^1.7.0: 248 | version "1.7.0" 249 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" 250 | dependencies: 251 | es-to-primitive "^1.1.1" 252 | function-bind "^1.1.0" 253 | is-callable "^1.1.3" 254 | is-regex "^1.0.3" 255 | 256 | es-to-primitive@^1.1.1: 257 | version "1.1.1" 258 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 259 | dependencies: 260 | is-callable "^1.1.1" 261 | is-date-object "^1.0.1" 262 | is-symbol "^1.0.1" 263 | 264 | es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: 265 | version "0.10.12" 266 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" 267 | dependencies: 268 | es6-iterator "2" 269 | es6-symbol "~3.1" 270 | 271 | es6-iterator@2: 272 | version "2.0.0" 273 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" 274 | dependencies: 275 | d "^0.1.1" 276 | es5-ext "^0.10.7" 277 | es6-symbol "3" 278 | 279 | es6-map@^0.1.3: 280 | version "0.1.4" 281 | resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" 282 | dependencies: 283 | d "~0.1.1" 284 | es5-ext "~0.10.11" 285 | es6-iterator "2" 286 | es6-set "~0.1.3" 287 | es6-symbol "~3.1.0" 288 | event-emitter "~0.3.4" 289 | 290 | es6-set@~0.1.3: 291 | version "0.1.4" 292 | resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" 293 | dependencies: 294 | d "~0.1.1" 295 | es5-ext "~0.10.11" 296 | es6-iterator "2" 297 | es6-symbol "3" 298 | event-emitter "~0.3.4" 299 | 300 | es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: 301 | version "3.1.0" 302 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" 303 | dependencies: 304 | d "~0.1.1" 305 | es5-ext "~0.10.11" 306 | 307 | es6-weak-map@^2.0.1: 308 | version "2.0.1" 309 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" 310 | dependencies: 311 | d "^0.1.1" 312 | es5-ext "^0.10.8" 313 | es6-iterator "2" 314 | es6-symbol "3" 315 | 316 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 317 | version "1.0.5" 318 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 319 | 320 | escope@^3.6.0: 321 | version "3.6.0" 322 | resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" 323 | dependencies: 324 | es6-map "^0.1.3" 325 | es6-weak-map "^2.0.1" 326 | esrecurse "^4.1.0" 327 | estraverse "^4.1.1" 328 | 329 | eslint-config-semistandard@8.0.0: 330 | version "8.0.0" 331 | resolved "https://registry.yarnpkg.com/eslint-config-semistandard/-/eslint-config-semistandard-8.0.0.tgz#fb8239379a1dcc114cde7a7dcbbc80beea3334b0" 332 | 333 | eslint-config-standard-jsx@3.3.0: 334 | version "3.3.0" 335 | resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-3.3.0.tgz#cab0801a15a360bf63facb97ab22fbdd88d8a5e0" 336 | 337 | eslint-config-standard@7.0.0: 338 | version "7.0.0" 339 | resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-7.0.0.tgz#4f161bc65695e4bc61331c55b9eeaca458cd99c6" 340 | 341 | eslint-plugin-promise@~3.4.0: 342 | version "3.4.0" 343 | resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.4.0.tgz#6ba9048c2df57be77d036e0c68918bc9b4fc4195" 344 | 345 | eslint-plugin-react@~6.9.0: 346 | version "6.9.0" 347 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.9.0.tgz#54c2e9906b76f9d10142030bdc34e9d6840a0bb2" 348 | dependencies: 349 | array.prototype.find "^2.0.1" 350 | doctrine "^1.2.2" 351 | jsx-ast-utils "^1.3.4" 352 | 353 | eslint-plugin-standard@~2.0.1: 354 | version "2.0.1" 355 | resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz#3589699ff9c917f2c25f76a916687f641c369ff3" 356 | 357 | eslint@~3.15.0: 358 | version "3.15.0" 359 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.15.0.tgz#bdcc6a6c5ffe08160e7b93c066695362a91e30f2" 360 | dependencies: 361 | babel-code-frame "^6.16.0" 362 | chalk "^1.1.3" 363 | concat-stream "^1.4.6" 364 | debug "^2.1.1" 365 | doctrine "^1.2.2" 366 | escope "^3.6.0" 367 | espree "^3.4.0" 368 | estraverse "^4.2.0" 369 | esutils "^2.0.2" 370 | file-entry-cache "^2.0.0" 371 | glob "^7.0.3" 372 | globals "^9.14.0" 373 | ignore "^3.2.0" 374 | imurmurhash "^0.1.4" 375 | inquirer "^0.12.0" 376 | is-my-json-valid "^2.10.0" 377 | is-resolvable "^1.0.0" 378 | js-yaml "^3.5.1" 379 | json-stable-stringify "^1.0.0" 380 | levn "^0.3.0" 381 | lodash "^4.0.0" 382 | mkdirp "^0.5.0" 383 | natural-compare "^1.4.0" 384 | optionator "^0.8.2" 385 | path-is-inside "^1.0.1" 386 | pluralize "^1.2.1" 387 | progress "^1.1.8" 388 | require-uncached "^1.0.2" 389 | shelljs "^0.7.5" 390 | strip-bom "^3.0.0" 391 | strip-json-comments "~2.0.1" 392 | table "^3.7.8" 393 | text-table "~0.2.0" 394 | user-home "^2.0.0" 395 | 396 | espree@^3.4.0: 397 | version "3.4.0" 398 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.0.tgz#41656fa5628e042878025ef467e78f125cb86e1d" 399 | dependencies: 400 | acorn "4.0.4" 401 | acorn-jsx "^3.0.0" 402 | 403 | esprima@^2.6.0: 404 | version "2.7.3" 405 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 406 | 407 | esrecurse@^4.1.0: 408 | version "4.1.0" 409 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" 410 | dependencies: 411 | estraverse "~4.1.0" 412 | object-assign "^4.0.1" 413 | 414 | estraverse@^4.1.1, estraverse@^4.2.0: 415 | version "4.2.0" 416 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 417 | 418 | estraverse@~4.1.0: 419 | version "4.1.1" 420 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" 421 | 422 | esutils@^2.0.2: 423 | version "2.0.2" 424 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 425 | 426 | event-emitter@~0.3.4: 427 | version "0.3.4" 428 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" 429 | dependencies: 430 | d "~0.1.1" 431 | es5-ext "~0.10.7" 432 | 433 | exit-hook@^1.0.0: 434 | version "1.1.1" 435 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 436 | 437 | fast-levenshtein@~2.0.4: 438 | version "2.0.5" 439 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" 440 | 441 | figures@^1.3.5, figures@^1.4.0: 442 | version "1.7.0" 443 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 444 | dependencies: 445 | escape-string-regexp "^1.0.5" 446 | object-assign "^4.1.0" 447 | 448 | file-entry-cache@^2.0.0: 449 | version "2.0.0" 450 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 451 | dependencies: 452 | flat-cache "^1.2.1" 453 | object-assign "^4.0.1" 454 | 455 | find-root@^1.0.0: 456 | version "1.0.0" 457 | resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.0.0.tgz#962ff211aab25c6520feeeb8d6287f8f6e95807a" 458 | 459 | find-up@^2.0.0: 460 | version "2.1.0" 461 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 462 | dependencies: 463 | locate-path "^2.0.0" 464 | 465 | flat-cache@^1.2.1: 466 | version "1.2.1" 467 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" 468 | dependencies: 469 | circular-json "^0.3.0" 470 | del "^2.0.2" 471 | graceful-fs "^4.1.2" 472 | write "^0.2.1" 473 | 474 | for-each@~0.3.2: 475 | version "0.3.2" 476 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" 477 | dependencies: 478 | is-function "~1.0.0" 479 | 480 | foreach@^2.0.5: 481 | version "2.0.5" 482 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 483 | 484 | form-data@2.1.2: 485 | version "2.1.2" 486 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" 487 | dependencies: 488 | asynckit "^0.4.0" 489 | combined-stream "^1.0.5" 490 | mime-types "^2.1.12" 491 | 492 | fs.realpath@^1.0.0: 493 | version "1.0.0" 494 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 495 | 496 | function-bind@^1.0.2, function-bind@^1.1.0, function-bind@~1.1.0: 497 | version "1.1.0" 498 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 499 | 500 | generate-function@^2.0.0: 501 | version "2.0.0" 502 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 503 | 504 | generate-object-property@^1.1.0: 505 | version "1.2.0" 506 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 507 | dependencies: 508 | is-property "^1.0.0" 509 | 510 | get-stdin@^5.0.1: 511 | version "5.0.1" 512 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" 513 | 514 | glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1: 515 | version "7.1.1" 516 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 517 | dependencies: 518 | fs.realpath "^1.0.0" 519 | inflight "^1.0.4" 520 | inherits "2" 521 | minimatch "^3.0.2" 522 | once "^1.3.0" 523 | path-is-absolute "^1.0.0" 524 | 525 | globals@^9.14.0: 526 | version "9.16.0" 527 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.16.0.tgz#63e903658171ec2d9f51b1d31de5e2b8dc01fb80" 528 | 529 | globby@^5.0.0: 530 | version "5.0.0" 531 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 532 | dependencies: 533 | array-union "^1.0.1" 534 | arrify "^1.0.0" 535 | glob "^7.0.3" 536 | object-assign "^4.0.1" 537 | pify "^2.0.0" 538 | pinkie-promise "^2.0.0" 539 | 540 | graceful-fs@^4.1.2: 541 | version "4.1.11" 542 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 543 | 544 | has-ansi@^2.0.0: 545 | version "2.0.0" 546 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 547 | dependencies: 548 | ansi-regex "^2.0.0" 549 | 550 | has@~1.0.1: 551 | version "1.0.1" 552 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 553 | dependencies: 554 | function-bind "^1.0.2" 555 | 556 | home-or-tmp@^2.0.0: 557 | version "2.0.0" 558 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 559 | dependencies: 560 | os-homedir "^1.0.0" 561 | os-tmpdir "^1.0.1" 562 | 563 | ignore@^3.0.9, ignore@^3.2.0: 564 | version "3.2.0" 565 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" 566 | 567 | imurmurhash@^0.1.4: 568 | version "0.1.4" 569 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 570 | 571 | inflight@^1.0.4: 572 | version "1.0.6" 573 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 574 | dependencies: 575 | once "^1.3.0" 576 | wrappy "1" 577 | 578 | inherits@2, inherits@~2.0.1, inherits@~2.0.3: 579 | version "2.0.3" 580 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 581 | 582 | inquirer@^0.12.0: 583 | version "0.12.0" 584 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" 585 | dependencies: 586 | ansi-escapes "^1.1.0" 587 | ansi-regex "^2.0.0" 588 | chalk "^1.0.0" 589 | cli-cursor "^1.0.1" 590 | cli-width "^2.0.0" 591 | figures "^1.3.5" 592 | lodash "^4.3.0" 593 | readline2 "^1.0.1" 594 | run-async "^0.1.0" 595 | rx-lite "^3.1.2" 596 | string-width "^1.0.1" 597 | strip-ansi "^3.0.0" 598 | through "^2.3.6" 599 | 600 | interpret@^1.0.0: 601 | version "1.0.1" 602 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" 603 | 604 | is-arrayish@^0.2.1: 605 | version "0.2.1" 606 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 607 | 608 | is-callable@^1.1.1, is-callable@^1.1.3: 609 | version "1.1.3" 610 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 611 | 612 | is-date-object@^1.0.1: 613 | version "1.0.1" 614 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 615 | 616 | is-finite@^1.0.1: 617 | version "1.0.2" 618 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 619 | dependencies: 620 | number-is-nan "^1.0.0" 621 | 622 | is-fullwidth-code-point@^1.0.0: 623 | version "1.0.0" 624 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 625 | dependencies: 626 | number-is-nan "^1.0.0" 627 | 628 | is-fullwidth-code-point@^2.0.0: 629 | version "2.0.0" 630 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 631 | 632 | is-function@~1.0.0: 633 | version "1.0.1" 634 | resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" 635 | 636 | is-my-json-valid@^2.10.0: 637 | version "2.15.0" 638 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 639 | dependencies: 640 | generate-function "^2.0.0" 641 | generate-object-property "^1.1.0" 642 | jsonpointer "^4.0.0" 643 | xtend "^4.0.0" 644 | 645 | is-path-cwd@^1.0.0: 646 | version "1.0.0" 647 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 648 | 649 | is-path-in-cwd@^1.0.0: 650 | version "1.0.0" 651 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 652 | dependencies: 653 | is-path-inside "^1.0.0" 654 | 655 | is-path-inside@^1.0.0: 656 | version "1.0.0" 657 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 658 | dependencies: 659 | path-is-inside "^1.0.1" 660 | 661 | is-property@^1.0.0: 662 | version "1.0.2" 663 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 664 | 665 | is-regex@^1.0.3: 666 | version "1.0.3" 667 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.3.tgz#0d55182bddf9f2fde278220aec3a75642c908637" 668 | 669 | is-resolvable@^1.0.0: 670 | version "1.0.0" 671 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 672 | dependencies: 673 | tryit "^1.0.1" 674 | 675 | is-symbol@^1.0.1: 676 | version "1.0.1" 677 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 678 | 679 | isarray@^1.0.0, isarray@~1.0.0: 680 | version "1.0.0" 681 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 682 | 683 | js-tokens@^2.0.0: 684 | version "2.0.0" 685 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" 686 | 687 | js-yaml@^3.5.1: 688 | version "3.7.0" 689 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 690 | dependencies: 691 | argparse "^1.0.7" 692 | esprima "^2.6.0" 693 | 694 | json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: 695 | version "1.0.1" 696 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 697 | dependencies: 698 | jsonify "~0.0.0" 699 | 700 | jsonify@~0.0.0: 701 | version "0.0.0" 702 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 703 | 704 | jsonpointer@^4.0.0: 705 | version "4.0.0" 706 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" 707 | 708 | jsx-ast-utils@^1.3.4: 709 | version "1.3.4" 710 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.3.4.tgz#0257ed1cc4b1e65b39d7d9940f9fb4f20f7ba0a9" 711 | dependencies: 712 | acorn-jsx "^3.0.1" 713 | object-assign "^4.1.0" 714 | 715 | levn@^0.3.0, levn@~0.3.0: 716 | version "0.3.0" 717 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 718 | dependencies: 719 | prelude-ls "~1.1.2" 720 | type-check "~0.3.2" 721 | 722 | load-json-file@^2.0.0: 723 | version "2.0.0" 724 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 725 | dependencies: 726 | graceful-fs "^4.1.2" 727 | parse-json "^2.2.0" 728 | pify "^2.0.0" 729 | strip-bom "^3.0.0" 730 | 731 | locate-path@^2.0.0: 732 | version "2.0.0" 733 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 734 | dependencies: 735 | p-locate "^2.0.0" 736 | path-exists "^3.0.0" 737 | 738 | lodash@^3.6.0: 739 | version "3.10.1" 740 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" 741 | 742 | lodash@^4.0.0, lodash@^4.3.0: 743 | version "4.17.2" 744 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" 745 | 746 | mime-db@~1.25.0: 747 | version "1.25.0" 748 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" 749 | 750 | mime-types@^2.1.12: 751 | version "2.1.13" 752 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" 753 | dependencies: 754 | mime-db "~1.25.0" 755 | 756 | minimatch@^3.0.2: 757 | version "3.0.3" 758 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 759 | dependencies: 760 | brace-expansion "^1.0.0" 761 | 762 | minimist@0.0.8: 763 | version "0.0.8" 764 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 765 | 766 | minimist@^1.1.0, minimist@~1.2.0: 767 | version "1.2.0" 768 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 769 | 770 | mkdirp@^0.5.0, mkdirp@^0.5.1: 771 | version "0.5.1" 772 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 773 | dependencies: 774 | minimist "0.0.8" 775 | 776 | ms@0.7.2: 777 | version "0.7.2" 778 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 779 | 780 | mute-stream@0.0.5: 781 | version "0.0.5" 782 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" 783 | 784 | natural-compare@^1.4.0: 785 | version "1.4.0" 786 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 787 | 788 | number-is-nan@^1.0.0: 789 | version "1.0.1" 790 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 791 | 792 | object-assign@^4.0.1, object-assign@^4.1.0: 793 | version "4.1.0" 794 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 795 | 796 | object-inspect@~1.2.1: 797 | version "1.2.1" 798 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.2.1.tgz#3b62226eb8f6d441751c7d8f22a20ff80ac9dc3f" 799 | 800 | object-keys@^1.0.8: 801 | version "1.0.11" 802 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 803 | 804 | once@^1.3.0: 805 | version "1.4.0" 806 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 807 | dependencies: 808 | wrappy "1" 809 | 810 | onetime@^1.0.0: 811 | version "1.1.0" 812 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 813 | 814 | optionator@^0.8.2: 815 | version "0.8.2" 816 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 817 | dependencies: 818 | deep-is "~0.1.3" 819 | fast-levenshtein "~2.0.4" 820 | levn "~0.3.0" 821 | prelude-ls "~1.1.2" 822 | type-check "~0.3.2" 823 | wordwrap "~1.0.0" 824 | 825 | os-homedir@^1.0.0: 826 | version "1.0.2" 827 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 828 | 829 | os-tmpdir@^1.0.1: 830 | version "1.0.2" 831 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 832 | 833 | p-limit@^1.1.0: 834 | version "1.1.0" 835 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" 836 | 837 | p-locate@^2.0.0: 838 | version "2.0.0" 839 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 840 | dependencies: 841 | p-limit "^1.1.0" 842 | 843 | parse-json@^2.2.0: 844 | version "2.2.0" 845 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 846 | dependencies: 847 | error-ex "^1.2.0" 848 | 849 | parse-link-header@0.4.1: 850 | version "0.4.1" 851 | resolved "https://registry.yarnpkg.com/parse-link-header/-/parse-link-header-0.4.1.tgz#f6bd615dc6713fd40935ce97945e4d3f522edf14" 852 | dependencies: 853 | xtend "~4.0.0" 854 | 855 | parse-ms@^1.0.0: 856 | version "1.0.1" 857 | resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" 858 | 859 | path-exists@^3.0.0: 860 | version "3.0.0" 861 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 862 | 863 | path-is-absolute@^1.0.0: 864 | version "1.0.1" 865 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 866 | 867 | path-is-inside@^1.0.1: 868 | version "1.0.2" 869 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 870 | 871 | pify@^2.0.0: 872 | version "2.3.0" 873 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 874 | 875 | pinkie-promise@^2.0.0: 876 | version "2.0.1" 877 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 878 | dependencies: 879 | pinkie "^2.0.0" 880 | 881 | pinkie@^2.0.0: 882 | version "2.0.4" 883 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 884 | 885 | pkg-conf@^2.0.0: 886 | version "2.0.0" 887 | resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.0.0.tgz#071c87650403bccfb9c627f58751bfe47c067279" 888 | dependencies: 889 | find-up "^2.0.0" 890 | load-json-file "^2.0.0" 891 | 892 | pkg-config@^1.1.0: 893 | version "1.1.1" 894 | resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" 895 | dependencies: 896 | debug-log "^1.0.0" 897 | find-root "^1.0.0" 898 | xtend "^4.0.1" 899 | 900 | plur@^1.0.0: 901 | version "1.0.0" 902 | resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" 903 | 904 | pluralize@^1.2.1: 905 | version "1.2.1" 906 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" 907 | 908 | prelude-ls@~1.1.2: 909 | version "1.1.2" 910 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 911 | 912 | pretty-ms@^2.1.0: 913 | version "2.1.0" 914 | resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" 915 | dependencies: 916 | is-finite "^1.0.1" 917 | parse-ms "^1.0.0" 918 | plur "^1.0.0" 919 | 920 | process-nextick-args@~1.0.6: 921 | version "1.0.7" 922 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 923 | 924 | progress@^1.1.8: 925 | version "1.1.8" 926 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 927 | 928 | re-emitter@^1.0.0: 929 | version "1.1.3" 930 | resolved "https://registry.yarnpkg.com/re-emitter/-/re-emitter-1.1.3.tgz#fa9e319ffdeeeb35b27296ef0f3d374dac2f52a7" 931 | 932 | readable-stream@^2.0.0, readable-stream@~2.0.0: 933 | version "2.0.6" 934 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" 935 | dependencies: 936 | core-util-is "~1.0.0" 937 | inherits "~2.0.1" 938 | isarray "~1.0.0" 939 | process-nextick-args "~1.0.6" 940 | string_decoder "~0.10.x" 941 | util-deprecate "~1.0.1" 942 | 943 | readable-stream@^2.1.5: 944 | version "2.2.3" 945 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.3.tgz#9cf49463985df016c8ae8813097a9293a9b33729" 946 | dependencies: 947 | buffer-shims "^1.0.0" 948 | core-util-is "~1.0.0" 949 | inherits "~2.0.1" 950 | isarray "~1.0.0" 951 | process-nextick-args "~1.0.6" 952 | string_decoder "~0.10.x" 953 | util-deprecate "~1.0.1" 954 | 955 | readline2@^1.0.1: 956 | version "1.0.1" 957 | resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" 958 | dependencies: 959 | code-point-at "^1.0.0" 960 | is-fullwidth-code-point "^1.0.0" 961 | mute-stream "0.0.5" 962 | 963 | rechoir@^0.6.2: 964 | version "0.6.2" 965 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 966 | dependencies: 967 | resolve "^1.1.6" 968 | 969 | repeat-string@^1.5.2: 970 | version "1.6.1" 971 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 972 | 973 | require-uncached@^1.0.2: 974 | version "1.0.3" 975 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 976 | dependencies: 977 | caller-path "^0.1.0" 978 | resolve-from "^1.0.0" 979 | 980 | resolve-from@^1.0.0: 981 | version "1.0.1" 982 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 983 | 984 | resolve@^1.1.6, resolve@~1.1.7: 985 | version "1.1.7" 986 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 987 | 988 | restore-cursor@^1.0.1: 989 | version "1.0.1" 990 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 991 | dependencies: 992 | exit-hook "^1.0.0" 993 | onetime "^1.0.0" 994 | 995 | resumer@~0.0.0: 996 | version "0.0.0" 997 | resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" 998 | dependencies: 999 | through "~2.3.4" 1000 | 1001 | rimraf@^2.2.8: 1002 | version "2.5.4" 1003 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 1004 | dependencies: 1005 | glob "^7.0.5" 1006 | 1007 | run-async@^0.1.0: 1008 | version "0.1.0" 1009 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" 1010 | dependencies: 1011 | once "^1.3.0" 1012 | 1013 | run-parallel@^1.1.2: 1014 | version "1.1.6" 1015 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.6.tgz#29003c9a2163e01e2d2dfc90575f2c6c1d61a039" 1016 | 1017 | rx-lite@^3.1.2: 1018 | version "3.1.2" 1019 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" 1020 | 1021 | semistandard@10.0.0: 1022 | version "10.0.0" 1023 | resolved "https://registry.yarnpkg.com/semistandard/-/semistandard-10.0.0.tgz#d6894f7673b9b737c262dca94cadf35e8392dde9" 1024 | dependencies: 1025 | eslint "~3.15.0" 1026 | eslint-config-semistandard "8.0.0" 1027 | eslint-config-standard "7.0.0" 1028 | eslint-config-standard-jsx "3.3.0" 1029 | eslint-plugin-promise "~3.4.0" 1030 | eslint-plugin-react "~6.9.0" 1031 | eslint-plugin-standard "~2.0.1" 1032 | standard-engine "~5.4.0" 1033 | 1034 | shelljs@^0.7.5: 1035 | version "0.7.5" 1036 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.5.tgz#2eef7a50a21e1ccf37da00df767ec69e30ad0675" 1037 | dependencies: 1038 | glob "^7.0.0" 1039 | interpret "^1.0.0" 1040 | rechoir "^0.6.2" 1041 | 1042 | slice-ansi@0.0.4: 1043 | version "0.0.4" 1044 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 1045 | 1046 | split@^1.0.0: 1047 | version "1.0.0" 1048 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" 1049 | dependencies: 1050 | through "2" 1051 | 1052 | sprintf-js@~1.0.2: 1053 | version "1.0.3" 1054 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1055 | 1056 | standard-engine@~5.4.0: 1057 | version "5.4.0" 1058 | resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-5.4.0.tgz#e0e86959ea0786425d3383e40c1bf70d2f985579" 1059 | dependencies: 1060 | deglob "^2.1.0" 1061 | get-stdin "^5.0.1" 1062 | home-or-tmp "^2.0.0" 1063 | minimist "^1.1.0" 1064 | pkg-conf "^2.0.0" 1065 | 1066 | string-width@^1.0.1: 1067 | version "1.0.2" 1068 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1069 | dependencies: 1070 | code-point-at "^1.0.0" 1071 | is-fullwidth-code-point "^1.0.0" 1072 | strip-ansi "^3.0.0" 1073 | 1074 | string-width@^2.0.0: 1075 | version "2.0.0" 1076 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 1077 | dependencies: 1078 | is-fullwidth-code-point "^2.0.0" 1079 | strip-ansi "^3.0.0" 1080 | 1081 | string.prototype.trim@~1.1.2: 1082 | version "1.1.2" 1083 | resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" 1084 | dependencies: 1085 | define-properties "^1.1.2" 1086 | es-abstract "^1.5.0" 1087 | function-bind "^1.0.2" 1088 | 1089 | string_decoder@~0.10.x: 1090 | version "0.10.31" 1091 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1092 | 1093 | strip-ansi@^3.0.0: 1094 | version "3.0.1" 1095 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1096 | dependencies: 1097 | ansi-regex "^2.0.0" 1098 | 1099 | strip-bom@^3.0.0: 1100 | version "3.0.0" 1101 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1102 | 1103 | strip-json-comments@~2.0.1: 1104 | version "2.0.1" 1105 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1106 | 1107 | supports-color@^2.0.0: 1108 | version "2.0.0" 1109 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1110 | 1111 | table@^3.7.8: 1112 | version "3.8.3" 1113 | resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" 1114 | dependencies: 1115 | ajv "^4.7.0" 1116 | ajv-keywords "^1.0.0" 1117 | chalk "^1.1.1" 1118 | lodash "^4.0.0" 1119 | slice-ansi "0.0.4" 1120 | string-width "^2.0.0" 1121 | 1122 | tap-out@^1.4.1: 1123 | version "1.4.2" 1124 | resolved "https://registry.yarnpkg.com/tap-out/-/tap-out-1.4.2.tgz#c907ec1bf9405111d088263e92f5608b88cbb37a" 1125 | dependencies: 1126 | re-emitter "^1.0.0" 1127 | readable-stream "^2.0.0" 1128 | split "^1.0.0" 1129 | trim "0.0.1" 1130 | 1131 | tap-spec@^4.1.1: 1132 | version "4.1.1" 1133 | resolved "https://registry.yarnpkg.com/tap-spec/-/tap-spec-4.1.1.tgz#e2e9f26f5208232b1f562288c97624d58a88f05a" 1134 | dependencies: 1135 | chalk "^1.0.0" 1136 | duplexer "^0.1.1" 1137 | figures "^1.4.0" 1138 | lodash "^3.6.0" 1139 | pretty-ms "^2.1.0" 1140 | repeat-string "^1.5.2" 1141 | tap-out "^1.4.1" 1142 | through2 "^2.0.0" 1143 | 1144 | tape@4.6.3: 1145 | version "4.6.3" 1146 | resolved "https://registry.yarnpkg.com/tape/-/tape-4.6.3.tgz#637e77581e9ab2ce17577e9bd4ce4f575806d8b6" 1147 | dependencies: 1148 | deep-equal "~1.0.1" 1149 | defined "~1.0.0" 1150 | for-each "~0.3.2" 1151 | function-bind "~1.1.0" 1152 | glob "~7.1.1" 1153 | has "~1.0.1" 1154 | inherits "~2.0.3" 1155 | minimist "~1.2.0" 1156 | object-inspect "~1.2.1" 1157 | resolve "~1.1.7" 1158 | resumer "~0.0.0" 1159 | string.prototype.trim "~1.1.2" 1160 | through "~2.3.8" 1161 | 1162 | text-table@~0.2.0: 1163 | version "0.2.0" 1164 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1165 | 1166 | through2@^2.0.0: 1167 | version "2.0.3" 1168 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 1169 | dependencies: 1170 | readable-stream "^2.1.5" 1171 | xtend "~4.0.1" 1172 | 1173 | through@2, through@^2.3.6, through@~2.3.4, through@~2.3.8: 1174 | version "2.3.8" 1175 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1176 | 1177 | tiny-json-http@5.0.1: 1178 | version "5.0.1" 1179 | resolved "https://registry.yarnpkg.com/tiny-json-http/-/tiny-json-http-5.0.1.tgz#83738b8f3f8ccb8cd352aadf88ffb61736bf7daa" 1180 | 1181 | trim@0.0.1: 1182 | version "0.0.1" 1183 | resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" 1184 | 1185 | tryit@^1.0.1: 1186 | version "1.0.3" 1187 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 1188 | 1189 | type-check@~0.3.2: 1190 | version "0.3.2" 1191 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1192 | dependencies: 1193 | prelude-ls "~1.1.2" 1194 | 1195 | typedarray@~0.0.5: 1196 | version "0.0.6" 1197 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1198 | 1199 | uniq@^1.0.1: 1200 | version "1.0.1" 1201 | resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 1202 | 1203 | user-home@^2.0.0: 1204 | version "2.0.0" 1205 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 1206 | dependencies: 1207 | os-homedir "^1.0.0" 1208 | 1209 | util-deprecate@~1.0.1: 1210 | version "1.0.2" 1211 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1212 | 1213 | wordwrap@~1.0.0: 1214 | version "1.0.0" 1215 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1216 | 1217 | wrappy@1: 1218 | version "1.0.2" 1219 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1220 | 1221 | write@^0.2.1: 1222 | version "0.2.1" 1223 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1224 | dependencies: 1225 | mkdirp "^0.5.1" 1226 | 1227 | xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: 1228 | version "4.0.1" 1229 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1230 | --------------------------------------------------------------------------------