From 2ed02ea846ce6d68e7995b8c144f57e723126c31 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 1 Jan 2018 14:57:59 +0530 Subject: [PATCH 001/477] first commit --- .eslintrc | 8 + .gitignore | 13 + README.md | 23 + frappe/index.js | 60 + frappe/model/database.js | 124 + frappe/model/document.js | 109 + frappe/model/index.js | 63 + frappe/model/meta.js | 70 + frappe/model/models.js | 68 + frappe/models/doctype/todo/todo.js | 11 + frappe/models/doctype/todo/todo.json | 30 + frappe/session.js | 17 + frappe/tests/test_controller.js | 18 + frappe/tests/test_database.js | 13 + frappe/tests/test_document.js | 62 + frappe/tests/test_meta.js | 21 + frappe/tests/test_models.js | 13 + frappe/utils.js | 23 + package-lock.json | 4114 ++++++++++++++++++++++++++ package.json | 29 + 20 files changed, 4889 insertions(+) create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 README.md create mode 100644 frappe/index.js create mode 100644 frappe/model/database.js create mode 100644 frappe/model/document.js create mode 100644 frappe/model/index.js create mode 100644 frappe/model/meta.js create mode 100644 frappe/model/models.js create mode 100644 frappe/models/doctype/todo/todo.js create mode 100644 frappe/models/doctype/todo/todo.json create mode 100644 frappe/session.js create mode 100644 frappe/tests/test_controller.js create mode 100644 frappe/tests/test_database.js create mode 100644 frappe/tests/test_document.js create mode 100644 frappe/tests/test_meta.js create mode 100644 frappe/tests/test_models.js create mode 100644 frappe/utils.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..3e491231 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,8 @@ +{ + "env": { + "browser": true, + "es6": true, + "node": true + }, + "parser": "babel-eslint" +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..80ccedf6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +node_modules +.DS_Store +Thumbs.db +test.db +*.log + +/dist +/temp + +# ignore everything in 'app' folder what had been generated from 'src' folder +/app/app.js +/app/background.js +/app/**/*.map diff --git a/README.md b/README.md new file mode 100644 index 00000000..41514abf --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# Frappe Core + +Core libs for Frappe Framework JS + +### Examples + + const frappe = require('frappe-core); + + # init database + frappe.init(); + + # make a new todo + let todo = frappe.get_doc({doctype: 'ToDo', subject: 'something'}) + todo.insert() + + # get all todos + let total_open = 0; + for (let d of frappe.get_all('ToDo')) { + todo = frappe.get_doc('ToDo', d.name); + if (todo.status == 'Open') total_open += 1; + } + + diff --git a/frappe/index.js b/frappe/index.js new file mode 100644 index 00000000..69a31a57 --- /dev/null +++ b/frappe/index.js @@ -0,0 +1,60 @@ +const path = require('path') +module.exports = { + init(db_path, user, user_key) { + this.db_path = db_path || 'test.db'; + if (this._initialized) return; + this.init_config(); + this.init_errors(); + this.init_globals(); + this.init_libs(); + this.init_db(); + this._initialized = true; + this.login(user, user_key); + }, + init_config() { + this.config = {}; + }, + init_errors() { + this.ValueError = class extends Error { }; + }, + init_globals() { + this.meta_cache = {}; + }, + init_libs() { + this.utils = require('./utils'); + Object.assign(this, this.utils); + let models = require('./model/models'); + this.models = new models.Models(); + this.model = require('./model'); + this.document = require('./model/document'); + this.meta = require('./model/meta'); + this.session_lib = require('./session'); + }, + init_db() { + let database = require('./model/database'); + this.db = new database.Database(this.db_path); + }, + get_meta(doctype) { + if (!this.meta_cache[doctype]) { + this.meta_cache[doctype] = new this.meta.Meta(this.models.get('DocType', doctype)); + } + return this.meta_cache[doctype]; + }, + get_doc(data, name) { + if (typeof data==='string' && typeof name==='string') { + let controller_class = this.models.get_controller(data); + var doc = new controller_class({doctype:data, name: name}); + doc.load(); + } else { + let controller_class = this.models.get_controller(data.doctype); + var doc = new controller_class(data); + } + return doc; + }, + login(user, user_key) { + this.session = new this.session_lib.Session(user); + if (user && user_key) { + this.login(user_key); + } + } +}; diff --git a/frappe/model/database.js b/frappe/model/database.js new file mode 100644 index 00000000..88c9048e --- /dev/null +++ b/frappe/model/database.js @@ -0,0 +1,124 @@ +const fs = require('fs'); +const path = require('path'); +const SQL = require('sql.js'); +const frappe = require('frappe-core'); + +class Database { + constructor(db_path) { + this.db_file_name = db_path; + this.connect(); + } + + connect() { + if (this.db_path) { + const filebuffer = fs.readFileSync(this.db_path); + this._conn = new SQL.Database(filebuffer); + } else { + this._conn = new SQL.Database(); + } + } + + write() { + if (this.db_path) { + let data = this._conn.export(); + fs.writeFileSync(this.db_path, new Buffer(data)); + } + } + + close() { + this.write(); + this._conn.close(); + } + + create_db() { + // Create a database. + let db = new SQL.Database(); + let query = SCHEMA; + let result = db.exec(query); + if (Object.keys(result).length === 0 && + typeof result.constructor === 'function') { + return db; + } else { + return null; + } + } + + create_table(doctype) { + let meta = frappe.get_meta(doctype); + let columns = []; + + // add standard fields + let fields = frappe.model.standard_fields.slice(); + if (meta.istable) { + fields = fields.concat(model.child_fields); + } + + // add model fields + fields = fields.concat(meta.fields); + + for (let df of fields) { + if (frappe.model.type_map[df.fieldtype]) { + columns.push(`${df.fieldname} ${frappe.model.type_map[df.fieldtype]} ${df.reqd ? "not null" : ""} ${df.default ? ("default " + frappe.utils.sqlescape(df.default)) : ""}`); + } + } + + const query = `CREATE TABLE IF NOT EXISTS ${frappe.slug(doctype)} ( + ${columns.join(", ")})`; + + return this.sql(query); + } + + get(doctype, name) { + let doc = frappe.db.sql(`select * from ${frappe.slug(doctype)} where name = ${frappe.db.escape(name)}`); + return doc ? doc[0] : {}; + } + + insert(doctype, doc) { + this.sql(`insert into ${frappe.slug(doctype)} + (${Object.keys(doc).join(", ")}) + values (${Object.values(doc).map(d => frappe.db.escape(d)).join(", ")})`); + } + + update(doctype, doc) { + let assigns = []; + for (let key in doc) { + assigns.push(`${key} = ${this.escape(doc[key])}`); + } + this.sql(`update ${frappe.slug(doctype)} + set ${assigns.join(", ")}`); + } + + sql(query, opts={}) { + //console.log(query); + const result = frappe.db._conn.exec(query); + if (result.length > 0) { + if (opts.as_list) + return result[0]; + else + return sql_result_to_obj(result[0]); + } + return null; + } + + get_value(doctype, name, fieldname='name') { + let value = this.sql(`select ${fieldname} from ${frappe.slug(doctype)} + where name=${this.escape(name)}`); + return value.length ? value[0][fieldname] : null; + } + + escape(value) { + return frappe.utils.sqlescape(value); + } +} + +function sql_result_to_obj(result) { + const columns = result.columns; + return result.values.map(row => { + return columns.reduce((res, col, i) => { + res[col] = row[i]; + return res; + }, {}); + }) +} + +module.exports = { Database: Database }; \ No newline at end of file diff --git a/frappe/model/document.js b/frappe/model/document.js new file mode 100644 index 00000000..c6187673 --- /dev/null +++ b/frappe/model/document.js @@ -0,0 +1,109 @@ +const frappe = require('frappe-core'); + +class Document { + constructor(data) { + Object.assign(this, data); + } + + get(key) { + return this[key]; + } + + set(key, value) { + this.validate_field(key, value); + this[key] = value; + } + + set_name() { + // assign a random name by default + // override this to set a name + if (!this.name) { + this.name = Math.random().toString(36).substr(3); + } + } + + get meta() { + if (!this._meta) { + this._meta = frappe.get_meta(this.doctype); + } + return this._meta; + } + + append(key, document) { + if (!this[key]) { + this[key] = []; + } + this[key].push(this.init_doc(document)); + } + + init_doc(data) { + if (data.prototype instanceof Document) { + return data; + } else { + return new Document(d); + } + } + + validate_field (key, value) { + let df = this.meta.get_field(key); + if (df.fieldtype=='Select') { + this.meta.validate_select(df, value); + } + } + + validate() { } + before_insert() { } + after_insert() { } + before_update() { } + after_update() { } + after_save() { } + + get_valid_dict() { + let doc = {}; + for(let df of this.meta.get_valid_fields()) { + doc[df.fieldname] = this.get(df.fieldname); + } + return doc; + } + + set_standard_values() { + let now = new Date(); + if (this.docstatus === null || this.docstatus === undefined) { + this.docstatus = 0; + } + if (!this.owner) { + this.owner = frappe.session.user; + this.creation = now; + } + this.modified_by = frappe.session.user; + this.modified = now; + } + + load() { + Object.assign(this, frappe.db.get(this.doctype, this.name)); + return this; + } + + insert() { + this.set_name(); + this.set_standard_values(); + this.validate(); + this.before_insert(); + frappe.db.insert(this.doctype, this.get_valid_dict()) + this.after_insert(); + this.after_save(); + return this; + } + + update() { + this.set_standard_values(); + this.validate(); + this.before_insert(); + frappe.db.update(this.doctype, this.get_valid_dict()); + this.after_update(); + this.after_save(); + return this; + } +}; + +module.exports = { Document: Document }; \ No newline at end of file diff --git a/frappe/model/index.js b/frappe/model/index.js new file mode 100644 index 00000000..e6705a9f --- /dev/null +++ b/frappe/model/index.js @@ -0,0 +1,63 @@ +module.exports = { + standard_fields: [ + { + fieldname: 'name', fieldtype: 'Data', reqd: 1 + }, + { + fieldname: 'owner', fieldtype: 'Link', reqd: 1, options: 'User' + }, + { + fieldname: 'modified_by', fieldtype: 'Link', reqd: 1, options: 'User' + }, + { + fieldname: 'creation', fieldtype: 'Datetime', reqd: 1 + }, + { + fieldname: 'modified', fieldtype: 'Datetime', reqd: 1 + }, + { + fieldname: 'docstatus', fieldtype: 'Int', reqd: 1, default: 0 + } + ], + child_fields: [ + { + fieldname: 'idx', fieldtype: 'Int', reqd: 1 + }, + { + fieldname: 'parent', fieldtype: 'Data', reqd: 1 + }, + { + fieldname: 'parenttype', fieldtype: 'Link', reqd: 1, options: 'DocType' + }, + { + fieldname: 'parentfield', fieldtype: 'Data', reqd: 1 + } + ], + type_map: { + 'Currency': 'real' + ,'Int': 'integer' + ,'Float': 'real' + ,'Percent': 'real' + ,'Check': 'integer' + ,'Small Text': 'text' + ,'Long Text': 'text' + ,'Code': 'text' + ,'Text Editor': 'text' + ,'Date': 'text' + ,'Datetime': 'text' + ,'Time': 'text' + ,'Text': 'text' + ,'Data': 'text' + ,'Link': 'text' + ,'Dynamic Link':'text' + ,'Password': 'text' + ,'Select': 'text' + ,'Read Only': 'text' + ,'Attach': 'text' + ,'Attach Image':'text' + ,'Signature': 'text' + ,'Color': 'text' + ,'Barcode': 'text' + ,'Geolocation': 'text' + } +}; \ No newline at end of file diff --git a/frappe/model/meta.js b/frappe/model/meta.js new file mode 100644 index 00000000..2877d37e --- /dev/null +++ b/frappe/model/meta.js @@ -0,0 +1,70 @@ +const Document = require('./document').Document; +const frappe = require('frappe-core'); + +class Meta extends Document { + constructor(data) { + super(data); + this.event_handlers = {}; + } + + get_field(fieldname) { + if (!this.field_map) { + this.field_map = {}; + for (let df of this.fields) { + this.field_map[df.fieldname] = df; + } + } + return this.field_map[fieldname]; + } + + on(key, fn) { + if (!this.event_handlers[key]) { + this.event_handlers[key] = []; + } + this.event_handlers[key].push(fn); + } + + get_valid_fields() { + if (!this._valid_fields) { + this._valid_fields = []; + + // standard fields + for (let df of frappe.model.standard_fields) { + this._valid_fields.push(df); + } + + // parent fields + if (this.istable) { + for (let df of frappe.model.child_fields) { + this._valid_fields.push(df); + } + } + + // doctype fields + for (let df of this.fields) { + if (frappe.model.type_map[df.fieldtype]) { + this._valid_fields.push(df); + } + } + } + + return this._valid_fields; + } + + validate_select(df, value) { + let options = df.options; + if (typeof options === 'string') { + // values given as string + options = df.options.split('\n'); + } + if (!options.includes(value)) { + throw new frappe.ValueError(`${value} must be one of ${options.join(", ")}`); + } + } + + trigger(key) { + + } +} + +module.exports = { Meta: Meta } \ No newline at end of file diff --git a/frappe/model/models.js b/frappe/model/models.js new file mode 100644 index 00000000..a464c27b --- /dev/null +++ b/frappe/model/models.js @@ -0,0 +1,68 @@ +const walk = require('walk'); +const path = require('path'); +const process = require('process'); +const frappe = require('frappe-core'); + +class Models { + constructor() { + this.data = {}; + this.controllers = {}; + this.setup_path_map(); + } + + get(doctype, name) { + if (!this.data[doctype]) { + this.data[doctype] = {}; + } + if (!this.data[doctype][name]) { + this.data[doctype][name] = require( + this.path_map[frappe.slug(doctype)][frappe.slug(name)]); + } + return this.data[doctype][name]; + } + + get_controller(doctype) { + doctype = frappe.slug(doctype); + if (!this.controllers[doctype]) { + this.controllers[doctype] = require(this.controller_map[doctype])[doctype]; + } + return this.controllers[doctype]; + } + + setup_path_map() { + const cwd = process.cwd(); + this.path_map = {}; + this.controller_map = {}; + + if (!frappe.config.apps) { + frappe.config.apps = []; + } + frappe.config.apps.unshift('frappe-core'); + + for (let app_name of frappe.config.apps) { + let start = path.resolve(require.resolve(app_name), '../models'); + walk.walkSync(start, { + listeners: { + file: (basepath, file_data, next) => { + const doctype = path.basename(path.dirname(basepath)); + const name = path.basename(basepath); + const file_path = path.resolve(basepath, file_data.name); + if (file_data.name.endsWith('.json')) { + if (!this.path_map[doctype]) { + this.path_map[doctype] = {}; + } + + this.path_map[doctype][name] = file_path; + } + if (doctype==='doctype' && file_data.name.endsWith('.js')) { + this.controller_map[name] = file_path; + } + next(); + } + } + }); + } + } +} + +module.exports = { Models: Models } \ No newline at end of file diff --git a/frappe/models/doctype/todo/todo.js b/frappe/models/doctype/todo/todo.js new file mode 100644 index 00000000..fc738568 --- /dev/null +++ b/frappe/models/doctype/todo/todo.js @@ -0,0 +1,11 @@ +const frappe = require('frappe-core'); + +class todo extends frappe.document.Document { + validate() { + if (!this.status) { + this.status = 'Open'; + } + } +} + +module.exports = { todo: todo }; diff --git a/frappe/models/doctype/todo/todo.json b/frappe/models/doctype/todo/todo.json new file mode 100644 index 00000000..e29dae57 --- /dev/null +++ b/frappe/models/doctype/todo/todo.json @@ -0,0 +1,30 @@ +{ + "autoname": "hash", + "name": "ToDo", + "doctype": "DocType", + "issingle": 0, + "fields": [ + { + "fieldname": "subject", + "label": "Subject", + "fieldtype": "Data", + "reqd": 1 + }, + { + "fieldname": "description", + "label": "Description", + "fieldtype": "Text" + }, + { + "fieldname": "status", + "label": "Status", + "fieldtype": "Select", + "options": [ + "Open", + "Closed" + ], + "default": "Open", + "reqd": 1 + } + ] +} \ No newline at end of file diff --git a/frappe/session.js b/frappe/session.js new file mode 100644 index 00000000..91d46159 --- /dev/null +++ b/frappe/session.js @@ -0,0 +1,17 @@ +const frappe = require('frappe-core'); + +class Session { + constructor(user, user_key) { + this.user = user || 'guest'; + if (this.user !== 'guest') { + this.login(user_key); + } + } + + login(user_key) { + // could be password, sessionid, otp + } + +} + +module.exports = { Session: Session }; \ No newline at end of file diff --git a/frappe/tests/test_controller.js b/frappe/tests/test_controller.js new file mode 100644 index 00000000..2f90fd7e --- /dev/null +++ b/frappe/tests/test_controller.js @@ -0,0 +1,18 @@ +const assert = require('assert'); +const frappe = require('frappe-core'); + +describe('Controller', () => { + before(function() { + frappe.init(); + frappe.db.create_table('ToDo'); + }); + + it('should call controller method', () => { + let doc = frappe.get_doc({ + doctype:'ToDo', + subject: 'test' + }); + doc.validate(); + assert.equal(doc.status, 'Open'); + }); +}); \ No newline at end of file diff --git a/frappe/tests/test_database.js b/frappe/tests/test_database.js new file mode 100644 index 00000000..b539c136 --- /dev/null +++ b/frappe/tests/test_database.js @@ -0,0 +1,13 @@ +const assert = require('assert'); +const frappe = require('frappe-core'); + +describe('Document', () => { + before(function() { + frappe.init(); + }); + + // it('should create a table', () => { + // frappe.db.create_table('ToDo'); + // frappe.db.write(); + // }); +}); \ No newline at end of file diff --git a/frappe/tests/test_document.js b/frappe/tests/test_document.js new file mode 100644 index 00000000..b4c07dd9 --- /dev/null +++ b/frappe/tests/test_document.js @@ -0,0 +1,62 @@ +const assert = require('assert'); +const frappe = require('frappe-core'); + +describe('Document', () => { + before(function() { + frappe.init(); + frappe.db.create_table('ToDo'); + }); + + it('should insert a doc', () => { + let doc1 = test_doc(); + doc1.subject = 'insert subject 1'; + doc1.description = 'insert description 1'; + doc1.insert(); + + // get it back from the db + let doc2 = frappe.get_doc(doc1.doctype, doc1.name); + assert.equal(doc1.subject, doc2.subject); + assert.equal(doc1.description, doc2.description); + }); + + it('should update a doc', () => { + let doc = test_doc().insert(); + + assert.notEqual(frappe.db.get_value(doc.doctype, doc.name, 'subject'), 'subject 2'); + + doc.subject = 'subject 2' + doc.update(); + + assert.equal(frappe.db.get_value(doc.doctype, doc.name, 'subject'), 'subject 2'); + }) + + it('should get a value', () => { + assert.equal(test_doc().get('subject'), 'testing 1'); + }); + + it('should set a value', () => { + let doc = test_doc(); + doc.set('subject', 'testing 1') + assert.equal(doc.get('subject'), 'testing 1'); + }); + + it('should not allow incorrect Select option', () => { + let doc = test_doc(); + assert.throws( + () => { + doc.set('status', 'Illegal'); + }, + frappe.ValueError + ); + }); + +}); + +const test_doc = () => { + return frappe.get_doc({ + doctype: 'ToDo', + status: 'Open', + subject: 'testing 1', + description: 'test description 1' + }); +} \ No newline at end of file diff --git a/frappe/tests/test_meta.js b/frappe/tests/test_meta.js new file mode 100644 index 00000000..3f56a894 --- /dev/null +++ b/frappe/tests/test_meta.js @@ -0,0 +1,21 @@ +const assert = require('assert'); +const frappe = require('frappe-core'); + +describe('Meta', () => { + before(function() { + frappe.init(); + }); + + it('should get init from json file', () => { + let todo = frappe.get_meta('ToDo'); + assert.equal(todo.issingle, 0); + }); + + it('should get fields from meta', () => { + let todo = frappe.get_meta('ToDo'); + let fields = todo.fields.map((df) => df.fieldname); + assert.ok(fields.includes('subject')); + assert.ok(fields.includes('description')); + assert.ok(fields.includes('status')); + }); +}); \ No newline at end of file diff --git a/frappe/tests/test_models.js b/frappe/tests/test_models.js new file mode 100644 index 00000000..072a068c --- /dev/null +++ b/frappe/tests/test_models.js @@ -0,0 +1,13 @@ +const assert = require('assert'); +const frappe = require('frappe-core'); + +describe('Models', () => { + before(function() { + frappe.init(); + }); + + it('should get todo json', () => { + let todo = frappe.models.get('DocType', 'ToDo'); + assert.equal(todo.issingle, 0); + }); +}); \ No newline at end of file diff --git a/frappe/utils.js b/frappe/utils.js new file mode 100644 index 00000000..4fd3e8dd --- /dev/null +++ b/frappe/utils.js @@ -0,0 +1,23 @@ +module.exports = { + slug(text) { + return text.toLowerCase().replace(/ /g, '_'); + }, + sqlescape(value) { + if (value===null || value===undefined) { + // null + return 'null'; + + } else if (value instanceof Date) { + // date + return `'${value.toISOString()}'`; + + } else if (typeof value==='string') { + // text + return "'" + value.replace(/'/g, '\'').replace(/"/g, '\"') + "'"; + + } else { + // number + return value + ''; + } + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..0af250c1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4114 @@ +{ + "name": "frappe-core", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.31.tgz", + "integrity": "sha512-yd7CkUughvHQoEahQqcMdrZw6o/6PwUxiRkfZuVDVHCDe77mysD/suoNyk5mK6phTnRW1kyIbPHyCJgxw++LXg==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "@babel/helper-function-name": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.31.tgz", + "integrity": "sha512-c+DAyp8LMm2nzSs2uXEuxp4LYGSUYEyHtU3fU57avFChjsnTmmpWmXj2dv0yUxHTEydgVAv5fIzA+4KJwoqWDA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "7.0.0-beta.31", + "@babel/template": "7.0.0-beta.31", + "@babel/traverse": "7.0.0-beta.31", + "@babel/types": "7.0.0-beta.31" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.31.tgz", + "integrity": "sha512-m7rVVX/dMLbbB9NCzKYRrrFb0qZxgpmQ4Wv6y7zEsB6skoJHRuXVeb/hAFze79vXBbuD63ci7AVHXzAdZSk9KQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0-beta.31" + } + }, + "@babel/template": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.31.tgz", + "integrity": "sha512-97IRmLvoDhIDSQkqklVt3UCxJsv0LUEVb/0DzXWtc8Lgiyxj567qZkmTG9aR21CmcJVVIvq2Y/moZj4oEpl5AA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.31", + "@babel/types": "7.0.0-beta.31", + "babylon": "7.0.0-beta.31", + "lodash": "4.17.4" + } + }, + "@babel/traverse": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.31.tgz", + "integrity": "sha512-3N+VJW+KlezEjFBG7WSYeMyC5kIqVLPb/PGSzCDPFcJrnArluD1GIl7Y3xC7cjKiTq2/JohaLWHVPjJWHlo9Gg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.31", + "@babel/helper-function-name": "7.0.0-beta.31", + "@babel/types": "7.0.0-beta.31", + "babylon": "7.0.0-beta.31", + "debug": "3.1.0", + "globals": "10.4.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + }, + "dependencies": { + "globals": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz", + "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.31.tgz", + "integrity": "sha512-exAHB+NeFGxkfQ5dSUD03xl3zYGneeSk2Mw2ldTt/nTvYxuDiuSp3DlxgUBgzbdTFG4fbwPk0WtKWOoTXCmNGg==", + "dev": true, + "requires": { + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "2.0.0" + } + }, + "acorn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", + "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1.js": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "babel-eslint": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.1.2.tgz", + "integrity": "sha512-IE+glF8t0lLoldylN7JyR8gT7e3jwyuNH2ds8g3UVUwGob/U4iT7Xpsiq2kQ8QGLb0eX4RcQXNqeW6mgPysu9A==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.31", + "@babel/traverse": "7.0.0-beta.31", + "@babel/types": "7.0.0-beta.31", + "babylon": "7.0.0-beta.31", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0" + } + }, + "babylon": { + "version": "7.0.0-beta.31", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.31.tgz", + "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.5" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.6" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.9" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5", + "randomfill": "1.0.3" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.37" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.5" + } + }, + "doctrine": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz", + "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + } + }, + "errno": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", + "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es5-ext": { + "version": "0.10.37", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", + "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.14.0.tgz", + "integrity": "sha512-Ul6CSGRjKscEyg0X/EeNs7o2XdnbTEOD1OM8cTjmx85RPcBJQrEhZLevhuJZNAE/vS2iVl5Uhgiqf3h5uLMCJQ==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.3.0", + "concat-stream": "1.6.0", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.0.2", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.2", + "esquery": "1.0.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.1.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.0.1", + "js-yaml": "3.10.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.4.1", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", + "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "dev": true, + "requires": { + "acorn": "5.3.0", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.8.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.1.0.tgz", + "integrity": "sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.0", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-resolvable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz", + "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.6", + "readable-stream": "2.3.3" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true, + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.1.7", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "1.0.3", + "timers-browserify": "2.0.4", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "4.9.2", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", + "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "dev": true, + "requires": { + "randombytes": "2.0.5", + "safe-buffer": "5.1.1" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sql.js": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-0.4.0.tgz", + "integrity": "sha1-I76WNVIOsP9Dp0Hn6DA5cmbohEU=" + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.3.0", + "lodash": "4.17.4", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + } + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.0" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "walk": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.9.tgz", + "integrity": "sha1-MbTbZnjyrgHDnqn7hyWpAx5Vins=", + "requires": { + "foreachasync": "3.0.0" + } + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true, + "requires": { + "async": "2.6.0", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" + } + }, + "webpack": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", + "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", + "dev": true, + "requires": { + "acorn": "5.3.0", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.4.0", + "webpack-sources": "1.1.0", + "yargs": "8.0.2" + }, + "dependencies": { + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..fbda4224 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "frappe-core", + "version": "1.0.0", + "description": "Frappe Core", + "main": "frappe/index.js", + "scripts": { + "test": "mocha frappe/tests" + }, + "dependencies": { + "sql.js": "^0.4.0", + "walk": "^2.3.9" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/frappe/frappe-js.git" + }, + "author": "Frappe", + "license": "MIT", + "bugs": { + "url": "https://github.com/frappe/frappe-js/issues" + }, + "homepage": "https://github.com/frappe/frappe-js#readme", + "devDependencies": { + "babel-eslint": "^8.0.1", + "eslint": "^4.9.0", + "mocha": "^4.0.1", + "webpack": "^3.8.1" + } +} From 80699c833a7133bcd5a8acbbab6095fe677ca1c2 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 1 Jan 2018 15:58:30 +0530 Subject: [PATCH 002/477] get_all with filters --- README.md | 118 +++++++++++++++++++++++++++++--- frappe/model/database.js | 68 +++++++++++++++--- frappe/tests/test_controller.js | 2 +- frappe/tests/test_database.js | 41 +++++++++-- frappe/tests/test_document.js | 2 +- frappe/tests/test_meta.js | 1 + frappe/tests/test_models.js | 1 + 7 files changed, 209 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 41514abf..6cd2bc61 100644 --- a/README.md +++ b/README.md @@ -2,22 +2,124 @@ Core libs for Frappe Framework JS -### Examples +## Examples + +### Declaring Models + +Models are declared by adding a `.json` model file in the `models/doctype` folder of the module/app. + + { + "autoname": "hash", + "name": "ToDo", + "doctype": "DocType", + "issingle": 0, + "fields": [ + { + "fieldname": "subject", + "label": "Subject", + "fieldtype": "Data", + "reqd": 1 + }, + { + "fieldname": "description", + "label": "Description", + "fieldtype": "Text" + }, + { + "fieldname": "status", + "label": "Status", + "fieldtype": "Select", + "options": [ + "Open", + "Closed" + ], + "default": "Open", + "reqd": 1 + } + ] + } + +### Setup / Migrate const frappe = require('frappe-core); - # init database frappe.init(); - # make a new todo + // sync all schema from `models` folders in all apps + frappe.migrate(); + +### Managing Documents + +Frappe Object-Relational-Mapper (ORM) helps you manage (create, read, update, delete) documents based on the DocTypes declared + +#### Create + + const frappe = require('frappe-core); + frappe.init(); + + // make a new todo let todo = frappe.get_doc({doctype: 'ToDo', subject: 'something'}) todo.insert() - # get all todos - let total_open = 0; - for (let d of frappe.get_all('ToDo')) { - todo = frappe.get_doc('ToDo', d.name); - if (todo.status == 'Open') total_open += 1; +#### Read + + const frappe = require('frappe-core); + frappe.init(); + + // get all open todos + let todos = frappe.db.get_all('ToDo', ['name'], {status: "Open"}); + let first_todo = frappe.get_doc('ToDo', toods.name); + + +#### Update + + const frappe = require('frappe-core); + frappe.init(); + + // get all open todos + let todos = frappe.db.get_all('ToDo', ['name'], {status: "Open"}); + let first_todo = frappe.get_doc('ToDo', toods.name); + + first_todo.status = 'Closed'; + first_todo.update(); + +### Metadata + + const frappe = require('frappe-core); + + frappe.init(); + + let todo_meta = frappe.get_meta('ToDo'); + + // get all fields of type "Data" + let data_fields = todo_meta.fields.map(d => d.fieldtype=='Data' ? d : null); + +### Controllers + +You can write event handlers in controllers, by declaring a `.js` file in the `models/doctype/` folder along with the model file. + +The name of the class must be the slugged name of the DocType + + const frappe = require('frappe-core'); + + class todo extends frappe.document.Document { + validate() { + // set default status as "Open" if not set + if (!this.status) { + this.status = 'Open'; + } + } } + module.exports = { todo: todo }; + +### Database + +You can also directly write SQL with `frappe.db.sql` + + const frappe = require('frappe-core); + + frappe.init(); + + all_todos = frappe.db.sql('select name from todo'); diff --git a/frappe/model/database.js b/frappe/model/database.js index 88c9048e..7e0966bd 100644 --- a/frappe/model/database.js +++ b/frappe/model/database.js @@ -43,20 +43,21 @@ class Database { } } + migrate() { + for (let doctype in frappe.models.path_map.doctype) { + if (this.table_exists(doctype)) { + this.alter_table(doctype); + } else { + this.create_table(doctype); + } + } + } + create_table(doctype) { let meta = frappe.get_meta(doctype); let columns = []; - // add standard fields - let fields = frappe.model.standard_fields.slice(); - if (meta.istable) { - fields = fields.concat(model.child_fields); - } - - // add model fields - fields = fields.concat(meta.fields); - - for (let df of fields) { + for (let df of this.get_fields(meta)) { if (frappe.model.type_map[df.fieldtype]) { columns.push(`${df.fieldname} ${frappe.model.type_map[df.fieldtype]} ${df.reqd ? "not null" : ""} ${df.default ? ("default " + frappe.utils.sqlescape(df.default)) : ""}`); } @@ -68,6 +69,13 @@ class Database { return this.sql(query); } + alter_table(doctype) { + // add columns + + // change columns + + } + get(doctype, name) { let doc = frappe.db.sql(`select * from ${frappe.slug(doctype)} where name = ${frappe.db.escape(name)}`); return doc ? doc[0] : {}; @@ -88,6 +96,29 @@ class Database { set ${assigns.join(", ")}`); } + get_all(doctype, fields=['name'], filters, start, limit) { + return this.sql(`select ${fields.join(", ")} + from ${frappe.slug(doctype)} + ${filters ? "where" : ""} ${this.get_filter_conditions(filters)} + ${limit ? ("limit " + limit) : ""} ${start ? ("offset " + start) : ""}`); + } + + get_filter_conditions(filters) { + // {"status": "Open"} => `status = "Open"` + // {"status": "Open", "name": ["like", "apple%"]} + // => `status="Open" and name like "apple%" + let conditions = []; + for (let key in filters) { + const value = filters[key]; + if (value instanceof Array) { + conditions.push(`${key} ${value[0]} ${this.escape(value)}`); + } else { + conditions.push(`${key} = ${this.escape(value)}`); + } + } + return conditions.join(" and "); + } + sql(query, opts={}) { //console.log(query); const result = frappe.db._conn.exec(query); @@ -109,6 +140,23 @@ class Database { escape(value) { return frappe.utils.sqlescape(value); } + + get_fields(meta) { + // add standard fields + let fields = frappe.model.standard_fields.slice(); + if (meta.istable) { + fields = fields.concat(frappe.model.child_fields); + } + + // add model fields + fields = fields.concat(meta.fields); + + return fields; + } + + table_exists(table) { + return this.sql(`SELECT name FROM sqlite_master WHERE type='table' AND name='${table}'`) ? true : false; + } } function sql_result_to_obj(result) { diff --git a/frappe/tests/test_controller.js b/frappe/tests/test_controller.js index 2f90fd7e..8a50d5cd 100644 --- a/frappe/tests/test_controller.js +++ b/frappe/tests/test_controller.js @@ -4,7 +4,7 @@ const frappe = require('frappe-core'); describe('Controller', () => { before(function() { frappe.init(); - frappe.db.create_table('ToDo'); + frappe.db.migrate(); }); it('should call controller method', () => { diff --git a/frappe/tests/test_database.js b/frappe/tests/test_database.js index b539c136..8ea152bc 100644 --- a/frappe/tests/test_database.js +++ b/frappe/tests/test_database.js @@ -4,10 +4,43 @@ const frappe = require('frappe-core'); describe('Document', () => { before(function() { frappe.init(); + frappe.db.migrate(); }); - // it('should create a table', () => { - // frappe.db.create_table('ToDo'); - // frappe.db.write(); - // }); + it('should insert and get values', () => { + frappe.db.sql('delete from todo'); + frappe.get_doc({doctype:'ToDo', subject: 'testing 1'}).insert(); + frappe.get_doc({doctype:'ToDo', subject: 'testing 3'}).insert(); + frappe.get_doc({doctype:'ToDo', subject: 'testing 2'}).insert(); + + let subjects = frappe.db.get_all('ToDo', ['name', 'subject']).map(d => d.subject); + + assert.ok(subjects.includes('testing 1')); + assert.ok(subjects.includes('testing 2')); + assert.ok(subjects.includes('testing 3')); + }); + + it('should filter correct values', () => { + let subjects = null; + + frappe.db.sql('delete from todo'); + frappe.get_doc({doctype:'ToDo', subject: 'testing 1', status: 'Open'}).insert(); + frappe.get_doc({doctype:'ToDo', subject: 'testing 3', status: 'Open'}).insert(); + frappe.get_doc({doctype:'ToDo', subject: 'testing 2', status: 'Closed'}).insert(); + + subjects = frappe.db.get_all('ToDo', ['name', 'subject'], + {status: 'Open'}).map(d => d.subject); + + assert.ok(subjects.includes('testing 1')); + assert.ok(subjects.includes('testing 3')); + assert.equal(subjects.includes('testing 2'), false); + + subjects = frappe.db.get_all('ToDo', ['name', 'subject'], + {status: 'Closed'}).map(d => d.subject); + + assert.equal(subjects.includes('testing 1'), false); + assert.equal(subjects.includes('testing 3'), false); + assert.ok(subjects.includes('testing 2')); + + }); }); \ No newline at end of file diff --git a/frappe/tests/test_document.js b/frappe/tests/test_document.js index b4c07dd9..08ca8be9 100644 --- a/frappe/tests/test_document.js +++ b/frappe/tests/test_document.js @@ -4,7 +4,7 @@ const frappe = require('frappe-core'); describe('Document', () => { before(function() { frappe.init(); - frappe.db.create_table('ToDo'); + frappe.db.migrate(); }); it('should insert a doc', () => { diff --git a/frappe/tests/test_meta.js b/frappe/tests/test_meta.js index 3f56a894..6d2cc9a7 100644 --- a/frappe/tests/test_meta.js +++ b/frappe/tests/test_meta.js @@ -4,6 +4,7 @@ const frappe = require('frappe-core'); describe('Meta', () => { before(function() { frappe.init(); + frappe.db.migrate(); }); it('should get init from json file', () => { diff --git a/frappe/tests/test_models.js b/frappe/tests/test_models.js index 072a068c..0da55671 100644 --- a/frappe/tests/test_models.js +++ b/frappe/tests/test_models.js @@ -4,6 +4,7 @@ const frappe = require('frappe-core'); describe('Models', () => { before(function() { frappe.init(); + frappe.db.migrate(); }); it('should get todo json', () => { From 6d66347377d7093969d1d4ca8daaf5e2a258a0cb Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 1 Jan 2018 16:01:02 +0530 Subject: [PATCH 003/477] typo --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 6cd2bc61..9e7bbb5b 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,6 @@ Models are declared by adding a `.json` model file in the `models/doctype` folde ### Setup / Migrate const frappe = require('frappe-core); - frappe.init(); // sync all schema from `models` folders in all apps @@ -50,7 +49,9 @@ Models are declared by adding a `.json` model file in the `models/doctype` folde ### Managing Documents -Frappe Object-Relational-Mapper (ORM) helps you manage (create, read, update, delete) documents based on the DocTypes declared +Frappe Object-Relational-Mapper (ORM) helps you manage (create, read, update, delete) documents based on the DocTypes declared. + +Documents are stored in SQLite using `sql.js` #### Create @@ -58,8 +59,8 @@ Frappe Object-Relational-Mapper (ORM) helps you manage (create, read, update, de frappe.init(); // make a new todo - let todo = frappe.get_doc({doctype: 'ToDo', subject: 'something'}) - todo.insert() + let todo = frappe.get_doc({doctype: 'ToDo', subject: 'something'}); + todo.insert(); #### Read @@ -68,7 +69,7 @@ Frappe Object-Relational-Mapper (ORM) helps you manage (create, read, update, de // get all open todos let todos = frappe.db.get_all('ToDo', ['name'], {status: "Open"}); - let first_todo = frappe.get_doc('ToDo', toods.name); + let first_todo = frappe.get_doc('ToDo', toods[0].name); #### Update @@ -78,7 +79,7 @@ Frappe Object-Relational-Mapper (ORM) helps you manage (create, read, update, de // get all open todos let todos = frappe.db.get_all('ToDo', ['name'], {status: "Open"}); - let first_todo = frappe.get_doc('ToDo', toods.name); + let first_todo = frappe.get_doc('ToDo', toods[0].name); first_todo.status = 'Closed'; first_todo.update(); @@ -86,7 +87,6 @@ Frappe Object-Relational-Mapper (ORM) helps you manage (create, read, update, de ### Metadata const frappe = require('frappe-core); - frappe.init(); let todo_meta = frappe.get_meta('ToDo'); @@ -118,7 +118,6 @@ The name of the class must be the slugged name of the DocType You can also directly write SQL with `frappe.db.sql` const frappe = require('frappe-core); - frappe.init(); all_todos = frappe.db.sql('select name from todo'); From 2c00242731a7e679149ac2413b5bea5f4dc31b6d Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 1 Jan 2018 16:01:42 +0530 Subject: [PATCH 004/477] typo --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 9e7bbb5b..27d5d5c0 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Models are declared by adding a `.json` model file in the `models/doctype` folde ### Setup / Migrate - const frappe = require('frappe-core); + const frappe = require('frappe-core'); frappe.init(); // sync all schema from `models` folders in all apps @@ -55,7 +55,7 @@ Documents are stored in SQLite using `sql.js` #### Create - const frappe = require('frappe-core); + const frappe = require('frappe-core'); frappe.init(); // make a new todo @@ -64,7 +64,7 @@ Documents are stored in SQLite using `sql.js` #### Read - const frappe = require('frappe-core); + const frappe = require('frappe-core'); frappe.init(); // get all open todos @@ -74,7 +74,7 @@ Documents are stored in SQLite using `sql.js` #### Update - const frappe = require('frappe-core); + const frappe = require('frappe-core'); frappe.init(); // get all open todos @@ -86,7 +86,7 @@ Documents are stored in SQLite using `sql.js` ### Metadata - const frappe = require('frappe-core); + const frappe = require('frappe-core'); frappe.init(); let todo_meta = frappe.get_meta('ToDo'); @@ -117,7 +117,7 @@ The name of the class must be the slugged name of the DocType You can also directly write SQL with `frappe.db.sql` - const frappe = require('frappe-core); + const frappe = require('frappe-core'); frappe.init(); all_todos = frappe.db.sql('select name from todo'); From e0738def25a15cc42477cfefcfa5e9c8e8eb7944 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 1 Jan 2018 17:47:51 +0530 Subject: [PATCH 005/477] rest api start --- .eslintrc | 3 +- README.md | 93 ++- frappe/app.js | 17 + frappe/index.js | 8 +- frappe/rest.js | 27 + package-lock.json | 1400 ++++++++++++++++++++++++++++++++------------- package.json | 9 +- 7 files changed, 1132 insertions(+), 425 deletions(-) create mode 100644 frappe/app.js create mode 100644 frappe/rest.js diff --git a/.eslintrc b/.eslintrc index 3e491231..2d55cb35 100644 --- a/.eslintrc +++ b/.eslintrc @@ -3,6 +3,5 @@ "browser": true, "es6": true, "node": true - }, - "parser": "babel-eslint" + } } \ No newline at end of file diff --git a/README.md b/README.md index 27d5d5c0..ab1dca36 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,7 @@ Core libs for Frappe Framework JS -## Examples - -### Declaring Models +## Declaring Models Models are declared by adding a `.json` model file in the `models/doctype` folder of the module/app. @@ -39,7 +37,7 @@ Models are declared by adding a `.json` model file in the `models/doctype` folde ] } -### Setup / Migrate +## Setup / Migrate const frappe = require('frappe-core'); frappe.init(); @@ -47,13 +45,13 @@ Models are declared by adding a `.json` model file in the `models/doctype` folde // sync all schema from `models` folders in all apps frappe.migrate(); -### Managing Documents +## Managing Documents Frappe Object-Relational-Mapper (ORM) helps you manage (create, read, update, delete) documents based on the DocTypes declared. Documents are stored in SQLite using `sql.js` -#### Create +### Create const frappe = require('frappe-core'); frappe.init(); @@ -62,7 +60,7 @@ Documents are stored in SQLite using `sql.js` let todo = frappe.get_doc({doctype: 'ToDo', subject: 'something'}); todo.insert(); -#### Read +### Read const frappe = require('frappe-core'); frappe.init(); @@ -72,7 +70,7 @@ Documents are stored in SQLite using `sql.js` let first_todo = frappe.get_doc('ToDo', toods[0].name); -#### Update +### Update const frappe = require('frappe-core'); frappe.init(); @@ -84,7 +82,7 @@ Documents are stored in SQLite using `sql.js` first_todo.status = 'Closed'; first_todo.update(); -### Metadata +## Metadata const frappe = require('frappe-core'); frappe.init(); @@ -94,7 +92,7 @@ Documents are stored in SQLite using `sql.js` // get all fields of type "Data" let data_fields = todo_meta.fields.map(d => d.fieldtype=='Data' ? d : null); -### Controllers +## Controllers You can write event handlers in controllers, by declaring a `.js` file in the `models/doctype/` folder along with the model file. @@ -113,7 +111,7 @@ The name of the class must be the slugged name of the DocType module.exports = { todo: todo }; -### Database +## Database You can also directly write SQL with `frappe.db.sql` @@ -122,3 +120,76 @@ You can also directly write SQL with `frappe.db.sql` all_todos = frappe.db.sql('select name from todo'); +## REST API + +You can directly access documents at `/api/resource/:doctype` + +### Create + +- URL: `/api/resource/:doctype` +- Method: `POST` +- Data: document properties + +**Example:** + +- URL: `/api/resource/todo` +- Method: `POST` + +Data: + + { + "subject": "test", + "description": " + } + +### Read + +- URL: `/api/resource/:doctype/:name` +- Method: `GET` + +**Example:** + +- URL: `/api/resource/todo/uig7d1v12` + +Reponse: + + { + "name": "uig7d1v12", + "owner": "guest", + "modified_by": "guest", + "creation": "2018-01-01T12:08:19.482Z", + "modified": "2018-01-01T12:08:19.482Z", + "docstatus": 0, + "subject": "test 1", + "description": "description 1", + "status": "Open" + } + +### List + +- URL: `/api/resource/:doctype/` +- Method: `GET` +- Params (optional) + - `start`: Page start + - `limit`: Page limit + +**Example:** + +- URL: `/api/resource/todo` + +Response: + + [ + { + "name": "r4qxyki0i6", + "subject": "test 1" + }, + { + "name": "efywwvtwcp", + "subject": "test 1" + }, + { + "name": "9ioz05urgp", + "subject": "test 1" + } + ] diff --git a/frappe/app.js b/frappe/app.js new file mode 100644 index 00000000..f5617e70 --- /dev/null +++ b/frappe/app.js @@ -0,0 +1,17 @@ +const express = require('express'); +const app = express(); +const bodyParser = require('body-parser'); +const frappe = require('frappe-core'); + +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: true })); + +// setup frappe REST routes +frappe.init(); +frappe.db.migrate(); +frappe.db.write(); + +frappe.rest.setup(app); + +app.listen(8000); + diff --git a/frappe/index.js b/frappe/index.js index 69a31a57..de613079 100644 --- a/frappe/index.js +++ b/frappe/index.js @@ -1,7 +1,8 @@ -const path = require('path') +const path = require('path'); + module.exports = { - init(db_path, user, user_key) { - this.db_path = db_path || 'test.db'; + init(db_path = 'test.db', user, user_key) { + this.db_path = db_path; if (this._initialized) return; this.init_config(); this.init_errors(); @@ -29,6 +30,7 @@ module.exports = { this.document = require('./model/document'); this.meta = require('./model/meta'); this.session_lib = require('./session'); + this.rest = require('./rest'); }, init_db() { let database = require('./model/database'); diff --git a/frappe/rest.js b/frappe/rest.js new file mode 100644 index 00000000..5398d358 --- /dev/null +++ b/frappe/rest.js @@ -0,0 +1,27 @@ +const frappe = require('frappe-core'); + +module.exports = { + setup(app) { + // get list + app.get('/api/resource/:doctype', function(request, response) { + return response.json(frappe.db.get_all(request.params.doctype, ['name', 'subject'], null, + start = request.params.start || 0, limit = request.params.limit || 20)); + }); + + // create + app.post('/api/resource/:doctype', function(request, response) { + data = request.body; + data.doctype = request.params.doctype; + let doc = frappe.get_doc(data).insert(); + frappe.db.write(); + return response.json(doc.get_valid_dict()); + }); + + // get list + app.get('/api/resource/:doctype/:name', function(request, response) { + let data = frappe.get_doc(request.params.doctype, request.params.name).get_valid_dict(); + console.log(data); + return response.json(data); + }); + } +}; diff --git a/package-lock.json b/package-lock.json index 0af250c1..b5f800d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,83 +4,18 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.31.tgz", - "integrity": "sha512-yd7CkUughvHQoEahQqcMdrZw6o/6PwUxiRkfZuVDVHCDe77mysD/suoNyk5mK6phTnRW1kyIbPHyCJgxw++LXg==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "@babel/helper-function-name": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.31.tgz", - "integrity": "sha512-c+DAyp8LMm2nzSs2uXEuxp4LYGSUYEyHtU3fU57avFChjsnTmmpWmXj2dv0yUxHTEydgVAv5fIzA+4KJwoqWDA==", - "dev": true, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.31", - "@babel/template": "7.0.0-beta.31", - "@babel/traverse": "7.0.0-beta.31", - "@babel/types": "7.0.0-beta.31" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.31.tgz", - "integrity": "sha512-m7rVVX/dMLbbB9NCzKYRrrFb0qZxgpmQ4Wv6y7zEsB6skoJHRuXVeb/hAFze79vXBbuD63ci7AVHXzAdZSk9KQ==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.31" - } - }, - "@babel/template": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.31.tgz", - "integrity": "sha512-97IRmLvoDhIDSQkqklVt3UCxJsv0LUEVb/0DzXWtc8Lgiyxj567qZkmTG9aR21CmcJVVIvq2Y/moZj4oEpl5AA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.31", - "@babel/types": "7.0.0-beta.31", - "babylon": "7.0.0-beta.31", - "lodash": "4.17.4" - } - }, - "@babel/traverse": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.31.tgz", - "integrity": "sha512-3N+VJW+KlezEjFBG7WSYeMyC5kIqVLPb/PGSzCDPFcJrnArluD1GIl7Y3xC7cjKiTq2/JohaLWHVPjJWHlo9Gg==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.31", - "@babel/helper-function-name": "7.0.0-beta.31", - "@babel/types": "7.0.0-beta.31", - "babylon": "7.0.0-beta.31", - "debug": "3.1.0", - "globals": "10.4.0", - "invariant": "2.2.2", - "lodash": "4.17.4" - }, - "dependencies": { - "globals": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz", - "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.31.tgz", - "integrity": "sha512-exAHB+NeFGxkfQ5dSUD03xl3zYGneeSk2Mw2ldTt/nTvYxuDiuSp3DlxgUBgzbdTFG4fbwPk0WtKWOoTXCmNGg==", - "dev": true, - "requires": { - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "2.0.0" + "mime-types": "2.1.17", + "negotiator": "0.6.1" } }, "acorn": { @@ -152,6 +87,14 @@ "repeat-string": "1.6.1" } }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "2.1.1" + } + }, "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", @@ -174,12 +117,16 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, "requires": { "micromatch": "2.3.11", "normalize-path": "2.1.1" } }, + "append-field": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz", + "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=" + }, "argparse": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", @@ -193,7 +140,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, "requires": { "arr-flatten": "1.1.0" } @@ -201,8 +147,12 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-union": { "version": "1.0.2", @@ -222,8 +172,7 @@ "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, "arrify": { "version": "1.0.1", @@ -263,8 +212,7 @@ "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" }, "babel-code-frame": { "version": "6.26.0", @@ -301,31 +249,10 @@ } } }, - "babel-eslint": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.1.2.tgz", - "integrity": "sha512-IE+glF8t0lLoldylN7JyR8gT7e3jwyuNH2ds8g3UVUwGob/U4iT7Xpsiq2kQ8QGLb0eX4RcQXNqeW6mgPysu9A==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.31", - "@babel/traverse": "7.0.0-beta.31", - "@babel/types": "7.0.0-beta.31", - "babylon": "7.0.0-beta.31", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "1.0.0" - } - }, - "babylon": { - "version": "7.0.0-beta.31", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.31.tgz", - "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ==", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base64-js": { "version": "1.2.1", @@ -342,8 +269,7 @@ "binary-extensions": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" }, "bn.js": { "version": "4.11.8", @@ -351,11 +277,63 @@ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" @@ -365,7 +343,6 @@ "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, "requires": { "expand-range": "1.8.2", "preserve": "0.2.0", @@ -483,6 +460,43 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -504,6 +518,11 @@ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", @@ -518,7 +537,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", @@ -529,7 +547,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, "requires": { "color-convert": "1.9.1" } @@ -538,7 +555,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, "requires": { "has-flag": "2.0.0" } @@ -555,7 +571,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", @@ -584,6 +599,11 @@ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -634,7 +654,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -642,8 +661,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "commander": { "version": "2.11.0", @@ -654,20 +672,31 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, "requires": { "inherits": "2.0.3", "readable-stream": "2.3.3", "typedarray": "0.0.6" } }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.1.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", @@ -683,11 +712,30 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "create-ecdh": { "version": "4.0.0", @@ -699,6 +747,14 @@ "elliptic": "6.4.0" } }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "1.0.0" + } + }, "create-hash": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", @@ -729,7 +785,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { "lru-cache": "4.1.1", "shebang-command": "1.2.0", @@ -755,6 +810,11 @@ "randomfill": "1.0.3" } }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -777,6 +837,14 @@ "dev": true, "requires": { "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "decamelize": { @@ -785,6 +853,11 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -806,6 +879,11 @@ "rimraf": "2.6.2" } }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -816,6 +894,43 @@ "minimalistic-assert": "1.0.0" } }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.14", + "streamsearch": "0.1.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "diff": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", @@ -848,6 +963,29 @@ "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", "dev": true }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, "elliptic": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", @@ -869,6 +1007,11 @@ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", @@ -969,11 +1112,15 @@ "es6-symbol": "3.1.1" } }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escope": { "version": "3.6.0", @@ -1095,6 +1242,11 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -1105,6 +1257,20 @@ "es5-ext": "0.10.37" } }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -1125,7 +1291,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, "requires": { "cross-spawn": "5.1.0", "get-stream": "3.0.0", @@ -1140,7 +1305,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, "requires": { "is-posix-bracket": "0.1.1" } @@ -1149,11 +1313,62 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, "requires": { "fill-range": "2.2.3" } }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "external-editor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", @@ -1169,7 +1384,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "requires": { "is-extglob": "1.0.0" } @@ -1214,14 +1428,12 @@ "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" }, "fill-range": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", @@ -1230,6 +1442,35 @@ "repeat-string": "1.6.1" } }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -1254,14 +1495,12 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, "requires": { "for-in": "1.0.2" } @@ -1271,6 +1510,21 @@ "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1281,7 +1535,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", - "dev": true, "optional": true, "requires": { "nan": "2.8.0", @@ -1291,13 +1544,11 @@ "abbrev": { "version": "1.1.0", "bundled": true, - "dev": true, "optional": true }, "ajv": { "version": "4.11.8", "bundled": true, - "dev": true, "optional": true, "requires": { "co": "4.6.0", @@ -1306,19 +1557,16 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "aproba": { "version": "1.1.1", "bundled": true, - "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.4", "bundled": true, - "dev": true, "optional": true, "requires": { "delegates": "1.0.0", @@ -1328,42 +1576,35 @@ "asn1": { "version": "0.2.3", "bundled": true, - "dev": true, "optional": true }, "assert-plus": { "version": "0.2.0", "bundled": true, - "dev": true, "optional": true }, "asynckit": { "version": "0.4.0", "bundled": true, - "dev": true, "optional": true }, "aws-sign2": { "version": "0.6.0", "bundled": true, - "dev": true, "optional": true }, "aws4": { "version": "1.6.0", "bundled": true, - "dev": true, "optional": true }, "balanced-match": { "version": "0.4.2", - "bundled": true, - "dev": true + "bundled": true }, "bcrypt-pbkdf": { "version": "1.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { "tweetnacl": "0.14.5" @@ -1372,7 +1613,6 @@ "block-stream": { "version": "0.0.9", "bundled": true, - "dev": true, "requires": { "inherits": "2.0.3" } @@ -1380,7 +1620,6 @@ "boom": { "version": "2.10.1", "bundled": true, - "dev": true, "requires": { "hoek": "2.16.3" } @@ -1388,7 +1627,6 @@ "brace-expansion": { "version": "1.1.7", "bundled": true, - "dev": true, "requires": { "balanced-match": "0.4.2", "concat-map": "0.0.1" @@ -1396,53 +1634,44 @@ }, "buffer-shims": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "caseless": { "version": "0.12.0", "bundled": true, - "dev": true, "optional": true }, "co": { "version": "4.6.0", "bundled": true, - "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "combined-stream": { "version": "1.0.5", "bundled": true, - "dev": true, "requires": { "delayed-stream": "1.0.0" } }, "concat-map": { "version": "0.0.1", - "bundled": true, - "dev": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "cryptiles": { "version": "2.0.5", "bundled": true, - "dev": true, "requires": { "boom": "2.10.1" } @@ -1450,7 +1679,6 @@ "dashdash": { "version": "1.14.1", "bundled": true, - "dev": true, "optional": true, "requires": { "assert-plus": "1.0.0" @@ -1459,7 +1687,6 @@ "assert-plus": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true } } @@ -1467,7 +1694,6 @@ "debug": { "version": "2.6.8", "bundled": true, - "dev": true, "optional": true, "requires": { "ms": "2.0.0" @@ -1476,30 +1702,25 @@ "deep-extend": { "version": "0.4.2", "bundled": true, - "dev": true, "optional": true }, "delayed-stream": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "delegates": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "detect-libc": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "ecc-jsbn": { "version": "0.1.1", "bundled": true, - "dev": true, "optional": true, "requires": { "jsbn": "0.1.1" @@ -1508,24 +1729,20 @@ "extend": { "version": "3.0.1", "bundled": true, - "dev": true, "optional": true }, "extsprintf": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "forever-agent": { "version": "0.6.1", "bundled": true, - "dev": true, "optional": true }, "form-data": { "version": "2.1.4", "bundled": true, - "dev": true, "optional": true, "requires": { "asynckit": "0.4.0", @@ -1535,13 +1752,11 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "fstream": { "version": "1.0.11", "bundled": true, - "dev": true, "requires": { "graceful-fs": "4.1.11", "inherits": "2.0.3", @@ -1552,7 +1767,6 @@ "fstream-ignore": { "version": "1.0.5", "bundled": true, - "dev": true, "optional": true, "requires": { "fstream": "1.0.11", @@ -1563,7 +1777,6 @@ "gauge": { "version": "2.7.4", "bundled": true, - "dev": true, "optional": true, "requires": { "aproba": "1.1.1", @@ -1579,7 +1792,6 @@ "getpass": { "version": "0.1.7", "bundled": true, - "dev": true, "optional": true, "requires": { "assert-plus": "1.0.0" @@ -1588,7 +1800,6 @@ "assert-plus": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true } } @@ -1596,7 +1807,6 @@ "glob": { "version": "7.1.2", "bundled": true, - "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -1608,19 +1818,16 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true, - "dev": true + "bundled": true }, "har-schema": { "version": "1.0.5", "bundled": true, - "dev": true, "optional": true }, "har-validator": { "version": "4.2.1", "bundled": true, - "dev": true, "optional": true, "requires": { "ajv": "4.11.8", @@ -1630,13 +1837,11 @@ "has-unicode": { "version": "2.0.1", "bundled": true, - "dev": true, "optional": true }, "hawk": { "version": "3.1.3", "bundled": true, - "dev": true, "requires": { "boom": "2.10.1", "cryptiles": "2.0.5", @@ -1646,13 +1851,11 @@ }, "hoek": { "version": "2.16.3", - "bundled": true, - "dev": true + "bundled": true }, "http-signature": { "version": "1.1.1", "bundled": true, - "dev": true, "optional": true, "requires": { "assert-plus": "0.2.0", @@ -1663,7 +1866,6 @@ "inflight": { "version": "1.0.6", "bundled": true, - "dev": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -1671,19 +1873,16 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "dev": true + "bundled": true }, "ini": { "version": "1.3.4", "bundled": true, - "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "dev": true, "requires": { "number-is-nan": "1.0.1" } @@ -1691,24 +1890,20 @@ "is-typedarray": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true }, "isarray": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "isstream": { "version": "0.1.2", "bundled": true, - "dev": true, "optional": true }, "jodid25519": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true, "requires": { "jsbn": "0.1.1" @@ -1717,19 +1912,16 @@ "jsbn": { "version": "0.1.1", "bundled": true, - "dev": true, "optional": true }, "json-schema": { "version": "0.2.3", "bundled": true, - "dev": true, "optional": true }, "json-stable-stringify": { "version": "1.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { "jsonify": "0.0.0" @@ -1738,19 +1930,16 @@ "json-stringify-safe": { "version": "5.0.1", "bundled": true, - "dev": true, "optional": true }, "jsonify": { "version": "0.0.0", "bundled": true, - "dev": true, "optional": true }, "jsprim": { "version": "1.4.0", "bundled": true, - "dev": true, "optional": true, "requires": { "assert-plus": "1.0.0", @@ -1762,20 +1951,17 @@ "assert-plus": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true } } }, "mime-db": { "version": "1.27.0", - "bundled": true, - "dev": true + "bundled": true }, "mime-types": { "version": "2.1.15", "bundled": true, - "dev": true, "requires": { "mime-db": "1.27.0" } @@ -1783,20 +1969,17 @@ "minimatch": { "version": "3.0.4", "bundled": true, - "dev": true, "requires": { "brace-expansion": "1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true, - "dev": true + "bundled": true }, "mkdirp": { "version": "0.5.1", "bundled": true, - "dev": true, "requires": { "minimist": "0.0.8" } @@ -1804,13 +1987,11 @@ "ms": { "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, "node-pre-gyp": { "version": "0.6.39", "bundled": true, - "dev": true, "optional": true, "requires": { "detect-libc": "1.0.2", @@ -1829,7 +2010,6 @@ "nopt": { "version": "4.0.1", "bundled": true, - "dev": true, "optional": true, "requires": { "abbrev": "1.1.0", @@ -1839,7 +2019,6 @@ "npmlog": { "version": "4.1.0", "bundled": true, - "dev": true, "optional": true, "requires": { "are-we-there-yet": "1.1.4", @@ -1850,25 +2029,21 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "oauth-sign": { "version": "0.8.2", "bundled": true, - "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", "bundled": true, - "dev": true, "optional": true }, "once": { "version": "1.4.0", "bundled": true, - "dev": true, "requires": { "wrappy": "1.0.2" } @@ -1876,19 +2051,16 @@ "os-homedir": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", "bundled": true, - "dev": true, "optional": true }, "osenv": { "version": "0.1.4", "bundled": true, - "dev": true, "optional": true, "requires": { "os-homedir": "1.0.2", @@ -1897,36 +2069,30 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "performance-now": { "version": "0.2.0", "bundled": true, - "dev": true, "optional": true }, "process-nextick-args": { "version": "1.0.7", - "bundled": true, - "dev": true + "bundled": true }, "punycode": { "version": "1.4.1", "bundled": true, - "dev": true, "optional": true }, "qs": { "version": "6.4.0", "bundled": true, - "dev": true, "optional": true }, "rc": { "version": "1.2.1", "bundled": true, - "dev": true, "optional": true, "requires": { "deep-extend": "0.4.2", @@ -1938,7 +2104,6 @@ "minimist": { "version": "1.2.0", "bundled": true, - "dev": true, "optional": true } } @@ -1946,7 +2111,6 @@ "readable-stream": { "version": "2.2.9", "bundled": true, - "dev": true, "requires": { "buffer-shims": "1.0.0", "core-util-is": "1.0.2", @@ -1960,7 +2124,6 @@ "request": { "version": "2.81.0", "bundled": true, - "dev": true, "optional": true, "requires": { "aws-sign2": "0.6.0", @@ -1990,38 +2153,32 @@ "rimraf": { "version": "2.6.1", "bundled": true, - "dev": true, "requires": { "glob": "7.1.2" } }, "safe-buffer": { "version": "5.0.1", - "bundled": true, - "dev": true + "bundled": true }, "semver": { "version": "5.3.0", "bundled": true, - "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", "bundled": true, - "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", "bundled": true, - "dev": true, "optional": true }, "sntp": { "version": "1.0.9", "bundled": true, - "dev": true, "requires": { "hoek": "2.16.3" } @@ -2029,7 +2186,6 @@ "sshpk": { "version": "1.13.0", "bundled": true, - "dev": true, "optional": true, "requires": { "asn1": "0.2.3", @@ -2046,7 +2202,6 @@ "assert-plus": { "version": "1.0.0", "bundled": true, - "dev": true, "optional": true } } @@ -2054,7 +2209,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "dev": true, "requires": { "code-point-at": "1.1.0", "is-fullwidth-code-point": "1.0.0", @@ -2064,7 +2218,6 @@ "string_decoder": { "version": "1.0.1", "bundled": true, - "dev": true, "requires": { "safe-buffer": "5.0.1" } @@ -2072,13 +2225,11 @@ "stringstream": { "version": "0.0.5", "bundled": true, - "dev": true, "optional": true }, "strip-ansi": { "version": "3.0.1", "bundled": true, - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -2086,13 +2237,11 @@ "strip-json-comments": { "version": "2.0.1", "bundled": true, - "dev": true, "optional": true }, "tar": { "version": "2.2.1", "bundled": true, - "dev": true, "requires": { "block-stream": "0.0.9", "fstream": "1.0.11", @@ -2102,7 +2251,6 @@ "tar-pack": { "version": "3.4.0", "bundled": true, - "dev": true, "optional": true, "requires": { "debug": "2.6.8", @@ -2118,7 +2266,6 @@ "tough-cookie": { "version": "2.3.2", "bundled": true, - "dev": true, "optional": true, "requires": { "punycode": "1.4.1" @@ -2127,7 +2274,6 @@ "tunnel-agent": { "version": "0.6.0", "bundled": true, - "dev": true, "optional": true, "requires": { "safe-buffer": "5.0.1" @@ -2136,30 +2282,25 @@ "tweetnacl": { "version": "0.14.5", "bundled": true, - "dev": true, "optional": true }, "uid-number": { "version": "0.0.6", "bundled": true, - "dev": true, "optional": true }, "util-deprecate": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "uuid": { "version": "3.0.1", "bundled": true, - "dev": true, "optional": true }, "verror": { "version": "1.3.6", "bundled": true, - "dev": true, "optional": true, "requires": { "extsprintf": "1.0.2" @@ -2168,7 +2309,6 @@ "wide-align": { "version": "1.1.2", "bundled": true, - "dev": true, "optional": true, "requires": { "string-width": "1.0.2" @@ -2176,8 +2316,7 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true } } }, @@ -2196,8 +2335,7 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "glob": { "version": "7.1.2", @@ -2217,7 +2355,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, "requires": { "glob-parent": "2.0.0", "is-glob": "2.0.1" @@ -2227,11 +2364,18 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, "requires": { "is-glob": "2.0.1" } }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "requires": { + "ini": "1.3.5" + } + }, "globals": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.1.0.tgz", @@ -2252,11 +2396,28 @@ "pinkie-promise": "2.0.1" } }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "growl": { "version": "1.10.3", @@ -2276,8 +2437,7 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" }, "hash-base": { "version": "2.0.2", @@ -2321,6 +2481,24 @@ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", "dev": true }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + }, + "dependencies": { + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + } + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -2330,8 +2508,7 @@ "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, "ieee754": { "version": "1.1.8", @@ -2345,11 +2522,20 @@ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indexof": { "version": "0.0.1", @@ -2370,8 +2556,12 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { "version": "3.3.0", @@ -2401,21 +2591,17 @@ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, - "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2426,7 +2612,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, "requires": { "binary-extensions": "1.11.0" } @@ -2434,8 +2619,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-builtin-module": { "version": "1.0.0", @@ -2449,14 +2633,12 @@ "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, "requires": { "is-primitive": "2.0.0" } @@ -2464,39 +2646,53 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, "requires": { "is-extglob": "1.0.0" } }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, "requires": { "kind-of": "3.2.2" } }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -2516,7 +2712,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, "requires": { "path-is-inside": "1.0.2" } @@ -2524,14 +2719,12 @@ "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, "is-promise": { "version": "2.1.0", @@ -2539,35 +2732,41 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, "is-resolvable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz", "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==", "dev": true }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, "requires": { "isarray": "1.0.0" } @@ -2616,11 +2815,18 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "4.0.1" + } + }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -2697,25 +2903,40 @@ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", "dev": true }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" } }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "requires": { + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -2738,6 +2959,11 @@ } } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", @@ -2757,11 +2983,20 @@ "readable-stream": "2.3.3" } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, "requires": { "arr-diff": "2.0.0", "array-unique": "0.2.1", @@ -2788,6 +3023,24 @@ "brorand": "1.1.0" } }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, "mimic-fn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", @@ -2810,7 +3063,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "1.1.8" } @@ -2818,14 +3070,12 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -2860,10 +3110,31 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "multer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz", + "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=", + "requires": { + "append-field": "0.1.0", + "busboy": "0.2.14", + "concat-stream": "1.6.0", + "mkdirp": "0.5.1", + "object-assign": "3.0.0", + "on-finished": "2.3.0", + "type-is": "1.6.15", + "xtend": "4.0.1" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + } + } }, "mute-stream": { "version": "0.0.7", @@ -2875,7 +3146,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", - "dev": true, "optional": true }, "natural-compare": { @@ -2884,6 +3154,11 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", @@ -2915,6 +3190,44 @@ "vm-browserify": "0.0.4" } }, + "nodemon": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.14.7.tgz", + "integrity": "sha512-uEguLNr+QIk4TVd8swNvw7kHqOE/sjvNsIwhnc8CM7QdI+ezFvvkMRtCpCJ+DEVyIopLSTu2eayZ/ELKtswcbg==", + "requires": { + "chokidar": "1.7.0", + "debug": "2.6.9", + "ignore-by-default": "1.0.1", + "minimatch": "3.0.4", + "pstree.remy": "1.1.0", + "touch": "3.1.0", + "undefsafe": "0.0.3", + "update-notifier": "2.3.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1.1.1" + } + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -2931,7 +3244,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, "requires": { "remove-trailing-separator": "1.1.0" } @@ -2940,7 +3252,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, "requires": { "path-key": "2.0.1" } @@ -2961,12 +3272,19 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, "requires": { "for-own": "0.1.5", "is-extendable": "0.1.1" } }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3025,8 +3343,7 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { "version": "1.1.0", @@ -3043,6 +3360,17 @@ "p-limit": "1.1.0" } }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.4.1" + } + }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", @@ -3066,7 +3394,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, "requires": { "glob-base": "0.3.0", "is-dotfile": "1.0.3", @@ -3083,6 +3410,11 @@ "error-ex": "1.3.1" } }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, "path-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", @@ -3098,20 +3430,22 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { "version": "2.0.0", @@ -3122,6 +3456,14 @@ "pify": "2.3.0" } }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "requires": { + "through": "2.3.8" + } + }, "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", @@ -3168,11 +3510,15 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "process": { "version": "0.11.10", @@ -3183,8 +3529,7 @@ "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "progress": { "version": "2.0.0", @@ -3192,17 +3537,41 @@ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, + "ps-tree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", + "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", + "requires": { + "event-stream": "3.3.4" + } + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "pstree.remy": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.0.tgz", + "integrity": "sha512-q5I5vLRMVtdWa8n/3UEzZX7Lfghzrg9eG2IKk2ENLSofKRCXVqMvMUHxCKgXNaqH/8ebhBxrqftHWnyTFweJ5Q==", + "requires": { + "ps-tree": "1.1.0" + } }, "public-encrypt": { "version": "4.0.0", @@ -3223,6 +3592,11 @@ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -3239,7 +3613,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" @@ -3249,7 +3622,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, "requires": { "kind-of": "3.2.2" }, @@ -3258,7 +3630,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3269,7 +3640,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, "requires": { "is-buffer": "1.1.6" } @@ -3295,6 +3665,40 @@ "safe-buffer": "5.1.1" } }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", + "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -3320,7 +3724,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -3335,7 +3738,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, "requires": { "graceful-fs": "4.1.11", "minimatch": "3.0.4", @@ -3347,28 +3749,41 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, "requires": { "is-equal-shallow": "0.1.3" } }, + "registry-auth-token": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "requires": { + "rc": "1.2.2", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "1.2.2" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "require-directory": { "version": "2.1.1", @@ -3463,14 +3878,66 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "5.4.1" + } + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } }, "set-blocking": { "version": "2.0.0", @@ -3481,8 +3948,7 @@ "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" }, "setimmediate": { "version": "1.0.5", @@ -3490,6 +3956,11 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, "sha.js": { "version": "2.4.9", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", @@ -3504,7 +3975,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -3512,14 +3982,12 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slice-ansi": { "version": "1.0.0", @@ -3563,6 +4031,14 @@ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "requires": { + "through": "2.3.8" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -3574,6 +4050,11 @@ "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-0.4.0.tgz", "integrity": "sha1-I76WNVIOsP9Dp0Hn6DA5cmbohEU=" }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", @@ -3584,6 +4065,14 @@ "readable-stream": "2.3.3" } }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "requires": { + "duplexer": "0.1.1" + } + }, "stream-http": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", @@ -3597,11 +4086,15 @@ "xtend": "4.0.1" } }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -3611,7 +4104,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, "requires": { "safe-buffer": "5.1.1" } @@ -3620,7 +4112,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "3.0.0" }, @@ -3628,8 +4119,7 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" } } }, @@ -3642,14 +4132,12 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "supports-color": { "version": "2.0.0", @@ -3677,6 +4165,14 @@ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "0.7.0" + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -3686,8 +4182,12 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { "version": "2.0.4", @@ -3713,11 +4213,13 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "requires": { + "nopt": "1.0.10" + } }, "tty-browserify": { "version": "0.0.0", @@ -3734,11 +4236,19 @@ "prelude-ls": "1.1.2" } }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "uglify-js": { "version": "2.8.29", @@ -3783,6 +4293,45 @@ "webpack-sources": "1.1.0" } }, + "undefsafe": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", + "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=" + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "requires": { + "boxen": "1.3.0", + "chalk": "2.3.0", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -3801,6 +4350,14 @@ } } }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "1.0.4" + } + }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -3821,8 +4378,12 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "validate-npm-package-license": { "version": "3.0.1", @@ -3834,6 +4395,11 @@ "spdx-expression-parse": "1.0.4" } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -3925,7 +4491,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, "requires": { "isexe": "2.0.0" } @@ -3936,6 +4501,14 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "requires": { + "string-width": "2.1.1" + } + }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", @@ -4004,11 +4577,25 @@ "mkdirp": "0.5.1" } }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", @@ -4019,8 +4606,7 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { "version": "8.0.2", diff --git a/package.json b/package.json index fbda4224..41ed8b54 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,15 @@ "description": "Frappe Core", "main": "frappe/index.js", "scripts": { - "test": "mocha frappe/tests" + "test": "mocha frappe/tests", + "start": "nodemon frappe/app.js" }, "dependencies": { + "body-parser": "^1.18.2", + "express": "^4.16.2", + "ms": "^2.1.1", + "multer": "^1.3.0", + "nodemon": "^1.14.7", "sql.js": "^0.4.0", "walk": "^2.3.9" }, @@ -21,7 +27,6 @@ }, "homepage": "https://github.com/frappe/frappe-js#readme", "devDependencies": { - "babel-eslint": "^8.0.1", "eslint": "^4.9.0", "mocha": "^4.0.1", "webpack": "^3.8.1" From 13385f16c31f69de46a2f0e7c0da039f558b724e Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 2 Jan 2018 15:40:32 +0530 Subject: [PATCH 006/477] add sqlite3 backend, rest api test --- .eslintrc | 3 + README.md | 114 +++- frappe/app.js | 15 +- frappe/backends/rest_client.js | 0 frappe/backends/sqllite.js | 214 ++++++++ frappe/index.js | 58 +- frappe/model/database.js | 172 ------ frappe/model/document.js | 66 ++- frappe/model/index.js | 29 +- frappe/model/meta.js | 2 +- frappe/models/doctype/todo/todo.js | 3 + frappe/rest.js | 27 - frappe/rest_server.js | 35 ++ frappe/tests/test_controller.js | 12 +- frappe/tests/test_database.js | 41 +- frappe/tests/test_document.js | 53 +- frappe/tests/test_meta.js | 6 +- frappe/tests/test_models.js | 6 +- frappe/tests/test_rest_api.js | 43 ++ package-lock.json | 846 +++++++++++++++++++++++++---- package.json | 7 +- 21 files changed, 1308 insertions(+), 444 deletions(-) create mode 100644 frappe/backends/rest_client.js create mode 100644 frappe/backends/sqllite.js delete mode 100644 frappe/model/database.js delete mode 100644 frappe/rest.js create mode 100644 frappe/rest_server.js create mode 100644 frappe/tests/test_rest_api.js diff --git a/.eslintrc b/.eslintrc index 2d55cb35..c1e7e091 100644 --- a/.eslintrc +++ b/.eslintrc @@ -3,5 +3,8 @@ "browser": true, "es6": true, "node": true + }, + "parserOptions": { + "ecmaVersion": 2017 } } \ No newline at end of file diff --git a/README.md b/README.md index ab1dca36..f777e3b7 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Core libs for Frappe Framework JS Models are declared by adding a `.json` model file in the `models/doctype` folder of the module/app. +```json { "autoname": "hash", "name": "ToDo", @@ -36,54 +37,100 @@ Models are declared by adding a `.json` model file in the `models/doctype` folde } ] } +``` ## Setup / Migrate +```js const frappe = require('frappe-core'); frappe.init(); // sync all schema from `models` folders in all apps frappe.migrate(); +``` ## Managing Documents Frappe Object-Relational-Mapper (ORM) helps you manage (create, read, update, delete) documents based on the DocTypes declared. -Documents are stored in SQLite using `sql.js` +Documents are sub-classed from the `frappe.document.Document` class. + +All document write methods are asynchronous and return javascript Promise objects. + +### Initialize + +Documents are initialized with the `frappe.get_doc` method. If `doctype` and `name` are passed as parameters, then the document is fetched from the backend. If a simple object is passed, then object properties are set in the document. + +```js + const frappe = require('frappe-core'); + await frappe.init(); + + // make a new todo + let todo = await frappe.get_doc({doctype: 'ToDo', subject: 'something'}); +``` ### Create +You can insert a document in the backend with the `insert` method. + +```js const frappe = require('frappe-core'); - frappe.init(); + await frappe.init(); // make a new todo - let todo = frappe.get_doc({doctype: 'ToDo', subject: 'something'}); - todo.insert(); + let todo = await frappe.get_doc({doctype: 'ToDo', subject: 'something'}); + await todo.insert(); +``` ### Read +You can read a document from the backend with the `frappe.get_doc` method + +```js const frappe = require('frappe-core'); - frappe.init(); + await frappe.init(); // get all open todos - let todos = frappe.db.get_all('ToDo', ['name'], {status: "Open"}); - let first_todo = frappe.get_doc('ToDo', toods[0].name); - + let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); + let first_todo = await frappe.get_doc('ToDo', toods[0].name); +``` ### Update +The `update` method updates a document. + +```js const frappe = require('frappe-core'); - frappe.init(); + await frappe.init(); // get all open todos - let todos = frappe.db.get_all('ToDo', ['name'], {status: "Open"}); - let first_todo = frappe.get_doc('ToDo', toods[0].name); + let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); + let first_todo = await frappe.get_doc('ToDo', toods[0].name); first_todo.status = 'Closed'; - first_todo.update(); + await first_todo.update(); +``` + +### Delete + +The `delete` method deletes a document. + +```js + const frappe = require('frappe-core'); + await frappe.init(); + + // get all open todos + let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); + let first_todo = await frappe.get_doc('ToDo', toods[0].name); + + await first_todo.delete(); +``` ## Metadata +Metadata are first class objects in Frappe. You can get a metadata object by `frappe.get_meta`. All objects from the `models` folders of all modules are loaded. + +```js const frappe = require('frappe-core'); frappe.init(); @@ -91,6 +138,7 @@ Documents are stored in SQLite using `sql.js` // get all fields of type "Data" let data_fields = todo_meta.fields.map(d => d.fieldtype=='Data' ? d : null); +``` ## Controllers @@ -98,9 +146,16 @@ You can write event handlers in controllers, by declaring a `.js` file in the `m The name of the class must be the slugged name of the DocType +To add a standard handler, you must bind all handlers in `setup` method. + +```js const frappe = require('frappe-core'); class todo extends frappe.document.Document { + setup() { + this.add_handler('validate'); + } + validate() { // set default status as "Open" if not set if (!this.status) { @@ -110,15 +165,34 @@ The name of the class must be the slugged name of the DocType } module.exports = { todo: todo }; +``` + +### Controller Events + +Standard events on which you can bind handlers are + +- `before_insert` +- `before_update` +- `validate` (called before any write) +- `after_insert`, +- `after_update` (called after any write) +- `before_submit` +- `after_submit` +- `before_cancel` +- `after_cancel` +- `before_delete` +- `after_delete` ## Database You can also directly write SQL with `frappe.db.sql` +```js const frappe = require('frappe-core'); frappe.init(); all_todos = frappe.db.sql('select name from todo'); +``` ## REST API @@ -137,10 +211,12 @@ You can directly access documents at `/api/resource/:doctype` Data: +```json { "subject": "test", - "description": " + "description": "test description" } +``` ### Read @@ -153,6 +229,7 @@ Data: Reponse: +```json { "name": "uig7d1v12", "owner": "guest", @@ -164,6 +241,7 @@ Reponse: "description": "description 1", "status": "Open" } +``` ### List @@ -179,6 +257,7 @@ Reponse: Response: +```json [ { "name": "r4qxyki0i6", @@ -193,3 +272,12 @@ Response: "subject": "test 1" } ] +``` +## Tests + +All tests are in the `tests` folder and are run using `mocha`. To run tests + +```sh + npm run test +``` + diff --git a/frappe/app.js b/frappe/app.js index f5617e70..5f64154a 100644 --- a/frappe/app.js +++ b/frappe/app.js @@ -1,17 +1,6 @@ -const express = require('express'); -const app = express(); -const bodyParser = require('body-parser'); +const app = require('express')(); const frappe = require('frappe-core'); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: true })); - // setup frappe REST routes -frappe.init(); -frappe.db.migrate(); -frappe.db.write(); - -frappe.rest.setup(app); - -app.listen(8000); +frappe.init({app:app}).then(frappe.start()); diff --git a/frappe/backends/rest_client.js b/frappe/backends/rest_client.js new file mode 100644 index 00000000..e69de29b diff --git a/frappe/backends/sqllite.js b/frappe/backends/sqllite.js new file mode 100644 index 00000000..24ea7f1e --- /dev/null +++ b/frappe/backends/sqllite.js @@ -0,0 +1,214 @@ +const frappe = require('frappe-core'); +const sqlite3 = require('sqlite3').verbose(); + +class SQLLiteDatabase { + constructor(db_name) { + this.conn_name = db_name; + this.init_type_map(); + } + + connect(db_name) { + if (db_name) { + this.conn_name = db_name; + } + return new Promise(resolve => { + this.conn = new sqlite3.Database(this.conn_name, () => { + resolve(); + }); + }); + } + + async migrate() { + for (let doctype in frappe.models.path_map.doctype) { + if (await this.table_exists(doctype)) { + await this.alter_table(doctype); + } else { + await this.create_table(doctype); + } + } + await this.commit(); + } + + async create_table(doctype) { + let meta = frappe.get_meta(doctype); + let columns = []; + + for (let df of this.get_fields(meta)) { + if (this.type_map[df.fieldtype]) { + columns.push(`${df.fieldname} ${this.type_map[df.fieldtype]} ${df.reqd ? "not null" : ""} ${df.default ? ("default " + frappe.utils.sqlescape(df.default)) : ""}`); + } + } + + const query = `CREATE TABLE IF NOT EXISTS ${frappe.slug(doctype)} ( + ${columns.join(", ")})`; + + return await this.run(query); + } + + close() { + this.conn.close(); + } + + async alter_table(doctype) { + // add columns + + // change columns + + } + + get(doctype, name, fields='*') { + if (fields instanceof Array) { + fields = fields.join(", "); + } + return new Promise((resolve, reject) => { + this.conn.get(`select ${fields} from ${frappe.slug(doctype)} + where name = ?`, name, + (err, row) => { + resolve(row || {}); + }); + }); + } + + async insert(doctype, doc) { + return await this.run(`insert into ${frappe.slug(doctype)} + (${Object.keys(doc).join(", ")}) + values (${Object.values(doc).map(d => frappe.db.escape(d)).join(", ")})`); + } + + async update(doctype, doc) { + let assigns = []; + for (let key in doc) { + assigns.push(`${key} = ${this.escape(doc[key])}`); + } + return await this.run(`update ${frappe.slug(doctype)} + set ${assigns.join(", ")}`); + } + + async delete(doctype, name) { + return await this.run(`delete from ${frappe.slug(doctype)} where name=?`, name); + } + + get_all(doctype, fields=['name'], filters, start, limit) { + return new Promise(resolve => { + this.conn.all(`select ${fields.join(", ")} + from ${frappe.slug(doctype)} + ${filters ? "where" : ""} ${this.get_filter_conditions(filters)} + ${limit ? ("limit " + limit) : ""} ${start ? ("offset " + start) : ""}`, + (err, rows) => { + resolve(rows); + }); + }); + } + + get_filter_conditions(filters) { + // {"status": "Open"} => `status = "Open"` + // {"status": "Open", "name": ["like", "apple%"]} + // => `status="Open" and name like "apple%" + let conditions = []; + for (let key in filters) { + const value = filters[key]; + if (value instanceof Array) { + conditions.push(`${key} ${value[0]} ${this.escape(value)}`); + } else { + conditions.push(`${key} = ${this.escape(value)}`); + } + } + return conditions.join(" and "); + } + + run(query, params) { + //console.log(query); + return new Promise((resolve, reject) => { + this.conn.run(query, params, (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } + + sql(query, params) { + //console.log(query); + return new Promise((resolve) => { + this.conn.all(query, params, (err, rows) => { + resolve(rows); + }); + }); + } + + async commit() { + try { + await this.run('commit'); + } catch (e) { + if (e.errno !== 1) { + throw e; + } + } + } + + async get_value(doctype, filters, fieldname='name') { + if (typeof filters==='string') { + filters = {name: filters}; + } + + let row = await this.get_all(doctype, [fieldname], filters, 0, 1); + return row.length ? row[0][fieldname] : null; + } + + escape(value) { + return frappe.utils.sqlescape(value); + } + + get_fields(meta) { + // add standard fields + let fields = frappe.model.standard_fields.slice(); + if (meta.istable) { + fields = fields.concat(frappe.model.child_fields); + } + + // add model fields + fields = fields.concat(meta.fields); + + return fields; + } + + async table_exists(table) { + const name = await this.sql(`SELECT name FROM sqlite_master WHERE type='table' AND name='${table}'`); + return (name && name.length) ? true : false; + } + + init_type_map() { + this.type_map = { + 'Currency': 'real' + ,'Int': 'integer' + ,'Float': 'real' + ,'Percent': 'real' + ,'Check': 'integer' + ,'Small Text': 'text' + ,'Long Text': 'text' + ,'Code': 'text' + ,'Text Editor': 'text' + ,'Date': 'text' + ,'Datetime': 'text' + ,'Time': 'text' + ,'Text': 'text' + ,'Data': 'text' + ,'Link': 'text' + ,'Dynamic Link':'text' + ,'Password': 'text' + ,'Select': 'text' + ,'Read Only': 'text' + ,'Attach': 'text' + ,'Attach Image':'text' + ,'Signature': 'text' + ,'Color': 'text' + ,'Barcode': 'text' + ,'Geolocation': 'text' + } + } + +} + +module.exports = { Database: SQLLiteDatabase }; diff --git a/frappe/index.js b/frappe/index.js index de613079..38897ba2 100644 --- a/frappe/index.js +++ b/frappe/index.js @@ -1,26 +1,33 @@ const path = require('path'); +const bodyParser = require('body-parser'); module.exports = { - init(db_path = 'test.db', user, user_key) { - this.db_path = db_path; + async init({db_name ='test.db', user, user_key, for_test} = {}) { + this.db_name = db_name; if (this._initialized) return; this.init_config(); this.init_errors(); this.init_globals(); this.init_libs(); - this.init_db(); + await this.init_db(); this._initialized = true; this.login(user, user_key); }, + init_config() { - this.config = {}; + this.config = { + backend: 'sqllite' + }; }, + init_errors() { this.ValueError = class extends Error { }; }, + init_globals() { this.meta_cache = {}; }, + init_libs() { this.utils = require('./utils'); Object.assign(this, this.utils); @@ -30,33 +37,64 @@ module.exports = { this.document = require('./model/document'); this.meta = require('./model/meta'); this.session_lib = require('./session'); - this.rest = require('./rest'); + this.rest_server = require('./rest_server'); }, - init_db() { - let database = require('./model/database'); - this.db = new database.Database(this.db_path); + + init_app(app) { + this.app = app; + this.init_middleware(); + this.rest_server.setup(this.app); }, + + init_middleware() { + this.app.use(bodyParser.json()); + this.app.use(bodyParser.urlencoded({ extended: true })); + }, + + async start(port=8000) { + await this.db.migrate(); + this.server = this.app.listen(port); + }, + + async init_db() { + let database = require('./backends/' + this.config.backend); + this.db = new database.Database(this.db_name); + await this.db.connect(this.db_name); + }, + get_meta(doctype) { if (!this.meta_cache[doctype]) { this.meta_cache[doctype] = new this.meta.Meta(this.models.get('DocType', doctype)); } return this.meta_cache[doctype]; }, - get_doc(data, name) { + + async get_doc(data, name) { if (typeof data==='string' && typeof name==='string') { let controller_class = this.models.get_controller(data); var doc = new controller_class({doctype:data, name: name}); - doc.load(); + await doc.load(); } else { let controller_class = this.models.get_controller(data.doctype); var doc = new controller_class(data); } return doc; }, + + async insert(data) { + const doc = await this.get_doc(data); + return await doc.insert(); + }, + login(user, user_key) { this.session = new this.session_lib.Session(user); if (user && user_key) { this.login(user_key); } + }, + + close() { + this.db.close(); + this.server.close(); } }; diff --git a/frappe/model/database.js b/frappe/model/database.js deleted file mode 100644 index 7e0966bd..00000000 --- a/frappe/model/database.js +++ /dev/null @@ -1,172 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const SQL = require('sql.js'); -const frappe = require('frappe-core'); - -class Database { - constructor(db_path) { - this.db_file_name = db_path; - this.connect(); - } - - connect() { - if (this.db_path) { - const filebuffer = fs.readFileSync(this.db_path); - this._conn = new SQL.Database(filebuffer); - } else { - this._conn = new SQL.Database(); - } - } - - write() { - if (this.db_path) { - let data = this._conn.export(); - fs.writeFileSync(this.db_path, new Buffer(data)); - } - } - - close() { - this.write(); - this._conn.close(); - } - - create_db() { - // Create a database. - let db = new SQL.Database(); - let query = SCHEMA; - let result = db.exec(query); - if (Object.keys(result).length === 0 && - typeof result.constructor === 'function') { - return db; - } else { - return null; - } - } - - migrate() { - for (let doctype in frappe.models.path_map.doctype) { - if (this.table_exists(doctype)) { - this.alter_table(doctype); - } else { - this.create_table(doctype); - } - } - } - - create_table(doctype) { - let meta = frappe.get_meta(doctype); - let columns = []; - - for (let df of this.get_fields(meta)) { - if (frappe.model.type_map[df.fieldtype]) { - columns.push(`${df.fieldname} ${frappe.model.type_map[df.fieldtype]} ${df.reqd ? "not null" : ""} ${df.default ? ("default " + frappe.utils.sqlescape(df.default)) : ""}`); - } - } - - const query = `CREATE TABLE IF NOT EXISTS ${frappe.slug(doctype)} ( - ${columns.join(", ")})`; - - return this.sql(query); - } - - alter_table(doctype) { - // add columns - - // change columns - - } - - get(doctype, name) { - let doc = frappe.db.sql(`select * from ${frappe.slug(doctype)} where name = ${frappe.db.escape(name)}`); - return doc ? doc[0] : {}; - } - - insert(doctype, doc) { - this.sql(`insert into ${frappe.slug(doctype)} - (${Object.keys(doc).join(", ")}) - values (${Object.values(doc).map(d => frappe.db.escape(d)).join(", ")})`); - } - - update(doctype, doc) { - let assigns = []; - for (let key in doc) { - assigns.push(`${key} = ${this.escape(doc[key])}`); - } - this.sql(`update ${frappe.slug(doctype)} - set ${assigns.join(", ")}`); - } - - get_all(doctype, fields=['name'], filters, start, limit) { - return this.sql(`select ${fields.join(", ")} - from ${frappe.slug(doctype)} - ${filters ? "where" : ""} ${this.get_filter_conditions(filters)} - ${limit ? ("limit " + limit) : ""} ${start ? ("offset " + start) : ""}`); - } - - get_filter_conditions(filters) { - // {"status": "Open"} => `status = "Open"` - // {"status": "Open", "name": ["like", "apple%"]} - // => `status="Open" and name like "apple%" - let conditions = []; - for (let key in filters) { - const value = filters[key]; - if (value instanceof Array) { - conditions.push(`${key} ${value[0]} ${this.escape(value)}`); - } else { - conditions.push(`${key} = ${this.escape(value)}`); - } - } - return conditions.join(" and "); - } - - sql(query, opts={}) { - //console.log(query); - const result = frappe.db._conn.exec(query); - if (result.length > 0) { - if (opts.as_list) - return result[0]; - else - return sql_result_to_obj(result[0]); - } - return null; - } - - get_value(doctype, name, fieldname='name') { - let value = this.sql(`select ${fieldname} from ${frappe.slug(doctype)} - where name=${this.escape(name)}`); - return value.length ? value[0][fieldname] : null; - } - - escape(value) { - return frappe.utils.sqlescape(value); - } - - get_fields(meta) { - // add standard fields - let fields = frappe.model.standard_fields.slice(); - if (meta.istable) { - fields = fields.concat(frappe.model.child_fields); - } - - // add model fields - fields = fields.concat(meta.fields); - - return fields; - } - - table_exists(table) { - return this.sql(`SELECT name FROM sqlite_master WHERE type='table' AND name='${table}'`) ? true : false; - } -} - -function sql_result_to_obj(result) { - const columns = result.columns; - return result.values.map(row => { - return columns.reduce((res, col, i) => { - res[col] = row[i]; - return res; - }, {}); - }) -} - -module.exports = { Database: Database }; \ No newline at end of file diff --git a/frappe/model/document.js b/frappe/model/document.js index c6187673..fd756ae7 100644 --- a/frappe/model/document.js +++ b/frappe/model/document.js @@ -2,9 +2,22 @@ const frappe = require('frappe-core'); class Document { constructor(data) { + this.handlers = {}; + this.setup(); Object.assign(this, data); } + setup() { + // add handlers + } + + add_handler(key, method) { + if (!this.handlers[key]) { + this.handlers[key] = []; + } + this.handlers[key].push(method || key); + } + get(key) { return this[key]; } @@ -51,13 +64,6 @@ class Document { } } - validate() { } - before_insert() { } - after_insert() { } - before_update() { } - after_update() { } - after_save() { } - get_valid_dict() { let doc = {}; for(let df of this.meta.get_valid_fields()) { @@ -79,29 +85,43 @@ class Document { this.modified = now; } - load() { - Object.assign(this, frappe.db.get(this.doctype, this.name)); - return this; + async load() { + Object.assign(this, await frappe.db.get(this.doctype, this.name)); } - insert() { + async insert() { this.set_name(); this.set_standard_values(); - this.validate(); - this.before_insert(); - frappe.db.insert(this.doctype, this.get_valid_dict()) - this.after_insert(); - this.after_save(); - return this; + await this.trigger('validate', 'before_insert'); + await frappe.db.insert(this.doctype, this.get_valid_dict()); + await this.trigger('after_insert', 'after_save'); } - update() { + async delete() { + await this.trigger('before_delete'); + await frappe.db.delete(this.doctype, this.name); + await this.trigger('after_delete'); + } + + async trigger() { + for(var key of arguments) { + if (this.handlers[key]) { + for (let method of this.handlers[key]) { + if (typeof method === 'string') { + await this[method](); + } else { + await method(this); + } + } + } + } + } + + async update() { this.set_standard_values(); - this.validate(); - this.before_insert(); - frappe.db.update(this.doctype, this.get_valid_dict()); - this.after_update(); - this.after_save(); + await this.trigger('validate', 'before_update'); + await frappe.db.update(this.doctype, this.get_valid_dict()); + await this.trigger('after_update', 'after_save'); return this; } }; diff --git a/frappe/model/index.js b/frappe/model/index.js index e6705a9f..2b6a6d8e 100644 --- a/frappe/model/index.js +++ b/frappe/model/index.js @@ -32,32 +32,5 @@ module.exports = { { fieldname: 'parentfield', fieldtype: 'Data', reqd: 1 } - ], - type_map: { - 'Currency': 'real' - ,'Int': 'integer' - ,'Float': 'real' - ,'Percent': 'real' - ,'Check': 'integer' - ,'Small Text': 'text' - ,'Long Text': 'text' - ,'Code': 'text' - ,'Text Editor': 'text' - ,'Date': 'text' - ,'Datetime': 'text' - ,'Time': 'text' - ,'Text': 'text' - ,'Data': 'text' - ,'Link': 'text' - ,'Dynamic Link':'text' - ,'Password': 'text' - ,'Select': 'text' - ,'Read Only': 'text' - ,'Attach': 'text' - ,'Attach Image':'text' - ,'Signature': 'text' - ,'Color': 'text' - ,'Barcode': 'text' - ,'Geolocation': 'text' - } + ] }; \ No newline at end of file diff --git a/frappe/model/meta.js b/frappe/model/meta.js index 2877d37e..473f0f32 100644 --- a/frappe/model/meta.js +++ b/frappe/model/meta.js @@ -42,7 +42,7 @@ class Meta extends Document { // doctype fields for (let df of this.fields) { - if (frappe.model.type_map[df.fieldtype]) { + if (frappe.db.type_map[df.fieldtype]) { this._valid_fields.push(df); } } diff --git a/frappe/models/doctype/todo/todo.js b/frappe/models/doctype/todo/todo.js index fc738568..2b778f5e 100644 --- a/frappe/models/doctype/todo/todo.js +++ b/frappe/models/doctype/todo/todo.js @@ -1,6 +1,9 @@ const frappe = require('frappe-core'); class todo extends frappe.document.Document { + setup() { + this.add_handler('validate'); + } validate() { if (!this.status) { this.status = 'Open'; diff --git a/frappe/rest.js b/frappe/rest.js deleted file mode 100644 index 5398d358..00000000 --- a/frappe/rest.js +++ /dev/null @@ -1,27 +0,0 @@ -const frappe = require('frappe-core'); - -module.exports = { - setup(app) { - // get list - app.get('/api/resource/:doctype', function(request, response) { - return response.json(frappe.db.get_all(request.params.doctype, ['name', 'subject'], null, - start = request.params.start || 0, limit = request.params.limit || 20)); - }); - - // create - app.post('/api/resource/:doctype', function(request, response) { - data = request.body; - data.doctype = request.params.doctype; - let doc = frappe.get_doc(data).insert(); - frappe.db.write(); - return response.json(doc.get_valid_dict()); - }); - - // get list - app.get('/api/resource/:doctype/:name', function(request, response) { - let data = frappe.get_doc(request.params.doctype, request.params.name).get_valid_dict(); - console.log(data); - return response.json(data); - }); - } -}; diff --git a/frappe/rest_server.js b/frappe/rest_server.js new file mode 100644 index 00000000..4e8fa59f --- /dev/null +++ b/frappe/rest_server.js @@ -0,0 +1,35 @@ +const frappe = require('frappe-core'); + +module.exports = { + setup(app) { + // get list + app.get('/api/resource/:doctype', async function(request, response) { + let data = await frappe.db.get_all(request.params.doctype, ['name', 'subject'], null, + start = request.params.start || 0, limit = request.params.limit || 20); + return response.json(data); + }); + + // create + app.post('/api/resource/:doctype', async function(request, response) { + data = request.body; + data.doctype = request.params.doctype; + let doc = await frappe.get_doc(data) + await doc.insert(); + await frappe.db.commit(); + return response.json(doc.get_valid_dict()); + }); + + // get list + app.get('/api/resource/:doctype/:name', async function(request, response) { + let data = await frappe.get_doc(request.params.doctype, request.params.name).get_valid_dict(); + return response.json(data); + }); + + // get list + app.delete('/api/resource/:doctype/:name', async function(request, response) { + let data = await frappe.get_doc(request.params.doctype, request.params.name).delete(); + return response.json(data); + }); + + } +}; diff --git a/frappe/tests/test_controller.js b/frappe/tests/test_controller.js index 8a50d5cd..9b930e87 100644 --- a/frappe/tests/test_controller.js +++ b/frappe/tests/test_controller.js @@ -2,17 +2,17 @@ const assert = require('assert'); const frappe = require('frappe-core'); describe('Controller', () => { - before(function() { - frappe.init(); - frappe.db.migrate(); + before(async function() { + await frappe.init(); + await frappe.db.migrate(); }); - it('should call controller method', () => { - let doc = frappe.get_doc({ + it('should call controller method', async () => { + let doc = await frappe.get_doc({ doctype:'ToDo', subject: 'test' }); - doc.validate(); + doc.trigger('validate'); assert.equal(doc.status, 'Open'); }); }); \ No newline at end of file diff --git a/frappe/tests/test_database.js b/frappe/tests/test_database.js index 8ea152bc..34950322 100644 --- a/frappe/tests/test_database.js +++ b/frappe/tests/test_database.js @@ -1,42 +1,45 @@ const assert = require('assert'); const frappe = require('frappe-core'); -describe('Document', () => { - before(function() { - frappe.init(); - frappe.db.migrate(); +describe('Database', () => { + before(async function() { + await frappe.init(); + await frappe.db.migrate(); }); - it('should insert and get values', () => { - frappe.db.sql('delete from todo'); - frappe.get_doc({doctype:'ToDo', subject: 'testing 1'}).insert(); - frappe.get_doc({doctype:'ToDo', subject: 'testing 3'}).insert(); - frappe.get_doc({doctype:'ToDo', subject: 'testing 2'}).insert(); + it('should insert and get values', async () => { + await frappe.db.sql('delete from todo'); + await frappe.insert({doctype:'ToDo', subject: 'testing 1'}); + await frappe.insert({doctype:'ToDo', subject: 'testing 3'}); + await frappe.insert({doctype:'ToDo', subject: 'testing 2'}); - let subjects = frappe.db.get_all('ToDo', ['name', 'subject']).map(d => d.subject); + let subjects = await frappe.db.get_all('ToDo', ['name', 'subject']) + subjects = subjects.map(d => d.subject); assert.ok(subjects.includes('testing 1')); assert.ok(subjects.includes('testing 2')); assert.ok(subjects.includes('testing 3')); }); - it('should filter correct values', () => { + it('should filter correct values', async () => { let subjects = null; - frappe.db.sql('delete from todo'); - frappe.get_doc({doctype:'ToDo', subject: 'testing 1', status: 'Open'}).insert(); - frappe.get_doc({doctype:'ToDo', subject: 'testing 3', status: 'Open'}).insert(); - frappe.get_doc({doctype:'ToDo', subject: 'testing 2', status: 'Closed'}).insert(); + await frappe.db.sql('delete from todo'); + await frappe.insert({doctype:'ToDo', subject: 'testing 1', status: 'Open'}); + await frappe.insert({doctype:'ToDo', subject: 'testing 3', status: 'Open'}); + await frappe.insert({doctype:'ToDo', subject: 'testing 2', status: 'Closed'}); - subjects = frappe.db.get_all('ToDo', ['name', 'subject'], - {status: 'Open'}).map(d => d.subject); + subjects = await frappe.db.get_all('ToDo', ['name', 'subject'], + {status: 'Open'}) + subjects = subjects.map(d => d.subject); assert.ok(subjects.includes('testing 1')); assert.ok(subjects.includes('testing 3')); assert.equal(subjects.includes('testing 2'), false); - subjects = frappe.db.get_all('ToDo', ['name', 'subject'], - {status: 'Closed'}).map(d => d.subject); + subjects = await frappe.db.get_all('ToDo', ['name', 'subject'], + {status: 'Closed'}) + subjects = subjects.map(d => d.subject); assert.equal(subjects.includes('testing 1'), false); assert.equal(subjects.includes('testing 3'), false); diff --git a/frappe/tests/test_document.js b/frappe/tests/test_document.js index 08ca8be9..aabb0a3f 100644 --- a/frappe/tests/test_document.js +++ b/frappe/tests/test_document.js @@ -2,46 +2,48 @@ const assert = require('assert'); const frappe = require('frappe-core'); describe('Document', () => { - before(function() { - frappe.init(); - frappe.db.migrate(); + before(async function() { + await frappe.init(); + await frappe.db.migrate(); }); - it('should insert a doc', () => { - let doc1 = test_doc(); + it('should insert a doc', async () => { + let doc1 = await test_doc(); doc1.subject = 'insert subject 1'; doc1.description = 'insert description 1'; - doc1.insert(); + await doc1.insert(); // get it back from the db - let doc2 = frappe.get_doc(doc1.doctype, doc1.name); + let doc2 = await frappe.get_doc(doc1.doctype, doc1.name); assert.equal(doc1.subject, doc2.subject); assert.equal(doc1.description, doc2.description); }); - it('should update a doc', () => { - let doc = test_doc().insert(); + it('should update a doc', async () => { + let doc = await test_doc(); + await doc.insert(); - assert.notEqual(frappe.db.get_value(doc.doctype, doc.name, 'subject'), 'subject 2'); + assert.notEqual(await frappe.db.get_value(doc.doctype, doc.name, 'subject'), 'subject 2'); doc.subject = 'subject 2' - doc.update(); + await doc.update(); - assert.equal(frappe.db.get_value(doc.doctype, doc.name, 'subject'), 'subject 2'); + assert.equal(await frappe.db.get_value(doc.doctype, doc.name, 'subject'), 'subject 2'); }) - it('should get a value', () => { - assert.equal(test_doc().get('subject'), 'testing 1'); + it('should get a value', async () => { + let doc = await test_doc(); + assert.equal(doc.get('subject'), 'testing 1'); }); - it('should set a value', () => { - let doc = test_doc(); + it('should set a value', async () => { + let doc = await test_doc(); doc.set('subject', 'testing 1') assert.equal(doc.get('subject'), 'testing 1'); }); - it('should not allow incorrect Select option', () => { - let doc = test_doc(); + it('should not allow incorrect Select option', async () => { + let doc = await test_doc(); assert.throws( () => { doc.set('status', 'Illegal'); @@ -50,10 +52,21 @@ describe('Document', () => { ); }); + it('should delete a document', async () => { + let doc = await test_doc(); + await doc.insert(); + + assert.equal(await frappe.db.get_value(doc.doctype, doc.name), doc.name); + + await doc.delete(); + + assert.equal(await frappe.db.get_value(doc.doctype, doc.name), null); + }); + }); -const test_doc = () => { - return frappe.get_doc({ +async function test_doc() { + return await frappe.get_doc({ doctype: 'ToDo', status: 'Open', subject: 'testing 1', diff --git a/frappe/tests/test_meta.js b/frappe/tests/test_meta.js index 6d2cc9a7..32269299 100644 --- a/frappe/tests/test_meta.js +++ b/frappe/tests/test_meta.js @@ -2,9 +2,9 @@ const assert = require('assert'); const frappe = require('frappe-core'); describe('Meta', () => { - before(function() { - frappe.init(); - frappe.db.migrate(); + before(async function() { + await frappe.init(); + await frappe.db.migrate(); }); it('should get init from json file', () => { diff --git a/frappe/tests/test_models.js b/frappe/tests/test_models.js index 0da55671..46f7ea5a 100644 --- a/frappe/tests/test_models.js +++ b/frappe/tests/test_models.js @@ -2,9 +2,9 @@ const assert = require('assert'); const frappe = require('frappe-core'); describe('Models', () => { - before(function() { - frappe.init(); - frappe.db.migrate(); + before(async function() { + await frappe.init(); + await frappe.db.migrate(); }); it('should get todo json', () => { diff --git a/frappe/tests/test_rest_api.js b/frappe/tests/test_rest_api.js new file mode 100644 index 00000000..bb1b97d3 --- /dev/null +++ b/frappe/tests/test_rest_api.js @@ -0,0 +1,43 @@ +const assert = require('assert'); +const frappe = require('frappe-core'); +const fetch = require('node-fetch'); + +describe('Models', () => { + before(async function() { + var app = require('express')(); + await frappe.init(); + frappe.init_app(app); + await frappe.start(); + }); + + after(() => { + frappe.close(); + }); + + it('should create a document', async () => { + let res = await fetch('http://localhost:8000/api/resource/todo', { + method: 'post', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({subject: 'test rest insert 1', description: 'test rest description 1'}) + }); + let doc = await res.json(); + assert.equal(doc.subject, 'test rest insert 1'); + assert.equal(doc.description, 'test rest description 1'); + }); + + // it('should create a document with rest backend', async () => { + // frappe.set_backend('rest', { + // server: 'http://localhost:8000' + // }); + + // let doc = await frappe.get_doc({doctype: 'ToDo', subject: 'test rest backend 1'}); + // await doc.insert(); + + // let doc_reloaded = await frappe.get_doc('ToDo', doc.name); + + // }) + +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b5f800d8..26efaea2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -122,11 +122,6 @@ "normalize-path": "2.1.1" } }, - "append-field": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz", - "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=" - }, "argparse": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", @@ -460,38 +455,6 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -678,6 +641,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, "requires": { "inherits": "2.0.3", "readable-stream": "2.3.3", @@ -899,38 +863,6 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.14", - "streamsearch": "0.1.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, "diff": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", @@ -1012,6 +944,14 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.19" + } + }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", @@ -3070,12 +3010,14 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -3109,33 +3051,6 @@ } } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "multer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz", - "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=", - "requires": { - "append-field": "0.1.0", - "busboy": "0.2.14", - "concat-stream": "1.6.0", - "mkdirp": "0.5.1", - "object-assign": "3.0.0", - "on-finished": "2.3.0", - "type-is": "1.6.15", - "xtend": "4.0.1" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - } - } - }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -3159,6 +3074,15 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", @@ -4050,6 +3974,723 @@ "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-0.4.0.tgz", "integrity": "sha1-I76WNVIOsP9Dp0Hn6DA5cmbohEU=" }, + "sqlite3": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-3.1.13.tgz", + "integrity": "sha512-JxXKPJnkZ6NuHRojq+g2WXWBt3M1G9sjZaYiHEWSTGijDM3cwju/0T2XbWqMXFmPqDgw+iB7zKQvnns4bvzXlw==", + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.38" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "bundled": true + }, + "co": { + "version": "4.6.0", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + } + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.4", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + } + } + }, + "mime-db": { + "version": "1.30.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.17", + "bundled": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=" + }, + "node-pre-gyp": { + "version": "0.6.38", + "bundled": true, + "requires": { + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.2", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.4.1", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true + }, + "qs": { + "version": "6.4.0", + "bundled": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true + } + } + }, + "readable-stream": { + "version": "2.3.3", + "bundled": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true + }, + "semver": { + "version": "5.4.1", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.1", + "bundled": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "requires": { + "debug": "2.6.9", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.3.3", + "rimraf": "2.6.2", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.3", + "bundled": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "uuid": { + "version": "3.1.0", + "bundled": true + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + } + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + } + } + }, "statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", @@ -4086,11 +4727,6 @@ "xtend": "4.0.1" } }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -4248,7 +4884,8 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true }, "uglify-js": { "version": "2.8.29", @@ -4595,7 +5232,8 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true }, "y18n": { "version": "3.2.1", diff --git a/package.json b/package.json index 41ed8b54..ba64668a 100644 --- a/package.json +++ b/package.json @@ -10,16 +10,19 @@ "dependencies": { "body-parser": "^1.18.2", "express": "^4.16.2", - "ms": "^2.1.1", - "multer": "^1.3.0", + "node-fetch": "^1.7.3", "nodemon": "^1.14.7", "sql.js": "^0.4.0", + "sqlite3": "^3.1.13", "walk": "^2.3.9" }, "repository": { "type": "git", "url": "git+https://github.com/frappe/frappe-js.git" }, + "parserOptions": { + "ecmaVersion": 2017 + }, "author": "Frappe", "license": "MIT", "bugs": { From 98d8077282f890b90a94727348c9e6db23792833 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 2 Jan 2018 15:42:35 +0530 Subject: [PATCH 007/477] docs --- README.md | 224 +++++++++++++++++++++++++++--------------------------- 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/README.md b/README.md index f777e3b7..c03c6e30 100644 --- a/README.md +++ b/README.md @@ -7,46 +7,46 @@ Core libs for Frappe Framework JS Models are declared by adding a `.json` model file in the `models/doctype` folder of the module/app. ```json - { - "autoname": "hash", - "name": "ToDo", - "doctype": "DocType", - "issingle": 0, - "fields": [ - { - "fieldname": "subject", - "label": "Subject", - "fieldtype": "Data", - "reqd": 1 - }, - { - "fieldname": "description", - "label": "Description", - "fieldtype": "Text" - }, - { - "fieldname": "status", - "label": "Status", - "fieldtype": "Select", - "options": [ - "Open", - "Closed" - ], - "default": "Open", - "reqd": 1 - } - ] - } +{ + "autoname": "hash", + "name": "ToDo", + "doctype": "DocType", + "issingle": 0, + "fields": [ + { + "fieldname": "subject", + "label": "Subject", + "fieldtype": "Data", + "reqd": 1 + }, + { + "fieldname": "description", + "label": "Description", + "fieldtype": "Text" + }, + { + "fieldname": "status", + "label": "Status", + "fieldtype": "Select", + "options": [ + "Open", + "Closed" + ], + "default": "Open", + "reqd": 1 + } + ] +} ``` ## Setup / Migrate ```js - const frappe = require('frappe-core'); - frappe.init(); +const frappe = require('frappe-core'); +frappe.init(); - // sync all schema from `models` folders in all apps - frappe.migrate(); +// sync all schema from `models` folders in all apps +frappe.migrate(); ``` ## Managing Documents @@ -62,11 +62,11 @@ All document write methods are asynchronous and return javascript Promise object Documents are initialized with the `frappe.get_doc` method. If `doctype` and `name` are passed as parameters, then the document is fetched from the backend. If a simple object is passed, then object properties are set in the document. ```js - const frappe = require('frappe-core'); - await frappe.init(); +const frappe = require('frappe-core'); +await frappe.init(); - // make a new todo - let todo = await frappe.get_doc({doctype: 'ToDo', subject: 'something'}); +// make a new todo +let todo = await frappe.get_doc({doctype: 'ToDo', subject: 'something'}); ``` ### Create @@ -74,12 +74,12 @@ Documents are initialized with the `frappe.get_doc` method. If `doctype` and `na You can insert a document in the backend with the `insert` method. ```js - const frappe = require('frappe-core'); - await frappe.init(); +const frappe = require('frappe-core'); +await frappe.init(); - // make a new todo - let todo = await frappe.get_doc({doctype: 'ToDo', subject: 'something'}); - await todo.insert(); +// make a new todo +let todo = await frappe.get_doc({doctype: 'ToDo', subject: 'something'}); +await todo.insert(); ``` ### Read @@ -87,12 +87,12 @@ You can insert a document in the backend with the `insert` method. You can read a document from the backend with the `frappe.get_doc` method ```js - const frappe = require('frappe-core'); - await frappe.init(); +const frappe = require('frappe-core'); +await frappe.init(); - // get all open todos - let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); - let first_todo = await frappe.get_doc('ToDo', toods[0].name); +// get all open todos +let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); +let first_todo = await frappe.get_doc('ToDo', toods[0].name); ``` ### Update @@ -100,15 +100,15 @@ You can read a document from the backend with the `frappe.get_doc` method The `update` method updates a document. ```js - const frappe = require('frappe-core'); - await frappe.init(); +const frappe = require('frappe-core'); +await frappe.init(); - // get all open todos - let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); - let first_todo = await frappe.get_doc('ToDo', toods[0].name); +// get all open todos +let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); +let first_todo = await frappe.get_doc('ToDo', toods[0].name); - first_todo.status = 'Closed'; - await first_todo.update(); +first_todo.status = 'Closed'; +await first_todo.update(); ``` ### Delete @@ -116,14 +116,14 @@ The `update` method updates a document. The `delete` method deletes a document. ```js - const frappe = require('frappe-core'); - await frappe.init(); +const frappe = require('frappe-core'); +await frappe.init(); - // get all open todos - let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); - let first_todo = await frappe.get_doc('ToDo', toods[0].name); +// get all open todos +let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); +let first_todo = await frappe.get_doc('ToDo', toods[0].name); - await first_todo.delete(); +await first_todo.delete(); ``` ## Metadata @@ -131,13 +131,13 @@ The `delete` method deletes a document. Metadata are first class objects in Frappe. You can get a metadata object by `frappe.get_meta`. All objects from the `models` folders of all modules are loaded. ```js - const frappe = require('frappe-core'); - frappe.init(); +const frappe = require('frappe-core'); +frappe.init(); - let todo_meta = frappe.get_meta('ToDo'); +let todo_meta = frappe.get_meta('ToDo'); - // get all fields of type "Data" - let data_fields = todo_meta.fields.map(d => d.fieldtype=='Data' ? d : null); +// get all fields of type "Data" +let data_fields = todo_meta.fields.map(d => d.fieldtype=='Data' ? d : null); ``` ## Controllers @@ -149,22 +149,22 @@ The name of the class must be the slugged name of the DocType To add a standard handler, you must bind all handlers in `setup` method. ```js - const frappe = require('frappe-core'); +const frappe = require('frappe-core'); - class todo extends frappe.document.Document { - setup() { - this.add_handler('validate'); - } - - validate() { - // set default status as "Open" if not set - if (!this.status) { - this.status = 'Open'; - } - } +class todo extends frappe.document.Document { + setup() { + this.add_handler('validate'); } - module.exports = { todo: todo }; + validate() { + // set default status as "Open" if not set + if (!this.status) { + this.status = 'Open'; + } + } +} + +module.exports = { todo: todo }; ``` ### Controller Events @@ -188,10 +188,10 @@ Standard events on which you can bind handlers are You can also directly write SQL with `frappe.db.sql` ```js - const frappe = require('frappe-core'); - frappe.init(); +const frappe = require('frappe-core'); +frappe.init(); - all_todos = frappe.db.sql('select name from todo'); +all_todos = frappe.db.sql('select name from todo'); ``` ## REST API @@ -212,10 +212,10 @@ You can directly access documents at `/api/resource/:doctype` Data: ```json - { - "subject": "test", - "description": "test description" - } +{ + "subject": "test", + "description": "test description" +} ``` ### Read @@ -230,17 +230,17 @@ Data: Reponse: ```json - { - "name": "uig7d1v12", - "owner": "guest", - "modified_by": "guest", - "creation": "2018-01-01T12:08:19.482Z", - "modified": "2018-01-01T12:08:19.482Z", - "docstatus": 0, - "subject": "test 1", - "description": "description 1", - "status": "Open" - } +{ + "name": "uig7d1v12", + "owner": "guest", + "modified_by": "guest", + "creation": "2018-01-01T12:08:19.482Z", + "modified": "2018-01-01T12:08:19.482Z", + "docstatus": 0, + "subject": "test 1", + "description": "description 1", + "status": "Open" +} ``` ### List @@ -258,26 +258,26 @@ Reponse: Response: ```json - [ - { - "name": "r4qxyki0i6", - "subject": "test 1" - }, - { - "name": "efywwvtwcp", - "subject": "test 1" - }, - { - "name": "9ioz05urgp", - "subject": "test 1" - } - ] +[ + { + "name": "r4qxyki0i6", + "subject": "test 1" + }, + { + "name": "efywwvtwcp", + "subject": "test 1" + }, + { + "name": "9ioz05urgp", + "subject": "test 1" + } +] ``` ## Tests All tests are in the `tests` folder and are run using `mocha`. To run tests ```sh - npm run test +npm run test ``` From 634fa80d10df96df249a807e75fe433d2d3d553c Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 3 Jan 2018 12:19:59 +0530 Subject: [PATCH 008/477] a better way to test REST API --- README.md | 16 ++++++++--- frappe/app.js | 9 ++++-- frappe/backends/{sqllite.js => sqlite.js} | 16 +++++------ frappe/index.js | 35 ++++++++++++++++------- frappe/rest_server.js | 4 +-- frappe/tests/helpers.js | 9 ++++++ frappe/tests/test_controller.js | 4 +-- frappe/tests/test_database.js | 4 +-- frappe/tests/test_document.js | 4 +-- frappe/tests/test_meta.js | 4 +-- frappe/tests/test_models.js | 4 +-- frappe/tests/test_rest_api.js | 28 ++++++++++++------ frappe/tests/test_server.js | 14 +++++++++ frappe/utils.js | 5 ++++ package.json | 1 - 15 files changed, 110 insertions(+), 47 deletions(-) rename frappe/backends/{sqllite.js => sqlite.js} (94%) create mode 100644 frappe/tests/helpers.js create mode 100644 frappe/tests/test_server.js diff --git a/README.md b/README.md index c03c6e30..dc828bc5 100644 --- a/README.md +++ b/README.md @@ -43,10 +43,11 @@ Models are declared by adding a `.json` model file in the `models/doctype` folde ```js const frappe = require('frappe-core'); -frappe.init(); +await frappe.init(); +await frappe.init_db('sqlite', {db_path: 'test.db'}); // sync all schema from `models` folders in all apps -frappe.migrate(); +await frappe.migrate(); ``` ## Managing Documents @@ -64,6 +65,7 @@ Documents are initialized with the `frappe.get_doc` method. If `doctype` and `na ```js const frappe = require('frappe-core'); await frappe.init(); +await frappe.init_db('sqlite', {db_path: 'test.db'}); // make a new todo let todo = await frappe.get_doc({doctype: 'ToDo', subject: 'something'}); @@ -76,6 +78,7 @@ You can insert a document in the backend with the `insert` method. ```js const frappe = require('frappe-core'); await frappe.init(); +await frappe.init_db('sqlite', {db_path: 'test.db'}); // make a new todo let todo = await frappe.get_doc({doctype: 'ToDo', subject: 'something'}); @@ -89,6 +92,7 @@ You can read a document from the backend with the `frappe.get_doc` method ```js const frappe = require('frappe-core'); await frappe.init(); +await frappe.init_db('sqlite', {db_path: 'test.db'}); // get all open todos let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); @@ -102,6 +106,7 @@ The `update` method updates a document. ```js const frappe = require('frappe-core'); await frappe.init(); +await frappe.init_db('sqlite', {db_path: 'test.db'}); // get all open todos let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); @@ -118,6 +123,7 @@ The `delete` method deletes a document. ```js const frappe = require('frappe-core'); await frappe.init(); +await frappe.init_db('sqlite', {db_path: 'test.db'}); // get all open todos let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); @@ -132,7 +138,8 @@ Metadata are first class objects in Frappe. You can get a metadata object by `fr ```js const frappe = require('frappe-core'); -frappe.init(); +await frappe.init(); +await frappe.init_db('sqlite', {db_path: 'test.db'}); let todo_meta = frappe.get_meta('ToDo'); @@ -189,7 +196,8 @@ You can also directly write SQL with `frappe.db.sql` ```js const frappe = require('frappe-core'); -frappe.init(); +await frappe.init(); +await frappe.init_db('sqlite', {db_path: 'test.db'}); all_todos = frappe.db.sql('select name from todo'); ``` diff --git a/frappe/app.js b/frappe/app.js index 5f64154a..32f7158b 100644 --- a/frappe/app.js +++ b/frappe/app.js @@ -1,6 +1,11 @@ const app = require('express')(); const frappe = require('frappe-core'); -// setup frappe REST routes -frappe.init({app:app}).then(frappe.start()); +async function start() { + await frappe.init(); + await frappe.init_db('sqlite', {db_path: 'test.db'}); + await frappe.init_app(app); + await frappe.start(); +} +start(); diff --git a/frappe/backends/sqllite.js b/frappe/backends/sqlite.js similarity index 94% rename from frappe/backends/sqllite.js rename to frappe/backends/sqlite.js index 24ea7f1e..2a232a5e 100644 --- a/frappe/backends/sqllite.js +++ b/frappe/backends/sqlite.js @@ -1,18 +1,18 @@ const frappe = require('frappe-core'); const sqlite3 = require('sqlite3').verbose(); -class SQLLiteDatabase { - constructor(db_name) { - this.conn_name = db_name; +class sqliteDatabase { + constructor({db_path}) { + this.db_path = db_path; this.init_type_map(); } - connect(db_name) { - if (db_name) { - this.conn_name = db_name; + connect(db_path) { + if (db_path) { + this.db_path = db_path; } return new Promise(resolve => { - this.conn = new sqlite3.Database(this.conn_name, () => { + this.conn = new sqlite3.Database(this.db_path, () => { resolve(); }); }); @@ -211,4 +211,4 @@ class SQLLiteDatabase { } -module.exports = { Database: SQLLiteDatabase }; +module.exports = { Database: sqliteDatabase }; diff --git a/frappe/index.js b/frappe/index.js index 38897ba2..bbed4cc2 100644 --- a/frappe/index.js +++ b/frappe/index.js @@ -2,21 +2,21 @@ const path = require('path'); const bodyParser = require('body-parser'); module.exports = { - async init({db_name ='test.db', user, user_key, for_test} = {}) { - this.db_name = db_name; + async init() { if (this._initialized) return; this.init_config(); this.init_errors(); this.init_globals(); this.init_libs(); - await this.init_db(); this._initialized = true; - this.login(user, user_key); + + // login as guest + this.login(); }, init_config() { this.config = { - backend: 'sqllite' + backend: 'sqlite' }; }, @@ -56,10 +56,20 @@ module.exports = { this.server = this.app.listen(port); }, - async init_db() { - let database = require('./backends/' + this.config.backend); - this.db = new database.Database(this.db_name); - await this.db.connect(this.db_name); + async init_db(db_type, options) { + var Database; + switch (db_type) { + case 'sqlite': + Database = require('./backends/sqlite').Database; + break; + case 'rest': + Database = require('./backends/rest_client').Database; + break; + default: + throw new Error(`${db_type} is not a supported database type`); + } + this.db = new Database(options); + await this.db.connect(); }, get_meta(doctype) { @@ -86,7 +96,7 @@ module.exports = { return await doc.insert(); }, - login(user, user_key) { + login(user='guest', user_key) { this.session = new this.session_lib.Session(user); if (user && user_key) { this.login(user_key); @@ -95,6 +105,9 @@ module.exports = { close() { this.db.close(); - this.server.close(); + + if (this.server) { + this.server.close(); + } } }; diff --git a/frappe/rest_server.js b/frappe/rest_server.js index 4e8fa59f..368b5ed4 100644 --- a/frappe/rest_server.js +++ b/frappe/rest_server.js @@ -19,13 +19,13 @@ module.exports = { return response.json(doc.get_valid_dict()); }); - // get list + // get document app.get('/api/resource/:doctype/:name', async function(request, response) { let data = await frappe.get_doc(request.params.doctype, request.params.name).get_valid_dict(); return response.json(data); }); - // get list + // delete app.delete('/api/resource/:doctype/:name', async function(request, response) { let data = await frappe.get_doc(request.params.doctype, request.params.name).delete(); return response.json(data); diff --git a/frappe/tests/helpers.js b/frappe/tests/helpers.js new file mode 100644 index 00000000..9af4b3ec --- /dev/null +++ b/frappe/tests/helpers.js @@ -0,0 +1,9 @@ +const frappe = require('frappe-core'); + +module.exports = { + async init_sqlite() { + await frappe.init(); + await frappe.init_db('sqlite', {db_path: 'test.db'}); + await frappe.db.migrate(); + } +} \ No newline at end of file diff --git a/frappe/tests/test_controller.js b/frappe/tests/test_controller.js index 9b930e87..41564a0c 100644 --- a/frappe/tests/test_controller.js +++ b/frappe/tests/test_controller.js @@ -1,10 +1,10 @@ const assert = require('assert'); const frappe = require('frappe-core'); +const helpers = require('./helpers'); describe('Controller', () => { before(async function() { - await frappe.init(); - await frappe.db.migrate(); + await helpers.init_sqlite(); }); it('should call controller method', async () => { diff --git a/frappe/tests/test_database.js b/frappe/tests/test_database.js index 34950322..49e62882 100644 --- a/frappe/tests/test_database.js +++ b/frappe/tests/test_database.js @@ -1,10 +1,10 @@ const assert = require('assert'); const frappe = require('frappe-core'); +const helpers = require('./helpers'); describe('Database', () => { before(async function() { - await frappe.init(); - await frappe.db.migrate(); + await helpers.init_sqlite(); }); it('should insert and get values', async () => { diff --git a/frappe/tests/test_document.js b/frappe/tests/test_document.js index aabb0a3f..5b2e7ec8 100644 --- a/frappe/tests/test_document.js +++ b/frappe/tests/test_document.js @@ -1,10 +1,10 @@ const assert = require('assert'); const frappe = require('frappe-core'); +const helpers = require('./helpers'); describe('Document', () => { before(async function() { - await frappe.init(); - await frappe.db.migrate(); + await helpers.init_sqlite(); }); it('should insert a doc', async () => { diff --git a/frappe/tests/test_meta.js b/frappe/tests/test_meta.js index 32269299..a26a3617 100644 --- a/frappe/tests/test_meta.js +++ b/frappe/tests/test_meta.js @@ -1,10 +1,10 @@ const assert = require('assert'); const frappe = require('frappe-core'); +const helpers = require('./helpers'); describe('Meta', () => { before(async function() { - await frappe.init(); - await frappe.db.migrate(); + await helpers.init_sqlite(); }); it('should get init from json file', () => { diff --git a/frappe/tests/test_models.js b/frappe/tests/test_models.js index 46f7ea5a..de24b866 100644 --- a/frappe/tests/test_models.js +++ b/frappe/tests/test_models.js @@ -1,10 +1,10 @@ const assert = require('assert'); const frappe = require('frappe-core'); +const helpers = require('./helpers'); describe('Models', () => { before(async function() { - await frappe.init(); - await frappe.db.migrate(); + await helpers.init_sqlite(); }); it('should get todo json', () => { diff --git a/frappe/tests/test_rest_api.js b/frappe/tests/test_rest_api.js index bb1b97d3..3d60a3ad 100644 --- a/frappe/tests/test_rest_api.js +++ b/frappe/tests/test_rest_api.js @@ -1,22 +1,33 @@ const assert = require('assert'); const frappe = require('frappe-core'); const fetch = require('node-fetch'); +const helpers = require('./helpers'); +const { spawn } = require('child_process'); +const process = require('process'); -describe('Models', () => { +// create a copy of frappe + +var test_server; + +describe('REST', () => { before(async function() { - var app = require('express')(); - await frappe.init(); - frappe.init_app(app); - await frappe.start(); + await helpers.init_sqlite(); + test_server = spawn('node', ['frappe/tests/test_server.js'], { + stdio: [0, 'pipe', 'pipe' ] + }); + + // wait for server to start + await frappe.sleep(1); }); after(() => { frappe.close(); + test_server.kill(); }); it('should create a document', async () => { let res = await fetch('http://localhost:8000/api/resource/todo', { - method: 'post', + method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' @@ -29,9 +40,8 @@ describe('Models', () => { }); // it('should create a document with rest backend', async () => { - // frappe.set_backend('rest', { - // server: 'http://localhost:8000' - // }); + + // frappe.init_db('rest', { server: 'http://localhost:8000' }); // let doc = await frappe.get_doc({doctype: 'ToDo', subject: 'test rest backend 1'}); // await doc.insert(); diff --git a/frappe/tests/test_server.js b/frappe/tests/test_server.js new file mode 100644 index 00000000..c4ce4fd7 --- /dev/null +++ b/frappe/tests/test_server.js @@ -0,0 +1,14 @@ +const app = require('express')(); +const frappe = require('frappe-core'); + +async function start_server() { + console.log('Starting test server...'); + await frappe.init(); + await frappe.init_db('sqlite', {db_path: 'test.db'}); + await frappe.init_app(app); + await frappe.start(); +} + +if (require.main === module) { + start_server(); +} \ No newline at end of file diff --git a/frappe/utils.js b/frappe/utils.js index 4fd3e8dd..0eb25031 100644 --- a/frappe/utils.js +++ b/frappe/utils.js @@ -19,5 +19,10 @@ module.exports = { // number return value + ''; } + }, + async sleep(seconds) { + return new Promise(resolve => { + setTimeout(resolve, seconds * 1000); + }); } } diff --git a/package.json b/package.json index ba64668a..69338bb5 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "express": "^4.16.2", "node-fetch": "^1.7.3", "nodemon": "^1.14.7", - "sql.js": "^0.4.0", "sqlite3": "^3.1.13", "walk": "^2.3.9" }, From d8551b990973af532e84f6142a118920f3e6866f Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 3 Jan 2018 15:42:40 +0530 Subject: [PATCH 009/477] rest as a database backend --- README.md | 28 +++++++++-- frappe/backends/rest_client.js | 89 ++++++++++++++++++++++++++++++++++ frappe/backends/sqlite.js | 10 +++- frappe/rest_server.js | 73 +++++++++++++++++++++++----- frappe/tests/test_database.js | 10 ++-- frappe/tests/test_rest_api.js | 47 ++++++++++-------- 6 files changed, 215 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index dc828bc5..7fd83280 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,7 @@ await frappe.init(); await frappe.init_db('sqlite', {db_path: 'test.db'}); // get all open todos -let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); +let todos = await frappe.db.get_all({doctype:'ToDo', fields:['name'], filters: {status: "Open"}); let first_todo = await frappe.get_doc('ToDo', toods[0].name); ``` @@ -109,7 +109,7 @@ await frappe.init(); await frappe.init_db('sqlite', {db_path: 'test.db'}); // get all open todos -let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); +let todos = await frappe.db.get_all({doctype:'ToDo', fields:['name'], filters: {status: "Open"}); let first_todo = await frappe.get_doc('ToDo', toods[0].name); first_todo.status = 'Closed'; @@ -126,7 +126,7 @@ await frappe.init(); await frappe.init_db('sqlite', {db_path: 'test.db'}); // get all open todos -let todos = await frappe.db.get_all('ToDo', ['name'], {status: "Open"}); +let todos = await frappe.db.get_all({doctype:'ToDo', fields:['name'], filters: {status: "Open"}); let first_todo = await frappe.get_doc('ToDo', toods[0].name); await first_todo.delete(); @@ -281,6 +281,28 @@ Response: } ] ``` + +## REST Client + +Frappe comes with a built in REST client so you can also use REST as a database backend with the frappe API + +### Create, Read, Update, Delete + +You can manage documents, using the same Document API as if it were a local database + +```js +await frappe.init(); +await frappe.init_db('rest', {server: 'localhost:8000'}); + +let doc = await frappe.get_doc({doctype:'ToDo', subject:'test rest insert 1'}); +await doc.insert(); + +doc.subject = 'subject changed'; +await doc.update(); + +let data = await frappe.db.get_all({doctype:'ToDo'}); +``` + ## Tests All tests are in the `tests` folder and are run using `mocha`. To run tests diff --git a/frappe/backends/rest_client.js b/frappe/backends/rest_client.js index e69de29b..28424f96 100644 --- a/frappe/backends/rest_client.js +++ b/frappe/backends/rest_client.js @@ -0,0 +1,89 @@ +const frappe = require('frappe-core'); +const path = require('path'); +const fetch = require('node-fetch'); + +class RESTClient { + constructor({server, protocol='http'}) { + this.server = server; + this.protocol = protocol; + this.json_headers = { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + } + } + + connect() { + + } + + async insert(doctype, doc) { + doc.doctype = doctype; + let url = this.protocol + '://' + path.join(this.server, `/api/resource/${frappe.slug(doctype)}`); + let response = await fetch(url, { + method: 'POST', + headers: this.json_headers, + body: JSON.stringify(doc) + }); + + return await response.json(); + } + + async get(doctype, name) { + let url = this.protocol + '://' + path.join(this.server, `/api/resource/${frappe.slug(doctype)}/${name}`); + let response = await fetch(url, { + method: 'GET', + headers: this.json_headers + }); + return await response.json(); + } + + async get_all({doctype, fields, filters, start, limit, sort_by, order}) { + let url = this.protocol + '://' + path.join(this.server, `/api/resource/${frappe.slug(doctype)}`); + let response = await fetch(url, { + method: 'GET', + params: { + fields: JSON.stringify(fields), + filters: JSON.stringify(filters), + start: start, + limit: limit, + sort_by: sort_by, + order: order + }, + headers: this.json_headers + }); + return await response.json(); + + } + + async update(doctype, doc) { + doc.doctype = doctype; + let url = this.protocol + '://' + path.join(this.server, `/api/resource/${frappe.slug(doctype)}/${doc.name}`); + let response = await fetch(url, { + method: 'PUT', + headers: this.json_headers, + body: JSON.stringify(doc) + }); + + return await response.json(); + } + + async delete(doctype, name) { + let url = this.protocol + '://' + path.join(this.server, `/api/resource/${frappe.slug(doctype)}/${name}`); + + let response = await fetch(url, { + method: 'DELETE', + headers: this.json_headers + }); + + return await response.json(); + } + + close() { + + } + +} + +module.exports = { + Database: RESTClient +} \ No newline at end of file diff --git a/frappe/backends/sqlite.js b/frappe/backends/sqlite.js index 2a232a5e..98a68ce2 100644 --- a/frappe/backends/sqlite.js +++ b/frappe/backends/sqlite.js @@ -88,11 +88,12 @@ class sqliteDatabase { return await this.run(`delete from ${frappe.slug(doctype)} where name=?`, name); } - get_all(doctype, fields=['name'], filters, start, limit) { + get_all({doctype, fields=['name'], filters, start, limit, order_by='modified', order='desc'} = {}) { return new Promise(resolve => { this.conn.all(`select ${fields.join(", ")} from ${frappe.slug(doctype)} ${filters ? "where" : ""} ${this.get_filter_conditions(filters)} + ${order_by ? ("order by " + order_by) : ""} ${order_by ? (order || "asc") : ""} ${limit ? ("limit " + limit) : ""} ${start ? ("offset " + start) : ""}`, (err, rows) => { resolve(rows); @@ -153,7 +154,12 @@ class sqliteDatabase { filters = {name: filters}; } - let row = await this.get_all(doctype, [fieldname], filters, 0, 1); + let row = await this.get_all({ + doctype:doctype, + fields: [fieldname], + filters: filters, + start: 0, + limit: 1}); return row.length ? row[0][fieldname] : null; } diff --git a/frappe/rest_server.js b/frappe/rest_server.js index 368b5ed4..3b03d261 100644 --- a/frappe/rest_server.js +++ b/frappe/rest_server.js @@ -4,31 +4,78 @@ module.exports = { setup(app) { // get list app.get('/api/resource/:doctype', async function(request, response) { - let data = await frappe.db.get_all(request.params.doctype, ['name', 'subject'], null, - start = request.params.start || 0, limit = request.params.limit || 20); - return response.json(data); + try { + let fields, filters; + for (key of ['fields', 'filters']) { + if (request.params[key]) { + request.params[key] = JSON.parse(request.params[key]); + } + } + + let data = await frappe.db.get_all({ + doctype: request.params.doctype, + fields: request.params.fields || ['name', 'subject'], + filters: request.params.filters, + start: request.params.start || 0, + limit: request.params.limit || 20, + order_by: request.params.order_by, + order: request.params.order + }); + + return response.json(data); + } catch (e) { + throw e; + } }); // create app.post('/api/resource/:doctype', async function(request, response) { - data = request.body; - data.doctype = request.params.doctype; - let doc = await frappe.get_doc(data) - await doc.insert(); - await frappe.db.commit(); - return response.json(doc.get_valid_dict()); + try { + data = request.body; + data.doctype = request.params.doctype; + let doc = await frappe.get_doc(data); + await doc.insert(); + await frappe.db.commit(); + return response.json(doc.get_valid_dict()); + } catch (e) { + throw e; + } }); + // update + app.put('/api/resource/:doctype/:name', async function(request, response) { + try { + data = request.body; + let doc = await frappe.get_doc(request.params.doctype, request.params.name); + Object.assign(doc, data); + await doc.update(); + await frappe.db.commit(); + return response.json(doc.get_valid_dict()); + } catch (e) { + throw e; + } + }); + + // get document app.get('/api/resource/:doctype/:name', async function(request, response) { - let data = await frappe.get_doc(request.params.doctype, request.params.name).get_valid_dict(); - return response.json(data); + try { + let doc = await frappe.get_doc(request.params.doctype, request.params.name); + return response.json(doc.get_valid_dict()); + } catch (e) { + throw e; + } }); // delete app.delete('/api/resource/:doctype/:name', async function(request, response) { - let data = await frappe.get_doc(request.params.doctype, request.params.name).delete(); - return response.json(data); + try { + let doc = await frappe.get_doc(request.params.doctype, request.params.name) + await doc.delete(); + return response.json({}); + } catch (e) { + throw e; + } }); } diff --git a/frappe/tests/test_database.js b/frappe/tests/test_database.js index 49e62882..daf9e1f4 100644 --- a/frappe/tests/test_database.js +++ b/frappe/tests/test_database.js @@ -13,7 +13,7 @@ describe('Database', () => { await frappe.insert({doctype:'ToDo', subject: 'testing 3'}); await frappe.insert({doctype:'ToDo', subject: 'testing 2'}); - let subjects = await frappe.db.get_all('ToDo', ['name', 'subject']) + let subjects = await frappe.db.get_all({doctype:'ToDo', fields:['name', 'subject']}) subjects = subjects.map(d => d.subject); assert.ok(subjects.includes('testing 1')); @@ -29,16 +29,16 @@ describe('Database', () => { await frappe.insert({doctype:'ToDo', subject: 'testing 3', status: 'Open'}); await frappe.insert({doctype:'ToDo', subject: 'testing 2', status: 'Closed'}); - subjects = await frappe.db.get_all('ToDo', ['name', 'subject'], - {status: 'Open'}) + subjects = await frappe.db.get_all({doctype:'ToDo', fields:['name', 'subject'], + filters:{status: 'Open'}}); subjects = subjects.map(d => d.subject); assert.ok(subjects.includes('testing 1')); assert.ok(subjects.includes('testing 3')); assert.equal(subjects.includes('testing 2'), false); - subjects = await frappe.db.get_all('ToDo', ['name', 'subject'], - {status: 'Closed'}) + subjects = await frappe.db.get_all({doctype:'ToDo', fields:['name', 'subject'], + filters:{status: 'Closed'}}); subjects = subjects.map(d => d.subject); assert.equal(subjects.includes('testing 1'), false); diff --git a/frappe/tests/test_rest_api.js b/frappe/tests/test_rest_api.js index 3d60a3ad..9891b737 100644 --- a/frappe/tests/test_rest_api.js +++ b/frappe/tests/test_rest_api.js @@ -11,11 +11,13 @@ var test_server; describe('REST', () => { before(async function() { - await helpers.init_sqlite(); test_server = spawn('node', ['frappe/tests/test_server.js'], { - stdio: [0, 'pipe', 'pipe' ] + stdio: [process.stdin, process.stdout, process.stderr, 'pipe', 'pipe'] }); + await frappe.init(); + await frappe.init_db('rest', {server: 'localhost:8000'}); + // wait for server to start await frappe.sleep(1); }); @@ -26,28 +28,35 @@ describe('REST', () => { }); it('should create a document', async () => { - let res = await fetch('http://localhost:8000/api/resource/todo', { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify({subject: 'test rest insert 1', description: 'test rest description 1'}) - }); - let doc = await res.json(); - assert.equal(doc.subject, 'test rest insert 1'); - assert.equal(doc.description, 'test rest description 1'); + let doc = await frappe.get_doc({doctype:'ToDo', subject:'test rest insert 1'}); + await doc.insert(); + + let doc1 = await frappe.get_doc('ToDo', doc.name); + + assert.equal(doc.subject, doc1.subject); + assert.equal(doc1.status, 'Open'); }); - // it('should create a document with rest backend', async () => { + it('should update a document', async () => { + let doc = await frappe.get_doc({doctype:'ToDo', subject:'test rest insert 1'}); + await doc.insert(); - // frappe.init_db('rest', { server: 'http://localhost:8000' }); + doc.subject = 'subject changed'; + await doc.update(); - // let doc = await frappe.get_doc({doctype: 'ToDo', subject: 'test rest backend 1'}); - // await doc.insert(); + let doc1 = await frappe.get_doc('ToDo', doc.name); + assert.equal(doc.subject, doc1.subject); + }); - // let doc_reloaded = await frappe.get_doc('ToDo', doc.name); + it('should get multiple documents', async () => { + await frappe.insert({doctype:'ToDo', subject:'all test 1'}); + await frappe.insert({doctype:'ToDo', subject:'all test 2'}); + + let data = await frappe.db.get_all({doctype:'ToDo'}); + let subjects = data.map(d => d.subject); + assert.ok(subjects.includes('all test 1')); + assert.ok(subjects.includes('all test 2')); + }); - // }) }); \ No newline at end of file From 17c65bd894ac6703fe33eb04bd633ed02331db5f Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 3 Jan 2018 22:08:17 +0530 Subject: [PATCH 010/477] init webpack and client with primercss --- .gitignore | 1 + .sassrc.js | 10 + frappe/client/index.html | 19 + frappe/client/index.js | 1 + frappe/client/js/bundle.js | 667 +++++ frappe/client/scss/main.scss | 5 + frappe/index.js | 2 + package-lock.json | 307 ++- package.json | 9 +- webpack.config.js | 21 + yarn.lock | 4601 ++++++++++++++++++++++++++++++++++ 11 files changed, 5636 insertions(+), 7 deletions(-) create mode 100644 .sassrc.js create mode 100644 frappe/client/index.html create mode 100644 frappe/client/index.js create mode 100644 frappe/client/js/bundle.js create mode 100644 frappe/client/scss/main.scss create mode 100644 webpack.config.js create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index 80ccedf6..30197abd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ node_modules Thumbs.db test.db *.log +.cache /dist /temp diff --git a/.sassrc.js b/.sassrc.js new file mode 100644 index 00000000..dea78962 --- /dev/null +++ b/.sassrc.js @@ -0,0 +1,10 @@ +const path = require('path') + +const CWD = process.cwd() + +module.exports = { + "includePaths": [ + path.resolve(CWD, 'node_modules'), + path.resolve(CWD, 'client/scss') + ] +} diff --git a/frappe/client/index.html b/frappe/client/index.html new file mode 100644 index 00000000..c5ea7618 --- /dev/null +++ b/frappe/client/index.html @@ -0,0 +1,19 @@ + + + + + + Document + + + + + + \ No newline at end of file diff --git a/frappe/client/index.js b/frappe/client/index.js new file mode 100644 index 00000000..2d914ddd --- /dev/null +++ b/frappe/client/index.js @@ -0,0 +1 @@ +require('./scss/main.scss'); \ No newline at end of file diff --git a/frappe/client/js/bundle.js b/frappe/client/js/bundle.js new file mode 100644 index 00000000..c682b8c8 --- /dev/null +++ b/frappe/client/js/bundle.js @@ -0,0 +1,667 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(1); + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +// style-loader: Adds some css to the DOM by adding a +
+
+
+
+
+ +`; + + +class TreeNode extends HTMLElement { + static get observedAttributes() { + return ['label', 'expanded'] + } + + constructor() { + super(); + + let shadowRoot = this.attachShadow({ mode: 'open' }); + shadowRoot.appendChild(TreeNodeTemplate.content.cloneNode(true)); + this.iconEl = shadowRoot.querySelector('.tree-node-icon'); + this.labelEl = shadowRoot.querySelector('.tree-node-label'); + this.actionsEl = shadowRoot.querySelector('.tree-node-actions'); + } + + attributeChangedCallback(name, oldValue, newValue) { + console.log(name, oldValue, newValue); + + switch(name) { + case 'label': { + this.labelEl.innerHTML = newValue || ''; + break; + } + + case 'expanded': { + this.expanded = this.hasAttribute('expanded'); + + if (this.expanded) { + this.iconEl.innerHTML = iconSet.open; + } else { + this.iconEl.innerHTML = iconSet.close; + } + break; + } + + default: break; + } + } +} + +window.customElements.define('f-tree-node', TreeNode); + +class TreeOld { + constructor({ parent, label, iconSet, withSkeleton, method }) { Object.assign(this, arguments[0]); this.nodes = {}; - if(!iconSet) { + if (!iconSet) { this.iconSet = { - open: octicons["triangle-down"].toSVG({ "width": 10, "class": "node-parent"}), - closed: octicons["triangle-right"].toSVG({ "width": 5, "class": "node-parent"}), - leaf: octicons["primitive-dot"].toSVG({ "width": 7, "class": "node-leaf"}) + open: octicons["triangle-down"].toSVG({ "width": 10, "class": "node-parent" }), + closed: octicons["triangle-right"].toSVG({ "width": 5, "class": "node-parent" }), + leaf: octicons["primitive-dot"].toSVG({ "width": 7, "class": "node-leaf" }) }; } this.make(); @@ -31,7 +122,7 @@ class Tree { // this.loadChildren(this.selectedNode.parentNode, true); } - async loadChildren(node, deep=false) { + async loadChildren(node, deep = false) { let children = !deep ? await this.method(node) : await this.getAllNodes(node); this.renderNodeChildren(node, children); } @@ -40,7 +131,7 @@ class Tree { dataList.map(d => { this.renderNodeChildren(this.nodes[d.parent], d.data); }); } - renderNodeChildren(node, dataSet=[]) { + renderNodeChildren(node, dataSet = []) { frappe.ui.empty(node.childrenList); dataSet.forEach(data => { @@ -67,7 +158,7 @@ class Tree { expandable: expandable, }; - if(parentNode){ + if (parentNode) { node.parentNode = parentNode; node.parent = parentNode.childrenList; node.isRoot = 0; @@ -90,8 +181,8 @@ class Tree { }); let iconHtml = ''; - if(this.iconSet) { - iconHtml = node.expandable ? this.iconSet.closed : this.iconSet.leaf; + if (this.iconSet) { + iconHtml = node.expandable ? this.iconSet.closed : ''; } let labelEl = ` ${node.label}`; @@ -118,17 +209,17 @@ class Tree { async onNodeClick(node, click = true) { this.setSelectedNode(node); - if(click) { + if (click) { this.onClick && this.onClick(node); } await this.expandNode(node); // select link utils.activate(this.tree, node.treeLink, 'tree-link', 'active'); - if(node.toolbar) this.showToolbar(node); + if (node.toolbar) this.showToolbar(node); } async expandNode(node) { - if(node.expandable) { + if (node.expandable) { await this.toggleNode(node); } @@ -139,11 +230,11 @@ class Tree { } async toggleNode(node) { - if(!node.loaded) await this.loadChildren(node); + if (!node.loaded) await this.loadChildren(node); // expand children - if(node.childrenList) { - if(node.childrenList.innerHTML.length) { + if (node.childrenList) { + if (node.childrenList.innerHTML.length) { if (node.expanded) { node.childrenList.classList.add('hide'); } else { @@ -152,7 +243,7 @@ class Tree { } // open close icon - if(this.iconSet) { + if (this.iconSet) { const oldIcon = node.treeLink.querySelector('svg'); const newIconKey = node.expanded ? 'closed' : 'open'; const newIcon = frappe.ui.create(this.iconSet[newIconKey]); diff --git a/client/view/tree.js b/client/view/tree.js index 58262119..d61d6fed 100644 --- a/client/view/tree.js +++ b/client/view/tree.js @@ -56,18 +56,83 @@ module.exports = class BaseTree extends BaseList { } renderTree(rootLabel) { - this.tree = new Tree({ + // const tree = new Tree(); + // tree.getChildNodes = async node => { + // const children = await this.getData(node) || []; + // return children.map(d => ({ + // label: d.name, + // value: d.name, + // expandable: d.isGroup + // })); + // } + // tree.rootNode = { + // label: rootLabel, + // value: rootLabel, + // isRoot: 1, + // expandable: 1 + // } + // this.body.appendChild(tree); + + this.rootNode = { label: rootLabel, - parent: this.body, - method: async node => { - const children = await this.getData(node) || []; - return children.map(d => ({ - label: d.name, - value: d.name, - expandable: d.isGroup - })); - } + value: rootLabel, + isRoot: true, + expanded: true, + children: [] + } + + const getNodeHTML = node => + ` + `; + + this.treeWrapper = frappe.ui.create('f-tree'); + + this.rootNode.el = frappe.ui.create(getNodeHTML(this.rootNode), { + inside: this.treeWrapper }); + + this.treeWrapper = frappe.ui.create(` + + ${getNodeHTML(this.rootNode)} + + `); + + this.body.appendChild(this.treeWrapper); + + frappe.ui.on(this.treeWrapper, 'click', 'f-tree-node', async (e, treeNode) => { + if (treeNode.expanded) { + treeNode.removeAttribute('expanded'); + } else { + treeNode.setAttribute('expanded', ''); + } + + let node = null; + // if (treeNode.hasAttribute('is-root')) { + // node = this.rootNode; + // } else { + + // } + + + }); + + + // this.tree = new Tree({ + // label: rootLabel, + // parent: this.body, + // method: async node => { + // const children = await this.getData(node) || []; + // return children.map(d => ({ + // label: d.name, + // value: d.name, + // expandable: d.isGroup + // })); + // } + // }); } async getData(node) { @@ -119,7 +184,7 @@ module.exports = class BaseTree extends BaseList { }); this.page.body.addEventListener('click', (event) => { - if(event.target.classList.contains('checkbox')) { + if (event.target.classList.contains('checkbox')) { this.trigger('state-change'); } }) @@ -138,7 +203,7 @@ module.exports = class BaseTree extends BaseList { this.searchInput = this.toolbar.querySelector('input'); this.searchInput.addEventListener('keypress', (event) => { - if (event.keyCode===13) { + if (event.keyCode === 13) { this.refresh(); } }); diff --git a/config/rollup.config.style.js b/config/rollup.config.style.js index 2606b955..b219aa95 100644 --- a/config/rollup.config.style.js +++ b/config/rollup.config.style.js @@ -5,7 +5,6 @@ module.exports = { format: 'cjs' }, plugins: [ - require('rollup-plugin-sass')(), require('rollup-plugin-postcss')({ extract: true, plugins: [ From a30fb50405bcc039f4ba6aad30c520beb36b2bf2 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 9 Apr 2018 17:59:13 +0530 Subject: [PATCH 144/477] Pdf for electron --- client/desk/printpage.js | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/client/desk/printpage.js b/client/desk/printpage.js index 38ee1ccb..468faa00 100644 --- a/client/desk/printpage.js +++ b/client/desk/printpage.js @@ -15,6 +15,14 @@ module.exports = class PrintPage extends Page { this.addButton(frappe._('Edit'), 'primary', () => { frappe.router.setRoute('edit', this.doctype, this.name) }); + + this.addButton(frappe._('Print'), 'secondary', async () => { + const pdf = require('frappejs/server/pdf'); + const savePath = '/Users/farisansari/frappe.pdf'; + pdf(await this.getHTML(true), savePath); + const { shell } = require('electron'); + shell.openItem(savePath); + }); } async show(params) { @@ -29,18 +37,28 @@ module.exports = class PrintPage extends Page { } async renderTemplate() { - this.printFormat = await frappe.getDoc('PrintFormat', this.meta.print.printFormat); - let doc = await frappe.getDoc(this.doctype, this.name); - let context = {doc: doc, frappe: frappe}; - - frappe.desk.setActiveDoc(doc); - try { - this.body.innerHTML = ``; + this.body.innerHTML = await this.getHTML(); // this.setTitle(doc.name); } catch (e) { this.renderError('Template Error', e); throw e; } } + + async getHTML(pdf = false) { + this.printFormat = await frappe.getDoc('PrintFormat', this.meta.print.printFormat); + let doc = await frappe.getDoc(this.doctype, this.name); + let context = {doc: doc, frappe: frappe}; + frappe.desk.setActiveDoc(doc); + return ` + ${pdf ? ` + + ` : ''} + `; + } } From 9878055ddfe25583675bf96b5e829e6eb45b1503 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 12 Apr 2018 02:04:45 +0530 Subject: [PATCH 145/477] More functionality to Tree Component - Make a basecomponent to encapsulate bootstrapping of WC - Remove old tree.js - Refactor Tree Components into JS and HTML --- client/components/baseComponent.js | 43 +++++ client/components/tree/index.html | 11 ++ client/components/tree/index.js | 19 ++ client/components/tree/treeNode.html | 58 ++++++ client/components/tree/treeNode.js | 94 ++++++++++ client/style/tree.scss | 118 +----------- client/ui/index.js | 3 +- client/ui/tree.js | 262 --------------------------- client/view/tree.js | 182 +++++++------------ 9 files changed, 296 insertions(+), 494 deletions(-) create mode 100644 client/components/baseComponent.js create mode 100644 client/components/tree/index.html create mode 100644 client/components/tree/index.js create mode 100644 client/components/tree/treeNode.html create mode 100644 client/components/tree/treeNode.js delete mode 100644 client/ui/tree.js diff --git a/client/components/baseComponent.js b/client/components/baseComponent.js new file mode 100644 index 00000000..0b90ea65 --- /dev/null +++ b/client/components/baseComponent.js @@ -0,0 +1,43 @@ +let templates = {}; + +class BaseComponent extends HTMLElement { + constructor(name) { + super(); + + this._name = name; + this._shadowRoot = this.attachShadow({ mode: 'open' }); + + if (!templates[name]) { + makeTemplate(name, this.templateHTML); + } + + let template = getTemplate(name); + this._shadowRoot.appendChild(template); + } + + triggerEvent(eventName, detail = {}) { + const event = new CustomEvent(eventName, { + bubbles: true, + composed: true, + detail + }); + this.dispatchEvent(event); + } +} + + +function makeTemplate(name, html) { + if (!templates[name]) { + let template = document.createElement('template'); + template.id = name; + template.innerHTML = html; + + templates[name] = template; + } +} + +function getTemplate(name) { + return templates[name].content.cloneNode(true); +} + +module.exports = BaseComponent; diff --git a/client/components/tree/index.html b/client/components/tree/index.html new file mode 100644 index 00000000..17957bc7 --- /dev/null +++ b/client/components/tree/index.html @@ -0,0 +1,11 @@ + + + + +
+ +
diff --git a/client/components/tree/index.js b/client/components/tree/index.js new file mode 100644 index 00000000..1f2d2e31 --- /dev/null +++ b/client/components/tree/index.js @@ -0,0 +1,19 @@ +const BaseComponent = require('../baseComponent'); +const TreeNode = require('./treeNode'); + +class Tree extends BaseComponent { + get templateHTML() { + return require('./index.html'); + } + + constructor() { + super('Tree'); + } +} + +window.customElements.define('f-tree', Tree); + +module.exports = { + Tree, + TreeNode +} diff --git a/client/components/tree/treeNode.html b/client/components/tree/treeNode.html new file mode 100644 index 00000000..c8435088 --- /dev/null +++ b/client/components/tree/treeNode.html @@ -0,0 +1,58 @@ + + + + +
+
+
+
+
+
+ +
+
+
+ +
\ No newline at end of file diff --git a/client/components/tree/treeNode.js b/client/components/tree/treeNode.js new file mode 100644 index 00000000..7e56903f --- /dev/null +++ b/client/components/tree/treeNode.js @@ -0,0 +1,94 @@ +const octicons = require('octicons'); +const BaseComponent = require('../baseComponent'); + +const iconSet = { + open: octicons["triangle-down"].toSVG({ width: "12", height: "12", "class": "tree-icon-open" }), + close: octicons["triangle-right"].toSVG({ width: "12", height: "12", "class": "tree-icon-closed" }) +}; + +class TreeNode extends BaseComponent { + static get observedAttributes() { + return ['label', 'expanded']; + } + + get templateHTML() { + return require('./treeNode.html'); + } + + constructor() { + super('TreeNode'); + + let shadowRoot = this._shadowRoot; + this.iconEl = shadowRoot.querySelector('.tree-node-icon'); + this.labelEl = shadowRoot.querySelector('.tree-node-label'); + this.actionsEl = shadowRoot.querySelector('.tree-node-actions'); + this.childrenEl = shadowRoot.querySelector('.tree-node-children'); + + this.addEventListener('click', e => { + e.stopImmediatePropagation(); + + if (e.target.matches('[slot="actions"]')) { + this.triggerEvent('tree-node-action', { + actionEl: e.target + }); + return; + } + + if (this.expanded) { + this.removeAttribute('expanded'); + } else { + this.setAttribute('expanded', ''); + } + }); + this.onExpand(); + } + + attributeChangedCallback(name, oldValue, newValue) { + switch(name) { + case 'label': { + this.labelEl.innerHTML = newValue || ''; + break; + } + + case 'expanded': { + const isExpanded = this.hasAttribute('expanded'); + this.onExpand(isExpanded); + break; + } + + default: break; + } + } + + onExpand(isExpanded = false) { + if (this.isLeaf) return; + + if (isExpanded) { + this.iconEl.innerHTML = iconSet.open; + this.childrenEl.style.display = ''; + } else { + this.iconEl.innerHTML = iconSet.close; + this.childrenEl.style.display = 'none'; + } + + this.triggerEvent('tree-node-expand', { + expanded: isExpanded + }); + } + + get isRoot() { + return this.hasAttribute('is-root'); + } + + get expanded() { + return this.hasAttribute('expanded'); + } + + get isLeaf() { + return this.hasAttribute('is-leaf'); + } +} + +window.customElements.define('f-tree-node', TreeNode); + +module.exports = TreeNode; \ No newline at end of file diff --git a/client/style/tree.scss b/client/style/tree.scss index c3f9a670..eb8cad33 100644 --- a/client/style/tree.scss +++ b/client/style/tree.scss @@ -4,120 +4,6 @@ padding: $spacer-3 $spacer-4; } -f-tree, f-tree-node { - display: block; +f-tree-node { + --tree-node-hover: $gray-100; } - -f-tree-node:hover { - background-color: $gray-100; - cursor: pointer; -} - -// .tree { -// padding: $spacer-3 $spacer-4; -// } - -// .tree li { -// list-style: none; -// } - -// ul.tree-children { -// padding-left: $spacer-4; -// } - -// .tree-link { -// cursor: pointer; -// display: flex; -// align-items: center; -// width: 100%; -// } - -// .tree-link:hover { -// background-color: $gray-100; -// } - -// .tree-link .node-parent { -// color: $gray-200; -// width: 24px; -// height: 24px; -// } - -// .tree-link .node-leaf { -// color: $gray-400; -// } - -// .tree-link .node-parent, .tree-link .node-leaf { -// padding: $spacer-2; -// } - -// .tree-link.active { -// a { -// color: $gray-600; -// } -// } - -// .tree-hover { -// background-color: $gray-200; -// min-height: 20px; -// border: 1px solid $gray-600; -// } - -// .tree-node-toolbar { -// display: inline-block; -// padding: 0px 5px; -// margin-left: 15px; -// margin-bottom: -4px; -// margin-top: -8px; -// } - -// // @media (max-width: @screen-xs) { -// // ul.tree-children { -// // padding-left: 10px; -// // } -// // } - -// // decoration -// // .tree, .tree-node { -// .tree.with-skeleton, .tree.with-skeleton .tree-node { -// position: relative; - -// &.opened::before, &:last-child::after { -// content: ''; -// position: absolute; -// top: 12px; -// left: 7px; -// height: calc(100% - 23px); -// width: 1px; -// background: $gray-400; -// z-index: -1; -// } - -// &:last-child::after { -// top: 11px; -// left: -13px; -// height: calc(100% - 15px); -// width: 3px; -// background: #fff; -// } - -// &.opened > .tree-children > .tree-node > .tree-link::before { -// content: ''; -// position: absolute; -// width: 18px; -// height: 1px; -// top: 10px; -// left: -12px; -// z-index: -1; -// background: $gray-400; -// } -// } - -// .tree.with-skeleton.opened::before { -// left: 22px; -// top: 33px; -// height: calc(100% - 67px); -// } - -// .tree-link.active ~ .balance-area { -// color: $gray-600 !important; -// } diff --git a/client/ui/index.js b/client/ui/index.js index 5200cac0..c37f805b 100644 --- a/client/ui/index.js +++ b/client/ui/index.js @@ -3,12 +3,13 @@ const Dropdown = require('./dropdown'); module.exports = { create(tag, obj) { - if(!obj) { + if(tag.includes('<')) { let div = document.createElement('div'); div.innerHTML = tag.trim(); return div.firstChild; } let element = document.createElement(tag); + obj = obj || {}; let $ = (expr, con) => { return typeof expr === "string" diff --git a/client/ui/tree.js b/client/ui/tree.js deleted file mode 100644 index 6a8f171a..00000000 --- a/client/ui/tree.js +++ /dev/null @@ -1,262 +0,0 @@ -const frappe = require('frappejs'); -const octicons = require('octicons'); -const utils = require('frappejs/client/ui/utils'); - -const iconSet = { - open: octicons["triangle-down"].toSVG({ width: "12", height: "12", "class": "tree-icon-open" }), - close: octicons["triangle-right"].toSVG({ width: "12", height: "12", "class": "tree-icon-closed" }) -}; - -let TreeTemplate = document.createElement('template'); -TreeTemplate.innerHTML = ` -
- -
-`; - -class Tree extends HTMLElement { - constructor() { - super(); - - this.attachShadow({ mode: 'open' }) - .appendChild(TreeTemplate.content.cloneNode(true)); - } -} - -window.customElements.define('f-tree', Tree); - -let TreeNodeTemplate = document.createElement('template'); -TreeNodeTemplate.innerHTML = ` - -
-
-
-
-
- -`; - - -class TreeNode extends HTMLElement { - static get observedAttributes() { - return ['label', 'expanded'] - } - - constructor() { - super(); - - let shadowRoot = this.attachShadow({ mode: 'open' }); - shadowRoot.appendChild(TreeNodeTemplate.content.cloneNode(true)); - this.iconEl = shadowRoot.querySelector('.tree-node-icon'); - this.labelEl = shadowRoot.querySelector('.tree-node-label'); - this.actionsEl = shadowRoot.querySelector('.tree-node-actions'); - } - - attributeChangedCallback(name, oldValue, newValue) { - console.log(name, oldValue, newValue); - - switch(name) { - case 'label': { - this.labelEl.innerHTML = newValue || ''; - break; - } - - case 'expanded': { - this.expanded = this.hasAttribute('expanded'); - - if (this.expanded) { - this.iconEl.innerHTML = iconSet.open; - } else { - this.iconEl.innerHTML = iconSet.close; - } - break; - } - - default: break; - } - } -} - -window.customElements.define('f-tree-node', TreeNode); - -class TreeOld { - constructor({ parent, label, iconSet, withSkeleton, method }) { - Object.assign(this, arguments[0]); - this.nodes = {}; - if (!iconSet) { - this.iconSet = { - open: octicons["triangle-down"].toSVG({ "width": 10, "class": "node-parent" }), - closed: octicons["triangle-right"].toSVG({ "width": 5, "class": "node-parent" }), - leaf: octicons["primitive-dot"].toSVG({ "width": 7, "class": "node-leaf" }) - }; - } - this.make(); - } - - make() { - this.tree = frappe.ui.create('div', { - inside: this.parent, - className: 'tree ' + (this.withSkeleton ? 'with-skeleton' : '') - }); - - this.rootNode = this.makeNode(this.label, this.label, true, null, this.tree); - this.expandNode(this.rootNode); - } - - refresh() { - // this.selectedNode.parentNode && - // this.loadChildren(this.selectedNode.parentNode, true); - } - - async loadChildren(node, deep = false) { - let children = !deep ? await this.method(node) : await this.getAllNodes(node); - this.renderNodeChildren(node, children); - } - - renderChildrenDeep(dataList) { - dataList.map(d => { this.renderNodeChildren(this.nodes[d.parent], d.data); }); - } - - renderNodeChildren(node, dataSet = []) { - frappe.ui.empty(node.childrenList); - - dataSet.forEach(data => { - let parentNode = this.nodes[node.value]; - let childNode = this.makeNode(data.label || data.value, data.value, - data.expandable, parentNode); - childNode.treeLink.dataset.nodeData = data; - }); - node.expanded = false; - - // As children loaded - node.loaded = true; - this.onNodeClick(node, true); - } - - getAllNodes() { } - - makeNode(label, value, expandable, parentNode, parentEl) { - let node = { - label: label, - value: value, - loaded: 0, - expanded: 0, - expandable: expandable, - }; - - if (parentNode) { - node.parentNode = parentNode; - node.parent = parentNode.childrenList; - node.isRoot = 0; - } else { - node.isRoot = 1; - node.parent = parentEl; - } - - this.nodes[value] = node; - this.buildNodeElement(node); - this.onRender && this.onRender(node); - - return node; - } - - buildNodeElement(node) { - node.parentLi = frappe.ui.create('li', { - inside: node.parent, - className: 'tree-node' - }); - - let iconHtml = ''; - if (this.iconSet) { - iconHtml = node.expandable ? this.iconSet.closed : ''; - } - let labelEl = ` ${node.label}`; - - node.treeLink = frappe.ui.create('span', { - inside: node.parentLi, - className: 'tree-link', - 'data-label': node.label, - innerHTML: iconHtml + labelEl - }); - node.treeLink.dataset.node = node; - node.treeLink.addEventListener('click', () => { - this.onNodeClick(node); - }); - - node.childrenList = frappe.ui.create('ul', { - inside: node.parentLi, - className: 'tree-children hide' - }); - - // if(this.toolbar) { - // node.toolbar = this.getToolbar(node).insertAfter(node.treeLink); - // } - } - - async onNodeClick(node, click = true) { - this.setSelectedNode(node); - if (click) { - this.onClick && this.onClick(node); - } - await this.expandNode(node); - // select link - utils.activate(this.tree, node.treeLink, 'tree-link', 'active'); - if (node.toolbar) this.showToolbar(node); - } - - async expandNode(node) { - if (node.expandable) { - await this.toggleNode(node); - } - - node.expanded = !node.expanded; - // node.parent.classList.toggle('opened', node.expanded); - node.parent.classList.add('opened'); - node.parentLi.classList.add('opened'); - } - - async toggleNode(node) { - if (!node.loaded) await this.loadChildren(node); - - // expand children - if (node.childrenList) { - if (node.childrenList.innerHTML.length) { - if (node.expanded) { - node.childrenList.classList.add('hide'); - } else { - node.childrenList.classList.remove('hide'); - } - } - - // open close icon - if (this.iconSet) { - const oldIcon = node.treeLink.querySelector('svg'); - const newIconKey = node.expanded ? 'closed' : 'open'; - const newIcon = frappe.ui.create(this.iconSet[newIconKey]); - node.treeLink.replaceChild(newIcon, oldIcon); - } - } - } - - getSelectedNode() { return this.selectedNode; } - - setSelectedNode(node) { this.selectedNode = node; } - - showToolbar() { } -} - -module.exports = Tree; diff --git a/client/view/tree.js b/client/view/tree.js index d61d6fed..97d117eb 100644 --- a/client/view/tree.js +++ b/client/view/tree.js @@ -1,6 +1,6 @@ const frappe = require('frappejs'); const BaseList = require('./list'); -const Tree = require('frappejs/client/ui/tree'); +const Tree = require('frappejs/client/components/tree'); // const keyboard = require('frappejs/client/ui/keyboard'); module.exports = class BaseTree extends BaseList { @@ -56,83 +56,62 @@ module.exports = class BaseTree extends BaseList { } renderTree(rootLabel) { - // const tree = new Tree(); - // tree.getChildNodes = async node => { - // const children = await this.getData(node) || []; - // return children.map(d => ({ - // label: d.name, - // value: d.name, - // expandable: d.isGroup - // })); - // } - // tree.rootNode = { - // label: rootLabel, - // value: rootLabel, - // isRoot: 1, - // expandable: 1 - // } - // this.body.appendChild(tree); - this.rootNode = { label: rootLabel, value: rootLabel, isRoot: true, - expanded: true, - children: [] + isGroup: true, + children: null } - const getNodeHTML = node => - ` - `; - - this.treeWrapper = frappe.ui.create('f-tree'); - - this.rootNode.el = frappe.ui.create(getNodeHTML(this.rootNode), { - inside: this.treeWrapper - }); - this.treeWrapper = frappe.ui.create(` - ${getNodeHTML(this.rootNode)} + ${this.getTreeNodeHTML(this.rootNode)} `); + const rootNode = this.treeWrapper.querySelector('f-tree-node[is-root]'); + rootNode.props = this.rootNode; + this.body.appendChild(this.treeWrapper); - frappe.ui.on(this.treeWrapper, 'click', 'f-tree-node', async (e, treeNode) => { - if (treeNode.expanded) { - treeNode.removeAttribute('expanded'); - } else { - treeNode.setAttribute('expanded', ''); + frappe.ui.on(this.treeWrapper, 'tree-node-expand', 'f-tree-node', async (e, treeNode) => { + if (!treeNode.expanded) return; + + if (!treeNode.props.children) { + const data = await this.getData(treeNode.props); + const children = data.map(d => ({ + label: d.name, + value: d.name, + isGroup: d.isGroup, + doc: d + })); + treeNode.props.children = children; + + for (let child of children) { + const childNode = frappe.ui.create(this.getTreeNodeHTML(child)); + childNode.props = child; + treeNode.appendChild(childNode); + } } - - let node = null; - // if (treeNode.hasAttribute('is-root')) { - // node = this.rootNode; - // } else { - - // } - - }); + frappe.ui.on(this.treeWrapper, 'tree-node-action', 'f-tree-node', (e, treeNode) => { + if (treeNode.isRoot) return; - // this.tree = new Tree({ - // label: rootLabel, - // parent: this.body, - // method: async node => { - // const children = await this.getData(node) || []; - // return children.map(d => ({ - // label: d.name, - // value: d.name, - // expandable: d.isGroup - // })); - // } - // }); + const button = e.detail.actionEl; + const action = button.getAttribute('data-action'); + + if (action === 'edit') { + this.edit(treeNode.props.doc.name); + } + }); + + rootNode.click(); // open the root node + } + + edit(name) { + frappe.desk.showFormModal(this.doctype, name); } async getData(node) { @@ -154,63 +133,36 @@ module.exports = class BaseTree extends BaseList { }); } + getTreeNodeHTML(node) { + return ( + ` + ${this.getActionButtonsHTML()} + ` + ); + } + + getActionButtonsHTML() { + return [ + { id: 'edit', label: frappe._('Edit') } + // { id: 'addChild', label: frappe._('Add Child') }, + // { id: 'delete', label: frappe._('Delete') }, + ].map(button => { + return ``; + }) + .join(''); + } + getFields() { let fields = [this.treeSettings.parentField, 'isGroup'] this.updateStandardFields(fields); return fields; } - - makeToolbar() { - this.makeSearch(); - - this.btnNew = this.page.addButton(frappe._('New'), 'btn-primary', async () => { - await frappe.router.setRoute('new', this.doctype); - }); - - this.btnDelete = this.page.addButton(frappe._('Delete'), 'btn-secondary hide', async () => { - await frappe.db.deleteMany(this.doctype, this.getCheckedRowNames()); - await this.refresh(); - }); - - this.btnReport = this.page.addButton(frappe._('Report'), 'btn-outline-secondary hide', async () => { - await frappe.router.setRoute('table', this.doctype); - }); - - this.on('state-change', () => { - const checkedCount = this.getCheckedRowNames().length; - this.btnDelete.classList.toggle('hide', checkedCount ? false : true); - this.btnNew.classList.toggle('hide', checkedCount ? true : false); - this.btnReport.classList.toggle('hide', checkedCount ? true : false); - }); - - this.page.body.addEventListener('click', (event) => { - if (event.target.classList.contains('checkbox')) { - this.trigger('state-change'); - } - }) - } - - makeSearch() { - this.toolbar = frappe.ui.add('div', 'list-toolbar', this.parent); - this.toolbar.innerHTML = ` - - `; - - this.searchInput = this.toolbar.querySelector('input'); - this.searchInput.addEventListener('keypress', (event) => { - if (event.keyCode === 13) { - this.refresh(); - } - }); - - this.btnSearch = this.toolbar.querySelector('.btn-search'); - this.btnSearch.addEventListener('click', (event) => { - this.refresh(); - }); - } }; From 32cd6581d11f02cc066ae715f1bf382e45e1725c Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sun, 15 Apr 2018 00:44:02 +0530 Subject: [PATCH 146/477] PDF generation - /api/method/pdf - frappe.getPDF - download using blob url --- client/desk/printpage.js | 32 ++------ client/index.js | 3 + client/pdf.js | 30 +++++++ client/view/tree.js | 5 +- common/print.js | 29 +++++++ config/rollup.config.app.js | 4 +- package.json | 3 +- server/index.js | 7 +- server/pdf.js | 34 +++++++- server/utils.js | 5 ++ utils/format.js | 9 ++- yarn.lock | 153 ++++++++++++++++++++++++++++++------ 12 files changed, 258 insertions(+), 56 deletions(-) create mode 100644 client/pdf.js create mode 100644 common/print.js diff --git a/client/desk/printpage.js b/client/desk/printpage.js index 468faa00..820590fe 100644 --- a/client/desk/printpage.js +++ b/client/desk/printpage.js @@ -1,5 +1,6 @@ -const Page = require('frappejs/client/view/page'); const frappe = require('frappejs'); +const Page = require('frappejs/client/view/page'); +const { getHTML } = require('frappejs/common/print'); const nunjucks = require('nunjucks/browser/nunjucks'); nunjucks.configure({ autoescape: false }); @@ -16,12 +17,8 @@ module.exports = class PrintPage extends Page { frappe.router.setRoute('edit', this.doctype, this.name) }); - this.addButton(frappe._('Print'), 'secondary', async () => { - const pdf = require('frappejs/server/pdf'); - const savePath = '/Users/farisansari/frappe.pdf'; - pdf(await this.getHTML(true), savePath); - const { shell } = require('electron'); - shell.openItem(savePath); + this.addButton(frappe._('PDF'), 'secondary', async () => { + frappe.getPDF(this.doctype, this.name); }); } @@ -37,28 +34,15 @@ module.exports = class PrintPage extends Page { } async renderTemplate() { + let doc = await frappe.getDoc(this.doctype, this.name); + frappe.desk.setActiveDoc(doc); + const html = await getHTML(this.doctype, this.name); try { - this.body.innerHTML = await this.getHTML(); + this.body.innerHTML = html; // this.setTitle(doc.name); } catch (e) { this.renderError('Template Error', e); throw e; } } - - async getHTML(pdf = false) { - this.printFormat = await frappe.getDoc('PrintFormat', this.meta.print.printFormat); - let doc = await frappe.getDoc(this.doctype, this.name); - let context = {doc: doc, frappe: frappe}; - frappe.desk.setActiveDoc(doc); - return ` - ${pdf ? ` - - ` : ''} - `; - } } diff --git a/client/index.js b/client/index.js index 40347d3c..4e3ac28d 100644 --- a/client/index.js +++ b/client/index.js @@ -4,6 +4,7 @@ const frappe = require('frappejs'); frappe.ui = require('./ui'); const Desk = require('./desk'); const Observable = require('frappejs/utils/observable'); +const { getPDF } = require('frappejs/client/pdf'); module.exports = { async start({server, columns = 2, makeDesk = 1}) { @@ -47,6 +48,8 @@ module.exports = { return await response.json(); } + + frappe.getPDF = getPDF; } }; diff --git a/client/pdf.js b/client/pdf.js new file mode 100644 index 00000000..f8c029e6 --- /dev/null +++ b/client/pdf.js @@ -0,0 +1,30 @@ +async function getPDF(doctype, name) { + const headers = { + 'Accept': 'application/pdf', + 'Content-Type': 'application/json' + } + + const res = await fetch('/api/method/pdf', { + method: 'POST', + headers, + body: JSON.stringify({ doctype, name }) + }); + + const blob = await res.blob(); + showFile(blob); +} + + +function showFile(blob, filename='file.pdf') { + const newBlob = new Blob([blob], { type: "application/pdf" }) + const data = window.URL.createObjectURL(newBlob); + const link = document.createElement('a'); + link.href = data; + link.download = filename; + link.click(); + setTimeout(() => window.URL.revokeObjectURL(data), 100); +} + +module.exports = { + getPDF +} diff --git a/client/view/tree.js b/client/view/tree.js index 97d117eb..6a523114 100644 --- a/client/view/tree.js +++ b/client/view/tree.js @@ -38,8 +38,9 @@ module.exports = class BaseTree extends BaseList { this.body.innerHTML = ''; this.dirty = false; - let accountingSettings = await frappe.db.getSingle('AccountingSettings'); - let rootLabel = accountingSettings.companyName; + const rootLabel = this.treeSettings.getRootLabel ? + await this.treeSettings.getRootLabel() : + this.doctype; this.renderTree(rootLabel); this.trigger('state-change'); diff --git a/common/print.js b/common/print.js new file mode 100644 index 00000000..c56f32fc --- /dev/null +++ b/common/print.js @@ -0,0 +1,29 @@ +const frappe = require('frappejs'); +const nunjucks = require('nunjucks/browser/nunjucks'); + +async function getHTML(doctype, name) { + const meta = frappe.getMeta(doctype); + const printFormat = await frappe.getDoc('PrintFormat', meta.print.printFormat); + let doc = await frappe.getDoc(doctype, name); + let context = {doc: doc, frappe: frappe}; + + console.log(context); + + let html; + try { + html = nunjucks.renderString(printFormat.template, context); + } catch (error) { + console.log(error); + html = ''; + } + + return ` + + `; +} + +module.exports = { + getHTML +} diff --git a/config/rollup.config.app.js b/config/rollup.config.app.js index 510f7eac..4bb5c22b 100644 --- a/config/rollup.config.app.js +++ b/config/rollup.config.app.js @@ -4,11 +4,13 @@ module.exports = { file: './www/dist/js/bundle.js', format: 'iife', name: 'desk', - globals: ['io', 'nunjucks'] // for socketio client, which is imported directly + sourcemap: true, + globals: ['io', 'nunjucks'], // for socketio client, which is imported directly, }, plugins: [ require('rollup-plugin-commonjs')(), require('rollup-plugin-json')(), + require('rollup-plugin-html')(), require('rollup-plugin-node-resolve')({ preferBuiltins: true }), diff --git a/package.json b/package.json index 4b31fc35..3340ad0f 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "eslint": "^4.19.1", "express": "^4.16.2", "flatpickr": "^4.3.2", - "frappejs": "../frappejs", "frappe-datatable": "frappe/datatable", + "frappejs": "../frappejs", "jquery": "^3.3.1", "mkdirp": "^0.5.1", "mocha": "^4.1.0", @@ -36,6 +36,7 @@ "puppeteer": "^1.2.0", "rollup": "^0.55.1", "rollup-plugin-commonjs": "^8.3.0", + "rollup-plugin-html": "^0.2.1", "rollup-plugin-json": "^2.3.0", "rollup-plugin-node-resolve": "^3.0.2", "rollup-plugin-postcss": "^1.2.7", diff --git a/server/index.js b/server/index.js index ed42f4ef..c734d9e5 100644 --- a/server/index.js +++ b/server/index.js @@ -12,6 +12,7 @@ const frappeModels = require('frappejs/models'); const common = require('frappejs/common'); const bodyParser = require('body-parser'); const fs = require('fs'); +const { setupExpressRoute: setRouteForPDF } = require('frappejs/server/pdf'); require.extensions['.html'] = function (module, filename) { module.exports = fs.readFileSync(filename, 'utf8'); @@ -19,6 +20,7 @@ require.extensions['.html'] = function (module, filename) { module.exports = { async start({backend, connectionParams, models, staticPath = './'}) { + await this.init(); if (models) { @@ -41,10 +43,12 @@ module.exports = { restAPI.setup(app); // listen + server.listen(frappe.config.port); + frappe.app = app; frappe.server = server; - server.listen(frappe.config.port); + setRouteForPDF(); }, async init() { @@ -52,6 +56,7 @@ module.exports = { await frappe.init(); frappe.registerModels(frappeModels, 'server'); frappe.registerLibs(common); + await frappe.login(); }, diff --git a/server/pdf.js b/server/pdf.js index 3d1f39c4..651b430d 100644 --- a/server/pdf.js +++ b/server/pdf.js @@ -1,6 +1,12 @@ +const frappe = require('frappejs'); const puppeteer = require('puppeteer'); +const fs = require('fs'); +const path = require('path'); +const { getTmpDir } = require('frappejs/server/utils'); +const { getHTML } = require('frappejs/common/print'); +const { getRandomString } = require('frappejs/utils'); -module.exports = async function (html, filepath) { +async function makePDF(html, filepath) { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setContent(html); @@ -10,3 +16,29 @@ module.exports = async function (html, filepath) { }); await browser.close(); } + +function setupExpressRoute() { + if (!frappe.app) return; + frappe.app.post('/api/method/pdf', frappe.asyncHandler(handlePDFRequest)); +} + +async function handlePDFRequest(req, res) { + const args = req.body; + const { doctype, name } = args; + const html = await getHTML(doctype, name); + + const filepath = path.join(getTmpDir(), `frappe-pdf-${getRandomString()}.pdf`); + await makePDF(html, filepath); + + const file = fs.createReadStream(filepath); + const stat = fs.statSync(filepath); + res.setHeader('Content-Length', stat.size); + res.setHeader('Content-Type', 'application/pdf'); + res.setHeader('Content-Disposition', `attachment; filename=${path.basename(filepath)}`); + file.pipe(res); +} + +module.exports = { + makePDF, + setupExpressRoute +} diff --git a/server/utils.js b/server/utils.js index 02a01901..755d48ab 100644 --- a/server/utils.js +++ b/server/utils.js @@ -1,6 +1,7 @@ const mkdirp = require('mkdirp'); const fs = require('fs'); const getDirName = require('path').dirname; +const os = require('os'); module.exports = { writeFile(fullpath, contents) { @@ -13,5 +14,9 @@ module.exports = { }); }); }); + }, + + getTmpDir() { + return os.tmpdir(); } } \ No newline at end of file diff --git a/utils/format.js b/utils/format.js index 9f91b2ed..c863f849 100644 --- a/utils/format.js +++ b/utils/format.js @@ -16,7 +16,14 @@ module.exports = { value = markdown.makeHtml(value || ''); } else if (field.fieldtype === 'Date') { - value = moment(value).format(frappe.SystemSettings.dateFormat.toUpperCase()); + let dateFormat; + if (!frappe.SystemSettings) { + dateFormat = 'yyyy-mm-dd'; + } else { + dateFormat = frappe.SystemSettings.dateFormat; + } + + value = moment(value).format(dateFormat.toUpperCase()); } else { if (value===null || value===undefined) { diff --git a/yarn.lock b/yarn.lock index 75830045..bece6004 100644 --- a/yarn.lock +++ b/yarn.lock @@ -412,6 +412,13 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + camelcase-css@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-1.0.1.tgz#157c4238265f5cf94a1dffde86446552cbf3f705" @@ -511,6 +518,12 @@ clap@^1.0.9: dependencies: chalk "^1.1.3" +clean-css@4.1.x: + version "4.1.11" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" + dependencies: + source-map "0.5.x" + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -613,6 +626,10 @@ commander@2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +commander@2.15.x, commander@~2.15.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + commander@^2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" @@ -1016,22 +1033,6 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -eslint-config-airbnb-base@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" - dependencies: - eslint-restricted-globals "^0.1.1" - -eslint-config-airbnb@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz#2546bfb02cc9fe92284bf1723ccf2e87bc45ca46" - dependencies: - eslint-config-airbnb-base "^12.1.0" - -eslint-restricted-globals@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" - eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" @@ -1118,6 +1119,10 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" +estree-walker@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" + estree-walker@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" @@ -1369,14 +1374,55 @@ forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" -frappe-datatable@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/frappe-datatable/-/frappe-datatable-0.0.3.tgz#55d3fd7bafdf2a7380efab2ae2aaaa956624fca0" +frappe-datatable@frappe/datatable: + version "0.0.4" + resolved "https://codeload.github.com/frappe/datatable/tar.gz/4bb400230087fbf97e8587a34916e14f77fa01cd" dependencies: clusterize.js "^0.18.0" lodash "^4.17.5" sortablejs "^1.7.0" +frappejs@../frappejs: + version "0.0.5" + dependencies: + autoprefixer "^7.2.4" + awesomplete "^1.1.2" + body-parser "^1.18.2" + bootstrap "^4.0.0" + clusterize.js "^0.18.0" + codemirror "^5.35.0" + commander "^2.13.0" + eslint "^4.19.1" + express "^4.16.2" + flatpickr "^4.3.2" + frappe-datatable frappe/datatable + frappejs "../frappejs" + jquery "^3.3.1" + mkdirp "^0.5.1" + mocha "^4.1.0" + moment "^2.20.1" + mysql "^2.15.0" + node-fetch "^1.7.3" + node-sass "^4.7.2" + nodemon "^1.14.7" + nunjucks "^3.1.0" + octicons "^7.2.0" + popper.js "^1.12.9" + precss "^2.0.0" + puppeteer "^1.2.0" + rollup "^0.55.1" + rollup-plugin-commonjs "^8.3.0" + rollup-plugin-json "^2.3.0" + rollup-plugin-node-resolve "^3.0.2" + rollup-plugin-postcss "^1.2.7" + rollup-plugin-replace "^2.0.0" + rollup-plugin-sass "^0.5.3" + showdown "^1.8.6" + socket.io "^2.0.4" + sortablejs "^1.7.0" + sqlite3 "^3.1.13" + walk "^2.3.9" + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -1672,7 +1718,7 @@ hawk@~6.0.2: hoek "4.x.x" sntp "2.x.x" -he@1.1.1: +he@1.1.1, he@1.1.x: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -1692,6 +1738,18 @@ html-comment-regex@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" +html-minifier@^3.0.2: + version "3.5.14" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.14.tgz#88653b24b344274e3e3d7052f1541ebea054ac60" + dependencies: + camel-case "3.0.x" + clean-css "4.1.x" + commander "2.15.x" + he "1.1.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.3.x" + http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" @@ -2191,6 +2249,10 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + lowercase-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" @@ -2381,6 +2443,12 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + dependencies: + lower-case "^1.1.1" + node-fetch@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -2652,6 +2720,12 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + dependencies: + no-case "^2.2.0" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -3444,6 +3518,10 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -3601,6 +3679,13 @@ rollup-plugin-commonjs@^8.3.0: resolve "^1.4.0" rollup-pluginutils "^2.0.1" +rollup-plugin-html@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-html/-/rollup-plugin-html-0.2.1.tgz#a1862eca87ae54b677689d0d4133911e8226463d" + dependencies: + html-minifier "^3.0.2" + rollup-pluginutils "^1.5.0" + rollup-plugin-json@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/rollup-plugin-json/-/rollup-plugin-json-2.3.0.tgz#3c07a452c1b5391be28006fbfff3644056ce0add" @@ -3656,6 +3741,13 @@ rollup-plugin-sass@^0.5.3: estree-walker "^0.3.0" micromatch "^2.3.11" +rollup-pluginutils@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" + dependencies: + estree-walker "^0.2.1" + minimatch "^3.0.2" + rollup@^0.55.1: version "0.55.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.55.1.tgz#baf4f23abe3014b29e56dea7d72d9946e56ac7dd" @@ -3846,17 +3938,17 @@ sortablejs@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.7.0.tgz#80a2b2370abd568e1cec8c271131ef30a904fa28" +source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + source-map@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: amdefine ">=0.0.4" -source-map@^0.5.3, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -source-map@^0.6.1: +source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -4161,6 +4253,13 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +uglify-js@3.3.x: + version "3.3.21" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.21.tgz#851a34cbb31840ecb881968ed07dd3a61e7264a0" + dependencies: + commander "~2.15.0" + source-map "~0.6.1" + uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -4219,6 +4318,10 @@ update-notifier@^2.3.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" From 4471bc0bd17fd3261881c2a8b9fe9b603dc958d7 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 16 Apr 2018 15:02:31 +0530 Subject: [PATCH 147/477] getPDF api for electron --- server/pdf.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/pdf.js b/server/pdf.js index 651b430d..862fa1a0 100644 --- a/server/pdf.js +++ b/server/pdf.js @@ -2,6 +2,7 @@ const frappe = require('frappejs'); const puppeteer = require('puppeteer'); const fs = require('fs'); const path = require('path'); +const { shell } = require('electron'); const { getTmpDir } = require('frappejs/server/utils'); const { getHTML } = require('frappejs/common/print'); const { getRandomString } = require('frappejs/utils'); @@ -17,6 +18,13 @@ async function makePDF(html, filepath) { await browser.close(); } +async function getPDFForElectron(doctype, name) { + const html = await getHTML(doctype, name); + const filepath = path.join(frappe.electronConfig.directory, name + '.pdf'); + await makePDF(html, filepath); + shell.openItem(filepath); +} + function setupExpressRoute() { if (!frappe.app) return; frappe.app.post('/api/method/pdf', frappe.asyncHandler(handlePDFRequest)); @@ -40,5 +48,6 @@ async function handlePDFRequest(req, res) { module.exports = { makePDF, - setupExpressRoute + setupExpressRoute, + getPDFForElectron } From 66284ec5b349aedc8382a91f6b747a67290ad187 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 16 Apr 2018 18:34:16 +0530 Subject: [PATCH 148/477] minor fixes --- client/desk/reportpage.js | 7 +++++-- client/view/form.js | 4 +++- server/pdf.js | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/client/desk/reportpage.js b/client/desk/reportpage.js index 1b3d7db2..d218c6f1 100644 --- a/client/desk/reportpage.js +++ b/client/desk/reportpage.js @@ -42,7 +42,7 @@ module.exports = class ReportPage extends Page { getFilterValues() { const values = {}; - for (let control of this.form.controlList) { + for (let control of this.form.formLayout.controlList) { values[control.fieldname] = control.getInputValue(); if (control.required && !values[control.fieldname]) { frappe.ui.showAlert({message: frappe._('{0} is mandatory', control.label), color: 'red'}); @@ -75,7 +75,10 @@ module.exports = class ReportPage extends Page { const filterValues = this.getFilterValues(); if (filterValues === false) return; - let data = await frappe.call(this.method, filterValues); + let data = await frappe.call({ + method: this.method, + args: filterValues + }); this.datatable.refresh(data); } diff --git a/client/view/form.js b/client/view/form.js index 409f03c7..24785afc 100644 --- a/client/view/form.js +++ b/client/view/form.js @@ -11,7 +11,9 @@ module.exports = class BaseForm extends Observable { Object.assign(this, arguments[0]); this.links = []; - this.meta = frappe.getMeta(this.doctype); + if (!this.meta) { + this.meta = frappe.getMeta(this.doctype); + } if (this.setup) { this.setup(); diff --git a/server/pdf.js b/server/pdf.js index 862fa1a0..044c15ef 100644 --- a/server/pdf.js +++ b/server/pdf.js @@ -20,7 +20,7 @@ async function makePDF(html, filepath) { async function getPDFForElectron(doctype, name) { const html = await getHTML(doctype, name); - const filepath = path.join(frappe.electronConfig.directory, name + '.pdf'); + const filepath = path.join(frappe.electronSettings.directory, name + '.pdf'); await makePDF(html, filepath); shell.openItem(filepath); } From 6fb782b30065ba4f70e244eb7a861db271b24c02 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 18 Apr 2018 12:18:20 +0530 Subject: [PATCH 149/477] Support 'in' and 'not in' in db filters --- backends/database.js | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/backends/database.js b/backends/database.js index 5281aeb6..1690a2f8 100644 --- a/backends/database.js +++ b/backends/database.js @@ -393,20 +393,36 @@ module.exports = class Database extends Observable { let conditions = []; let values = []; for (let key in filters) { + + let field = `ifnull(${key}, '')`; const value = filters[key]; + if (value instanceof Array) { - const condition = value[0]; + + let condition = value[0]; + let comparisonValue = value[1]; + let placeholder = '?'; + // if its like, we should add the wildcard "%" if the user has not added if (condition.toLowerCase()==='includes') { condition = 'like'; } - if (['like', 'includes'].includes(condition.toLowerCase()) && !value[1].includes('%')) { - value[1] = `%${value[1]}%`; + if (['like', 'includes'].includes(condition.toLowerCase()) && !comparisonValue.includes('%')) { + comparisonValue = `%${comparisonValue}%`; } - conditions.push(`ifnull(${key}, '') ${condition} ?`); - values.push(value[1]); + if (['in', 'not in'].includes(condition) && Array.isArray(comparisonValue)) { + placeholder = `(${comparisonValue.map(v => '?').join(", ")})`; + } + conditions.push(`${field} ${condition} ${placeholder}`); + + if (Array.isArray(comparisonValue)) { + values = values.concat(comparisonValue); + } else { + values.push(comparisonValue); + } + } else { - conditions.push(`ifnull(${key}, '') = ?`); + conditions.push(`${field} = ?`); values.push(value); } } From 769c9e86bd2c28a10de1a760e13b1d5d28a8d13b Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 18 Apr 2018 12:18:24 +0530 Subject: [PATCH 150/477] nested set wip --- client/view/form.js | 2 +- common/print.js | 2 -- model/index.js | 10 +++++++++- model/meta.js | 9 +++++++++ model/nestedset.js | 0 5 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 model/nestedset.js diff --git a/client/view/form.js b/client/view/form.js index 24785afc..9326d8ae 100644 --- a/client/view/form.js +++ b/client/view/form.js @@ -206,7 +206,7 @@ module.exports = class BaseForm extends Observable { } refreshLinks(links) { - if (!this.container) return; + if (!(this.container && this.container.clearLinks)) return; this.container.clearLinks(); for(let link of links) { diff --git a/common/print.js b/common/print.js index c56f32fc..faa5a3fa 100644 --- a/common/print.js +++ b/common/print.js @@ -7,8 +7,6 @@ async function getHTML(doctype, name) { let doc = await frappe.getDoc(doctype, name); let context = {doc: doc, frappe: frappe}; - console.log(context); - let html; try { html = nunjucks.renderString(printFormat.template, context); diff --git a/model/index.js b/model/index.js index cfbd05d6..f32fc6e4 100644 --- a/model/index.js +++ b/model/index.js @@ -34,5 +34,13 @@ module.exports = { { fieldname: 'parentfield', fieldtype: 'Data', required: 1 } + ], + treeFields: [ + { + fieldname: 'lft', fieldtype: 'Int', required: 1 + }, + { + fieldname: 'rgt', fieldtype: 'Int', required: 1 + } ] -}; \ No newline at end of file +}; diff --git a/model/meta.js b/model/meta.js index 6cfc4a79..38d6a4ac 100644 --- a/model/meta.js +++ b/model/meta.js @@ -112,6 +112,15 @@ module.exports = class BaseMeta extends BaseDocument { } } + if (this.isTree) { + // tree fields + for (let field of model.treeFields) { + if (frappe.db.typeMap[field.fieldtype] && !doctype_fields.includes(field.fieldname)) { + _add(field); + } + } + } + // doctype fields for (let field of this.fields) { let include = frappe.db.typeMap[field.fieldtype]; diff --git a/model/nestedset.js b/model/nestedset.js new file mode 100644 index 00000000..e69de29b From 3a085b1c669fa28ea839b8ea457fd68e0a4da6fa Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Wed, 18 Apr 2018 14:32:51 +0530 Subject: [PATCH 151/477] Add deepmerge dep --- package.json | 1 + yarn.lock | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/package.json b/package.json index 3340ad0f..4dfb3f5c 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "clusterize.js": "^0.18.0", "codemirror": "^5.35.0", "commander": "^2.13.0", + "deepmerge": "^2.1.0", "eslint": "^4.19.1", "express": "^4.16.2", "flatpickr": "^4.3.2", diff --git a/yarn.lock b/yarn.lock index bece6004..a6aac571 100644 --- a/yarn.lock +++ b/yarn.lock @@ -872,6 +872,10 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" +deepmerge@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.0.tgz#511a54fff405fc346f0240bb270a3e9533a31102" + defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" @@ -1412,6 +1416,7 @@ frappejs@../frappejs: puppeteer "^1.2.0" rollup "^0.55.1" rollup-plugin-commonjs "^8.3.0" + rollup-plugin-html "^0.2.1" rollup-plugin-json "^2.3.0" rollup-plugin-node-resolve "^3.0.2" rollup-plugin-postcss "^1.2.7" From 6cadb5fc1f831984eb70023a05d1e767d0ce440b Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 19 Apr 2018 15:43:55 +0530 Subject: [PATCH 152/477] "New Item" link item should be last --- client/view/controls/link.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/view/controls/link.js b/client/view/controls/link.js index 0a5a42ed..aa1f4ef1 100644 --- a/client/view/controls/link.js +++ b/client/view/controls/link.js @@ -14,6 +14,12 @@ class LinkControl extends BaseControl { minChars: 0, maxItems: 99, filter: () => true, + sort: (a, b) => { + if (a.value === '__newitem' || b.value === '__newitem') { + return -1; + } + return a.value > b.value; + } }); // rebuild the list on input From a85490eeae46777cd67a89da1e8983a0f7c5375c Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 19 Apr 2018 15:44:07 +0530 Subject: [PATCH 153/477] addChild method in TreeView --- client/view/tree.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/client/view/tree.js b/client/view/tree.js index 6a523114..e4325910 100644 --- a/client/view/tree.js +++ b/client/view/tree.js @@ -105,6 +105,8 @@ module.exports = class BaseTree extends BaseList { if (action === 'edit') { this.edit(treeNode.props.doc.name); + } else if (action === 'addChild') { + this.addChildNode(treeNode.props.doc.name); } }); @@ -115,6 +117,15 @@ module.exports = class BaseTree extends BaseList { frappe.desk.showFormModal(this.doctype, name); } + async addChildNode(name) { + const newDoc = await frappe.getNewDoc(this.doctype); + const formModal = await frappe.desk.showFormModal(this.doctype, newDoc.name); + const parentField = this.treeSettings.parentField; + if (formModal.form.doc.meta.hasField(parentField)) { + formModal.form.doc.set(parentField, name); + } + } + async getData(node) { let fields = this.getFields(); let filters = {}; @@ -150,8 +161,8 @@ module.exports = class BaseTree extends BaseList { getActionButtonsHTML() { return [ - { id: 'edit', label: frappe._('Edit') } - // { id: 'addChild', label: frappe._('Add Child') }, + { id: 'edit', label: frappe._('Edit') }, + { id: 'addChild', label: frappe._('Add Child') }, // { id: 'delete', label: frappe._('Delete') }, ].map(button => { return ` @@ -26,6 +27,10 @@ export default { type: String, default: "Modal Title" }, + primaryAction: { + type: Object, + default: null + }, component: { type: Object }, @@ -39,6 +44,9 @@ export default { methods: { closeModal() { this.$emit('close-modal'); + }, + onPrimaryAction() { + this.primaryAction.handler(this.$refs.modalComponent); } } }; diff --git a/ui/components/Modal/ModalContainer.vue b/ui/components/Modal/ModalContainer.vue index 3628a599..bc362ddd 100644 --- a/ui/components/Modal/ModalContainer.vue +++ b/ui/components/Modal/ModalContainer.vue @@ -3,7 +3,7 @@ @@ -35,13 +35,15 @@ export default { }); }, methods: { - add(component, props, events) { + add({ component, props = {}, events = {}, modalProps = {} }) { this.currentId++; this.modals.push({ id: this.currentId, - component, - props, - events + modalProps: Object.assign({}, modalProps, { + component, + props, + events + }) }); return this.currentId; }, @@ -55,7 +57,7 @@ export default { onModalClose(id) { if (id) { const modal = this.modals.find(modal => modal.id === id); - modal.props.onClose && modal.props.onClose(); + modal.modalProps.events.onClose && modal.modalProps.events.onClose(); } this.removeModal(id); } diff --git a/ui/plugins/formModal.js b/ui/plugins/formModal.js index 7a6691ac..3a757603 100644 --- a/ui/plugins/formModal.js +++ b/ui/plugins/formModal.js @@ -1,3 +1,4 @@ +import frappe from 'frappejs'; import Form from '../components/Form/Form'; export default function installFormModal(Vue) { @@ -7,11 +8,19 @@ export default function installFormModal(Vue) { $formModal() { const open = (doc, options = {}) => { const { defaultValues = null, onClose = null } = options; - this.$modal.show(Form, { - doctype: doc.doctype, - name: doc.name, - defaultValues, - onClose + this.$modal.show({ + component: Form, + props: { + doctype: doc.doctype, + name: doc.name, + defaultValues, + }, + events: { + onClose + }, + modalProps: { + title: frappe._('Form Modal') + } }); } From 9d3726cf5cc5d926afb653e8144c0287f6b7110f Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sun, 15 Jul 2018 17:10:19 +0530 Subject: [PATCH 220/477] File - now takes an array of accepted file types --- ui/components/controls/File.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/components/controls/File.vue b/ui/components/controls/File.vue index e47fc882..8b9f790e 100644 --- a/ui/components/controls/File.vue +++ b/ui/components/controls/File.vue @@ -44,7 +44,8 @@ export default { required: this.docfield.required, disabled: this.disabled, webkitdirectory: this.docfield.directory, - directory: this.docfield.directory + directory: this.docfield.directory, + accept: (this.docfield.filetypes || []).join(',') }; }, getInputListeners() { From d59fd52ffd0baeba89e4ea442acb190b6dc61cc1 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sun, 15 Jul 2018 17:10:42 +0530 Subject: [PATCH 221/477] Configurable sidebar title and click --- ui/components/Sidebar.vue | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/ui/components/Sidebar.vue b/ui/components/Sidebar.vue index 0afb9800..6d2c645f 100644 --- a/ui/components/Sidebar.vue +++ b/ui/components/Sidebar.vue @@ -1,11 +1,12 @@ \ No newline at end of file + diff --git a/ui/components/Form/FormActions.vue b/ui/components/Form/FormActions.vue index 1b346a1a..6786d908 100644 --- a/ui/components/Form/FormActions.vue +++ b/ui/components/Form/FormActions.vue @@ -5,7 +5,7 @@ {{ _('Save') }} {{ _('Submit') }} {{ _('Revert') }} - {{ _('Print') }} + {{ _('Print') }} diff --git a/ui/components/Print/PrintActions.vue b/ui/components/Print/PrintActions.vue index d0ba1143..d7eb56e3 100644 --- a/ui/components/Print/PrintActions.vue +++ b/ui/components/Print/PrintActions.vue @@ -4,8 +4,10 @@
{{ _('View Form') }} - {{ _('Print') }} + {{ _('PDF') }} +
+ diff --git a/ui/components/Print/PrintView.vue b/ui/components/Print/PrintView.vue index ed013c98..9da13507 100644 --- a/ui/components/Print/PrintView.vue +++ b/ui/components/Print/PrintView.vue @@ -3,7 +3,7 @@ diff --git a/ui/components/Print/PrintView.vue b/ui/components/Print/PrintView.vue index 9da13507..67a4c7a9 100644 --- a/ui/components/Print/PrintView.vue +++ b/ui/components/Print/PrintView.vue @@ -13,9 +13,12 @@ From 6ada1a86483e65971849b24f891675681b36f1db Mon Sep 17 00:00:00 2001 From: Aakanksha Jain Date: Sat, 18 Aug 2018 21:28:00 +0530 Subject: [PATCH 244/477] Fix typo: SystemSettings (#65) Was going through docs, there is a typo on line 33. --- docs/models/fields.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/models/fields.md b/docs/models/fields.md index 20abe208..eb50317b 100644 --- a/docs/models/fields.md +++ b/docs/models/fields.md @@ -30,7 +30,7 @@ Code string (like Text but monospaced) ### Date -Date (formatted by [SystemSetings.dateFormat](../utilities/system-settings.md)) +Date (formatted by [SystemSettings.dateFormat](../utilities/system-settings.md)) ### Select @@ -74,4 +74,4 @@ Property with child documents, the type of children is defined by `childtype` pr label: "Items", target: "InvoiceItem" } -``` \ No newline at end of file +``` From 4c0e85aaec10873e30c9d8b4608de1c6fcd1343a Mon Sep 17 00:00:00 2001 From: sahil28297 <37302950+sahil28297@users.noreply.github.com> Date: Thu, 6 Sep 2018 13:48:58 +0530 Subject: [PATCH 245/477] Show items on Link focus (#83) --- client/desk/formmodal.js | 2 +- ui/components/controls/Autocomplete.vue | 14 ++++++++++---- ui/components/controls/Link.vue | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/client/desk/formmodal.js b/client/desk/formmodal.js index 52d8624c..ed2883a7 100644 --- a/client/desk/formmodal.js +++ b/client/desk/formmodal.js @@ -44,4 +44,4 @@ module.exports = class FormModal extends Modal { } } -} \ No newline at end of file +} diff --git a/ui/components/controls/Autocomplete.vue b/ui/components/controls/Autocomplete.vue index 2f4b318b..765474de 100644 --- a/ui/components/controls/Autocomplete.vue +++ b/ui/components/controls/Autocomplete.vue @@ -17,15 +17,23 @@ export default { methods: { getInputListeners() { return { - input: async e => { - this.awesomplete.list = await this.getList(e.target.value); + input: e => { + this.updateList(e.target.value); }, 'awesomplete-select': e => { const value = e.text.value; this.handleChange(value); + }, + focus: async e => { + await this.updateList(); + this.awesomplete.evaluate(); + this.awesomplete.open(); } } }, + async updateList(value) { + this.awesomplete.list = await this.getList(value); + }, getList(text) { return this.docfield.getList(text); }, @@ -46,11 +54,9 @@ export default { return li; } }); - this.bindEvents(); }, bindEvents() { - }, sort() { // return a function that handles sorting of items diff --git a/ui/components/controls/Link.vue b/ui/components/controls/Link.vue index f4bb1183..bcdc74df 100644 --- a/ui/components/controls/Link.vue +++ b/ui/components/controls/Link.vue @@ -18,9 +18,9 @@ export default { async getList(query) { const list = await frappe.db.getAll({ doctype: this.getTarget(), - filters: { + filters: query ? { keywords: ['like', query] - }, + } : null, fields: ['name'], limit: 50 }); From 06c06a81cb32ffb78c6437114736cd3a575acd59 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Thu, 6 Sep 2018 14:04:45 +0530 Subject: [PATCH 246/477] [fix] Use frappe.call to get report data on ReportPage --- ui/pages/Report/index.vue | 42 +++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/ui/pages/Report/index.vue b/ui/pages/Report/index.vue index f278b6fc..35a3eb05 100644 --- a/ui/pages/Report/index.vue +++ b/ui/pages/Report/index.vue @@ -25,17 +25,39 @@ export default { } }, methods: { - getReportData(filters) { - frappe.methods[this.reportConfig.method](filters).then(data => { - if (this.datatable) { - this.datatable.refresh(data || []); - } else { - this.datatable = new DataTable(this.$refs.datatable, { - columns: this.reportColumns, - data: data || [] - }); - } + async getReportData(filters) { + let data = await frappe.call({ + method: this.reportConfig.method, + args: filters }); + + let rows, columns; + if (data.rows) { + rows = data.rows; + } else { + rows = data; + } + + if (data.columns) { + columns = data.columns; + } + + if (!rows) { + rows = []; + } + + if (!columns) { + columns = this.reportColumns; + } + + if (this.datatable) { + this.datatable.refresh(rows, columns); + } else { + this.datatable = new DataTable(this.$refs.datatable, { + columns: columns, + data: rows + }); + } } }, components: { From 0a354fa5c1565871a6e1a098c33ba81f0a2f9c99 Mon Sep 17 00:00:00 2001 From: sahil28297 <37302950+sahil28297@users.noreply.github.com> Date: Fri, 7 Sep 2018 15:38:15 +0530 Subject: [PATCH 247/477] Displaying Links in correct sorted order (#84) --- common/router.js | 2 +- package.json | 2 +- server/index.js | 1 + test.db-journal | Bin 0 -> 4616 bytes ui/components/List/List.vue | 1 + ui/components/controls/Link.vue | 3 +++ ui/pages/Report/index.vue | 5 ++++- 7 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 test.db-journal diff --git a/common/router.js b/common/router.js index e2437d33..ce3ea8e7 100644 --- a/common/router.js +++ b/common/router.js @@ -136,4 +136,4 @@ module.exports = class Router extends Observable { } return route; } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 6635d115..27603255 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "express": "^4.16.2", "feather-icons": "^4.7.3", "flatpickr": "^4.3.2", - "frappe-datatable": "^1.1.2", + "frappe-datatable": "^1.3.1", "friendly-errors-webpack-plugin": "^1.7.0", "html-webpack-plugin": "^3.2.0", "jquery": "^3.3.1", diff --git a/server/index.js b/server/index.js index f1c841ef..7ff914d1 100644 --- a/server/index.js +++ b/server/index.js @@ -43,6 +43,7 @@ module.exports = { app.use(bodyParser.urlencoded({ extended: true })); app.use(express.static(frappe.conf.distPath)); + app.use('/static', express.static(frappe.conf.staticPath)) app.use(morgan('tiny')); diff --git a/test.db-journal b/test.db-journal new file mode 100644 index 0000000000000000000000000000000000000000..aba14275ef9d58434282845f4f991a751b4dbcb4 GIT binary patch literal 4616 zcmeH~PfG$p6u@V6)e6)Og@-Oryd;Pa(mgE`X|pneJjv>gF}Ay7>zI1AK0;@qL!YG2 z5YacOTeJCZX*Ie=^I)0xm!0=}GlzM534Fj~;}s!nvN^ku3KrSWAr`i_)v9Yvm^&*6H+T9z#R zl7J*22}lBxfFvLZNCJ|8Bp?a=Z34qpe<+qn;JYf<>IONa1}ApGX5F?+RrbsIY$Xqs zY);LCD*)ST;1brehz*?dIY8;80;LO8g%p@fr%g)q+`t=a*hJ%$S>DLB${V>RgC4W> z&LkrKU}+{9Tc_pXakgBAqkMI~1=n80Q}Tc{DuebUf1U)%T_qSRCNQFwPWqi2Lp(ie zT9>mgyXI=Uw&OAa!z~<&#pC!MyAT#RF~>=c=34;J@qgp@`!=ZF2WoM0C3w$UNI_e( ziN(Fh#(ut_?P-k|kfD1Em$)0u(&^&4-D*a63Kt-m@daar_|H%s6jP>-?iY7z#kp6l H(PsJ+O2^-> literal 0 HcmV?d00001 diff --git a/ui/components/List/List.vue b/ui/components/List/List.vue index b844c1e2..9e99ba85 100644 --- a/ui/components/List/List.vue +++ b/ui/components/List/List.vue @@ -93,6 +93,7 @@ export default { }, async deleteCheckedItems() { await frappe.db.deleteMany(this.doctype, this.checkList); + this.$router.push(`/list/${this.doctype}`); this.checkList = []; }, toggleCheck(name) { diff --git a/ui/components/controls/Link.vue b/ui/components/controls/Link.vue index bcdc74df..b89ba602 100644 --- a/ui/components/controls/Link.vue +++ b/ui/components/controls/Link.vue @@ -101,6 +101,9 @@ export default { }, sort() { return (a, b) => { + a = a.toLowerCase(); + b = b.toLowerCase(); + if (a.value === '__newItem') { return 1; } diff --git a/ui/pages/Report/index.vue b/ui/pages/Report/index.vue index 35a3eb05..e921a8cf 100644 --- a/ui/pages/Report/index.vue +++ b/ui/pages/Report/index.vue @@ -2,7 +2,7 @@

{{ reportConfig.title }}

- +
@@ -22,6 +22,9 @@ export default { return utils.convertFieldsToDatatableColumns( this.reportConfig.getColumns() ); + }, + filtersExists() { + return (this.reportConfig.filterFields || []).length; } }, methods: { From dc7f7be4475b40f9e4286b47ddb674053f04ac8e Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 11 Sep 2018 23:45:18 +0530 Subject: [PATCH 248/477] Update documentation for new app (#86) --- docs/app.md | 139 ++++++++++++++++++++++------------------------------ 1 file changed, 59 insertions(+), 80 deletions(-) diff --git a/docs/app.md b/docs/app.md index c8b8c027..17689897 100644 --- a/docs/app.md +++ b/docs/app.md @@ -6,125 +6,104 @@ yarn add frappejs ``` -FrappeJS comes with built in rollup config for your files +FrappeJS comes with an Express Server on the backend, VueJS for the front-end and a CLI to run these things with built-in webpack configs. -## Build +## Config -There are 2 files that get built for the Desk single page application +FrappeJS requires a file named `frappe.conf.js` to be present in the root of your directory. Minimum configuration looks like: -- `/dist/js/bundle.js` -- `/dist/css/style.css` +``` +module.exports = { + staticPath: './static', // uploaded files are served from this directory + distPath: './dist', // bundled assets are built and served here + dev: { + // your client side entry files + entry: { + app: './src/main.js' + }, + outputDir: './dist', + assetsPublicPath: '/', + devServerPort: 8000, + env: { + PORT: process.env.PORT || 8000 + } + }, + node: { + paths: { + main: 'server/index.js' // your server entry file + } + }, + electron: { + // wip + } +} -Your `rollup.config.js` should look like: - -```js -module.exports = [ - require('frappejs/config/rollup.config.style.js'), - require('frappejs/config/rollup.config.app.js') -] ``` -## Create a basic app - -### index.html - -The UI for the single page app (desk) will be built inside the `body` element, so you just need to have an empty body element, and link your JS bundle in `index.html` - -Sample index.html +You also need an `index.html` located in the `src` directory. It can look like ```html - - - Document - + + + + My Awesome App - - +
``` -## For development setup -Clone frappejs in the same folder as your app, since you will be developing frappejs on the side. +### Server -### Link frappejs - -```sh -# make frappejs linkable -cd frappejs - -yarn link -yarn link frappejs - -# link frappejs in all -cd ../myapp -yarn link frappejs - -# install libs -yarn -``` - -### server.js - -Create your server file `server.js` +Assuming you have a `server/index.js` file, you can start the frappejs server in just a few lines of code. ```js const server = require('frappejs/server'); server.start({ backend: 'sqlite', - connection_params: {db_path: 'test.db'}, - static: './' + connection_params: { + db_path: 'test.db' + } }); ``` -### index.js +### Client -In your client file you will have to import all your controllers and init them. +In your client file you will have to initialize `frappe` and `models`. `frappejs/client` lib will initialize your server and user interface with the Desk. -Example starting point for a to-do app: +Example starting point for an app: ```js -const client = require('frappejs/client'); -const todo = require('frappejs/models/doctype/todo/todo.js'); -// start server -client.start({ - server: 'localhost:8000', -}).then(() => { - frappe.init_controller('todo', todo); +import frappe from 'frappejs'; +import io from 'socket.io-client'; +import HTTPClient from 'frappejs/backends/http'; +import common from 'frappejs/common'; +import coreModels from 'frappejs/models'; - frappe.desk.add_sidebar_item('Home', '#'); - frappe.desk.add_sidebar_item('New ToDo', '#new/todo'); +frappe.init(); +frappe.registerLibs(common); +frappe.registerModels(coreModels); + +const server = 'localhost:8000'; +frappe.fetch = window.fetch.bind(); +frappe.db = new HTTPClient({ server }); +const socket = io.connect(`http://${server}`); +frappe.db.bindSocketClient(socket); - frappe.router.default = '/list/todo'; - frappe.router.show(window.location.hash); -}); ``` ## Start -To start the app and build webpack simultaneously you can use a `Procfile` +To start the server and build webpack simultaneously you can use the cli command -```yml -server: nodemon server.js -watch: node_modules/.bin/rollup -c --watch -``` - -You can use any procfile handler like `node-foreman` to start the processes. - -``` -yarn global add foreman -``` - -Then - -``` -nf start +```bash +./node_modules/.bin/frappe start ``` From 2950a368c00178fc509a6468ddc219c18310d2be Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Fri, 14 Sep 2018 23:16:30 +0530 Subject: [PATCH 249/477] test(REST): Initialize models before testing --- server/index.js | 2 -- tests/test_restAPI.js | 9 +++++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/server/index.js b/server/index.js index f1c841ef..94ec1605 100644 --- a/server/index.js +++ b/server/index.js @@ -25,8 +25,6 @@ require.extensions['.html'] = function (module, filename) { module.exports = fs.readFileSync(filename, 'utf8'); }; -process.env.NODE_ENV = 'development'; - module.exports = { async start({backend, connectionParams, models, authConfig=null}) { await this.init(); diff --git a/tests/test_restAPI.js b/tests/test_restAPI.js index 6ada5e75..39ef9495 100644 --- a/tests/test_restAPI.js +++ b/tests/test_restAPI.js @@ -4,23 +4,28 @@ const fetch = require('node-fetch'); const { spawn } = require('child_process'); const process = require('process'); const HTTPClient = require('frappejs/backends/http') +const utils = require('frappejs/utils'); +const models = require('frappejs/models'); +const common = require('frappejs/common'); // create a copy of frappe var test_server; -describe('REST', () => { +describe.only('REST', () => { before(async function() { test_server = spawn('node', ['tests/test_server.js'], { stdio: 'inherit' }); await frappe.init(); + await frappe.registerLibs(common); + await frappe.registerModels(models); await frappe.login('Administrator'); frappe.db = await new HTTPClient({server: 'localhost:8000'}); frappe.fetch = fetch; // wait for server to start - return await frappe.sleep(2); + return await utils.sleep(2); }); after(() => { From 231b36a51b38d73c632befd4302ffab84b9a83be Mon Sep 17 00:00:00 2001 From: sahil28297 <37302950+sahil28297@users.noreply.github.com> Date: Thu, 20 Sep 2018 16:23:18 +0530 Subject: [PATCH 250/477] Make datatable non-editable in Report and formula field selectable (#85) * making the datatable fields non editable and making the field selectable that uses formula * Revised the datatable selectable property * Update index.vue --- client/ui/utils.js | 2 +- ui/components/controls/FrappeControl.vue | 4 ---- ui/pages/Report/index.vue | 4 ++++ 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/client/ui/utils.js b/client/ui/utils.js index dd38f281..32de5837 100644 --- a/client/ui/utils.js +++ b/client/ui/utils.js @@ -58,4 +58,4 @@ module.exports = { $child.classList.add(activeClass); } -} \ No newline at end of file +} diff --git a/ui/components/controls/FrappeControl.vue b/ui/components/controls/FrappeControl.vue index 471c1223..1839a4fe 100644 --- a/ui/components/controls/FrappeControl.vue +++ b/ui/components/controls/FrappeControl.vue @@ -67,10 +67,6 @@ export default { disabled = true; } - if (this.docfield.formula && this.docfield.fieldtype !== 'Table') { - disabled = true; - } - return Boolean(disabled); } } diff --git a/ui/pages/Report/index.vue b/ui/pages/Report/index.vue index e921a8cf..e767b6c7 100644 --- a/ui/pages/Report/index.vue +++ b/ui/pages/Report/index.vue @@ -53,6 +53,10 @@ export default { columns = this.reportColumns; } + for(let column of columns) { + column.editable = false; + } + if (this.datatable) { this.datatable.refresh(rows, columns); } else { From e5a4464167fb0f75ea437879d5e2961a6a1b831c Mon Sep 17 00:00:00 2001 From: sahil28297 <37302950+sahil28297@users.noreply.github.com> Date: Thu, 20 Sep 2018 18:09:21 +0530 Subject: [PATCH 251/477] Changes in events, payment modal and date in registers (#92) * changes in events, payment modal and date in registers * Remove window.datatable --- client/desk/reportpage.js | 2 +- models/doctype/SystemSettings/SystemSettings.js | 14 +++++++------- ui/components/List/ListItem.vue | 4 +++- utils/format.js | 4 ++-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/client/desk/reportpage.js b/client/desk/reportpage.js index 021e15d0..b2bf3605 100644 --- a/client/desk/reportpage.js +++ b/client/desk/reportpage.js @@ -102,4 +102,4 @@ module.exports = class ReportPage extends Page { layout: this.layout || 'fluid', }, this.datatableOptions || {})); } -} \ No newline at end of file +} diff --git a/models/doctype/SystemSettings/SystemSettings.js b/models/doctype/SystemSettings/SystemSettings.js index 783a9054..7d3b7741 100644 --- a/models/doctype/SystemSettings/SystemSettings.js +++ b/models/doctype/SystemSettings/SystemSettings.js @@ -11,14 +11,14 @@ module.exports = { label: "Date Format", fieldtype: "Select", options: [ - "dd/mm/yyyy", - "mm/dd/yyyy", - "dd-mm-yyyy", - "mm-dd-yyyy", - "yyyy-mm-dd" + "dd/MM/yyyy", + "MM/dd/yyyy", + "dd-MM-yyyy", + "MM-dd-yyyy", + "yyyy-MM-dd" ], - default: "yyyy-mm-dd", + default: "yyyy-MM-dd", required: 1 } ] -} \ No newline at end of file +} diff --git a/ui/components/List/ListItem.vue b/ui/components/List/ListItem.vue index b874b76f..8eb43d96 100644 --- a/ui/components/List/ListItem.vue +++ b/ui/components/List/ListItem.vue @@ -6,7 +6,9 @@ >
- +
+ +
- diff --git a/ui/plugins/frappeVue.js b/ui/plugins/frappeVue.js index 01861fa1..5abb6ac7 100644 --- a/ui/plugins/frappeVue.js +++ b/ui/plugins/frappeVue.js @@ -35,4 +35,4 @@ export default function installFrappePlugin(Vue) { } } }); -} \ No newline at end of file +} From b96ea40b991a4aaccedb861b3000791c3bc1d20d Mon Sep 17 00:00:00 2001 From: Anto Christopher Date: Fri, 21 Sep 2018 10:58:53 +0530 Subject: [PATCH 253/477] Add error modal (#82) * Add error modal * Initialize frappe.error and frappe.events. Code formatting * Fix indentation --- common/errors.js | 20 +++++++++++++++++++- index.js | 1 + ui/components/Modal/ErrorModal.vue | 20 ++++++++++++++++++++ ui/components/Modal/Modal.vue | 6 +++++- ui/components/Modal/ModalContainer.vue | 18 +++++++++++++++--- 5 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 ui/components/Modal/ErrorModal.vue diff --git a/common/errors.js b/common/errors.js index 7a5628a0..fdb06a0f 100644 --- a/common/errors.js +++ b/common/errors.js @@ -1,3 +1,5 @@ +const frappe = require('frappejs'); + class BaseError extends Error { constructor(statusCode, ...params) { super(...params); @@ -26,10 +28,26 @@ class Forbidden extends BaseError { class ValueError extends ValidationError { } class Conflict extends ValidationError { } +function throwError(message, error='ValidationError') { + const errorClass = { + 'ValidationError': ValidationError, + 'NotFound': NotFound, + 'Forbidden': Forbidden, + 'ValueError': ValueError, + 'Conflict': Conflict + }; + const err = new errorClass[error](message); + frappe.events.trigger('throw', { message, stackTrace: err.stack }); + throw err; +} + +frappe.throw = throwError; + module.exports = { ValidationError, ValueError, Conflict, NotFound, - Forbidden + Forbidden, + throw: throwError } diff --git a/index.js b/index.js index 252a3626..edbaa336 100644 --- a/index.js +++ b/index.js @@ -6,6 +6,7 @@ module.exports = { this.initConfig(); this.initGlobals(); this.docs = new Observable(); + this.events = new Observable(); this._initialized = true; }, diff --git a/ui/components/Modal/ErrorModal.vue b/ui/components/Modal/ErrorModal.vue new file mode 100644 index 00000000..169f4245 --- /dev/null +++ b/ui/components/Modal/ErrorModal.vue @@ -0,0 +1,20 @@ + + + diff --git a/ui/components/Modal/Modal.vue b/ui/components/Modal/Modal.vue index c2d07420..08e64741 100644 --- a/ui/components/Modal/Modal.vue +++ b/ui/components/Modal/Modal.vue @@ -12,7 +12,7 @@ - @@ -30,13 +31,6 @@ export default { this.$emit('change', this.filterValues); } }, - provide() { - return { - dynamicLinkTarget: reference => { - return this.filterValues[reference]; - } - }; - }, methods: { updateValue(fieldname, value) { this.filterValues[fieldname] = value; From b380812c57d0d1b76c48311c3c96320b9484f0a6 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 23 Oct 2018 02:20:35 +0530 Subject: [PATCH 292/477] Dont convert md to html in fieldtype Text --- utils/format.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/format.js b/utils/format.js index de80a707..e944fa25 100644 --- a/utils/format.js +++ b/utils/format.js @@ -1,5 +1,5 @@ const numberFormat = require('./numberFormat'); -const markdown = new (require('showdown').Converter)(); +// const markdown = new (require('showdown').Converter)(); const luxon = require('luxon'); const frappe = require('frappejs'); @@ -13,7 +13,7 @@ module.exports = { value = numberFormat.formatNumber(value); } else if (field.fieldtype === 'Text') { - value = markdown.makeHtml(value || ''); + // value = markdown.makeHtml(value || ''); } else if (field.fieldtype === 'Date') { let dateFormat; From 058011ebe998921bb191d206a4d90d825fd56430 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 23 Oct 2018 02:20:50 +0530 Subject: [PATCH 293/477] Get filters from docfield in Link --- ui/components/controls/Link.vue | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/ui/components/controls/Link.vue b/ui/components/controls/Link.vue index e0de70fd..f37c5b15 100644 --- a/ui/components/controls/Link.vue +++ b/ui/components/controls/Link.vue @@ -10,13 +10,18 @@ export default { extends: Autocomplete, methods: { async getList(query) { + let filters = this.docfield.getFilters ? + this.docfield.getFilters(query) : + null; + + if (query) { + if (!filters) filters = {}; + filters.keywords = ['like', query]; + } + const list = await frappe.db.getAll({ doctype: this.getTarget(), - filters: query - ? { - keywords: ['like', query] - } - : null, + filters, fields: ['name'], limit: 50 }); From 9fdc94bd93cada675248bb106128a07ae3340439 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 23 Oct 2018 02:21:19 +0530 Subject: [PATCH 294/477] Link bootstrap css in puppeteer for generating pdf --- server/pdf.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server/pdf.js b/server/pdf.js index d4a9545e..bdf3aec9 100644 --- a/server/pdf.js +++ b/server/pdf.js @@ -10,6 +10,9 @@ async function makePDF(html, filepath) { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.setContent(html); + await page.addStyleTag({ + url: 'https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css' + }) await page.pdf({ path: filepath, format: 'A4' @@ -17,9 +20,9 @@ async function makePDF(html, filepath) { await browser.close(); } -async function getPDFForElectron(doctype, name, destination) { +async function getPDFForElectron(doctype, name, destination, htmlContent) { const { shell } = require('electron'); - const html = await getHTML(doctype, name); + const html = htmlContent || await getHTML(doctype, name); const filepath = path.join(destination, name + '.pdf'); await makePDF(html, filepath); shell.openItem(filepath); From 610d592310a41a82ffefcdb473467523c4faed35 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 23 Oct 2018 02:21:34 +0530 Subject: [PATCH 295/477] minor --- ui/components/Form/FormActions.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/components/Form/FormActions.vue b/ui/components/Form/FormActions.vue index 1e3d9fe7..4e052997 100644 --- a/ui/components/Form/FormActions.vue +++ b/ui/components/Form/FormActions.vue @@ -34,13 +34,14 @@ export default { }, created() { this.doc.on('change', () => { - this.isDirty = this.doc._dirty; this.updateShowSubmittable(); }); this.updateShowSubmittable(); }, methods: { updateShowSubmittable() { + this.isDirty = this.doc._dirty; + this.showSubmit = this.meta.isSubmittable && !this.isDirty From 2884c157ec06459fe5ed79c9c3323c6b9ac27ab4 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 23 Oct 2018 09:46:50 +0530 Subject: [PATCH 296/477] Emit updateDoc event from FormLayout --- ui/components/Form/FormLayout.vue | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ui/components/Form/FormLayout.vue b/ui/components/Form/FormLayout.vue index 58048f5f..7eed8b6c 100644 --- a/ui/components/Form/FormLayout.vue +++ b/ui/components/Form/FormLayout.vue @@ -66,6 +66,10 @@ export default { }, updateDoc(fieldname, value) { this.doc.set(fieldname, value); + this.$emit('updateDoc', { + fieldname, + value + }); }, showSection(i) { if (this.layoutConfig.paginated) { From 8ee664e81ed66c56f828cde910fe9f3bb9ff7433 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 23 Oct 2018 09:47:30 +0530 Subject: [PATCH 297/477] Report filters 4 column --- ui/pages/Report/ReportFilters.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/pages/Report/ReportFilters.vue b/ui/pages/Report/ReportFilters.vue index dc1cc5a2..5e6dcd15 100644 --- a/ui/pages/Report/ReportFilters.vue +++ b/ui/pages/Report/ReportFilters.vue @@ -1,6 +1,6 @@ diff --git a/ui/pages/Report/ReportLinks.vue b/ui/pages/Report/ReportLinks.vue index 97cc86f2..7c560a3f 100644 --- a/ui/pages/Report/ReportLinks.vue +++ b/ui/pages/Report/ReportLinks.vue @@ -1,7 +1,7 @@ diff --git a/ui/pages/Report/index.vue b/ui/pages/Report/index.vue index 9e3b305f..79ba3940 100644 --- a/ui/pages/Report/index.vue +++ b/ui/pages/Report/index.vue @@ -1,18 +1,20 @@ diff --git a/src/main.js b/src/main.js index 8c0ae136..69423217 100644 --- a/src/main.js +++ b/src/main.js @@ -1,12 +1,12 @@ import { ipcRenderer } from 'electron'; import frappe from 'frappe'; -import FeatherIcon from 'frappe/ui/components/FeatherIcon'; -import outsideClickDirective from 'frappe/ui/plugins/outsideClickDirective'; import Vue from 'vue'; import models from '../models'; import App from './App'; +import FeatherIcon from './components/FeatherIcon'; import { IPC_MESSAGES } from './messages'; import router from './router'; +import { outsideClickDirective } from './ui'; (async () => { frappe.isServer = true; diff --git a/src/ui.js b/src/ui.js new file mode 100644 index 00000000..cfe4dc59 --- /dev/null +++ b/src/ui.js @@ -0,0 +1,30 @@ +let instances = []; + +function onDocumentClick(e, el, fn) { + let target = e.target; + if (el !== target && !el.contains(target)) { + fn(e); + } +} + +export const outsideClickDirective = { + bind(el, binding) { + el.dataset.outsideClickIndex = instances.length; + + const fn = binding.value; + const click = function (e) { + onDocumentClick(e, el, fn); + }; + + document.addEventListener('click', click); + instances.push(click); + }, + unbind(el) { + const index = el.dataset.outsideClickIndex; + const handler = instances[index]; + document.addEventListener('click', handler); + instances.splice(index, 1); + }, +}; + +// https://github.com/frappe/frappejs/commits/master/ui/plugins/outsideClickDirective.js From a1eb69994536ee1ab1dcbc849a403eb038357b91 Mon Sep 17 00:00:00 2001 From: 18alantom <2.alan.tom@gmail.com> Date: Fri, 21 Jan 2022 15:08:53 +0530 Subject: [PATCH 475/477] fix: config, tranpile for the main process --- package.json | 7 +- vue.config.js | 13 +- yarn.lock | 837 ++++---------------------------------------------- 3 files changed, 70 insertions(+), 787 deletions(-) diff --git a/package.json b/package.json index 440e7821..d118e464 100644 --- a/package.json +++ b/package.json @@ -25,11 +25,12 @@ "core-js": "^3.19.0", "csvjson-csv2json": "^5.0.6", "electron-store": "^8.0.1", + "feather-icons": "^4.28.0", "frappe-charts": "1.6.1", - "frappejs": "frappe/frappejs", "knex": "^0.95.12", "lodash": "^4.17.21", "luxon": "^2.0.2", + "pesa": "^1.1.3", "sqlite3": "npm:@vscode/sqlite3@^5.0.7", "vue": "^2.6.14", "vue-router": "^3.5.3" @@ -42,6 +43,7 @@ "@vue/cli-plugin-router": "^4.5.0", "@vue/cli-service": "^4.5.0", "autoprefixer": "^9", + "babel-loader": "^8.2.3", "electron": "^15.3.0", "electron-devtools-installer": "^3.2.0", "electron-notarize": "^1.1.1", @@ -56,7 +58,8 @@ "raw-loader": "^4.0.2", "tailwindcss": "npm:@tailwindcss/postcss7-compat", "vue-cli-plugin-electron-builder": "^2.0.0", - "vue-template-compiler": "^2.6.10" + "vue-template-compiler": "^2.6.10", + "webpack": "^5.66.0" }, "gitHooks": { "pre-commit": "lint-staged" diff --git a/vue.config.js b/vue.config.js index b3898b26..1072cda7 100644 --- a/vue.config.js +++ b/vue.config.js @@ -7,6 +7,16 @@ module.exports = { nodeIntegration: true, chainWebpackRendererProcess: (config) => { config.target('electron-renderer'); + config.resolve.alias.set('frappe', path.resolve(__dirname, './frappe')); + }, + chainWebpackMainProcess: (config) => { + config.target('electron-main'); + config.resolve.alias.set('frappe', path.resolve(__dirname, './frappe')); + config.module + .rule('js') + .test(/\.js$/) + .use('babel') + .loader('babel-loader'); }, }, }, @@ -24,8 +34,7 @@ module.exports = { lintOnSave: process.env.NODE_ENV !== 'production', configureWebpack(config) { Object.assign(config.resolve.alias, { - deepmerge$: 'deepmerge/dist/umd.js', - frappe: path.resolve(__dirname, 'frappe'), + frappe: path.resolve(__dirname, './frappe'), 'frappe-charts$': 'frappe-charts/dist/frappe-charts.esm.js', '~': path.resolve('.'), }); diff --git a/yarn.lock b/yarn.lock index 74e1ef4a..3d09e28b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1194,19 +1194,7 @@ "@types/connect" "*" "@types/node" "*" -"@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== - dependencies: - "@types/node" "*" - -"@types/component-emitter@^1.2.10": - version "1.2.11" - resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" - integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== - -"@types/connect-history-api-fallback@*", "@types/connect-history-api-fallback@^1.3.5": +"@types/connect-history-api-fallback@*": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== @@ -1221,16 +1209,6 @@ dependencies: "@types/node" "*" -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/cors@^2.8.12": - version "2.8.12" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== - "@types/debug@^4.1.6": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" @@ -1301,11 +1279,6 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - "@types/http-proxy@^1.17.5": version "1.17.8" resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55" @@ -1313,7 +1286,7 @@ dependencies: "@types/node" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== @@ -1338,7 +1311,7 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*", "@types/node@>=10.0.0": +"@types/node@*": version "17.0.8" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== @@ -1381,23 +1354,11 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== - "@types/semver@^7.3.5": version "7.3.9" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== -"@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== - dependencies: - "@types/express" "*" - "@types/serve-static@*": version "1.13.10" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" @@ -1406,13 +1367,6 @@ "@types/mime" "^1" "@types/node" "*" -"@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== - dependencies: - "@types/node" "*" - "@types/source-list-map@*": version "0.1.2" resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" @@ -1467,13 +1421,6 @@ anymatch "^3.0.0" source-map "^0.6.0" -"@types/ws@^8.2.2": - version "8.2.2" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21" - integrity sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg== - dependencies: - "@types/node" "*" - "@types/yargs-parser@*": version "20.2.1" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" @@ -2051,11 +1998,6 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -a-sync-waterfall@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz#75b6b6aa72598b497a125e7a2770f14f4c8a1fa7" - integrity sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA== - accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -2138,13 +2080,6 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -2155,7 +2090,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.0: +ajv@^8.0.0: version "8.8.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== @@ -2204,11 +2139,6 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-html-community@0.0.8, ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -2234,11 +2164,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2314,11 +2239,6 @@ app-builder-lib@22.13.1: semver "^7.3.5" temp-file "^3.4.0" -append-field@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" - integrity sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY= - aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -2398,11 +2318,6 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - asar@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/asar/-/asar-3.1.0.tgz#70b0509449fe3daccc63beb4d3c7d2e24d3c6473" @@ -2502,18 +2417,6 @@ atomically@^1.7.0: resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe" integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w== -autoprefixer@^10.4.0: - version "10.4.1" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.1.tgz#1735959d6462420569bc42408016acbc56861c12" - integrity sha512-B3ZEG7wtzXDRCEFsan7HmR2AeNsxdJB0+sEC0Hc5/c2NbhJqPwuZm+tn233GBVw82L+6CtD6IPSfVruwKjfV3A== - dependencies: - browserslist "^4.19.1" - caniuse-lite "^1.0.30001294" - fraction.js "^4.1.2" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - autoprefixer@^9, autoprefixer@^9.8.6: version "9.8.8" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" @@ -2583,21 +2486,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-arraybuffer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz#87bd13525626db4a9838e00a508c2b73efcf348c" - integrity sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA== - base64-js@^1.0.2, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -2611,13 +2504,6 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -basic-auth@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== - dependencies: - safe-buffer "5.1.2" - batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" @@ -2714,7 +2600,7 @@ body-parser@1.19.0: raw-body "2.4.0" type-is "~1.6.17" -body-parser@1.19.1, body-parser@^1.19.0: +body-parser@1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== @@ -2874,7 +2760,7 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4 node-releases "^2.0.1" picocolors "^1.0.0" -browserslist@^4.14.5, browserslist@^4.19.1: +browserslist@^4.14.5: version "4.19.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== @@ -2992,14 +2878,6 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= -busboy@^0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" - integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= - dependencies: - dicer "0.2.5" - readable-stream "1.1.x" - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -3145,14 +3023,6 @@ camel-case@3.0.x: no-case "^2.2.0" upper-case "^1.1.1" -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - camelcase-css@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" @@ -3183,12 +3053,12 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz#26ca36204d15b17601ba6fc35dbdad950a647cc7" integrity sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew== -caniuse-lite@^1.0.30001271, caniuse-lite@^1.0.30001286, caniuse-lite@^1.0.30001294: +caniuse-lite@^1.0.30001271, caniuse-lite@^1.0.30001286: version "1.0.30001296" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001296.tgz#d99f0f3bee66544800b93d261c4be55a35f1cec8" integrity sha512-WfrtPEoNSoeATDlf4y3QvkwiELl9GyPLISV5GejTbbQRtQx4LhsXmc9IQ6XCL2d7UxCyEzToEZNMeqR79OUw8Q== -case-sensitive-paths-webpack-plugin@^2.3.0, case-sensitive-paths-webpack-plugin@^2.4.0: +case-sensitive-paths-webpack-plugin@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== @@ -3335,13 +3205,6 @@ clean-css@4.2.x: dependencies: source-map "~0.6.0" -clean-css@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.2.2.tgz#d3a7c6ee2511011e051719838bdcf8314dc4548d" - integrity sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w== - dependencies: - source-map "~0.6.0" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -3517,7 +3380,7 @@ color@^4.0.1: color-convert "^2.0.1" color-string "^1.9.0" -colorette@2.0.16, colorette@^2.0.10, colorette@^2.0.16: +colorette@2.0.16, colorette@^2.0.16: version "2.0.16" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== @@ -3556,7 +3419,7 @@ commander@^2.18.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^5.0.0, commander@^5.1.0: +commander@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== @@ -3566,7 +3429,7 @@ commander@^7.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^8.0.0, commander@^8.2.0, commander@^8.3.0: +commander@^8.0.0, commander@^8.2.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== @@ -3586,7 +3449,7 @@ compare-version@^0.1.2: resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= -component-emitter@^1.2.1, component-emitter@~1.3.0: +component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== @@ -3616,7 +3479,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.2: +concat-stream@^1.5.0, concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3720,7 +3583,7 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== -cookie@0.4.1, cookie@~0.4.1: +cookie@0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== @@ -3760,18 +3623,6 @@ copy-webpack-plugin@^5.1.1: serialize-javascript "^4.0.0" webpack-log "^2.0.0" -copy-webpack-plugin@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz#2d2c460c4c4695ec0a58afb2801a1205256c4e6b" - integrity sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA== - dependencies: - fast-glob "^3.2.7" - glob-parent "^6.0.1" - globby "^11.0.3" - normalize-path "^3.0.0" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - core-js-compat@^3.18.0, core-js-compat@^3.19.0, core-js-compat@^3.6.5: version "3.19.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.0.tgz#b3b93f93c8721b3ed52b91f12f964cc410967f8b" @@ -3781,9 +3632,9 @@ core-js-compat@^3.18.0, core-js-compat@^3.19.0, core-js-compat@^3.6.5: semver "7.0.0" core-js@^3.1.3: - version "3.20.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.2.tgz#46468d8601eafc8b266bd2dd6bf9dee622779581" - integrity sha512-nuqhq11DcOAbFBV4zCbKeGbKQsUDRqTX0oqx7AttUBuqe3h20ixsE039QHelbL6P4h+9kytVqyEtyZ6gsiwEYw== + version "3.20.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.3.tgz#c710d0a676e684522f3db4ee84e5e18a9d11d69a" + integrity sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag== core-js@^3.19.0, core-js@^3.6.5: version "3.19.0" @@ -3800,14 +3651,6 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@^2.8.5, cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - cosmiconfig@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" @@ -3818,7 +3661,7 @@ cosmiconfig@^5.0.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: +cosmiconfig@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== @@ -3867,13 +3710,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -3957,20 +3793,6 @@ css-loader@^3.5.3: schema-utils "^2.7.0" semver "^6.3.0" -css-loader@^6.5.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.5.1.tgz#0c43d4fbe0d97f699c91e9818cb585759091d1b1" - integrity sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ== - dependencies: - icss-utils "^5.1.0" - postcss "^8.2.15" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.1.0" - semver "^7.3.5" - css-select-base-adapter@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" @@ -4125,11 +3947,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-uri-to-buffer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" - integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== - de-indent@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" @@ -4163,7 +3980,7 @@ debug@^3.1.1, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@~4.3.1, debug@~4.3.2: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== @@ -4229,13 +4046,6 @@ default-gateway@^5.0.5: dependencies: execa "^3.3.0" -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -4300,20 +4110,6 @@ del@^4.1.1: pify "^4.0.1" rimraf "^2.6.3" -del@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" - integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -4324,11 +4120,6 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - des.js@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" @@ -4356,14 +4147,6 @@ detective@^5.2.0: defined "^1.0.0" minimist "^1.1.1" -dicer@0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" - integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= - dependencies: - readable-stream "1.1.x" - streamsearch "0.1.2" - didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -4526,14 +4309,6 @@ domutils@^2.5.2, domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -4765,29 +4540,6 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -engine.io-parser@~5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.2.tgz#69a2ec3ed431da021f0666712d07f106bcffa6ce" - integrity sha512-wuiO7qO/OEkPJSFueuATIXtrxF7/6GTbAO9QLv7nnbjwZ5tYhLm9zxvLwxstRs0dcT0KUlWTjtIOs1T86jt12g== - dependencies: - base64-arraybuffer "~1.0.1" - -engine.io@~6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.1.1.tgz#2e87680feedabe380e506594f5bfd34cde955d87" - integrity sha512-AyMc20q8JUUdvKd46+thc9o7yCZ6iC6MoBCChG5Z1XmFMpp+2+y/oKvwpZTUJB0KCjxScw1dV9c2h5pjiYBLuQ== - dependencies: - "@types/cookie" "^0.4.1" - "@types/cors" "^2.8.12" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~5.0.0" - ws "~8.2.3" - enhanced-resolve@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" @@ -5414,13 +5166,6 @@ feather-icons@^4.28.0: classnames "^2.2.5" core-js "^3.1.3" -fetch-blob@^3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.1.3.tgz#a7dca4855e39d3e3c5a1da62d4ee335c37d26012" - integrity sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ== - dependencies: - web-streams-polyfill "^3.0.3" - figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -5536,11 +5281,6 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flatpickr@^4.6.9: - version "4.6.9" - resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.9.tgz#9a13383e8a6814bda5d232eae3fcdccb97dc1499" - integrity sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw== - flatted@^3.1.0: version "3.2.2" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" @@ -5578,23 +5318,11 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -formdata-polyfill@^4.0.10: - version "4.0.10" - resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" - integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== - dependencies: - fetch-blob "^3.1.2" - forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" - integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== - fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -5607,46 +5335,6 @@ frappe-charts@1.6.1: resolved "https://registry.yarnpkg.com/frappe-charts/-/frappe-charts-1.6.1.tgz#2162cec05f4524b10cf232df8787a3ac20218384" integrity sha512-Fteae/oqv4XdxP4ALoqTmUBBvXt8ECtghziqabp1ZA4yLqY8a3haafNqluwUCxnBOvrV+EdpvhZu0H+VEebX1Q== -frappejs@frappe/frappejs: - version "0.0.10" - resolved "https://codeload.github.com/frappe/frappejs/tar.gz/9ae799cf0ed65528edcc8783336e59a759bbb267" - dependencies: - "@babel/core" "^7.16.0" - autoprefixer "^10.4.0" - babel-loader "^8.2.3" - body-parser "^1.19.0" - case-sensitive-paths-webpack-plugin "^2.4.0" - commander "^8.3.0" - copy-webpack-plugin "^9.0.1" - cors "^2.8.5" - cross-env "^7.0.3" - css-loader "^6.5.0" - electron "^15.3.0" - express "^4.17.1" - feather-icons "^4.28.0" - html-webpack-plugin "^5.5.0" - knex "^0.95.12" - lodash "^4.17.21" - luxon "^2.0.2" - morgan "^1.10.0" - multer "^1.4.3" - node-fetch "^3.0.0" - nunjucks "^3.2.3" - postcss "^8.3.11" - postcss-loader "^6.2.0" - sass-loader "^12.3.0" - socket.io "^4.3.1" - sqlite3 "npm:@vscode/sqlite3@^5.0.7" - tailwindcss "^2.2.19" - vue "^2.6.10" - vue-flatpickr-component "^9.0.5" - vue-loader "^15.9.8" - vue-router "^3.5.3" - vue-template-compiler "^2.6.14" - webpack "^5.61.0" - webpack-dev-server "^4.4.0" - webpack-hot-middleware "^2.25.1" - fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -5713,11 +5401,6 @@ fs-minipass@^2.0.0: dependencies: minipass "^3.0.0" -fs-monkey@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -5921,7 +5604,7 @@ globalthis@^1.0.1: dependencies: define-properties "^1.1.3" -globby@^11.0.1, globby@^11.0.2, globby@^11.0.3: +globby@^11.0.2: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== @@ -5992,7 +5675,7 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== @@ -6132,7 +5815,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -he@1.2.x, he@^1.1.0, he@^1.2.0: +he@1.2.x, he@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -6198,24 +5881,6 @@ html-entities@^1.3.1: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== -html-entities@^2.1.0, html-entities@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" - integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - html-minifier@^3.2.3: version "3.5.21" resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" @@ -6252,17 +5917,6 @@ html-webpack-plugin@^3.2.0: toposort "^1.0.0" util.promisify "1.0.0" -html-webpack-plugin@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" - integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - htmlparser2@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" @@ -6352,17 +6006,6 @@ http-proxy-middleware@^1.0.0: is-plain-obj "^3.0.0" micromatch "^4.0.2" -http-proxy-middleware@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" - integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== - dependencies: - "@types/http-proxy" "^1.17.5" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - http-proxy@^1.17.0, http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" @@ -6425,11 +6068,6 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - ieee754@^1.1.13, ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -6613,11 +6251,6 @@ ipaddr.js@1.9.1, ipaddr.js@^1.9.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -6881,7 +6514,7 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-cwd@^2.0.0, is-path-cwd@^2.2.0: +is-path-cwd@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== @@ -7008,11 +6641,6 @@ is-yarn-global@^0.3.0: resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -7284,11 +6912,6 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klona@^2.0.4, klona@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== - knex@^0.95.12: version "0.95.12" resolved "https://registry.yarnpkg.com/knex/-/knex-0.95.12.tgz#b250f6690dc643c17e59b82e5c8780f0ed82060a" @@ -7551,13 +7174,6 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -7653,13 +7269,6 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -memfs@^3.2.2: - version "3.4.1" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" - integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== - dependencies: - fs-monkey "1.0.3" - memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -7755,7 +7364,7 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "1.50.0" -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: +mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.24: version "2.1.34" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== @@ -7901,17 +7510,6 @@ modern-normalize@^1.1.0: resolved "https://registry.yarnpkg.com/modern-normalize/-/modern-normalize-1.1.0.tgz#da8e80140d9221426bd4f725c6e11283d34f90b7" integrity sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA== -morgan@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" - integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== - dependencies: - basic-auth "~2.0.1" - debug "2.6.9" - depd "~2.0.0" - on-finished "~2.3.0" - on-headers "~1.0.2" - move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -7944,20 +7542,6 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multer@^1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.4.tgz#e2bc6cac0df57a8832b858d7418ccaa8ebaf7d8c" - integrity sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw== - dependencies: - append-field "^1.0.0" - busboy "^0.2.11" - concat-stream "^1.5.2" - mkdirp "^0.5.4" - object-assign "^4.1.1" - on-finished "^2.3.0" - type-is "^1.6.4" - xtend "^4.0.0" - multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -8039,14 +7623,6 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - node-addon-api@^1.6.3: version "1.7.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" @@ -8071,15 +7647,6 @@ node-fetch@^2.6.1: dependencies: whatwg-url "^5.0.0" -node-fetch@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.1.0.tgz#714f4922dc270239487654eaeeab86b8206cb52e" - integrity sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw== - dependencies: - data-uri-to-buffer "^4.0.0" - fetch-blob "^3.1.2" - formdata-polyfill "^4.0.10" - node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" @@ -8221,21 +7788,12 @@ num2fraction@^1.2.2: resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= -nunjucks@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/nunjucks/-/nunjucks-3.2.3.tgz#1b33615247290e94e28263b5d855ece765648a31" - integrity sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ== - dependencies: - a-sync-waterfall "^1.0.0" - asap "^2.0.3" - commander "^5.1.0" - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -8319,7 +7877,7 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@^2.3.0, on-finished@~2.3.0: +on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= @@ -8359,7 +7917,7 @@ open@^6.3.0: dependencies: is-wsl "^1.1.0" -open@^8.0.2, open@^8.0.9: +open@^8.0.2: version "8.4.0" resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== @@ -8498,14 +8056,6 @@ p-retry@^3.0.1: dependencies: retry "^0.12.0" -p-retry@^4.5.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" - integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== - dependencies: - "@types/retry" "^0.12.0" - retry "^0.13.1" - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -8542,14 +8092,6 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -8608,14 +8150,6 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -8704,6 +8238,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +pesa@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pesa/-/pesa-1.1.3.tgz#cddd43b02a1db55cd6fb7b220257d33a268588a4" + integrity sha512-WcgR2zb5h8h+k9JQb+xkLsYkdMuoxqKgqWm5uTcbi3EGNg3r0tfzcvIBpRYLtZ6TtICbyCRZxWi0WXCh5jSw0A== + pg-connection-string@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" @@ -8794,7 +8333,7 @@ pnp-webpack-plugin@^1.6.4: dependencies: ts-pnp "^1.1.6" -portfinder@^1.0.16, portfinder@^1.0.26, portfinder@^1.0.28: +portfinder@^1.0.16, portfinder@^1.0.26: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== @@ -8882,14 +8421,6 @@ postcss-js@^2: camelcase-css "^2.0.1" postcss "^7.0.18" -postcss-js@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-3.0.3.tgz#2f0bd370a2e8599d45439f6970403b5873abda33" - integrity sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw== - dependencies: - camelcase-css "^2.0.1" - postcss "^8.1.6" - postcss-load-config@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" @@ -8916,15 +8447,6 @@ postcss-loader@^3.0.0: postcss-load-config "^2.0.0" schema-utils "^1.0.0" -postcss-loader@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" - postcss-merge-longhand@^4.0.11: version "4.0.11" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" @@ -8994,11 +8516,6 @@ postcss-modules-extract-imports@^2.0.0: dependencies: postcss "^7.0.5" -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - postcss-modules-local-by-default@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" @@ -9009,15 +8526,6 @@ postcss-modules-local-by-default@^3.0.2: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - postcss-modules-scope@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" @@ -9026,13 +8534,6 @@ postcss-modules-scope@^2.2.0: postcss "^7.0.6" postcss-selector-parser "^6.0.0" -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - postcss-modules-values@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" @@ -9041,20 +8542,6 @@ postcss-modules-values@^3.0.0: icss-utils "^4.0.0" postcss "^7.0.6" -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-nested@5.0.6: - version "5.0.6" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" - integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== - dependencies: - postcss-selector-parser "^6.0.6" - postcss-nested@^4: version "4.2.3" resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-4.2.3.tgz#c6f255b0a720549776d220d00c4b70cd244136f6" @@ -9190,7 +8677,7 @@ postcss-selector-parser@^6.0.0: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6: +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.6: version "6.0.8" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz#f023ed7a9ea736cd7ef70342996e8e78645a7914" integrity sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ== @@ -9226,7 +8713,7 @@ postcss-value-parser@^4.0.2: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: +postcss-value-parser@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== @@ -9257,7 +8744,7 @@ postcss@^8: nanoid "^3.1.22" source-map "^0.6.1" -postcss@^8.1.6, postcss@^8.2.15, postcss@^8.3.11, postcss@^8.3.5: +postcss@^8.3.5: version "8.4.5" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== @@ -9306,14 +8793,6 @@ pretty-error@^2.0.2: lodash "^4.17.20" renderkid "^2.0.4" -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - pretty-hrtime@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" @@ -9483,11 +8962,6 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -querystring@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -9595,16 +9069,6 @@ read-pkg@^5.1.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -9728,7 +9192,7 @@ regjsparser@^0.7.0: dependencies: jsesc "~0.5.0" -relateurl@0.2.x, relateurl@^0.2.7: +relateurl@0.2.x: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= @@ -9749,17 +9213,6 @@ renderkid@^2.0.4: lodash "^4.17.21" strip-ansi "^3.0.1" -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - repeat-element@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" @@ -9893,11 +9346,6 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -10009,14 +9457,6 @@ sanitize-filename@^1.6.3: dependencies: truncate-utf8-bytes "^1.0.0" -sass-loader@^12.3.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.4.0.tgz#260b0d51a8a373bb8e88efc11f6ba5583fea0bcf" - integrity sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" - sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -10049,22 +9489,12 @@ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selfsigned@^1.10.11, selfsigned@^1.10.8: +selfsigned@^1.10.8: version "1.10.11" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== @@ -10380,32 +9810,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socket.io-adapter@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz#4d6111e4d42e9f7646e365b4f578269821f13486" - integrity sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ== - -socket.io-parser@~4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" - integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== - dependencies: - "@types/component-emitter" "^1.2.10" - component-emitter "~1.3.0" - debug "~4.3.1" - -socket.io@^4.3.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.4.1.tgz#cd6de29e277a161d176832bb24f64ee045c56ab8" - integrity sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg== - dependencies: - accepts "~1.3.4" - base64id "~2.0.0" - debug "~4.3.2" - engine.io "~6.1.0" - socket.io-adapter "~2.3.3" - socket.io-parser "~4.0.4" - sockjs-client@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.2.tgz#4bc48c2da9ce4769f19dc723396b50f5c12330a3" @@ -10660,11 +10064,6 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -streamsearch@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" - integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= - strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -10724,11 +10123,6 @@ string_decoder@^1.0.0, string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -10773,13 +10167,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -10895,44 +10282,6 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" -tailwindcss@^2.2.19: - version "2.2.19" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-2.2.19.tgz#540e464832cd462bb9649c1484b0a38315c2653c" - integrity sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw== - dependencies: - arg "^5.0.1" - bytes "^3.0.0" - chalk "^4.1.2" - chokidar "^3.5.2" - color "^4.0.1" - cosmiconfig "^7.0.1" - detective "^5.2.0" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.2.7" - fs-extra "^10.0.0" - glob-parent "^6.0.1" - html-tags "^3.1.0" - is-color-stop "^1.1.0" - is-glob "^4.0.1" - lodash "^4.17.21" - lodash.topath "^4.5.2" - modern-normalize "^1.1.0" - node-emoji "^1.11.0" - normalize-path "^3.0.0" - object-hash "^2.2.0" - postcss-js "^3.0.3" - postcss-load-config "^3.1.0" - postcss-nested "5.0.6" - postcss-selector-parser "^6.0.6" - postcss-value-parser "^4.1.0" - pretty-hrtime "^1.0.3" - purgecss "^4.0.3" - quick-lru "^5.1.1" - reduce-css-calc "^2.1.8" - resolve "^1.20.0" - tmp "^0.2.1" - "tailwindcss@npm:@tailwindcss/postcss7-compat": version "2.2.17" resolved "https://registry.yarnpkg.com/@tailwindcss/postcss7-compat/-/postcss7-compat-2.2.17.tgz#dc78f3880a2af84163150ff426a39e42b9ae8922" @@ -10979,7 +10328,7 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== @@ -11059,7 +10408,7 @@ terser@^4.1.2, terser@^4.8.0: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.10.0, terser@^5.7.2: +terser@^5.7.2: version "5.10.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== @@ -11265,7 +10614,7 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.1.0: +tslib@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== @@ -11329,7 +10678,7 @@ type-fest@^1.0.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== -type-is@^1.6.4, type-is@~1.6.17, type-is@~1.6.18: +type-is@~1.6.17, type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== @@ -11631,7 +10980,7 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vary@^1, vary@~1.1.2: +vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= @@ -11694,13 +11043,6 @@ vue-eslint-parser@^8.0.1: lodash "^4.17.21" semver "^7.3.5" -vue-flatpickr-component@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/vue-flatpickr-component/-/vue-flatpickr-component-9.0.5.tgz#350ec73b7f3d7f80b050c170c088234f9c3bd14c" - integrity sha512-fKuz/D4ePQKi+jPo4xjYRgBCLTWrTsCoKbx8nam63x4kTDtSqvFOjNwLvy0QgwC0lC+aFpUWa1dNYTH0hgUcCA== - dependencies: - flatpickr "^4.6.9" - vue-hot-reload-api@^2.3.0: version "2.3.4" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" @@ -11715,7 +11057,7 @@ vue-hot-reload-api@^2.3.0: hash-sum "^2.0.0" loader-utils "^2.0.0" -vue-loader@^15.9.2, vue-loader@^15.9.8: +vue-loader@^15.9.2: version "15.9.8" resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.8.tgz#4b0f602afaf66a996be1e534fb9609dc4ab10e61" integrity sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog== @@ -11739,7 +11081,7 @@ vue-style-loader@^4.1.0, vue-style-loader@^4.1.2: hash-sum "^1.0.2" loader-utils "^1.0.2" -vue-template-compiler@^2.6.10, vue-template-compiler@^2.6.14: +vue-template-compiler@^2.6.10: version "2.6.14" resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz#a2f0e7d985670d42c9c9ee0d044fed7690f4f763" integrity sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g== @@ -11752,7 +11094,7 @@ vue-template-es2015-compiler@^1.9.0: resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== -vue@^2.6.10, vue@^2.6.14: +vue@^2.6.14: version "2.6.14" resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ== @@ -11805,11 +11147,6 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web-streams-polyfill@^3.0.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz#a6b74026b38e4885869fb5c589e90b95ccfc7965" - integrity sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA== - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -11853,17 +11190,6 @@ webpack-dev-middleware@^3.7.2: range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-middleware@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz#8fc02dba6e72e1d373eca361623d84610f27be7c" - integrity sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg== - dependencies: - colorette "^2.0.10" - memfs "^3.2.2" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - webpack-dev-server@^3.11.0: version "3.11.2" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" @@ -11903,51 +11229,6 @@ webpack-dev-server@^3.11.0: ws "^6.2.1" yargs "^13.3.2" -webpack-dev-server@^4.4.0: - version "4.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.7.2.tgz#324b79046491f2cf0b9d9e275381198c8246b380" - integrity sha512-s6yEOSfPpB6g1T2+C5ZOUt5cQOMhjI98IVmmvMNb5cdiqHoxSUfACISHqU/wZy+q4ar/A9jW0pbNj7sa50XRVA== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/serve-index" "^1.9.1" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.2.2" - ansi-html-community "^0.0.8" - bonjour "^3.5.0" - chokidar "^3.5.2" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - default-gateway "^6.0.3" - del "^6.0.0" - express "^4.17.1" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.0" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - portfinder "^1.0.28" - schema-utils "^4.0.0" - selfsigned "^1.10.11" - serve-index "^1.9.1" - sockjs "^0.3.21" - spdy "^4.0.2" - strip-ansi "^7.0.0" - webpack-dev-middleware "^5.3.0" - ws "^8.1.0" - -webpack-hot-middleware@^2.25.1: - version "2.25.1" - resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz#581f59edf0781743f4ca4c200fd32c9266c6cf7c" - integrity sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw== - dependencies: - ansi-html-community "0.0.8" - html-entities "^2.1.0" - querystring "^0.2.0" - strip-ansi "^6.0.0" - webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" @@ -11977,9 +11258,9 @@ webpack-sources@^3.2.0: integrity sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA== webpack-sources@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260" - integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw== + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^4.0.0, webpack@^4.18.0: version "4.46.0" @@ -12040,10 +11321,10 @@ webpack@^5.22.0: watchpack "^2.2.0" webpack-sources "^3.2.0" -webpack@^5.61.0: - version "5.65.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.65.0.tgz#ed2891d9145ba1f0d318e4ea4f89c3fa18e6f9be" - integrity sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw== +webpack@^5.66.0: + version "5.66.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.66.0.tgz#789bf36287f407fc92b3e2d6f978ddff1bfc2dbb" + integrity sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.50" @@ -12059,7 +11340,7 @@ webpack@^5.61.0: eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" json-parse-better-errors "^1.0.2" loader-runner "^4.2.0" mime-types "^2.1.27" @@ -12190,16 +11471,6 @@ ws@^6.0.0, ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^8.1.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.0.tgz#f05e982a0a88c604080e8581576e2a063802bed6" - integrity sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ== - -ws@~8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" - integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== - xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" From 13573c5133081b1537d4e2612e8cf1bf579be81e Mon Sep 17 00:00:00 2001 From: 18alantom <2.alan.tom@gmail.com> Date: Fri, 21 Jan 2022 15:30:02 +0530 Subject: [PATCH 476/477] ci(build): remove frappejs steps --- .github/workflows/build.yml | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 30134a96..d99951b9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,26 +24,9 @@ jobs: - name: Checkout Books uses: actions/checkout@v2 - with: - path: main - - - name: Checkout FrappeJS - uses: actions/checkout@v2 - with: - repository: 'frappe/frappejs' - path: framework - - - name: Setup FrappeJS - run: | - cd $GITHUB_WORKSPACE/framework - yarn - yarn link - name: Setup Books - run: | - cd $GITHUB_WORKSPACE/main - yarn upgrade frappejs - yarn link frappejs + run: yarn - name: Install RPM run: HOMEBREW_NO_AUTO_UPDATE=1 brew install rpm @@ -52,6 +35,4 @@ jobs: env: CSC_IDENTITY_AUTO_DISCOVERY: false APPLE_NOTARIZE: 0 - run: | - cd $GITHUB_WORKSPACE/main - yarn electron:build -mwl --publish never + run: yarn electron:build -mwl --publish never From b7519cb730fbda844ddbe3dca06d20edbc5c4ba7 Mon Sep 17 00:00:00 2001 From: 18alantom <2.alan.tom@gmail.com> Date: Fri, 21 Jan 2022 15:58:43 +0530 Subject: [PATCH 477/477] ci(publish): remove frappejs steps --- .github/workflows/publish.yml | 78 ++++------------------------------- 1 file changed, 9 insertions(+), 69 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b24fb289..f0658f3e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -16,26 +16,9 @@ jobs: - name: Checkout Books uses: actions/checkout@v2 - with: - path: main - - - name: Checkout FrappeJS - uses: actions/checkout@v2 - with: - repository: 'frappe/frappejs' - path: framework - - - name: Setup FrappeJS - run: | - cd $GITHUB_WORKSPACE/framework - yarn - yarn link - name: Setup Books - run: | - cd $GITHUB_WORKSPACE/main - yarn upgrade frappejs - yarn link frappejs + run: yarn - name: Run build env: @@ -47,12 +30,10 @@ jobs: CSC_IDENTITY_AUTO_DISCOVERY: true GH_TOKEN: ${{ secrets.GH_TOKEN }} APPLE_NOTARIZE: 1 - run: | - cd $GITHUB_WORKSPACE/main - yarn electron:build --mac --publish always + run: yarn electron:build --mac --publish always - name: Tar files - run: tar -cvf dist-macOS.tar $GITHUB_WORKSPACE/main/dist_electron + run: tar -cvf dist-macOS.tar dist_electron - name: Upload Artifacts uses: actions/upload-artifact@v2 @@ -70,36 +51,17 @@ jobs: - name: Checkout Books uses: actions/checkout@v2 - with: - path: main - - - name: Checkout FrappeJS - uses: actions/checkout@v2 - with: - repository: 'frappe/frappejs' - path: framework - - - name: Setup FrappeJS - run: | - cd $GITHUB_WORKSPACE/framework - yarn - yarn link - name: Setup Books - run: | - cd $GITHUB_WORKSPACE/main - yarn upgrade frappejs - yarn link frappejs + run: yarn - name: Run build env: GH_TOKEN: ${{ secrets.GH_TOKEN }} - run: | - cd $GITHUB_WORKSPACE/main - yarn electron:build --linux --publish always + run: yarn electron:build --linux --publish always - name: Tar files - run: tar -cvf dist-linux.tar $GITHUB_WORKSPACE/main/dist_electron + run: tar -cvf dist-linux.tar dist_electron - name: Upload Artifacts uses: actions/upload-artifact@v2 @@ -121,41 +83,19 @@ jobs: - name: Checkout Books uses: actions/checkout@v2 - with: - path: main - - - name: Checkout FrappeJS - uses: actions/checkout@v2 - with: - repository: 'frappe/frappejs' - path: framework - - - name: Setup FrappeJS - run: | - cd $GITHUB_WORKSPACE/framework - yarn - yarn link - name: Setup Books - run: | - cd $GITHUB_WORKSPACE/main - yarn upgrade frappejs - yarn link frappejs + run: yarn - name: Run build env: WIN_CSC_LINK: ${{ secrets.WIN_CSC_LINK }} WIN_CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }} GH_TOKEN: ${{ secrets.GH_TOKEN }} - run: | - cd $GITHUB_WORKSPACE/main - yarn electron:build --win --publish always + run: yarn electron:build --win --publish always - name: Tar files - run: | - cd $GITHUB_WORKSPACE/main - tar -cvf dist-windows.tar dist_electron - mv dist-windows.tar ../ + run: tar -cvf dist-windows.tar dist_electron - name: Upload Artifacts uses: actions/upload-artifact@v2