2
0
mirror of https://github.com/frappe/books.git synced 2025-01-27 17:18:27 +00:00

print formats, momentjs, markdown, nunjucks

This commit is contained in:
Rushabh Mehta 2018-02-21 15:08:56 +05:30
parent eac8bb3051
commit f25c4ab81b
20 changed files with 289 additions and 78 deletions

View File

@ -19,7 +19,8 @@
"describe": true, "describe": true,
"before": true, "before": true,
"after": true, "after": true,
"it": true "it": true,
"io": true
}, },
"rules": { "rules": {

View File

@ -8,6 +8,7 @@ module.exports = class FormModal extends Modal {
} }
async showWith(doctype, name) { async showWith(doctype, name) {
if (!name) name = doctype;
this.show(); this.show();
await this.setDoc(doctype, name); await this.setDoc(doctype, name);
} }
@ -17,7 +18,8 @@ module.exports = class FormModal extends Modal {
this.makeForm(); this.makeForm();
} }
await this.form.setDoc(doctype, name); await this.form.setDoc(doctype, name);
this.modal.querySelector('input').focus(); let input = this.modal.querySelector('input') || this.modal.querySelector('select');
input && input.focus();
} }
makeForm() { makeForm() {

View File

@ -13,14 +13,11 @@ module.exports = class FormPage extends Page {
doctype: doctype, doctype: doctype,
parent: this.body, parent: this.body,
container: this, container: this,
actions: ['submit', 'delete', 'duplicate', 'settings'] actions: ['submit', 'delete', 'duplicate', 'settings', 'print']
}); });
this.on('show', async (params) => { this.on('show', async (params) => {
await this.showDoc(params.doctype, params.name); await this.showDoc(params.doctype, params.name);
if (frappe.desk.center && !frappe.desk.center.activePage) {
frappe.desk.showListPage(doctype);
}
}); });
// if name is different after saving, change the route // if name is different after saving, change the route
@ -41,15 +38,9 @@ module.exports = class FormPage extends Page {
async showDoc(doctype, name) { async showDoc(doctype, name) {
try { try {
await this.form.setDoc(doctype, name); await this.form.setDoc(doctype, name);
this.setActiveListRow(name); frappe.desk.setActiveDoc(this.form.doc);
} catch (e) { } catch (e) {
this.renderError(e.status_code, e.message); this.renderError(e.status_code, e.message);
} }
} }
setActiveListRow(name) {
if (frappe.desk.pages.lists[this.doctype]) {
frappe.desk.pages.lists[this.doctype].list.setActiveListRow(name);
}
}
} }

View File

@ -2,11 +2,13 @@ const frappe = require('frappejs');
// const Search = require('./search'); // const Search = require('./search');
const Router = require('frappejs/common/router'); const Router = require('frappejs/common/router');
const Page = require('frappejs/client/view/page'); const Page = require('frappejs/client/view/page');
const FormPage = require('frappejs/client/desk/formpage');
const ListPage = require('frappejs/client/desk/listpage'); const views = {};
// const Navbar = require('./navbar'); views.Form = require('frappejs/client/desk/formpage');
views.List = require('frappejs/client/desk/listpage');
views.Print = require('frappejs/client/desk/printpage');
views.FormModal = require('frappejs/client/desk/formmodal');
const DeskMenu = require('./menu'); const DeskMenu = require('./menu');
const FormModal = require('frappejs/client/desk/formmodal');
module.exports = class Desk { module.exports = class Desk {
constructor(columns=2) { constructor(columns=2) {
@ -20,9 +22,8 @@ module.exports = class Desk {
this.makeColumns(columns); this.makeColumns(columns);
this.pages = { this.pages = {
lists: {}, formModals: {},
forms: {}, List: {}
formModals: {}
}; };
this.routeItems = {}; this.routeItems = {};
@ -69,12 +70,15 @@ module.exports = class Desk {
}) })
frappe.router.add('list/:doctype', async (params) => { frappe.router.add('list/:doctype', async (params) => {
await this.showListPage(params.doctype); await this.showViewPage('List', params.doctype);
}); });
frappe.router.add('edit/:doctype/:name', async (params) => { frappe.router.add('edit/:doctype/:name', async (params) => {
let page = this.getFormPage(params.doctype); await this.showViewPage('Form', params.doctype, params);
await page.show(params); })
frappe.router.add('print/:doctype/:name', async (params) => {
await this.showViewPage('Print', params.doctype, params);
}) })
frappe.router.add('new/:doctype', async (params) => { frappe.router.add('new/:doctype', async (params) => {
@ -94,29 +98,31 @@ module.exports = class Desk {
} }
async showListPage(doctype) { async showViewPage(view, doctype, params) {
if (!this.pages.lists[doctype]) { if (!params) params = doctype;
this.pages.lists[doctype] = new ListPage(doctype); if (!this.pages[view]) this.pages[view] = {};
} if (!this.pages[view][doctype]) this.pages[view][doctype] = new views[view](doctype);
await this.pages.lists[doctype].show(doctype); await this.pages[view][doctype].show(params);
return this.pages.lists[doctype];
}
getFormPage(doctype) {
if (!this.pages.forms[doctype]) {
this.pages.forms[doctype] = new FormPage(doctype);
}
return this.pages.forms[doctype];
} }
async showFormModal(doctype, name) { async showFormModal(doctype, name) {
if (!this.pages.formModals[doctype]) { if (!this.pages.formModals[doctype]) {
this.pages.formModals[doctype] = new FormModal(doctype); this.pages.formModals[doctype] = new views.FormModal(doctype);
} }
await this.pages.formModals[doctype].showWith(doctype, name); await this.pages.formModals[doctype].showWith(doctype, name);
return this.pages.formModals[doctype]; return this.pages.formModals[doctype];
} }
async setActiveDoc(doc) {
this.activeDoc = doc;
if (frappe.desk.center && !frappe.desk.center.activePage) {
await frappe.desk.showViewPage('List', doc.doctype);
}
if (frappe.desk.pages.List[doc.doctype]) {
frappe.desk.pages.List[doc.doctype].list.setActiveListRow(doc.name);
}
}
setActive(item) { setActive(item) {
let className = 'list-group-item-secondary'; let className = 'list-group-item-secondary';
let activeItem = this.sidebarList.querySelector('.' + className); let activeItem = this.sidebarList.querySelector('.' + className);

View File

@ -0,0 +1,43 @@
const Page = require('frappejs/client/view/page');
const frappe = require('frappejs');
const nunjucks = require('nunjucks/browser/nunjucks');
nunjucks.configure({ autoescape: false });
module.exports = class PrintPage extends Page {
constructor(doctype) {
let meta = frappe.getMeta(doctype);
super({title: `View ${meta.name}`});
this.meta = meta;
this.doctype = doctype;
this.on('show', async (params) => {
this.name = params.name;
if (this.meta.print) {
// render
this.renderTemplate();
} else {
this.renderError('No Print Settings');
}
});
this.addButton(frappe._('Edit'), 'primary', () => {
frappe.router.setRoute('edit', this.doctype, this.name)
});
}
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 = `<div class="print-page">${nunjucks.renderString(this.printFormat.template, context)}</div>`;
} catch (e) {
this.renderError('Template Error', e);
throw e;
}
}
}

View File

@ -17,7 +17,9 @@ module.exports = {
this.socket = io.connect('http://localhost:8000'); // eslint-disable-line this.socket = io.connect('http://localhost:8000'); // eslint-disable-line
frappe.db.bindSocketClient(this.socket); frappe.db.bindSocketClient(this.socket);
frappe.flags.cache_docs = true; frappe.flags.cacheDocs = true;
await frappe.getSingle('SystemSettings');
frappe.desk = new Desk(columns); frappe.desk = new Desk(columns);
await frappe.login(); await frappe.login();

View File

@ -9,6 +9,7 @@ $spacer-1: 0.25rem;
$spacer-2: 0.5rem; $spacer-2: 0.5rem;
$spacer-3: 1rem; $spacer-3: 1rem;
$spacer-4: 2rem; $spacer-4: 2rem;
$spacer-5: 3rem;
$page-width: 500px; $page-width: 500px;
@ -192,3 +193,12 @@ mark {
} }
} }
.print-page {
padding: $spacer-5;
line-height: 1.8;
td, th {
padding: $spacer-2;
}
}

View File

@ -1,5 +1,5 @@
const $ = require('jquery'); const $ = require('jquery');
const bootstrap = require('bootstrap'); const bootstrap = require('bootstrap'); // eslint-disable-line
const Observable = require('frappejs/utils/observable'); const Observable = require('frappejs/utils/observable');
module.exports = class Modal extends Observable { module.exports = class Modal extends Observable {

View File

@ -1,14 +1,31 @@
const flatpickr = require('flatpickr'); const flatpickr = require('flatpickr');
const BaseControl = require('./base'); const BaseControl = require('./base');
const frappe = require('frappejs');
class DateControl extends BaseControl { class DateControl extends BaseControl {
make() { make() {
let dateFormat = {
'yyyy-mm-dd': 'Y-m-d',
'dd/mm/yyyy': 'd/m/Y',
'dd-mm-yyyy': 'd-m-Y',
'mm/dd/yyyy': 'm/d/Y',
'mm-dd-yyyy': 'm-d-Y'
}
let altFormat = dateFormat[frappe.SystemSettings.dateFormat];
super.make(); super.make();
this.input.setAttribute('type', 'text'); this.input.setAttribute('type', 'text');
flatpickr.default(this.input, { this.flatpickr = flatpickr.default(this.input, {
dateFormat: "Y-m-d" altInput: true,
altFormat: altFormat,
dateFormat:'Y-m-d'
}); });
} }
setInputValue(value) {
super.setInputValue(value);
this.flatpickr.setDate(value);
}
}; };
module.exports = DateControl; module.exports = DateControl;

View File

@ -89,7 +89,7 @@ class TableControl extends BaseControl {
control.parentControl = this; control.parentControl = this;
control.doc = this.doc[this.fieldname][rowIndex]; control.doc = this.doc[this.fieldname][rowIndex];
control.set_focus(); control.set_focus();
return control.setInputValue(value); return control.setInputValue(control.doc[column.id]);
}, },
setValue: async (value, rowIndex, column) => { setValue: async (value, rowIndex, column) => {
control.handleChange(); control.handleChange();

View File

@ -49,6 +49,13 @@ module.exports = class BaseForm extends Observable {
}) })
} }
if (this.meta.print && this.actions.includes('print')) {
let menu = this.container.getDropdown(frappe._('Menu'));
menu.addItem(frappe._("Print"), async (e) => {
await frappe.router.setRoute('print', this.doctype, this.doc.name);
});
}
if (!this.meta.isSingle && this.actions.includes('delete')) { if (!this.meta.isSingle && this.actions.includes('delete')) {
let menu = this.container.getDropdown(frappe._('Menu')); let menu = this.container.getDropdown(frappe._('Menu'));
menu.addItem(frappe._("Delete"), async (e) => { menu.addItem(frappe._("Delete"), async (e) => {

View File

@ -124,8 +124,12 @@ module.exports = class BaseList {
} }
async showItem(name) { async showItem(name) {
if (this.meta.print) {
await frappe.router.setRoute('print', this.doctype, name);
} else {
await frappe.router.setRoute('edit', this.doctype, name); await frappe.router.setRoute('edit', this.doctype, name);
} }
}
getCheckedRowNames() { getCheckedRowNames() {
return [...this.body.querySelectorAll('.checkbox:checked')].map(check => check.getAttribute('data-name')); return [...this.body.querySelectorAll('.checkbox:checked')].map(check => check.getAttribute('data-name'));
@ -188,14 +192,29 @@ module.exports = class BaseList {
} }
bindKeys() { bindKeys() {
keyboard.bindKey(this.body, 'up', async (e) => await this.move('up')); keyboard.bindKey(this.body, 'up', () => this.move('up'));
keyboard.bindKey(this.body, 'down', async (e) => await this.move('down')) keyboard.bindKey(this.body, 'down', () => this.move('down'))
keyboard.bindKey(this.body, 'right', () => { keyboard.bindKey(this.body, 'right', () => {
if (frappe.desk.body.activePage) { if (frappe.desk.body.activePage) {
frappe.desk.body.activePage.body.querySelector('input').focus(); frappe.desk.body.activePage.body.querySelector('input').focus();
} }
}) });
keyboard.bindKey(this.body, 'n', (e) => {
frappe.router.setRoute('new', this.doctype);
e.preventDefault();
});
keyboard.bindKey(this.body, 'x', async (e) => {
let activeListRow = this.getActiveListRow();
if (activeListRow && activeListRow.docName) {
e.preventDefault();
await frappe.db.delete(this.doctype, activeListRow.docName);
frappe.desk.body.activePage.hide();
}
});
} }
async move(direction) { async move(direction) {
@ -225,15 +244,14 @@ module.exports = class BaseList {
} }
setActiveListRow(name) { setActiveListRow(name) {
let activeListRow = this.body.querySelector('.list-row.active'); let activeListRow = this.getActiveListRow();
if (activeListRow) { if (activeListRow) {
activeListRow.classList.remove('active'); activeListRow.classList.remove('active');
} }
if (!name) { if (!name) {
// get name from active page // get name from active page
name = frappe.desk.body.activePage && frappe.desk.body.activePage.form.doc name = frappe.desk.activeDoc && frappe.desk.activeDoc.name;
&& frappe.desk.body.activePage.form.doc.name;
} }
if (name) { if (name) {
@ -245,5 +263,7 @@ module.exports = class BaseList {
} }
} }
getActiveListRow() {
return this.body.querySelector('.list-row.active');
}
}; };

View File

@ -4,7 +4,7 @@ module.exports = {
file: './dist/js/bundle.js', file: './dist/js/bundle.js',
format: 'iife', format: 'iife',
name: 'desk', name: 'desk',
globals: ['io'] // for socketio client, which is imported directly globals: ['io', 'nunjucks'] // for socketio client, which is imported directly
}, },
plugins: [ plugins: [
require('rollup-plugin-commonjs')(), require('rollup-plugin-commonjs')(),

View File

@ -21,7 +21,7 @@ module.exports = {
this.views = {}; this.views = {};
this.docs = {}; this.docs = {};
this.flags = { this.flags = {
cache_docs: false cacheDocs: false
} }
}, },
@ -40,7 +40,7 @@ module.exports = {
}, },
addToCache(doc) { addToCache(doc) {
if (!this.flags.cache_docs) return; if (!this.flags.cacheDocs) return;
// add to `docs` cache // add to `docs` cache
if (doc.doctype && doc.name) { if (doc.doctype && doc.name) {
@ -48,6 +48,11 @@ module.exports = {
this.docs[doc.doctype] = {}; this.docs[doc.doctype] = {};
} }
this.docs[doc.doctype][doc.name] = doc; this.docs[doc.doctype][doc.name] = doc;
// singles available as first level objects too
if (doc.doctype === doc.name) {
this[doc.name] = doc;
}
} }
}, },

View File

@ -75,10 +75,10 @@ module.exports = class BaseDocument extends Observable {
setDefaults() { setDefaults() {
for (let field of this.meta.fields) { for (let field of this.meta.fields) {
if (this[field.fieldname]===null || this[field.fieldname]===undefined) {
if (field.fieldtype === 'Date') { if (field.fieldtype === 'Date') {
this[field.fieldname] = (new Date()).toISOString().substr(0, 10); this[field.fieldname] = (new Date()).toISOString().substr(0, 10);
} else if (!this[field.fieldname]) { } else if(field.default) {
if(field.default) {
this[field.fieldname] = field.default; this[field.fieldname] = field.default;
} }
} }
@ -141,6 +141,9 @@ module.exports = class BaseDocument extends Observable {
let data = await frappe.db.get(this.doctype, this.name); let data = await frappe.db.get(this.doctype, this.name);
if (data.name) { if (data.name) {
this.syncValues(data); this.syncValues(data);
if (this.meta.isSingle) {
this.setDefaults();
}
} else { } else {
throw new frappe.errors.NotFound(`Not Found: ${this.doctype} ${this.name}`); throw new frappe.errors.NotFound(`Not Found: ${this.doctype} ${this.name}`);
} }

View File

@ -1,5 +1,6 @@
module.exports = { module.exports = {
name: "PrintFormat", name: "PrintFormat",
label: "Print Format",
doctype: "DocType", doctype: "DocType",
isSingle: 0, isSingle: 0,
isChild: 0, isChild: 0,

View File

@ -1,21 +1,24 @@
module.exports = { module.exports = {
"name": "SystemSettings", name: "SystemSettings",
"doctype": "DocType", label: "System Settings",
"isSingle": 1, doctype: "DocType",
"isChild": 0, isSingle: 1,
"keywordFields": [], isChild: 0,
"fields": [ keywordFields: [],
fields: [
{ {
"fieldname": "dateFormat", fieldname: "dateFormat",
"label": "Date Format", label: "Date Format",
"fieldtype": "Select", fieldtype: "Select",
"options": [ options: [
"dd/mm/yyyy", "dd/mm/yyyy",
"mm/dd/yyyy", "mm/dd/yyyy",
"dd-mm-yyyy", "dd-mm-yyyy",
"mm-dd-yyyy" "mm-dd-yyyy",
"yyyy-mm-dd"
], ],
"required": 1 default: "yyyy-mm-dd",
required: 1
} }
] ]
} }

View File

@ -12,23 +12,21 @@
"awesomplete": "^1.1.2", "awesomplete": "^1.1.2",
"body-parser": "^1.18.2", "body-parser": "^1.18.2",
"bootstrap": "^4.0.0", "bootstrap": "^4.0.0",
"bufferutil": "^3.0.3",
"clusterize.js": "^0.18.0", "clusterize.js": "^0.18.0",
"codemirror": "^5.35.0", "codemirror": "^5.35.0",
"commander": "^2.13.0", "commander": "^2.13.0",
"express": "^4.16.2", "express": "^4.16.2",
"flatpickr": "^4.3.2", "flatpickr": "^4.3.2",
"jquery": "^3.3.1", "jquery": "^3.3.1",
"moment": "^2.20.1",
"mysql": "^2.15.0", "mysql": "^2.15.0",
"node-fetch": "^1.7.3", "node-fetch": "^1.7.3",
"nunjucks": "^3.1.0", "nunjucks": "^3.1.0",
"popper.js": "^1.12.9", "popper.js": "^1.12.9",
"rollup-plugin-ignore": "^1.0.3", "showdown": "^1.8.6",
"socket.io": "^2.0.4", "socket.io": "^2.0.4",
"socket.io-client": "^2.0.4",
"sortablejs": "^1.7.0", "sortablejs": "^1.7.0",
"sqlite3": "^3.1.13", "sqlite3": "^3.1.13",
"utf-8-validate": "^4.0.0",
"walk": "^2.3.9" "walk": "^2.3.9"
}, },
"repository": { "repository": {

View File

@ -1,13 +1,23 @@
const number_format = require('./number_format'); const number_format = require('./number_format');
const markdown = new (require('showdown').Converter)();
const moment = require('moment');
const frappe = require('frappejs');
module.exports = { module.exports = {
format(value, field) { format(value, field) {
if (typeof field === 'string') {
field = {fieldtype: field};
}
if (field.fieldtype==='Currency') { if (field.fieldtype==='Currency') {
value = number_format.format_number(value); value = number_format.format_number(value);
} else if (field.fieldtype === 'Text') {
value = markdown.makeHtml(value);
} else if (field.fieldtype === 'Date') { } else if (field.fieldtype === 'Date') {
if (value instanceof Date) { value = moment(value).format(frappe.SystemSettings.dateFormat.toUpperCase());
value = value.toISOString().substr(0, 10);
}
} else { } else {
if (value===null || value===undefined) { if (value===null || value===undefined) {
value = ''; value = '';

View File

@ -533,7 +533,7 @@ camelcase@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
camelcase@^4.0.0: camelcase@^4.0.0, camelcase@^4.1.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
@ -646,6 +646,14 @@ cliui@^3.0.3, cliui@^3.2.0:
strip-ansi "^3.0.1" strip-ansi "^3.0.1"
wrap-ansi "^2.0.0" wrap-ansi "^2.0.0"
cliui@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc"
dependencies:
string-width "^2.1.1"
strip-ansi "^4.0.0"
wrap-ansi "^2.0.0"
clone@^1.0.2: clone@^1.0.2:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f"
@ -1478,6 +1486,12 @@ find-up@^1.0.0:
path-exists "^2.0.0" path-exists "^2.0.0"
pinkie-promise "^2.0.0" pinkie-promise "^2.0.0"
find-up@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
dependencies:
locate-path "^2.0.0"
flat-cache@^1.2.1: flat-cache@^1.2.1:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
@ -2436,6 +2450,13 @@ loader-utils@^0.2.16:
json5 "^0.5.0" json5 "^0.5.0"
object-assign "^4.0.1" object-assign "^4.0.1"
locate-path@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
dependencies:
p-locate "^2.0.0"
path-exists "^3.0.0"
lodash.assign@^4.2.0: lodash.assign@^4.2.0:
version "4.2.0" version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
@ -2527,6 +2548,12 @@ media-typer@0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
mem@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
dependencies:
mimic-fn "^1.0.0"
meow@^3.7.0: meow@^3.7.0:
version "3.7.0" version "3.7.0"
resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
@ -2636,6 +2663,10 @@ mocha@^4.1.0:
mkdirp "0.5.1" mkdirp "0.5.1"
supports-color "4.4.0" supports-color "4.4.0"
moment@^2.20.1:
version "2.20.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd"
ms@2.0.0: ms@2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@ -2912,6 +2943,14 @@ os-locale@^1.4.0:
dependencies: dependencies:
lcid "^1.0.0" lcid "^1.0.0"
os-locale@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
dependencies:
execa "^0.7.0"
lcid "^1.0.0"
mem "^1.1.0"
os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
@ -2927,6 +2966,22 @@ p-finally@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
p-limit@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
dependencies:
p-try "^1.0.0"
p-locate@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
dependencies:
p-limit "^1.1.0"
p-try@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
package-json@^4.0.0: package-json@^4.0.0:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
@ -2983,6 +3038,10 @@ path-exists@^2.0.0:
dependencies: dependencies:
pinkie-promise "^2.0.0" pinkie-promise "^2.0.0"
path-exists@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
path-is-absolute@^1.0.0: path-is-absolute@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
@ -4190,6 +4249,12 @@ shebang-regex@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
showdown@^1.8.6:
version "1.8.6"
resolved "https://registry.yarnpkg.com/showdown/-/showdown-1.8.6.tgz#91ea4ee3b7a5448aaca6820a4e27e690c6ad771c"
dependencies:
yargs "^10.0.3"
signal-exit@^3.0.0, signal-exit@^3.0.2: signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@ -4749,6 +4814,10 @@ which-module@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
which@1, which@^1.2.9: which@1, which@^1.2.9:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
@ -4855,6 +4924,29 @@ yargs-parser@^5.0.0:
dependencies: dependencies:
camelcase "^3.0.0" camelcase "^3.0.0"
yargs-parser@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
dependencies:
camelcase "^4.1.0"
yargs@^10.0.3:
version "10.1.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
dependencies:
cliui "^4.0.0"
decamelize "^1.1.1"
find-up "^2.1.0"
get-caller-file "^1.0.1"
os-locale "^2.0.0"
require-directory "^2.1.1"
require-main-filename "^1.0.1"
set-blocking "^2.0.0"
string-width "^2.0.0"
which-module "^2.0.0"
y18n "^3.2.1"
yargs-parser "^8.1.0"
yargs@^3.32.0: yargs@^3.32.0:
version "3.32.0" version "3.32.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"