diff --git a/debian/changelog b/debian/changelog index 173fad91..6f6ab4db 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -hedera-web (1.408.24) stable; urgency=low +hedera-web (22.44.0) stable; urgency=low * Initial Release. diff --git a/debian/source.lintian-overrides b/debian/source.lintian-overrides new file mode 100644 index 00000000..fac393f9 --- /dev/null +++ b/debian/source.lintian-overrides @@ -0,0 +1 @@ +hedera-web: package-contains-npm-ignore-file \ No newline at end of file diff --git a/forms/account/address-list/address-list.js b/forms/account/address-list/address-list.js index 527cc6da..4078e792 100644 --- a/forms/account/address-list/address-list.js +++ b/forms/account/address-list/address-list.js @@ -1,41 +1,40 @@ -Hedera.AddressList = new Class -({ +Hedera.AddressList = new Class({ Extends: Hedera.Form - ,activate: function () - { - this.$('user-model').setInfo ('c', 'myClient', 'hedera'); - this.$('addresses').setInfo ('a', 'myAddress', 'hedera'); + ,activate: function() { + this.$.userModel.setInfo('c', 'myClient', 'hedera'); + this.$.addresses.setInfo('a', 'myAddress', 'hedera'); } - ,onAddAddressClick: function () - { - this.hash.set ({ + ,onAddAddressClick: function() { + this.hash.setAll({ form: 'account/address', address: 0 }); } - ,onReturnClick: function () - { + ,onReturnClick: function() { window.history.back(); } + + ,onSetDefaultClick: function(event, addressId) { + if (event.defaultPrevented) return; + this.$.defaultAddress.value = addressId; + Htk.Toast.showMessage(_('DefaultAddressModified')); + } - ,onRemoveAddressClick: function (button, form) - { - if (confirm (_('AreYouSureDeleteAddress'))) - { - form.set ('isActive', false); - form.refresh (); + ,onRemoveAddressClick: function(form) { + if (confirm(_('AreYouSureDeleteAddress'))) { + form.set('isActive', false); + form.refresh(); } } - ,onEditAddressClick: function (button, form) - { - this.hash.set ({ + ,onEditAddressClick: function(id) { + this.hash.setAll({ form: 'account/address', - address: form.get ('id') + address: id }); } }); diff --git a/forms/account/address-list/locale/ca.yml b/forms/account/address-list/locale/ca.yml index cf541723..26601428 100644 --- a/forms/account/address-list/locale/ca.yml +++ b/forms/account/address-list/locale/ca.yml @@ -1,7 +1,8 @@ -Addresses: Direccions +Addresses: Adreces Return: Tornar AddAddress: Afegir adreça SetAsDefault: Establir com per defecte RemoveAddress: Esborrar direcció EditAddress: Modificar direcció AreYouSureDeleteAddress: Estàs segur de que vols eliminar la direcció? +DefaultAddressModified: Adreça per defecte modificada diff --git a/forms/account/address-list/locale/en.yml b/forms/account/address-list/locale/en.yml index df5b564f..75bdb2ac 100644 --- a/forms/account/address-list/locale/en.yml +++ b/forms/account/address-list/locale/en.yml @@ -5,3 +5,4 @@ SetAsDefault: Set as default RemoveAddress: Remove address EditAddress: Edit address AreYouSureDeleteAddress: Are you sure you want to delete the address? +DefaultAddressModified: Default address modified diff --git a/forms/account/address-list/locale/es.yml b/forms/account/address-list/locale/es.yml index 66c4576d..50a29c77 100644 --- a/forms/account/address-list/locale/es.yml +++ b/forms/account/address-list/locale/es.yml @@ -5,3 +5,4 @@ SetAsDefault: Establecer como predeterminada RemoveAddress: Borrar dirección EditAddress: Modificar dirección AreYouSureDeleteAddress: ¿Estás seguro de que quieres borrar la dirección? +DefaultAddressModified: Dirección por defecto modificada diff --git a/forms/account/address-list/locale/fr.yml b/forms/account/address-list/locale/fr.yml index 9126d4fb..8530ec22 100644 --- a/forms/account/address-list/locale/fr.yml +++ b/forms/account/address-list/locale/fr.yml @@ -5,3 +5,4 @@ SetAsDefault: Définir par défaut RemoveAddress: Supprimer l'adresse EditAddress: Changement d'adresse AreYouSureDeleteAddress: Souhaitez-vous vraiment supprier l'adresse? +DefaultAddressModified: Adresse par défaut modifiée diff --git a/forms/account/address-list/locale/pt.yml b/forms/account/address-list/locale/pt.yml index 4f5fd79a..7657ab26 100644 --- a/forms/account/address-list/locale/pt.yml +++ b/forms/account/address-list/locale/pt.yml @@ -5,3 +5,4 @@ SetAsDefault: Selecionar como pre-determinado RemoveAddress: Eliminar Morada EditAddress: Modificar Morada AreYouSureDeleteAddress: Tens certeza que queres eliminar esta morada? +DefaultAddressModified: Endereço padrão modificado diff --git a/forms/account/address-list/style.css b/forms/account/address-list/style.css index 8bd9a259..92b791ba 100644 --- a/forms/account/address-list/style.css +++ b/forms/account/address-list/style.css @@ -1,48 +1,4 @@ -.address-list -{ - padding: 1em; -} -.address-list .box -{ - max-width: 30em; -} -.address-list .form -{ - margin: 0 auto; - max-width: 25em; - padding: 2em; -} -.address -{ - padding: 1em; - border-bottom: 1px solid #DDD; -} -.address p -{ - margin: 0.2em 0; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} -.address p.important -{ - font-size: 1.2em; -} -.address .actions -{ - float: right; -} -.address .actions > .htk-button -{ - margin: 0; -} -.address .actions > * -{ - display: inline-block; - vertical-align: middle; -} -.address .actions > input -{ - margin: .6em; +.address-list .htk-list .side { + padding-right: 16px; } diff --git a/forms/account/address-list/ui.xml b/forms/account/address-list/ui.xml index f43d945a..ed1b9519 100644 --- a/forms/account/address-list/ui.xml +++ b/forms/account/address-list/ui.xml @@ -2,20 +2,16 @@ <vn-group> <db-form id="user-form"> <db-model property="model" id="user-model" updatable="true"> - <custom> - SELECT id, defaultAddressFk - FROM myClient c - </custom> + SELECT id, defaultAddressFk + FROM myClient c </db-model> </db-form> <db-model id="addresses" updatable="true"> - <custom> - SELECT a.id, a.nickname, p.name province, a.postalCode, - a.city, a.street, a.isActive - FROM myAddress a - LEFT JOIN vn.province p ON p.id = a.provinceFk - WHERE a.isActive - </custom> + SELECT a.id, a.nickname, p.name province, a.postalCode, + a.city, a.street, a.isActive + FROM myAddress a + LEFT JOIN vn.province p ON p.id = a.provinceFk + WHERE a.isActive </db-model> </vn-group> <div id="title"> @@ -25,46 +21,47 @@ <htk-bar-button icon="add" tip="_AddAddress" - on-click="onAddAddressClick"/> + on-click="this.onAddAddressClick()"/> </div> <div id="form" class="address-list"> - <div class="box"> + <div class="box vn-w-sm"> <htk-radio-group id="default-address" column="defaultAddressFk" form="user-form"/> - <htk-repeater model="addresses" form-id="iter"> + <htk-repeater model="addresses" form-id="address" class="htk-list"> <custom> - <div class="address"> - <div class="actions"> + <div class="item clickable" on-click="this.onSetDefaultClick($event, address.id)"> + <div class="side"> <htk-radio - form="iter" - column="id" radio-group="default-address" - tip="_SetAsDefault"/> - <htk-button - form="iter" - column="id" - tip="_RemoveAddress" - icon="delete" - on-click="onRemoveAddressClick"/> - <htk-button - form="iter" - column="id" - tip="_EditAddress" - icon="edit" - on-click="onEditAddressClick"/> + val="{{address.id}}" + tip="_SetAsDefault" + name="test"/> + </div> + <div class="content"> + <p class="important"> + {{address.nickname}} + </p> + <p> + {{address.street}} + </p> + <p> + {{address.postalCode}}, {{address.city}} + </p> + </div> + <div + class="actions" + on-click="$event.preventDefault()"> + <htk-button + icon="delete" + tip="_RemoveAddress" + on-click="this.onRemoveAddressClick($iter)"/> + <htk-button + icon="edit" + tip="_EditAddress" + on-click="this.onEditAddressClick(address.id)"/> </div> - <p class="important"> - <htk-text form="iter" column="nickname"/> - </p> - <p> - <htk-text form="iter" column="street"/> - </p> - <p> - <htk-text form="iter" column="postalCode"/>, - <htk-text form="iter" column="city"/> - </p> </div> </custom> </htk-repeater> diff --git a/forms/account/address/address.js b/forms/account/address/address.js index db430998..649deaee 100644 --- a/forms/account/address/address.js +++ b/forms/account/address/address.js @@ -3,26 +3,18 @@ Hedera.Address = new Class({ Extends: Hedera.Form, activate: function() { - this.$('model').setInfo('a', 'myAddress', 'hedera', ['id'], 'id'); - this.$('model').setDefault('clientFk', 'a', + this.$.model.setInfo('a', 'myAddress', 'hedera', ['id'], 'id'); + this.$.model.setDefault('clientFk', 'a', new Sql.Function({schema: 'account', name: 'myUser_getId'})); }, - onStatusChange: function(form) { - if (form.ready && this.$('address').value == 0) - form.insertRow(); + onStatusChange: function() { + if (this.$.iter.ready && this.hash.$.address == 0) + this.$.iter.insertRow(); }, onOperationsDone: function() { Htk.Toast.showMessage(_('AddressChangedSuccessfully')); - this.onReturnClick(); - }, - - onAcceptClick: function() { - this.$('iter').performOperations(); - }, - - onReturnClick: function() { - window.history.back(); + window.history.back() } }); diff --git a/forms/account/address/style.css b/forms/account/address/style.css index 1fa559d2..e69de29b 100644 --- a/forms/account/address/style.css +++ b/forms/account/address/style.css @@ -1,16 +0,0 @@ - -.address -{ - padding: 1em; -} -.address .box -{ - max-width: 30em; - padding: 2em; -} -.address .form -{ - margin: 0 auto; - max-width: 25em; -} - diff --git a/forms/account/address/ui.xml b/forms/account/address/ui.xml index a309a580..64edf97f 100644 --- a/forms/account/address/ui.xml +++ b/forms/account/address/ui.xml @@ -1,89 +1,86 @@ <vn> <vn-group> - <vn-param id="address"/> - <vn-hash-param key="address" param="address"/> - <db-form id="iter" on-status-changed="onStatusChange"> + <vn-lot-query id="params"> + <vn-spec name="address" type="Number"/> + </vn-lot-query> + <db-form id="iter" on-status-changed="this.onStatusChange()"> <db-model id="model" property="model" updatable="true" mode="ON_DEMAND" - on-operations-done="onOperationsDone"> + lot="params" + on-operations-done="this.onOperationsDone()"> SELECT a.id, a.street, a.nickname, a.city, a.postalCode, a.provinceFk, p.countryFk FROM myAddress a LEFT JOIN vn.province p ON p.id = a.provinceFk WHERE a.id = #address - <sql-batch property="batch"> - <custom> - <item name="address" param="address"/> - </custom> - </sql-batch> </db-model> </db-form> </vn-group> <div id="title"> - <h1><t>AddEditAddress</t></h1> + <h1><t>Configuration</t></h1> </div> <div id="actions"> - <htk-bar-button - icon="ok" - tip="_Accept" - on-click="onAcceptClick"/> <htk-bar-button icon="close" tip="_Return" - on-click="onReturnClick"/> + on-click="window.history.back()"/> + <htk-bar-button + icon="check" + tip="_Accept" + on-click="iter.performOperations()"/> </div> <div id="form" class="address"> - <div class="box"> - <div class="form"> - <div class="form-group"> - <label><t>Name</t></label> - <htk-entry column="nickname" form="iter"/> - </div> - <div class="form-group"> - <label><t>Address</t></label> - <htk-entry column="street" form="iter"/> - </div> - <div class="form-group"> - <label><t>City</t></label> - <htk-entry column="city" form="iter"/> - </div> - <div class="form-group"> - <label><t>ZipCode</t></label> - <htk-entry column="postalCode" form="iter"/> - </div> - <div class="form-group"> - <label><t>Country</t></label> - <htk-combo> - <db-param - id="country" - property="param" - form="iter" - column="countryFk" - one-way="true"/> - <db-model property="model"> - SELECT id, country FROM vn.country - ORDER BY country - </db-model> - </htk-combo> - </div> - <div class="form-group"> - <label><t>Province</t></label> - <htk-combo column="provinceFk" form="iter"> - <db-model property="model"> - SELECT id, name FROM vn.province - WHERE countryFk = #country - ORDER BY name - <sql-batch property="batch"> - <custom> - <item name="country" param="country"/> - </custom> - </sql-batch> - </db-model> - </htk-combo> - </div> + <div class="form box vn-w-sm vn-pa-lg"> + <h5 class="vn-mb-md"> + <t>AddEditAddress</t> + </h5> + <div class="form-group"> + <htk-entry + placeholder="_Name" + form="iter" column="nickname"/> + </div> + <div class="form-group"> + <htk-entry + placeholder="_Address" + form="iter" column="street"/> + </div> + <div class="form-group"> + <htk-entry + placeholder="_City" + form="iter" column="city"/> + </div> + <div class="form-group"> + <htk-entry + placeholder="_ZipCode" + form="iter" column="postalCode"/> + </div> + <div class="form-group"> + <htk-combo + placeholder="_Country" + form="iter" column="countryFk" + id="country" + one-way="true" + one-time="true"> + <db-model property="model"> + SELECT id, country FROM vn.country + ORDER BY country + </db-model> + </htk-combo> + </div> + <div class="form-group"> + <htk-combo + placeholder="_Province" + column="provinceFk" + form="iter"> + <db-model property="model" lot="country"> + SELECT id, name FROM vn.province + WHERE countryFk = #id + ORDER BY name + </db-model> + </htk-combo> </div> </div> </div> diff --git a/forms/account/conf/conf.js b/forms/account/conf/conf.js index 5a7c37d1..437adb61 100644 --- a/forms/account/conf/conf.js +++ b/forms/account/conf/conf.js @@ -3,45 +3,45 @@ Hedera.Conf = new Class({ Extends: Hedera.Form ,activate: function() { - this.$('user-model').setInfo('c', 'myClient', 'hedera'); - this.$('user-model').setInfo('u', 'myUser', 'account'); + this.$.userModel.setInfo('c', 'myClient', 'hedera'); + this.$.userModel.setInfo('u', 'myUser', 'account'); - if (this.hash.get('verificationToken')) + if (this.hash.$.verificationToken) this.onPassChangeClick(); } - - ,onPassChangeClick: function() { - this.$('old-password').value = ''; - this.$('new-password').value = ''; - this.$('repeat-password').value = ''; - var verificationToken = this.hash.get('verificationToken'); - this.$('old-password').style.display = verificationToken ? 'none' : 'block'; - this.$('change-password').show(); + ,onPassChangeClick: function() { + this.$.oldPassword.value = ''; + this.$.newPassword.value = ''; + this.$.repeatPassword.value = ''; + + var verificationToken = this.hash.$.verificationToken; + this.$.oldPassword.style.display = verificationToken ? 'none' : 'block'; + this.$.changePassword.show(); if (verificationToken) - this.$('new-password').focus(); + this.$.newPassword.focus(); else - this.$('old-password').focus(); + this.$.oldPassword.focus(); } ,onPassModifyClick: function() { try { - var oldPassword = this.$('old-password').value; - var newPassword = this.$('new-password').value; - var repeatedPassword = this.$('repeat-password').value; + var oldPassword = this.$.oldPassword.value; + var newPassword = this.$.newPassword.value; + var repeatedPassword = this.$.repeatPassword.value; if (newPassword == '' && repeatedPassword == '') throw new Error(_('Passwords empty')); if (newPassword !== repeatedPassword) throw new Error(_('Passwords doesn\'t match')); - var verificationToken = this.hash.get('verificationToken'); + var verificationToken = this.hash.$.verificationToken; var params = {newPassword: newPassword}; if (verificationToken) { params.verificationToken = verificationToken; - this.conn.send('core/restore-password', params, + this.conn.send('user/restore-password', params, this._onPassChange.bind(this)); } else { let userId = this.gui.user.id; @@ -58,26 +58,22 @@ Hedera.Conf = new Class({ ,_onPassChange: function(json, error) { if (!error) { - this.$('change-password').hide(); + this.$.changePassword.hide(); this.hash.unset('verificationToken'); Htk.Toast.showMessage(_('Password changed!')); - this.$('user-form').refresh(); + this.$.userForm.refresh(); } else { Htk.Toast.showError(error.message); - if (this.hash.get('verificationToken')) - this.$('new-password').select(); + if (this.hash.$.verificationToken) + this.$.newPassword.select(); else - this.$('old-password').select(); + this.$.oldPassword.select(); } } ,onPassInfoClick: function() { - this.$('password-info').show(); - } - - ,onAddressesClick: function() { - this.hash.set({form: 'account/address-list'}); + this.$.passwordInfo.show(); } }); diff --git a/forms/account/conf/locale/ca.yml b/forms/account/conf/locale/ca.yml index 82241540..7fb9a5fa 100644 --- a/forms/account/conf/locale/ca.yml +++ b/forms/account/conf/locale/ca.yml @@ -1,4 +1,5 @@ Configuration: Configuració +Personal information: Dades personals Username: Nom d'usuari Password: Contrasenya Email: Correu electrònic @@ -9,7 +10,7 @@ Receive invoices by email: Rebre factures per correu electrònic Old password: Contrasenya antiga New password: Nova contrasenya Repeat password: Repetir contrasenya -Info: Info +Requirements: Requisits Modify: Modificar Password requirements: Requisits de contrasenya characters long: caràcters de longitud diff --git a/forms/account/conf/locale/en.yml b/forms/account/conf/locale/en.yml index 20de204a..c88631be 100644 --- a/forms/account/conf/locale/en.yml +++ b/forms/account/conf/locale/en.yml @@ -1,4 +1,5 @@ Configuration: Configuration +Personal information: Personal information Username: Username Password: Password Email: Email @@ -9,7 +10,7 @@ Receive invoices by email: Receive invoices by email Old password: Old password New password: New password Repeat password: Repeat password -Info: Info +Requirements: Requirements Modify: Modify Password requirements: Password requirements characters long: characters long diff --git a/forms/account/conf/locale/es.yml b/forms/account/conf/locale/es.yml index 66992c54..3012d755 100644 --- a/forms/account/conf/locale/es.yml +++ b/forms/account/conf/locale/es.yml @@ -1,4 +1,5 @@ Configuration: Configuración +Personal information: Datos personales Username: Nombre de usuario Password: Contraseña Email: Correo electrónico @@ -9,7 +10,7 @@ Receive invoices by email: Recibir facturas por correo electrónico Old password: Contaseña antigua New password: Nueva contraseña Repeat password: Repetir contraseña -Info: Info +Requirements: Requisitos Modify: Modificar Password requirements: Requisitos de constraseña characters long: carácteres de longitud diff --git a/forms/account/conf/locale/fr.yml b/forms/account/conf/locale/fr.yml index ba47177f..6ae14ca8 100644 --- a/forms/account/conf/locale/fr.yml +++ b/forms/account/conf/locale/fr.yml @@ -1,4 +1,5 @@ Configuration: Configuration +Personal information: Informations personnelles Username: Utilisateur Password: Mot de passe Email: Courriel @@ -9,7 +10,7 @@ Receive invoices by email: Recevoir des factures par e-mail Old password: Ancien mot de passe New password: Nouveau mot de passe Repeat password: Répéter le mot de passe -Info: Info +Requirements: Exigences Modify: Modifier Password requirements: Mot de passe exigences characters long: Longs caractères diff --git a/forms/account/conf/locale/pt.yml b/forms/account/conf/locale/pt.yml index a7430e50..51506ae1 100644 --- a/forms/account/conf/locale/pt.yml +++ b/forms/account/conf/locale/pt.yml @@ -1,4 +1,5 @@ Configuration: Configuração +Personal information: Dados pessoais Username: Nome de usuario Password: Palavra-Passe Email: E-Mail @@ -9,7 +10,7 @@ Receive invoices by email: Receber facturas por e-mail Old password: Palavra-Passe antiga New password: Nova Palavra-Passe Repeat password: Repetir Palavra-Passe -Info: Info +Requirements: Requisitos Modify: Modificar Password requirements: Requisitos de Palavra-Passe characters long: caracteres diff --git a/forms/account/conf/style.css b/forms/account/conf/style.css index 5cb03475..13dbdcf8 100644 --- a/forms/account/conf/style.css +++ b/forms/account/conf/style.css @@ -1,33 +1,4 @@ -.conf -{ - padding: 1em; -} -.conf .box -{ - max-width: 30em; - padding: 2em; -} -.conf .form -{ - margin: 0 auto; - max-width: 25em; -} -.conf .form-group input[type=password] -{ - margin-bottom: 0.5em; -} - -.pass-change -{ - max-width: 15em; -} - -.pass-info -{ - width: 15em; -} -.pass-info ul -{ +.pass-info ul { list-style-type: none; } diff --git a/forms/account/conf/ui.xml b/forms/account/conf/ui.xml index 28c315fb..cc60d89a 100644 --- a/forms/account/conf/ui.xml +++ b/forms/account/conf/ui.xml @@ -1,22 +1,18 @@ <vn> <vn-group> - <db-form id="password-form"> + <db-form v-model="passwordForm"> <db-model property="model"> - <custom> - SELECT length, nAlpha, nUpper, nDigits, nPunct - FROM account.userPassword - </custom> + SELECT length, nAlpha, nUpper, nDigits, nPunct + FROM account.userPassword </db-model> </db-form> <db-form id="user-form"> <db-model property="model" id="user-model" updatable="true"> - <custom> - SELECT u.id, u.name, u.email, u.nickname, - u.lang, c.isToBeMailed, c.id clientFk - FROM account.myUser u - LEFT JOIN myClient c - ON u.id = c.id - </custom> + SELECT u.id, u.name, u.email, u.nickname, + u.lang, c.isToBeMailed, c.id clientFk + FROM account.myUser u + LEFT JOIN myClient c + ON u.id = c.id </db-model> </db-form> </vn-group> @@ -27,49 +23,65 @@ <htk-bar-button icon="place" tip="_Addresses" - on-click="onAddressesClick"/> + on-click="hash.setAll({form: 'account/address-list'})"/> <htk-bar-button - icon="preferences" + icon="lock_reset" tip="_Change password" - on-click="onPassChangeClick"/> + on-click="this.onPassChangeClick()"/> </div> <div id="form" class="conf"> - <div class="box"> - <div class="form"> - <div class="form-group"> - <label for="user-name"><t>Username</t></label> - <htk-text form="user-form" column="name"/> - </div> - <div class="form-group"> - <label for="email"><t>Email</t></label> - <htk-entry form="user-form" column="email"></htk-entry> - </div> - <div class="form-group"> - <label for="nickname"><t>Display name</t></label> - <htk-entry form="user-form" column="nickname"/> - </div> - <div class="form-group"> - <label for="lang"><t>Language</t></label> - <htk-combo form="user-form" column="lang"> - <db-model property="model"> - <custom> - SELECT code, name FROM language WHERE isActive - </custom> - </db-model> - </htk-combo> - </div> - <div class="form-group"> - <label for="mail"><t>Receive invoices by email</t></label> + <div class="form box vn-w-sm vn-pa-lg"> + <h5 class="vn-mb-md"> + <t>Personal information</t> + </h5> + <div class="form-group"> + <htk-entry + placeholder="_Username" + disabled="true" + form="user-form" + column="name"/> + </div> + <div class="form-group"> + <htk-entry + placeholder="_Email" + form="user-form" + column="email"> + </htk-entry> + </div> + <div class="form-group"> + <htk-entry + placeholder="_Display name" + form="user-form" + column="nickname"/> + </div> + <div class="form-group"> + <htk-combo + placeholder="_Language" + form="user-form" + column="lang"> + <db-model property="model"> + <custom> + SELECT code, name FROM language WHERE isActive + </custom> + </db-model> + </htk-combo> + </div> + <div class="form-group"> + <label> <htk-check form="user-form" column="isToBeMailed"/> - </div> + <t>Receive invoices by email</t> + </label> </div> </div> </div> <htk-popup id="change-password" modal="true"> - <div property="child-node" class="htk-dialog pass-change"> - <div> + <div property="child-node" class="htk-dialog vn-w-xs vn-pa-lg"> + <div class="form"> + <h5 class="vn-mb-md"> + <t>Change password</t> + </h5> <input id="old-password" type="password" @@ -84,11 +96,11 @@ placeholder="_Repeat password"/> </div> <div class="button-bar"> - <button class="thin" on-click="onPassModifyClick"> + <button class="thin" on-click="this.onPassModifyClick()"> <t>Modify</t> </button> - <button class="thin" on-click="onPassInfoClick"> - <t>Info</t> + <button class="thin" on-click="this.onPassInfoClick()"> + <t>Requirements</t> </button> <div class="clear"/> </div> @@ -97,30 +109,25 @@ <htk-popup id="password-info" modal="true"> - <div property="child-node" class="htk-dialog pass-info"> - <h3> + <div property="child-node" class="htk-dialog pass-info vn-w-xs vn-pa-lg"> + <h5 class="vn-mb-md"> <t>Password requirements</t> - </h3> + </h5> <ul> <li> - <htk-text form="password-form" column="length"/> - <t>characters long</t> + {{passwordForm.length}} <t>characters long</t> </li> <li> - <htk-text form="password-form" column="nAlpha"/> - <t>alphabetic characters</t> + {{passwordForm.nAlpha}} <t>alphabetic characters</t> </li> <li> - <htk-text form="password-form" column="nUpper"/> - <t>capital letters</t> + {{passwordForm.nUpper}} <t>capital letters</t> </li> <li> - <htk-text form="password-form" column="nDigits"/> - <t>digits</t> + {{passwordForm.nDigits}} <t>digits</t> </li> <li> - <htk-text form="password-form" column="nPunct"/> - <t>symbols</t> + {{passwordForm.nPunct}} <t>symbols</t> </li> </ul> </div> diff --git a/forms/admin/access-log/access-log.js b/forms/admin/access-log/access-log.js index 8efbd52a..aa58beda 100644 --- a/forms/admin/access-log/access-log.js +++ b/forms/admin/access-log/access-log.js @@ -1,6 +1,5 @@ -Hedera.AccessLog = new Class -({ +Hedera.AccessLog = new Class({ Extends: Hedera.Form }); diff --git a/forms/admin/access-log/style.css b/forms/admin/access-log/style.css index 9a6b0cfe..b9edd1c4 100644 --- a/forms/admin/access-log/style.css +++ b/forms/admin/access-log/style.css @@ -1,36 +1,12 @@ -.access-log -{ - padding: 1em; -} -.access-log .box -{ - max-width: 25em; - margin: 0 auto; -} -.access-log .form -{ - padding: 2em; -} -.access-log .form > p -{ + +.access-log .form > p { font-size: 1.2em; margin: .1em 0; } /* List */ -.access-log .list -{ - margin-top: 1em; -} -.access-log .item -{ - display: block; - padding: 1em; - border-bottom: 1px solid #DDD; -} -.access-log .item > p -{ - margin: .1em 0; +.access-log .htk-list { + margin-top: 16px; } diff --git a/forms/admin/access-log/ui.xml b/forms/admin/access-log/ui.xml index 33cd2340..ebe24628 100644 --- a/forms/admin/access-log/ui.xml +++ b/forms/admin/access-log/ui.xml @@ -1,18 +1,12 @@ <vn> <vn-group> - <vn-param id="user"/> - <vn-hash-param key="user" param="user"/> - <db-form id="user-form"> - <db-model property="model"> - <custom> - SELECT Id_Cliente, Cliente, Telefono, movil - FROM vn2008.Clientes WHERE Id_Cliente = #user - </custom> - <sql-batch property="batch"> - <custom> - <item name="user" param="user"/> - </custom> - </sql-batch> + <db-form v-model="user"> + <db-model property="model" lot="hash"> + SELECT u.id, u.name user, u.nickname, u.email, c.phone, r.name role + FROM account.user u + JOIN account.role r ON r.id = u.role + LEFT JOIN vn.client c ON c.id = u.id + WHERE u.id = #user </db-model> </db-form> </vn-group> @@ -20,55 +14,37 @@ <h1><t>AccessLog</t></h1> </div> <div id="form" class="access-log"> - <div class="box"> + <div class="box vn-w-xs vn-pa-lg"> <div class="form"> - <p> - <htk-text form="user-form" column="Id_Cliente"/> - </p> - <p> - <htk-text form="user-form" column="Cliente"/> - </p> - <p> - <htk-text form="user-form" column="Telefono"/> - </p> - <p> - <htk-text form="user-form" column="movil"/> - </p> - </div> - </div> - <div class="list box"> - <div> - <htk-repeater form-id="iter"> - <db-model property="model"> - <custom> - SELECT u.stamp, a.platform, a.browser, a.version, a.javascript, a.cookies - FROM visitUser u - JOIN visitAccess c ON c.id = u.accessFk - JOIN visitAgent a ON a.id = c.agentFk - WHERE u.userFk = #user - ORDER BY u.stamp DESC - LIMIT 8 - </custom> - <sql-batch property="batch"> - <custom> - <item name="user" param="user"/> - </custom> - </sql-batch> - </db-model> - <custom> - <div class="item"> - <p> - <htk-text form="iter" column="stamp" format="_%a, %e %b %Y at %T"/> - </p> - <p> - <htk-text form="iter" column="platform"/> - - <htk-text form="iter" column="browser"/> - <htk-text form="iter" column="version"/> - </p> - </div> - </custom> - </htk-repeater> + <h4>{{user.nickname}}</h4> + <p>#{{user.id}} - {{user.user}}</p> + <p>{{user.role}}</p> + <p>{{user.email}}</p> + <p>{{user.phone}}</p> </div> </div> + <htk-repeater form-id="iter" class="box vn-w-xs htk-list vn-mt-md"> + <db-model property="model" lot="hash"> + SELECT u.stamp, a.platform, a.browser, a.version, a.javascript, a.cookies + FROM visitUser u + JOIN visitAccess c ON c.id = u.accessFk + JOIN visitAgent a ON a.id = c.agentFk + WHERE u.userFk = #user + ORDER BY u.stamp DESC + LIMIT 8 + </db-model> + <custom> + <div class="item"> + <div class="content"> + <p> + {{Vn.Value.format(iter.stamp, _('%a, %e %b %Y at %T'))}} + </p> + <p> + {{iter.platform}} - {{iter.browser}} {{iter.version}} + </p> + </div> + </div> + </custom> + </htk-repeater> </div> </vn> diff --git a/forms/admin/connections/connections.js b/forms/admin/connections/connections.js index ff058c12..ef09f125 100644 --- a/forms/admin/connections/connections.js +++ b/forms/admin/connections/connections.js @@ -4,38 +4,28 @@ Hedera.Connections = new Class({ ,_timeoutId: null - ,onModelStatusChange: function(model) { - if (!model.ready) + ,onModelStatusChange: function() { + if (!this.$.sessions.ready) return; if (this._timeoutId) clearTimeout(this._timeoutId); - this._timeoutId = setTimeout(this.onRefreshClick.bind(this), 60000); + this._timeoutId = setTimeout( + () => this.$.sessions.refresh(), 60000); } ,deactivate: function() { clearTimeout(this._timeoutId); } - - ,onRefreshClick: function() { - this.$('sessions').refresh(); - } - ,onAccessLogClick: function(button, form) { - this.hash.set({ - form: 'admin/access-log' - ,user: form.get('userId') - }); - } - - ,onChangeUserClick: function(button, form) { - this.gui.supplantUser(form.get('user'), + ,onChangeUserClick: function(userName) { + this.gui.supplantUser(userName, this._onUserSupplant.bind(this)); } ,_onUserSupplant: function() { - this.hash.set({form: 'ecomerce/orders'}); + this.hash.setAll({form: 'ecomerce/orders'}); } ,sessionsFunc: function() { diff --git a/forms/admin/connections/style.css b/forms/admin/connections/style.css index b27e9449..b7ac80ac 100644 --- a/forms/admin/connections/style.css +++ b/forms/admin/connections/style.css @@ -1,44 +1,6 @@ -.connections -{ - padding: 1em; -} -.connections .box -{ - max-width: 25em; - margin: 0 auto; -} -.action-bar .connections-sum -{ + +.action-bar .connections-sum { padding: .4em; - margin-top: .9em; - margin-right: .5em; background-color: #1e88e5; - border-radius: 0.1em; - box-shadow: 0 0 0.4em #666; + border-radius: .1em; } - -/* List */ - -.connections .item -{ - display: block; - padding: 1em; - border-bottom: 1px solid #DDD; -} -.connections .item > button -{ - float: right; - margin: 0; -} -.connections .item > p -{ - margin: .1em 0; -} -.connections .item > p.important -{ - font-size: 1.2em; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - diff --git a/forms/admin/connections/ui.xml b/forms/admin/connections/ui.xml index 29a9ceb3..487938fa 100644 --- a/forms/admin/connections/ui.xml +++ b/forms/admin/connections/ui.xml @@ -6,7 +6,7 @@ <htk-bar-button icon="refresh" tip="_Refresh" - on-click="onRefreshClick"/> + on-click="sessions.refresh()"/> <div class="connections-sum"> <htk-text> <db-calc-sum @@ -18,50 +18,46 @@ </div> </div> <div id="form" class="connections"> - <div class="box"> - <htk-repeater form-id="iter"> - <db-model property="model" id="sessions" on-status-changed="onModelStatusChange"> - <custom> - SELECT vu.userFk userId, vu.stamp, u.nickname, s.lastUpdate, - a.platform, a.browser, a.version, u.name user - FROM userSession s - JOIN visitUser vu ON vu.id = s.userVisitFk - JOIN visitAccess ac ON ac.id = vu.accessFk - JOIN visitAgent a ON a.id = ac.agentFk - JOIN visit v ON v.id = a.visitFk - JOIN account.user u ON u.id = vu.userFk - ORDER BY lastUpdate DESC - </custom> - </db-model> - <custom> - <div class="item"> - <htk-button - form="iter" - column="id" - tip="_Supplant user" - icon="incognito" - on-click="onChangeUserClick"/> - <htk-button - form="iter" - column="id" - tip="_Access log" - icon="gnome" - on-click="onAccessLogClick"/> + <htk-repeater form-id="iter" class="box htk-list vn-w-xs"> + <db-model + property="model" + id="sessions" + on-status-changed="this.onModelStatusChange()"> + SELECT vu.userFk userId, vu.stamp, u.nickname, s.lastUpdate, + a.platform, a.browser, a.version, u.name user + FROM userSession s + JOIN visitUser vu ON vu.id = s.userVisitFk + JOIN visitAccess ac ON ac.id = vu.accessFk + JOIN visitAgent a ON a.id = ac.agentFk + JOIN visit v ON v.id = a.visitFk + JOIN account.user u ON u.id = vu.userFk + ORDER BY lastUpdate DESC + </db-model> + <custom> + <a class="item" + href="{{`#!form=admin/access-log&user=${iter.userId}`}}" + title="_Access log"> + <div class="content"> <p class="important"> - <htk-text form="iter" column="nickname"/> + {{iter.nickname}} </p> <p> - <htk-text form="iter" column="stamp" format="%a, %T"/> - - <htk-text form="iter" column="lastUpdate" format="%T"/> + {{Vn.Value.format(iter.stamp, '%a, %T')}} - + {{Vn.Value.format(iter.lastUpdate, '%T')}} </p> <p> - <htk-text form="iter" column="platform"/> - - <htk-text form="iter" column="browser"/> - <htk-text form="iter" column="version"/> + {{iter.platform}} - {{iter.browser}} {{iter.version}} </p> </div> - </custom> - </htk-repeater> - </div> + <div class="actions" + on-click="$event.preventDefault()"> + <htk-button + tip="_Supplant user" + icon="supervisor_account" + on-click="this.onChangeUserClick(iter.user)"/> + </div> + </a> + </custom> + </htk-repeater> </div> </vn> diff --git a/forms/admin/items/items.js b/forms/admin/items/items.js index 63a56c8c..9c835278 100644 --- a/forms/admin/items/items.js +++ b/forms/admin/items/items.js @@ -3,6 +3,6 @@ Hedera.Items = new Class({ Extends: Hedera.Form, activate: function() { - this.$('items').setInfo('i', 'item', 'vn', ['id']); + this.$.items.setInfo('i', 'item', 'vn', ['id']); } }); diff --git a/forms/admin/items/style.css b/forms/admin/items/style.css index 0c32d69c..e9914e1a 100644 --- a/forms/admin/items/style.css +++ b/forms/admin/items/style.css @@ -1,41 +1,6 @@ -.items -{ - padding: 1em; -} -.items .box -{ - max-width: 25em; - margin: 0 auto; -} -/* Row */ - -.items .row -{ - padding: 1em; - border-bottom: 1px solid #DDD; +.items .item .photo { + border-radius: 10px; + height: 80px; + width: 80px; } -.items .row > .photo -{ - margin-right: 1em; - float: left; - border-radius: 3%; - height: 5.5em; - width: 5.5em; -} -.items .row > p -{ - margin: .1em 0; - margin-left: 5em; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -/* Topbar */ - -.action-bar .htk-search-entry -{ - margin: .8em .6em; -} - diff --git a/forms/admin/items/ui.xml b/forms/admin/items/ui.xml index 41fbf780..9dd869ba 100644 --- a/forms/admin/items/ui.xml +++ b/forms/admin/items/ui.xml @@ -1,38 +1,32 @@ <vn> -<vn-group> - <vn-param id="filter"/> - <vn-hash-param key="filter" param="filter"/> -</vn-group> <div id="title"> <h1><t>Items</t></h1> </div> <div id="actions"> - <htk-search-entry param="filter"/> + <htk-search-entry form="hash" column="search"/> </div> <div id="form" class="items"> - <div class="rows box"> - <htk-repeater form-id="iter" empty-message="_Enter a search term"> - <db-model property="model" id="items"> - SELECT i.id, i.longName, i.size, i.category, - i.value5, i.value6, i.value7, - i.image, im.updated - FROM vn.item i - LEFT JOIN image im - ON im.collectionFk = 'catalog' - AND im.name = i.image - WHERE i.longName LIKE CONCAT('%', #filter, '%') - OR i.id = #filter - ORDER BY i.longName LIMIT 50 - <sql-batch property="batch"> - <custom> - <item name="filter" param="filter"/> - </custom> - </sql-batch> - </db-model> - <custom> - <div class="row"> + <htk-repeater + class="htk-list rows box vn-w-xs" + form-id="iter" + empty-message="_Enter a search term"> + <db-model property="model" id="items" lot="hash"> + SELECT i.id, i.longName, i.size, i.category, + i.value5, i.value6, i.value7, + i.image, im.updated + FROM vn.item i + LEFT JOIN image im + ON im.collectionFk = 'catalog' + AND im.name = i.image + WHERE i.longName LIKE CONCAT('%', #search, '%') + OR i.id = #search + ORDER BY i.longName LIMIT 50 + </db-model> + <custom> + <div class="item"> + <div class="side vn-mr-md"> <htk-image - form="iter" + form="$iter" column="image" stamp-column="updated" class="photo" @@ -41,24 +35,23 @@ full-dir="1600x900" editable="true" conn="conn"/> - <p class="concept"> - <htk-text form="iter" column="longName"/> + </div> + <div class="content"> + <p class="important"> + {{iter.longName}} </p> <p class="tags"> - <htk-text form="iter" column="value5"/> - <htk-text form="iter" column="value6"/> - <htk-text form="iter" column="value7"/> + {{iter.value5}} {{iter.value6}} {{iter.value7}} </p> <p> - #<htk-text form="iter" column="id"/> + {{iter.id}} </p> <p> - <htk-text form="iter" column="image"/> + {{iter.image}} </p> - <div class="clear"/> </div> - </custom> - </htk-repeater> - </div> + </div> + </custom> + </htk-repeater> </div> </vn> diff --git a/forms/admin/links/links.js b/forms/admin/links/links.js index f19f14a1..4f761884 100644 --- a/forms/admin/links/links.js +++ b/forms/admin/links/links.js @@ -1,11 +1,5 @@ -Hedera.Links = new Class -({ +Hedera.Links = new Class({ Extends: Hedera.Form - - ,repeaterFunc: function (res, form) - { - res.$('link').href = form.get ('link'); - } }); diff --git a/forms/admin/links/style.css b/forms/admin/links/style.css index b74a6af2..4ec8fa2c 100644 --- a/forms/admin/links/style.css +++ b/forms/admin/links/style.css @@ -1,38 +1,50 @@ -.cpanel -{ - padding: 1em; +.cpanel .items > div { + max-width: 900px; + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 16px; + margin: 0 auto; } -.cpanel .box -{ - max-width: 30em; +.cpanel .item { + display: flex; + flex-direction: column; + align-items: center; + margin: 0; + width: 140px; + padding: 15px; + text-align: center; + transition: background-color 250ms ease-out; } - -/* Items */ - -.cpanel .item -{ - display: block; - padding: 1em; - border-bottom: 1px solid #DDD; -} -.cpanel .item:hover -{ +.cpanel .item:hover { background-color: rgba(1, 1, 1, 0.05); } -.cpanel .item > .htk-image -{ +.cpanel .item > .htk-image { + display: flex; + justify-content: center; + align-items: center; margin: 0; - margin-right: 1em; float: left; - max-height: 2.8em; - max-width: 2.8em; + height: 80px; } -.cpanel .item > p -{ +.cpanel .item > .htk-image > img { + max-height: 60px; + max-width: 60px; + padding: 0; +} +.cpanel .item > h6 { + flex: none; margin: .1em 0; + font-size: .9rem; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } -.cpanel .item > p.important -{ - font-size: 1.2em; +.cpanel .item > .text-secondary { + flex: none; + margin: 0; + font-size: .8rem; + height: 40px; + overflow: hidden; } diff --git a/forms/admin/links/ui.xml b/forms/admin/links/ui.xml index 79540fd9..c5e166c9 100644 --- a/forms/admin/links/ui.xml +++ b/forms/admin/links/ui.xml @@ -3,30 +3,29 @@ <h1><t>ControlPanel</t></h1> </div> <div id="form" class="cpanel"> - <div class="box"> - <htk-repeater form-id="iter" renderer="repeaterFunc"> - <db-model property="model"> - <custom> - SELECT image, name, description, link FROM link - ORDER BY name - </custom> - </db-model> + <htk-repeater form-id="iter" class="items"> + <db-model property="model"> <custom> - <a id="link" class="item" target="_blank"> - <htk-image - form="iter" - column="image" - directory="link" - subdir="full"/> - <p class="important"> - <htk-text form="iter" column="name"/> - </p> - <p> - <htk-text form="iter" column="description"/> - </p> - </a> + SELECT image, name, description, link FROM link + ORDER BY name </custom> - </htk-repeater> - </div> + </db-model> + <custom> + <a class="item box" + href="{{iter.link}}" + target="_blank"> + <htk-image + value="{{iter.image}}" + directory="link" + subdir="full"/> + <h6> + {{iter.name}} + </h6> + <p class="text-secondary"> + {{iter.description}} + </p> + </a> + </custom> + </htk-repeater> </div> </vn> diff --git a/forms/admin/photos/photos.js b/forms/admin/photos/photos.js index 7130d0a0..f51c8e1a 100644 --- a/forms/admin/photos/photos.js +++ b/forms/admin/photos/photos.js @@ -6,8 +6,7 @@ var Status = { ,UPLOADED : 3 }; -Hedera.Photos = new Class -({ +Hedera.Photos = new Class({ Extends: Hedera.Form ,filesData: [] ,uploadCount: 0 @@ -16,7 +15,7 @@ Hedera.Photos = new Class ,isUploading: false ,activate: function() { - this.$('schema').value = 'catalog'; + this.$.schema.value = 'catalog'; } ,addFiles: function(files) { @@ -54,23 +53,24 @@ Hedera.Photos = new Class statusNode.className = 'status'; li.appendChild(statusNode); - var button = new Htk.Button({ - tip: 'Remove', - icon: 'delete' - }); - button.on('click', this.onFileRemove, this); - li.appendChild(button.node); - var fileData = { li: li, file: file, name: name, statusNode: statusNode }; - this.filesData.push(fileData); - button.value = fileData; - this.$('file-list').appendChild(li); + var button = new Htk.Button({ + tip: 'Remove', + icon: 'delete' + }); + button.node.addEventListener('click', + () => this.onFileRemove(fileData)); + li.appendChild(button.node); + + this.filesData.push(fileData); + + this.$.fileList.appendChild(li); this.setImageStatus(fileData, Status.NONE, 'add', _('Pending upload')); } @@ -83,7 +83,7 @@ Hedera.Photos = new Class if (fileData.status === Status.NONE) { this.setImageStatus( - fileData, Status.WAITING, 'cloud-upload', _('Waiting for upload')); + fileData, Status.WAITING, 'cloud_upload', _('Waiting for upload')); fileData.name.disabled = true; this.uploadQueue.push(fileData); count++; @@ -107,10 +107,10 @@ Hedera.Photos = new Class fileData, Status.UPLOADING, 'upload', _('Uploading file')); var formData = new FormData(); - formData.append('updateMatching', this.$('update-matching').value); + formData.append('updateMatching', this.$.updateMatching.value); formData.append('image', fileData.file); formData.append('name', fileData.name.value); - formData.append('schema', this.$('schema').value); + formData.append('schema', this.$.schema.value); formData.append('srv', 'json:image/upload'); this.conn.sendFormData(formData, this.onFileUpload.bind(this, fileData)); @@ -121,7 +121,7 @@ Hedera.Photos = new Class if (data) { this.setImageStatus( - fileData, Status.UPLOADED, 'ok', _('Image uploaded')); + fileData, Status.UPLOADED, 'cloud_done', _('Image uploaded')); } else { this.setImageStatus( fileData, Status.NONE, 'error', error.message); @@ -146,14 +146,13 @@ Hedera.Photos = new Class var statusNode = fileData.statusNode; Vn.Node.removeChilds(statusNode); - var iconNode = new Htk.Icon({icon: icon}); + var iconNode = new Htk.Icon({name: icon}); statusNode.appendChild(iconNode.node); statusNode.title = title ? title : ''; } - ,onFileRemove: function(button) { - var fileData = button.value; - this.$('file-list').removeChild(fileData.li); + ,onFileRemove: function(fileData) { + this.$.fileList.removeChild(fileData.li); for (var i = 0; i < this.filesData.length; i++) if (this.filesData[i] === fileData) { @@ -164,23 +163,23 @@ Hedera.Photos = new Class ,onClearClick: function() { this.filesData = []; - Vn.Node.removeChilds(this.$('file-list')); + Vn.Node.removeChilds(this.$.fileList); } ,onDropzoneClick: function() { - this.$('file').click(); + this.$.file.click(); } ,onFileChange: function() { - this.addFiles(this.$('file').files); + this.addFiles(this.$.file.files); } ,onDragEnter: function() { - this.$('dropzone').classList.add('dragover'); + this.$.dropzone.classList.add('dragover'); } ,onDragLeave: function() { - this.$('dropzone').classList.remove('dragover'); + this.$.dropzone.classList.remove('dragover'); } ,onDragOver: function(event) { @@ -188,7 +187,7 @@ Hedera.Photos = new Class } ,onDragEnd: function(event) { - this.$('dropzone').classList.remove('dragover'); + this.$.dropzone.classList.remove('dragover'); event.dataTransfer.clearData(); } diff --git a/forms/admin/photos/style.css b/forms/admin/photos/style.css index 47d90ce5..ca193e89 100644 --- a/forms/admin/photos/style.css +++ b/forms/admin/photos/style.css @@ -1,12 +1,4 @@ -.photos { - padding: 1em; -} -.photos .box { - max-width: 25em; - padding: 2em; -} - /* Dropzone */ .photos .dropzone { @@ -56,11 +48,11 @@ } .photos .file-list .status { cursor: pointer; - width: 1em; + width: 1.2em; padding-left: .5em; padding-right: .5em; } -.photos .file-list .status > img { +.photos .file-list .status > .htk-icon { display: block; } .photos .file-list .htk-button { diff --git a/forms/admin/photos/ui.xml b/forms/admin/photos/ui.xml index 4b5910fd..4a4bb83c 100644 --- a/forms/admin/photos/ui.xml +++ b/forms/admin/photos/ui.xml @@ -3,7 +3,7 @@ <h1><t>Images</t></h1> </div> <div id="form" class="photos"> - <div class="box"> + <div class="box form vn-w-sm vn-pa-lg"> <div class="form-group"> <label><t>Collection</t></label> <htk-combo id="schema"> diff --git a/forms/admin/queries/queries.js b/forms/admin/queries/queries.js index cc2bb678..d27481e8 100644 --- a/forms/admin/queries/queries.js +++ b/forms/admin/queries/queries.js @@ -1,102 +1,91 @@ -Hedera.Queries = new Class -({ +Hedera.Queries = new Class({ Extends: Hedera.Form - ,activate: function () - { - this.$('result-index').value = 0; + ,activate: function() { + this.$.resultIndex.value = 0; } - ,clean: function () - { - if (this._grid) - { - this.$('grid-holder').removeChild (this._grid.node); - this._grid.unref (); + ,clean: function() { + if (this._grid) { + this.$.gridHolder.removeChild(this._grid.node); + this._grid.unref(); this._grid = null; } } - ,_onExecuteClick: function () - { - this.clean (); + ,onExecuteClick: function() { + this.clean(); - var model = new Db.Model ({ + var model = new Db.Model({ conn: this.conn, - query: this.$('sql').value, - resultIndex: this.$('result-index').value, - updatable: this.$('updatable').value + query: this.$.sql.value, + resultIndex: this.$.resultIndex.value, + updatable: this.$.updatable.value }); - model.on ('status-changed', this._onModelChange, this); + model.on('status-changed', this.onModelChange, this); } - ,_onCleanClick: function () - { - this.clean (); + ,onCleanClick: function() { + this.clean(); } - ,_onModelChange: function (model, status) - { - if (status !== Db.Model.Status.LOADING) - { - model.disconnect ('status-changed', this._onModelChange, this); - model.unref (); + ,onModelChange: function(model, status) { + if (status !== Db.Model.Status.LOADING) { + model.disconnect('status-changed', this.onModelChange, this); + model.unref(); } if (status !== Db.Model.Status.READY) return; - Htk.Toast.showMessage (_('Query executed!')); + Htk.Toast.showMessage(_('Query executed!')); - var gridHolder = this.$('grid-holder'); + var gridHolder = this.$.gridHolder; if (gridHolder.firstChild) - gridHolder.removeChilds (gridHolder.firstChild); + gridHolder.removeChilds(gridHolder.firstChild); - var grid = new Htk.Grid (); + var grid = new Htk.Grid(); var columns = model.columns; - for (var i = 0; i < columns.length; i++) - { + for (var i = 0; i < columns.length; i++) { var c = columns[i]; - switch (c.type) - { + switch (c.type) { case Db.Conn.Type.BOOLEAN: - var column = new Htk.ColumnCheck (); + var column = new Htk.ColumnCheck(); break; case Db.Conn.Type.INTEGER: - var column = new Htk.ColumnSpin (); + var column = new Htk.ColumnSpin(); break; case Db.Conn.Type.DOUBLE: - var column = new Htk.ColumnSpin ({digits: 2}); + var column = new Htk.ColumnSpin({digits: 2}); break; case Db.Conn.Type.DATE: - var column = new Htk.ColumnDate ({format: '%a, %e %b %Y'}); + var column = new Htk.ColumnDate({format: '%a, %e %b %Y'}); break; case Db.Conn.Type.DATE_TIME: - var column = new Htk.ColumnDate ({format: '%a, %e %b %Y, %T'}); + var column = new Htk.ColumnDate({format: '%a, %e %b %Y, %T'}); break; case Db.Conn.Type.STRING: default: - var column = new Htk.ColumnText (); + var column = new Htk.ColumnText(); } - column.setProperties ({ + column.setProperties({ title: c.name, - editable: this.$('updatable').value, + editable: this.$.updatable.value, columnIndex: i }); - grid.appendColumn (column); + grid.appendColumn(column); } grid.model = model; - gridHolder.appendChild (grid.node); + gridHolder.appendChild(grid.node); this._grid = grid; - } }); diff --git a/forms/admin/queries/style.css b/forms/admin/queries/style.css index e3c925ca..9b9420ce 100644 --- a/forms/admin/queries/style.css +++ b/forms/admin/queries/style.css @@ -1,25 +1,10 @@ -.queries -{ - padding: 1em; -} -.queries .box -{ - max-width: 40em; - margin: 0 auto; -} -.queries .form -{ - box-sizing: border-box; - padding: 2em; -} -.queries textarea -{ + +.queries textarea { display: block; width: 100%; height: 8em; } -.queries .result -{ +.queries .result { margin-top: 1em; overflow: auto; } diff --git a/forms/admin/queries/ui.xml b/forms/admin/queries/ui.xml index 6d1b6745..ab3932bf 100644 --- a/forms/admin/queries/ui.xml +++ b/forms/admin/queries/ui.xml @@ -6,14 +6,14 @@ <htk-bar-button icon="ok" tip="_Execute" - on-click="_onExecuteClick"/> + on-click="this.onExecuteClick()"/> <htk-bar-button icon="delete" tip="_Clean" - on-click="_onCleanClick"/> + on-click="this.onCleanClick()"/> </div> <div id="form" class="queries"> - <div class="box form"> + <div class="box form vn-w-sm vn-pa-lg"> <div class="form-group"> <label><t>SQL query</t></label> <textarea diff --git a/forms/admin/users/style.css b/forms/admin/users/style.css index 30caf897..586a0d0e 100644 --- a/forms/admin/users/style.css +++ b/forms/admin/users/style.css @@ -1,45 +1,11 @@ -.users -{ - padding: 1em; + +.users-box.item > .actions { + display: flex; } -.users .box -{ - max-width: 30em; - margin: 0 auto; -} -.users-box -{ - padding: 1em; - border-bottom: 1px solid #DDD; -} -.users-box > button -{ - float: right; - margin: 0; -} -.users-box > p -{ - margin: .2em 0; -} -.users-box > p.important -{ - font-size: 1.2em; -} -.users-box > .disabled -{ - float: right; +.users-box .disabled { color: white; background-color: #F66; border-radius: .2em; - padding: .2em; - margin: .3em; + padding: .3em; font-size: .8em; } - -/* Topbar */ - -.action-bar .htk-search-entry -{ - margin: .8em .6em; -} - diff --git a/forms/admin/users/ui.xml b/forms/admin/users/ui.xml index 0b41e395..922e88ff 100644 --- a/forms/admin/users/ui.xml +++ b/forms/admin/users/ui.xml @@ -1,62 +1,48 @@ <vn> -<vn-group> - <vn-param id="user-name"/> - <vn-hash-param key="user" param="user-name"/> -</vn-group> <div id="title"> <h1><t>User management</t></h1> </div> <div id="actions"> - <htk-search-entry - param="user-name"/> + <htk-search-entry form="hash" column="user"/> </div> <div id="form" class="users"> - <div class="box"> - <htk-repeater form-id="iter" renderer="rendererFunc"> - <db-model property="model"> - <custom> - SELECT u.id, u.name, u.nickname, u.active - FROM account.user u - WHERE u.name LIKE CONCAT('%', #user, '%') - OR u.nickname LIKE CONCAT('%', #user, '%') - OR u.id = #user - ORDER BY u.name LIMIT 200 - </custom> - <sql-batch property="batch"> - <custom> - <item name="user" param="user-name"/> - </custom> - </sql-batch> - </db-model> - <custom> - <div class="users-box"> - <htk-button - form="iter" - column="id" - tip="_Access log" - icon="gnome" - on-click="onAccessLogClick"/> - <htk-button - id="impersonate" - form="iter" - column="id" - tip="_Impersonate user" - icon="incognito" - on-click="onChangeUserClick"/> + <htk-repeater + form-id="iter" + renderer="rendererFunc" + class="htk-list box vn-w-xs"> + <db-model property="model" lot="hash"> + SELECT u.id, u.name, u.nickname, u.active + FROM account.user u + WHERE u.name LIKE CONCAT('%', #user, '%') + OR u.nickname LIKE CONCAT('%', #user, '%') + OR u.id = #user + ORDER BY u.name LIMIT 200 + </db-model> + <custom> + <a class="users-box item" + href="{{`#!form=admin/access-log&user=${iter.id}`}}" + title="_Access log"> + <div class="content"> + <p class="important"> + {{iter.nickname}} + </p> + <p> + #{{iter.id}} - {{iter.name}} + </p> + </div> + <div class="actions" + on-click="$event.preventDefault()"> <span id="disabled" class="disabled"> <t>Disabled</t> </span> - <p class="important"> - <htk-text form="iter" column="nickname"/> - </p> - <p> - #<htk-text form="iter" column="id"/> - - <htk-text form="iter" column="name"/> - </p> - <div class="clear"/> + <htk-button + id="impersonate" + icon="supervisor_account" + tip="_Impersonate user" + on-click="this.onChangeUserClick(iter.name)"/> </div> - </custom> - </htk-repeater> - </div> + </a> + </custom> + </htk-repeater> </div> </vn> diff --git a/forms/admin/users/users.js b/forms/admin/users/users.js index ccca530c..6df40d4d 100644 --- a/forms/admin/users/users.js +++ b/forms/admin/users/users.js @@ -2,28 +2,21 @@ Hedera.Users = new Class({ Extends: Hedera.Form - ,onAccessLogClick: function(button, form) { - this.hash.set({ - 'form': 'admin/access-log' - ,'user': form.get('id') - }); - } - ,rendererFunc: function(scope, form) { - var isEnabled = form.get('active') - scope.$('disabled').style.display = isEnabled ? + var isEnabled = form.$.active + scope.$.disabled.style.display = isEnabled ? 'none' : 'block'; - scope.$('impersonate').node.style.display = isEnabled ? + scope.$.impersonate.node.style.display = isEnabled ? 'block' : 'none'; } - ,onChangeUserClick: function(button, form) { - this.gui.supplantUser(form.get('name'), + ,onChangeUserClick: function(userName) { + this.gui.supplantUser(userName, this.onUserSupplant.bind(this)); } ,onUserSupplant: function() { - this.hash.set({form: 'ecomerce/orders'}); + this.hash.setAll({form: 'ecomerce/orders'}); } }); diff --git a/forms/admin/visits/style.css b/forms/admin/visits/style.css index 4ccdc136..e8dae95f 100644 --- a/forms/admin/visits/style.css +++ b/forms/admin/visits/style.css @@ -1,46 +1,12 @@ -.visits -{ - padding: 1em; + +.visits .box { + margin-bottom: 16px; } -.visits .box -{ - max-width: 25em; - margin: 0 auto; +.visits .box:last-child { + margin-bottom: 0; } -.visits .form -{ - padding: 1.5em; - max-width: 20em; -} -.visits .summary -{ - margin-top: 1em; -} -.visits .summary p -{ - padding: 1.5em; +.visits .summary p { font-size: 1.4em; + margin: 0; text-align: right; } - -/* List */ - -.visits .list -{ - margin-top: 1em; -} -.visits .item -{ - display: block; - padding: 1em; - border-bottom: 1px solid #DDD; -} -.visits .item > p -{ - margin: .1em 0; -} -.visits .item > p.important -{ - font-size: 1.2em; -} - diff --git a/forms/admin/visits/ui.xml b/forms/admin/visits/ui.xml index ae790c7f..8baf101b 100644 --- a/forms/admin/visits/ui.xml +++ b/forms/admin/visits/ui.xml @@ -1,4 +1,8 @@ <vn> +<vn-lot-query id="params"> + <vn-spec name="from" type="Date"/> + <vn-spec name="to" type="Date"/> +</vn-lot-query> <div id="title"> <h1><t>Visits</t></h1> </div> @@ -6,87 +10,78 @@ <htk-bar-button icon="refresh" tip="_Refresh" - on-click="onRefreshClick"/> + on-click="visits.refresh()"/> <htk-bar-button - icon="user-info" + icon="visibility" tip="_Connections" - on-click="onSessionsClick"/> + on-click="this.hash.setAll({form: 'admin/connections'})"/> </div> <div id="form" class="visits"> - <div class="box"> - <div class="form"> + <div class="vn-w-xs"> + <div class="form vn-pa-lg box"> <div class="form-group"> <label><t>From</t></label> - <htk-date-chooser> - <vn-param property="param" id="from"/> - </htk-date-chooser> + <htk-date-chooser + form="params" + column="from"/> </div> <div class="form-group"> <label><t>To</t></label> - <htk-date-chooser> - <vn-param property="param" id="to"/> - </htk-date-chooser> + <htk-date-chooser + form="params" + column="to"/> </div> </div> - </div> - <div class="summary box"> - <p> - <htk-text> - <db-calc-sum - property="param" - model="visits" - column-name="visits"/> - </htk-text> - <t>visits</t>, - <htk-text> - <db-calc-sum - property="param" - model="visits" - column-name="newVisits"/> - </htk-text> - <t>news</t> - </p> - </div> - <div class="list box"> - <htk-repeater form-id="iter" empty-message="_Select date interval"> - <db-model property="model" id="visits"> - <custom> - SELECT browser, - MIN(CAST(version AS DECIMAL(4,1))) minVersion, - MAX(CAST(version AS DECIMAL(4,1))) maxVersion, - MAX(c.stamp) lastVisit, - COUNT(DISTINCT c.id) visits, - SUM(a.firstAccessFk = c.id AND v.firstAgentFk = a.id) newVisits - FROM visitUser e - JOIN visitAccess c ON c.id = e.accessFk - JOIN visitAgent a ON a.id = c.agentFk - JOIN visit v ON v.id = a.visitFk - WHERE c.stamp BETWEEN TIMESTAMP(#from,'00:00:00') AND TIMESTAMP(#to,'23:59:59') - GROUP BY browser ORDER BY visits DESC - </custom> - <sql-batch property="batch"> - <custom> - <item name="from" param="from"/> - <item name="to" param="to"/> - </custom> - </sql-batch> + <div class="summary vn-pa-lg box"> + <p> + <htk-text> + <db-calc-sum + property="param" + model="visits" + column-name="visits"/> + </htk-text> + <t>visits</t>, + <htk-text> + <db-calc-sum + property="param" + model="visits" + column-name="newVisits"/> + </htk-text> + <t>news</t> + </p> + </div> + <htk-repeater + class="box htk-list" + form-id="iter" + empty-message="_Select date interval"> + <db-model property="model" id="visits" lot="params"> + SELECT browser, + MIN(CAST(version AS DECIMAL(4,1))) minVersion, + MAX(CAST(version AS DECIMAL(4,1))) maxVersion, + MAX(c.stamp) lastVisit, + COUNT(DISTINCT c.id) visits, + SUM(a.firstAccessFk = c.id AND v.firstAgentFk = a.id) newVisits + FROM visitUser e + JOIN visitAccess c ON c.id = e.accessFk + JOIN visitAgent a ON a.id = c.agentFk + JOIN visit v ON v.id = a.visitFk + WHERE c.stamp BETWEEN TIMESTAMP(#from,'00:00:00') AND TIMESTAMP(#to,'23:59:59') + GROUP BY browser ORDER BY visits DESC </db-model> <custom> <div class="item"> - <p class="important"> - <htk-text form="iter" column="browser"/> - <htk-text form="iter" column="minVersion"/> - - <htk-text form="iter" column="maxVersion"/> - </p> - <p> - <htk-text form="iter" column="visits"/> - <t>visits</t>, - <htk-text form="iter" column="newVisits"/> - <t>news</t> - </p> - <p> - <htk-text form="iter" column="lastVisit" format="_%a, %e %b %Y at %T"/> - </p> + <div class="content"> + <p class="important"> + {{iter.browser}} {{iter.minVersion}} - {{iter.maxVersion}} + </p> + <p> + {{iter.visits}} <t>visits</t>, + {{iter.newVisits}} <t>news</t> + </p> + <p> + {{Vn.Value.format(iter.lastVisit, _('%a, %e %b %Y at %T'))}} + </p> + </div> </div> </custom> </htk-repeater> diff --git a/forms/admin/visits/visits.js b/forms/admin/visits/visits.js index fd4c40b0..24d54cdb 100644 --- a/forms/admin/visits/visits.js +++ b/forms/admin/visits/visits.js @@ -1,22 +1,13 @@ -Hedera.Visits = new Class -({ +Hedera.Visits = new Class({ Extends: Hedera.Form - ,activate: function () - { - this.$('from').value = new Date (); - this.$('to').value = new Date (); - } - - ,onRefreshClick: function () - { - this.$('visits').refresh (); - } - - ,onSessionsClick: function () - { - this.hash.set ({'form': 'admin/connections'}); + ,activate: function() { + if (!this.hash.$.to) + this.hash.assign({ + from: new Date(), + to: new Date() + }); } }); diff --git a/forms/agencies/packages/packages.js b/forms/agencies/packages/packages.js index b71a13b6..d86d89c6 100644 --- a/forms/agencies/packages/packages.js +++ b/forms/agencies/packages/packages.js @@ -1,13 +1,11 @@ -Hedera.Packages = new Class -({ +Hedera.Packages = new Class({ Extends: Hedera.Form - ,onShowClick: function (column, agencyId) - { - this.hash.set ({ - 'form': 'agencies/provinces', - 'agency': agencyId + ,onShowClick: function(column, agencyId) { + this.hash.setAll({ + form: 'agencies/provinces', + agency: agencyId }); } }); diff --git a/forms/agencies/packages/style.css b/forms/agencies/packages/style.css index 42b69f97..e69de29b 100644 --- a/forms/agencies/packages/style.css +++ b/forms/agencies/packages/style.css @@ -1,9 +0,0 @@ -.packages -{ - padding: 1em; -} -.packages .box -{ - max-width: 40em; - margin: 0 auto; -} diff --git a/forms/agencies/packages/ui.xml b/forms/agencies/packages/ui.xml index e41ede06..866bab74 100644 --- a/forms/agencies/packages/ui.xml +++ b/forms/agencies/packages/ui.xml @@ -3,7 +3,7 @@ <h1><t>ListByAgency</t></h1> </div> <div id="form" class="packages"> - <div class="box"> + <div class="box vn-w-sm"> <htk-grid> <db-model property="model"> <custom> @@ -12,7 +12,7 @@ </db-model> <htk-column-button column="agency_id" - icon="show" + icon="search" tip="_ShowByProvince" on-clicked="onShowClick"/> <htk-column-text title="_Agency" column="Agencia"/> diff --git a/forms/agencies/provinces/provinces.js b/forms/agencies/provinces/provinces.js index 723fc15c..b441f598 100644 --- a/forms/agencies/provinces/provinces.js +++ b/forms/agencies/provinces/provinces.js @@ -1,6 +1,5 @@ -Hedera.Provinces = new Class -({ +Hedera.Provinces = new Class({ Extends: Hedera.Form }); diff --git a/forms/agencies/provinces/style.css b/forms/agencies/provinces/style.css index cbf4d53f..e69de29b 100644 --- a/forms/agencies/provinces/style.css +++ b/forms/agencies/provinces/style.css @@ -1,9 +0,0 @@ -.provinces -{ - padding: 1em; -} -.provinces .box -{ - max-width: 40em; - margin: 0 auto; -} diff --git a/forms/agencies/provinces/ui.xml b/forms/agencies/provinces/ui.xml index 5094002a..46fd7c04 100644 --- a/forms/agencies/provinces/ui.xml +++ b/forms/agencies/provinces/ui.xml @@ -1,23 +1,12 @@ <vn> -<vn-group> - <vn-param id="agency"/> - <vn-hash-param key="agency" param="agency"/> -</vn-group> <div id="title"> <h1><t>ByProvince</t></h1> </div> -<div id="form" class="provinces"> +<div id="form" class="provinces vn-w-sm"> <div class="box"> <htk-grid> - <db-model property="model"> - <custom> - CALL vn2008.desglose_volume (#agency) - </custom> - <sql-batch property="batch"> - <custom> - <item name="agency" param="agency"/> - </custom> - </sql-batch> + <db-model property="model" lot="hash"> + CALL vn2008.desglose_volume(#agency) </db-model> <htk-column-text title="_Province" column="Provincia"/> <htk-column-spin title="_Expeditions" column="expediciones"/> diff --git a/forms/cms/about/style.css b/forms/cms/about/style.css index 6d7a41eb..5290fa22 100644 --- a/forms/cms/about/style.css +++ b/forms/cms/about/style.css @@ -1,15 +1,5 @@ -.about -{ - padding: 1em; -} -.about .cols -{ - max-width: 85em; - margin: 0 auto; -} -@media screen and (min-width: 1000px) /* and (max-width: 1399px) */ -{ +@media screen and (min-width: 1000px) /* and (max-width: 1399px) */ { .about .cols { column-count: 2; @@ -17,8 +7,7 @@ -webkit-column-count: 2; } }/* -@media screen and (min-width: 1400px) -{ +@media screen and (min-width: 1400px) { .about .cols { column-count: 3; @@ -26,8 +15,7 @@ -webkit-column-count: 3; } } -@media screen and (min-width: 2000px) -{ +@media screen and (min-width: 2000px) { .about .cols { column-count: 4; @@ -35,39 +23,33 @@ -webkit-column-count: 4; } }*/ -.about .box -{ - margin-bottom: 1em; - padding: 2em; +.about .box { + margin-bottom: 16px; + padding: 32px; } -.about h1 -{ +.about h1 { padding: 0; margin: 0; font-weight: normal; font-size: 1.6em; } -.about h2 -{ +.about h2 { text-align: center; font-size: 1.2em; font-weight: normal; margin: 1em; } -.about h3 -{ +.about h3 { text-align: center; font-size: 1.2em; font-weight: normal; padding: 1em; color: #00796B; } -.about p -{ +.about p { margin: 1em 0; } -.about p.summary -{ +.about p.summary { max-width: 26em; text-align: center; background-color: #FF8; @@ -79,8 +61,7 @@ /* Images */ -.about img -{ +.about img { max-width: 90%; text-align: center; padding: 1em; @@ -90,16 +71,13 @@ .about img[alt="producers"], .about img[alt="4_control"], .about img[alt="dealer"], -.about img[alt="goods_transport"] -{ +.about img[alt="goods_transport"] { float: right; } -.about img[alt="2_control"] -{ +.about img[alt="2_control"] { float: left; } -.about img[alt="glass"] -{ +.about img[alt="glass"] { display: inline; padding: 0; padding-left: 0.9em; diff --git a/forms/cms/about/ui.xml b/forms/cms/about/ui.xml index 79628032..3dff0745 100644 --- a/forms/cms/about/ui.xml +++ b/forms/cms/about/ui.xml @@ -3,7 +3,7 @@ <h1><t>About</t></h1> </div> <div id="form" class="about"> -<div class="cols"> +<div class="cols vn-w-lg"> <div class="box"> <h1> <t>QualityAndVariety</t> diff --git a/forms/cms/contact/contact.js b/forms/cms/contact/contact.js index 509863ae..6bb9d700 100644 --- a/forms/cms/contact/contact.js +++ b/forms/cms/contact/contact.js @@ -1,46 +1,40 @@ -Hedera.Contact = new Class -({ +Hedera.Contact = new Class({ Extends: Hedera.Form - ,activate: function () - { + ,activate: function() { var self = this; - this.$('contact-form').onsubmit = function () - { self._onSubmit (); return false; }; - - this.refreshCaptcha (); - } - - ,refreshCaptcha: function () - { - params = { - 'srv': 'rest:core/captcha', - 'stamp': new Date ().getTime () + this.$.contactForm.onsubmit = function() { + self._onSubmit(); return false; }; - this.$('captcha-img').src = '?'+ Vn.Url.makeUri (params); - } - - ,_onSubmit: function () - { - this.conn.sendForm (this.$('contact-form'), - this._onResponse.bind (this)); - } - - ,_onResponse: function (json, error) - { - var form = this.$('contact-form'); - if (json) - { - form.reset (); - Htk.Toast.showMessage (_('DataSentSuccess')); - } - else - Htk.Toast.showError (_('ErrorSendingData')); + this.refreshCaptcha(); + } + + ,refreshCaptcha: function() { + params = { + srv: 'rest:misc/captcha', + stamp: new Date().getTime() + }; + this.$.captchaImg.src = '?'+ Vn.Url.makeUri(params); + } + + ,_onSubmit: function() { + this.conn.sendForm(this.$.contactForm, + this._onResponse.bind(this)); + } + + ,_onResponse: function(json) { + var form = this.$.contactForm; + + if (json) { + form.reset(); + Htk.Toast.showMessage(_('DataSentSuccess')); + } else + Htk.Toast.showError(_('ErrorSendingData')); form['captcha'].value = ''; - this.refreshCaptcha (); + this.refreshCaptcha(); } }); diff --git a/forms/cms/contact/style.css b/forms/cms/contact/style.css index 98fa547d..a330fa93 100644 --- a/forms/cms/contact/style.css +++ b/forms/cms/contact/style.css @@ -1,55 +1,38 @@ -.contact -{ - padding: 1em; -} -.contact .box -{ - max-width: 30em; - padding: 2em; -} -.contact .form -{ +.contact .form { position: relative; text-align: left; max-width: 25em; margin: 0 auto; } -.contact form -{ +.contact form { margin: 0 auto; } -.contact form p -{ +.contact form p { margin: 1em auto; display: block; margin-top: 2em; } -.contact textarea -{ +.contact textarea { height: 5em; } -.contact button -{ +.contact button { display: block; margin: 0 auto; margin-top: 1em; padding: 0.6em; } -.contact .mandatory-message -{ +.contact .mandatory-message { font-size: .9em; } /* Captcha */ -.captcha img -{ +.captcha img { vertical-align: middle; margin-left: 1em; } -.captcha input -{ +.captcha input { max-width: 8em; } diff --git a/forms/cms/contact/ui.xml b/forms/cms/contact/ui.xml index bcb3afe2..d00840ae 100644 --- a/forms/cms/contact/ui.xml +++ b/forms/cms/contact/ui.xml @@ -3,54 +3,47 @@ <h1><t>IWantCustomer</t></h1> </div> <div id="form" class="contact"> - <div class="box"> - <div class="form"> - <p> - <t>FillFormData</t> + <div class="box form vn-w-xs vn-pa-lg"> + <p><t>FillFormData</t></p> + <p><t>OrCallUs</t></p> + <form id="contact-form"> + <input type="hidden" name="srv" value="json:misc/contact"/> + <div class="form-group"> + <label><t>Name</t></label> + <input type="text" name="name"/> + </div> + <div class="form-group"> + <label><t>City</t></label> + <input type="text" name="city"/> + </div> + <div class="form-group"> + <label><t>PC</t></label> + <input type="text" name="pc"/> + </div> + <div class="form-group"> + <label><t>Phone</t></label> + <input type="text" name="phone"/> + </div> + <div class="form-group"> + <label><t>EMail</t></label> + <input type="text" name="email"/> + </div> + <div class="form-group"> + <label><t>Message</t></label> + <textarea name="message"/> + </div> + <div class="form-group captcha"> + <label><t>Anti-Spam</t></label> + <input type="text" name="captcha"/> + <img alt="Captcha" id="captcha-img"/> + </div> + <p class="mandatory-message"> + <t>AllFieldsMandatory</t> </p> - <p> - <t>OrCallUs</t> - </p> - <form - id="contact-form"> - <input type="hidden" name="srv" value="json:misc/contact"/> - <div class="form-group"> - <label><t>Name</t></label> - <input type="text" name="name"/> - </div> - <div class="form-group"> - <label><t>City</t></label> - <input type="text" name="city"/> - </div> - <div class="form-group"> - <label><t>PC</t></label> - <input type="text" name="pc"/> - </div> - <div class="form-group"> - <label><t>Phone</t></label> - <input type="text" name="phone"/> - </div> - <div class="form-group"> - <label><t>EMail</t></label> - <input type="text" name="email"/> - </div> - <div class="form-group"> - <label><t>Message</t></label> - <textarea name="message"/> - </div> - <div class="form-group captcha"> - <label><t>Anti-Spam</t></label> - <input type="text" name="captcha"/> - <img alt="Captcha" id="captcha-img"/> - </div> - <p class="mandatory-message"> - <t>AllFieldsMandatory</t> - </p> - <button class="thin"> - <t>Send</t> - </button> - </form> - </div> + <button> + <t>Send</t> + </button> + </form> </div> </div> </vn> diff --git a/forms/cms/home/home.js b/forms/cms/home/home.js index 85750bdc..e29f8765 100644 --- a/forms/cms/home/home.js +++ b/forms/cms/home/home.js @@ -1,9 +1,5 @@ Hedera.Home = new Class({ Extends: Hedera.Form - - ,onStartOrderClick: function() { - this.hash.set({form: 'ecomerce/catalog'}); - } }); diff --git a/forms/cms/home/style.css b/forms/cms/home/style.css index 2294ceea..a38f59a4 100644 --- a/forms/cms/home/style.css +++ b/forms/cms/home/style.css @@ -1,70 +1,60 @@ +.home { + padding: 0 !important; +} + /* News panel */ -.column -{ +.column { margin: .5em; max-width: 120em; } -.action-bar button.start-order -{ - background-color: #EF5350; - margin: .7em; - padding: .5em; - box-shadow: 0 0 0.4em rgba(1, 1, 1, 0.4); +.action-bar button.start-order { + border: 1px solid white; } -.action-bar button.start-order:hover -{ - background-color: #F44336; +.action-bar button.start-order:hover { + background-color: white !important; + color: black; } /* New */ -.new -{ +.new { text-align: left; - background-color: white; - color: #222; - border: none; - border-radius: 0.1em; - box-shadow: 0 0.2em 0.2em rgba(1, 1, 1, 0.2); margin: .5em; } -.new img -{ +.new img { display: block; margin: auto; width: 100%; } -.new .top -{ +.new .top { padding: 1.5em; padding-bottom: 1px; } -.new h2 -{ +.new h2 { font-size: 1.6em; color: black; font-weight: normal; padding: 0; } -.new-info -{ + +.new-info { font-size: 0.9em; color: #444; text-align: right; - margin: 0.8em 0; + margin: .8em 0; } -.new-text -{ +.new-text { margin: 1.5em 0; + font-family: 'Open Sans'; } -.new-text a -{ - color: blue; +.new-text a { + color: #6a1; +} +.new-text a:hover { text-decoration: underline; } -.new-text li -{ +.new-text li { margin: 0.4em 0; -} +} \ No newline at end of file diff --git a/forms/cms/home/ui.xml b/forms/cms/home/ui.xml index 9bd797ee..ba1600e8 100644 --- a/forms/cms/home/ui.xml +++ b/forms/cms/home/ui.xml @@ -5,34 +5,33 @@ <div id="actions" class="catalog-actions"> <htk-bar-button class="start-order" - icon="new-order" + icon="add_shopping_cart" tip="_Start order" - on-click="onStartOrderClick"/> + on-click="hash.setAll({form: 'ecomerce/catalog'})"/> </div> <div id="form" class="home"> <div class="column mansonry" id="news-column"> - <htk-repeater form-id="new"> + <htk-repeater form-id="iter"> <db-model property="model"> <custom> - SELECT title, text, image, id FROM news - WHERE tag != 'course' + SELECT title, text, image, id + FROM news ORDER BY priority, created DESC </custom> </db-model> <custom> <div class="masonry-box"> - <div class="new"> + <div class="new box"> <htk-image directory="news" subdir="full" - form="new" - column="image" + value="{{iter.image}}" editable="false" full-dir="full"/> <div class="top"> - <h2><htk-text form="new" column="title"/></h2> + <h2>{{iter.title}}</h2> <div class="new-text"> - <htk-html form="new" column="text"/> + <htk-html value="{{iter.text}}"/> </div> </div> </div> diff --git a/forms/cms/location/location.js b/forms/cms/location/location.js index d98bd35b..3a3c26c8 100644 --- a/forms/cms/location/location.js +++ b/forms/cms/location/location.js @@ -24,7 +24,7 @@ Hedera.Location = new Class({ } ,onLocationsDone: function(resultSet) { - this.locations = resultSet.fetchResult(); + this.locations = resultSet.fetchData(); this.allLoaded(); } @@ -44,12 +44,11 @@ Hedera.Location = new Class({ ,center: new google.maps.LatLng(46.0, 4.0) }; - var div = this.$('form'); + var div = this.$.form; var gmap = new google.maps.Map(div, options); - if (this.locations) - while (this.locations.next()) - this.createMarker(this.locations, gmap); + for (const location of this.locations) + this.createMarker(location, gmap); } ,createMarker: function(location, gmap) { @@ -57,28 +56,28 @@ Hedera.Location = new Class({ div.className = 'marker'; var h = document.createElement('h3'); - h.appendChild(document.createTextNode(location.get('title'))); + h.appendChild(document.createTextNode(location.title)); div.appendChild(h); var p = document.createElement('p'); - p.appendChild(document.createTextNode(location.get('address'))); + p.appendChild(document.createTextNode(location.address)); div.appendChild(p); var p = document.createElement('p'); - p.appendChild(document.createTextNode(location.get('postcode') +' '+ location.get('city'))); + p.appendChild(document.createTextNode(location.postcode +' '+ location.city)); div.appendChild(p); var p = document.createElement('p'); - p.appendChild(document.createTextNode(location.get('province'))); + p.appendChild(document.createTextNode(location.province)); div.appendChild(p); var p = document.createElement('p'); - p.appendChild(document.createTextNode(location.get('phone'))); + p.appendChild(document.createTextNode(location.phone)); div.appendChild(p); var lat = new google.maps.LatLng( - location.get('lat'), - location.get('lng') + location.lat, + location.lng ); var marker = new google.maps.Marker({ @@ -95,7 +94,7 @@ Hedera.Location = new Class({ this.openInfoWindow.bind(this, infoWindow, gmap, marker)); if (Vn.Locale.language - && Vn.Locale.language == location.get('language')) + && Vn.Locale.language == location.language) this.openInfoWindow(infoWindow, gmap, marker); } diff --git a/forms/cms/training/locale/ca.yml b/forms/cms/training/locale/ca.yml deleted file mode 100644 index 0967ef42..00000000 --- a/forms/cms/training/locale/ca.yml +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/forms/cms/training/locale/en.yml b/forms/cms/training/locale/en.yml deleted file mode 100644 index 0967ef42..00000000 --- a/forms/cms/training/locale/en.yml +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/forms/cms/training/locale/es.yml b/forms/cms/training/locale/es.yml deleted file mode 100644 index 0967ef42..00000000 --- a/forms/cms/training/locale/es.yml +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/forms/cms/training/locale/fr.yml b/forms/cms/training/locale/fr.yml deleted file mode 100644 index 0967ef42..00000000 --- a/forms/cms/training/locale/fr.yml +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/forms/cms/training/locale/pt.yml b/forms/cms/training/locale/pt.yml deleted file mode 100644 index 0967ef42..00000000 --- a/forms/cms/training/locale/pt.yml +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/forms/cms/training/style.css b/forms/cms/training/style.css deleted file mode 100644 index 150a3560..00000000 --- a/forms/cms/training/style.css +++ /dev/null @@ -1,59 +0,0 @@ - -/* News panel */ - -.column -{ - margin: .5em; - max-width: 120em; -} - -/* New */ - -.new -{ - text-align: left; - background-color: white; - color: #222; - border: none; - border-radius: 0.1em; - box-shadow: 0 0.2em 0.2em rgba(1, 1, 1, 0.2); - margin: .5em; -} -.new img -{ - display: block; - margin: auto; - width: 100%; -} -.new .top -{ - padding: 1.5em; - padding-bottom: 1px; -} -.new h2 -{ - font-size: 1.6em; - color: black; - font-weight: normal; - padding: 0; -} -.new-info -{ - font-size: 0.9em; - color: #444; - text-align: right; - margin: 0.8em 0; -} -.new-text -{ - margin: 1.5em 0; -} -.new-text a -{ - color: blue; - text-decoration: underline; -} -.new-text li -{ - margin: 0.4em 0; -} diff --git a/forms/cms/training/training.js b/forms/cms/training/training.js deleted file mode 100644 index adb059b7..00000000 --- a/forms/cms/training/training.js +++ /dev/null @@ -1,5 +0,0 @@ - -Hedera.Training = new Class -({ - Extends: Hedera.Form -}); diff --git a/forms/cms/training/ui.xml b/forms/cms/training/ui.xml deleted file mode 100644 index 3fecb4b3..00000000 --- a/forms/cms/training/ui.xml +++ /dev/null @@ -1,41 +0,0 @@ -<vn> -<div id="title"> - <h1><t>Training</t></h1> -</div> -<div id="form" class="training"> - <div class="column mansonry" id="news-column"> - <htk-repeater form-id="new"> - <db-model property="model"> - <custom> - SELECT title, created, text, image, id FROM news - WHERE tag = 'course' - ORDER BY priority, created DESC - </custom> - </db-model> - <custom> - <div class="masonry-box"> - <div class="new"> - <htk-image - directory="news" - subdir="full" - form="new" - column="image" - editable="false" - full-dir="full"/> - <div class="top"> - <h2><htk-text form="new" column="title"/></h2> - <p class="new-info"> - <htk-text format="_%a, %e %b %Y" form="new" column="created"/> - </p> - <div class="new-text"> - <htk-html form="new" column="text"/> - </div> - </div> - </div> - </div> - </custom> - </htk-repeater> - <div class="clear"/> - </div> -</div> -</vn> diff --git a/forms/cms/why/style.css b/forms/cms/why/style.css index 434da8da..edc70906 100644 --- a/forms/cms/why/style.css +++ b/forms/cms/why/style.css @@ -1,27 +1,13 @@ -.why -{ - padding: 1em; -} -.why .box -{ - max-width: 40em; - margin: 0 auto; -} -.why ul -{ +.why ul { list-style-type: none; - padding: 0 1em; - padding-bottom: 1em; - max-width: 36em; - margin: 0 auto; + padding: 0; + margin-top: 0; } -.why li -{ - padding: 0.5em 0; +.why li { + padding-bottom: 16px; } -.why img -{ +.why img { display: block; margin: 0 auto; max-width: 95%; diff --git a/forms/cms/why/ui.xml b/forms/cms/why/ui.xml index 98bb6c9c..822cda36 100644 --- a/forms/cms/why/ui.xml +++ b/forms/cms/why/ui.xml @@ -3,20 +3,18 @@ <h1><t>AboutCompany</t></h1> </div> <div id="form" class="why"> - <div class="box"> - <div class="body"> - <ul> - <li><t>BecauseOurBigCatalog</t></li> - <li><t>BecauseThisWeb</t></li> - <li><t>BecauseOurShoppingDep</t></li> - <li><t>BecauseOrderIsEasy</t></li> - <li><t>BecauseOurPlant</t></li> - <li><t>BecauseOurSalesDep</t></li> - <li><t>BecauseOurWorkShop</t></li> - <li><t>BecauseWeHaveWhatYouNeed</t></li> - </ul> - <img src="forms/cms/why/store.png" alt="Store photo"/> - </div> + <div class="box vn-w-sm vn-pa-lg"> + <ul class="vn-mb-lg"> + <li><t>BecauseOurBigCatalog</t></li> + <li><t>BecauseThisWeb</t></li> + <li><t>BecauseOurShoppingDep</t></li> + <li><t>BecauseOrderIsEasy</t></li> + <li><t>BecauseOurPlant</t></li> + <li><t>BecauseOurSalesDep</t></li> + <li><t>BecauseOurWorkShop</t></li> + <li><t>BecauseWeHaveWhatYouNeed</t></li> + </ul> + <img src="forms/cms/why/store.png" alt="Store photo"/> </div> </div> </vn> diff --git a/forms/ecomerce/basket/basket.js b/forms/ecomerce/basket/basket.js index 2f1239ac..e967ef52 100644 --- a/forms/ecomerce/basket/basket.js +++ b/forms/ecomerce/basket/basket.js @@ -1,58 +1,36 @@ -Hedera.Basket = new Class -({ +Hedera.Basket = new Class({ Extends: Hedera.Form - ,open: function () - { - this.close (); + ,open: function() { + this.close(); this.isOpen = true; - Hedera.BasketChecker.check (this.conn, - this.onBasketCheck.bind (this)); + Hedera.BasketChecker.check(this.conn, this.hash, + this.onBasketCheck.bind(this)); } - ,onBasketCheck: function (isOk) - { + ,onBasketCheck: function(isOk) { if (isOk) - this.loadUi (); + this.loadUi(); } - ,activate: function () - { - this.$('items').setInfo ('bi', 'myBasketItem', 'hedera'); + ,activate: function() { + this.$.items.setInfo('bi', 'myBasketItem', 'hedera'); } - ,onConfigureClick: function () - { - Htk.Toast.showWarning (_('RememberReconfiguringImpact')); - this.hash.set ({form: 'ecomerce/checkout'}); + ,onConfigureClick: function() { + Htk.Toast.showWarning(_('RememberReconfiguringImpact')); + this.hash.setAll({form: 'ecomerce/checkout'}); } - ,onCatalogClick: function () - { - this.hash.set ({form: 'ecomerce/catalog'}); + ,onDeleteClick: function(form) { + if (confirm(_('ReallyDelete'))) + form.deleteRow(); } - ,onCheckoutClick: function () - { - this.hash.set ({form: 'ecomerce/confirm'}); - } - - ,repeaterFunc: function (res, form) - { - res.$('subtotal').value = this.subtotal (form); - } - - ,onDeleteClick: function (button, form) - { - if (confirm (_('ReallyDelete'))) - form.deleteRow (); - } - - ,subtotal: function (form) - { - return form.get ('amount') * form.get ('price'); + ,subtotal: function(form) { + return form.$.amount * form.$.price; } }); diff --git a/forms/ecomerce/basket/style.css b/forms/ecomerce/basket/style.css index 2b0d1889..f49533d6 100644 --- a/forms/ecomerce/basket/style.css +++ b/forms/ecomerce/basket/style.css @@ -1,91 +1,65 @@ -.basket -{ - padding: 1em; + +.basket .head { + border-bottom: 1px solid #DDD; } -.basket .box -{ - max-width: 30em; - margin: 0 auto; - padding: 0 2em; +.basket .head p { + font-weight: bold; + margin: 0; + padding: 0; + font-size: 1.4em; + text-align: right; } -.basket .form > p -{ +.basket .form > p { margin: 0; font-size: 1.4em; color: white; text-align: right; } -.basket .head -{ - padding: 1.8em 0; - margin: 0; - border-bottom: 1px solid #DDD; -} -.basket .head p -{ - margin: 0; - padding: 0; - font-size: 1.4em; - text-align: right; -} /* Lines */ -.basket .lines -{ - padding: .8em 0; +.basket .line { + display: flex; + gap: 20px; + margin: 24px 0; + height: 65px; } -.basket .line -{ - padding: 1em 0; +.basket .line:last-child { + margin-bottom: 0; } -.basket .line > .delete -{ - margin: -0.5em; - margin-top: 1em; - margin-right: .5em; - float: left; +.basket .line > .delete { + align-self: center; } -.basket .line > .photo -{ - margin-right: 1em; - float: left; +.basket .line > .photo { + flex: none; border-radius: 50%; - height: 4.25em; - width: 4.25em; + width: 65px; } -.basket .line > .info -{ - margin-left: 7.5em; +.basket .line > .info { + flex: 1; } -.basket .line > .info > h2 -{ +.basket .line > .info > h2 { font-size: 1em; font-weight: normal; padding: 0; padding-bottom: .1em; } -.basket .line > .info > p -{ +.basket .line > .info > p { margin: 0; } -.basket .line > .info > .tags -{ +.basket .line > .info > .tags { color: #777; } -.basket .line .subtotal -{ +.basket .line .subtotal { float: right; } /* Fields */ -.basket td.available-exceeded input -{ +.basket td.available-exceeded input { background-color: #FCC; } -.basket .icon > img -{ +.basket .icon > img { border-radius: 50%; } diff --git a/forms/ecomerce/basket/ui.xml b/forms/ecomerce/basket/ui.xml index 32b66175..8a6d1f0a 100644 --- a/forms/ecomerce/basket/ui.xml +++ b/forms/ecomerce/basket/ui.xml @@ -4,21 +4,21 @@ </div> <div id="actions"> <htk-bar-button - icon="ok" - tip="_Checkout" - on-click="onCheckoutClick"/> - <htk-bar-button - icon="view-dual" - tip="_Catalog" - on-click="onCatalogClick"/> - <htk-bar-button - icon="preferences" + icon="settings" tip="_ConfigureOrder" - on-click="onConfigureClick"/> + on-click="this.onConfigureClick()"/> + <htk-bar-button + icon="local_florist" + tip="_Catalog" + on-click="this.hash.setAll({form: 'ecomerce/catalog'})"/> + <htk-bar-button + icon="shopping_cart_checkout" + tip="_Checkout" + on-click="this.hash.setAll({form: 'ecomerce/confirm'})"/> </div> <div id="form" class="basket"> - <div class="box"> - <div class="head"> + <div class="box vn-w-sm vn-pa-lg"> + <div class="head vn-pb-lg"> <p> <t>Total</t> <htk-text format="%.2d€"> @@ -27,7 +27,7 @@ </p> </div> <div class="lines"> - <htk-repeater form-id="iter" renderer="repeaterFunc"> + <htk-repeater form-id="iter"> <db-model id="items" property="model" updatable="true"> SELECT bi.id, bi.amount, bi.price, i.longName item, i.tag5, i.value5, i.tag6, i.value6, i.tag7, i.value7, @@ -41,38 +41,29 @@ <custom> <div class="line"> <htk-button - form="iter" - column="id" class="delete" tip="_Remove" icon="delete" - on-click="onDeleteClick"/> + on-click="this.onDeleteClick($iter)"/> <htk-image - form="iter" - column="image" + value="{{iter.image}}" stamp-column="updated" class="photo" directory="catalog" subdir="200x200" full-dir="1600x900"/> <div class="info"> - <h2> - <htk-text form="iter" column="item"/> - </h2> + <h2>{{iter.item}}</h2> <p class="tags"> - <htk-text form="iter" column="value5"/> - <htk-text form="iter" column="value6"/> - <htk-text form="iter" column="value7"/> + {{iter.value5}} {{iter.value6}} {{iter.value7}} </p> <p class="amount"> - <htk-text form="iter" column="amount"/> x - <htk-text form="iter" column="price" format="%.2d€"/> + {{iter.amount}} x {{Vn.Value.format(iter.price, '%.2d€')}} <span class="subtotal"> - <htk-text id="subtotal" format="%.2d€"/> + {{Vn.Value.format(iter.price * iter.amount, '%.2d€')}} </span> </p> </div> - <div class="clear"/> </div> </custom> </htk-repeater> diff --git a/forms/ecomerce/catalog/catalog.js b/forms/ecomerce/catalog/catalog.js index 373983d1..0f50ea19 100644 --- a/forms/ecomerce/catalog/catalog.js +++ b/forms/ecomerce/catalog/catalog.js @@ -8,8 +8,8 @@ Hedera.Catalog = new Class({ this.close(); this.isOpen = true; - if (!localStorage.getItem('hederaGuest')) { - Hedera.BasketChecker.check(this.conn, + if (!localStorage.getItem('hederaGuest')) { + Hedera.BasketChecker.check(this.conn, this.hash, this.onBasketCheck.bind(this)); } else { var query = 'CALL mybasket_configureForGuest'; @@ -23,40 +23,143 @@ Hedera.Catalog = new Class({ } ,activate: function() { - document.body.appendChild(this.$('right-panel')); - - this.$('items-model').setInfo('i', 'item', 'vn', ['id']); + document.body.appendChild(this.$.rightPanel); + this.$.items.setInfo('i', 'item', 'vn', ['id']); if (localStorage.getItem('hederaView')) this.setView(parseInt(localStorage.getItem('hederaView'))); else this.setView(Hedera.Catalog.View.GRID); + + this.onFilterChange(); } ,deactivate: function() { this.hideMenu(); - this.gui.$('top-bar').style.backgroundColor = ''; - Vn.Node.remove(this.$('right-panel')); + this.gui.$.topBar.style.backgroundColor = ''; + Vn.Node.remove(this.$.rightPanel); + } + + ,getFilter(params, tags, currentTag) { + if (params.search == null && params.type == null) + return null; + + const $ = this.$; + + params = Object.assign({}, params); + const filter = new Sql.Operation({ + type: Sql.Operation.Type.AND + }); + + let idSearch = false; + if (params.search != null) { + idSearch = /^\d+$/.test(params.search); + + if (!idSearch) { + filter.push($.searchOp); + params.search = `%${params.search}%`; + } else + filter.push($.idOp); + } + + if (!idSearch) { + if (params.realm != null) + filter.push($.realmOp); + if (params.type != null) + filter.push($.typeOp); + + for (const tag of tags) + if (tag != currentTag && params[tag] != null) + filter.push($[`${tag}Op`]); + } + + params.filter = filter; + const lot = new Vn.Lot(); + lot.setAll(params); + + return lot; + } + + ,onFilterChange: function() { + const $ = this.$; + const params = $.params.$; + + this.refreshTitle(); + const hasRealm = params.realm != null; + $.filters.style.display = hasRealm ? 'block' : 'none'; + $.realmMsg.style.display = hasRealm ? 'none' : 'block'; + + const tags = [ + 'color', + 'origin', + 'category', + 'producer' + ]; + + const lot = this.getFilter(params, tags); + if (lot) { + $.items.lot = lot; + $.items.refresh(); + } else + $.items.clean(); + + for (const tag of tags) + $[`${tag}s`].lot = this.getFilter(params, tags, tag); + + if (lot) this.hideMenu(); + } + + ,refreshTitle: function() { + const hash = this.hash.$; + const types = this.$.types; + const realms = this.$.realms; + + const type = hash.type; + const realm = hash.realm; + let typeName; + let realmName; + + if (type && types.ready) { + var row = types.search('id', type); + if (row != -1) typeName = types.get(row, 'name'); + } + if (realm && realms.ready) { + var row = realms.search('id', realm); + if (row != -1) realmName = realms.get(row, 'name'); + } + + let title = _('Catalog'); + let subtitle = ''; + + if (typeName) { + title = typeName; + subtitle = realmName; + } else if (realmName) { + title = realmName; + } + + Vn.Node.setText(this.$.titleText, title); + Vn.Node.setText(this.$.subtitle, subtitle); } ,setView: function(view) { if (view === Hedera.Catalog.View.GRID) { - this.$('view-button').setProperties({ - icon: 'view-list', + this.$.viewButton.setProperties({ + icon: 'view_list', tip: _('List view') }); this.view = Hedera.Catalog.View.GRID; var className = 'grid-view'; } else { - this.$('view-button').setProperties({ - icon: 'view-grid', + this.$.viewButton.setProperties({ + icon: 'grid_on', tip: _('Grid view') }); this.view = Hedera.Catalog.View.LIST; var className = 'list-view'; } - var node = this.$('grid-view').node; + var node = this.$.gridView.node; node.className = className; localStorage.setItem('hederaView', this.view); } @@ -66,18 +169,11 @@ Hedera.Catalog = new Class({ Hedera.Catalog.View.GRID : Hedera.Catalog.View.LIST); } - ,onBasketReady: function(form) { - if (form.get('method') != 'PICKUP') - Vn.Node.setText(this.$('method'), _('Agency')); - else - Vn.Node.setText(this.$('method'), _('Warehouse')); - } - ,onItemsChange: function(model, status) { if (status !== Db.Model.Status.CLEAN) - this.$('order').style.display = 'block'; + this.$.order.style.display = 'block'; else - this.$('order').style.display = 'none'; + this.$.order.style.display = 'none'; } ,onOrderChange: function(e) { @@ -87,98 +183,17 @@ Hedera.Catalog = new Class({ Db.Model.SortWay.ASC : Db.Model.SortWay.DESC; if (sortField) - this.$('items-model').sortByName(sortField, sortWay); + this.$.items.sortByName(sortField, sortWay); this.hideMenu(); } - ,onFilterChange: function(param, newValue) { - if (newValue) - this.hideMenu(); - } - ,realmRenderer: function(builder, form) { - var link = builder.$('link'); + var link = builder.$.link; link.href = this.hash.make({ - 'form': this.hash.get('form'), - 'realm': form.get('id') + form: this.hash.$.form, + realm: form.$.id }); - - var img = builder.$('image'); - img.src = 'image/family/light/'+ form.get('code') +'.svg'; - img.title = form.get('name'); - img.alt = img.title; - } - - ,onRealmChange: function(param, newValue) { - if (newValue) { - this.$('filters').style.display = 'block'; - this.$('realm-msg').style.display = 'none'; - } else { - this.$('filters').style.display = 'none'; - this.$('realm-msg').style.display = 'block'; - } - - this.refreshTitleColor(); - this.refreshFilter(newValue, undefined); - } - - ,onTypeChange: function(param, newValue) { - this.onFilterChange(param, newValue); - this.refreshTitle(); - this.refreshFilter(undefined, newValue); - } - - ,refreshFilter: function(realm, type) { - var batch = this.$('filter-batch'); - batch.block(); - this.$('realm-value').value = realm; - this.$('type-value').value = type; - this.$('search').value = undefined; - this.$('color').value = undefined; - this.$('origin').value = undefined; - this.$('category').value = undefined; - this.$('producer').value = undefined; - batch.unblock(); - batch.changed(); - } - - ,refreshTitleColor: function() { - var realms = this.$('realms-model'); - - if (!realms.ready) - return; - - var color = null; - var realm = this.$('realm').value; - - if (realm) { - var row = realms.search('id', realm); - - if (row != -1) - color = '#'+ realms.get(row, 'color'); - } - - this.gui.$('top-bar').style.backgroundColor = color; - } - - ,refreshTitle: function() { - var types = this.$('types-model'); - - if (!types.ready) - return; - - var title = _('Catalog'); - var type = this.$('type').value; - - if (type) { - var row = types.search('id', type); - - if (row != -1) - title = types.get(row, 'name'); - } - - Vn.Node.setText(this.$('title-text'), title); } ,onRightPanelClick: function(event) { @@ -189,7 +204,7 @@ Hedera.Catalog = new Class({ this._menuShown = true; event.stopPropagation(); this.gui.showBackground(); - Vn.Node.addClass(this.$('right-panel'), 'show'); + Vn.Node.addClass(this.$.rightPanel, 'show'); this.hideMenuCallback = this.hideMenu.bind(this); document.addEventListener('click', this.hideMenuCallback); } @@ -199,7 +214,7 @@ Hedera.Catalog = new Class({ return; this.gui.hideBackground(); - Vn.Node.removeClass(this.$('right-panel'), 'show'); + Vn.Node.removeClass(this.$.rightPanel, 'show'); document.removeEventListener('click', this.hideMenuCallback); this.hideMenuCallback = null; } @@ -217,34 +232,29 @@ Hedera.Catalog = new Class({ if (this.isGuest()) return; - this.hash.set({'form': 'ecomerce/basket'}); + this.hash.setAll({form: 'ecomerce/basket'}); } ,onConfigureClick: function() { if (this.isGuest()) return; - this.hash.set({'form': 'ecomerce/checkout'}); + this.hash.setAll({form: 'ecomerce/checkout'}); } - ,repeaterFunc: function(res, form) { - res.$('item-box').addEventListener('click', - this.onAddItemClick.bind(this, form)); - } - - ,onAddItemClick: function(form, event) { + ,onAddItemClick: function(event, form) { if (event.defaultPrevented) return; event.preventDefault(); if (this.isGuest()) return; this.onEraseClick(); - this.$('card').row = form.row; - this.$('card-item').value = form.get('id'); - this.$('card-popup').show(event.currentTarget); + this.$.$card.row = form.row; + this.$.cardLot.assign({item: form.$.id}); + this.$.cardPopup.show(event.currentTarget); } ,onAddLotClick: function(column, value, row) { - var model = this.$('item-lots'); + var model = this.$.itemLots; var grouping = model.get(row, 'grouping'); var warehouse = model.get(row, 'warehouseFk'); var available = model.get(row, 'available'); @@ -261,14 +271,13 @@ Hedera.Catalog = new Class({ newAmount = available; this.items[warehouse] = newAmount; - this.$('amount').value += newAmount - lotAmount; + this.$.amount.value += newAmount - lotAmount; } else Htk.Toast.showError(_('NoMoreAmountAvailable')); } ,onConfirmClick: function() { var sql = ''; - var batch = new Sql.Batch(); var query = new Sql.String({query: 'CALL myBasket_addItem(#warehouse, #item, #amount);'}); var amountSum = 0; @@ -276,36 +285,38 @@ Hedera.Catalog = new Class({ var amount = this.items[warehouse]; amountSum += amount; - batch.addValue('warehouse', warehouse); - batch.addValue('item', this.$('card-item').value); - batch.addValue('amount', amount); - sql += query.render(batch); + const params = { + warehouse: warehouse, + item: this.$.cardLot.$.item, + amount: amount + } + sql += query.render(params); } if (amountSum > 0) { this.conn.execQuery(sql); - var itemName = this.$('card').get('item'); + var itemName = this.$.$card.get('item'); Htk.Toast.showMessage( - sprintf(_('Added%dOf%s'), amountSum, itemName)); + Vn.Value.sprintf(_('Added%dOf%s'), amountSum, itemName)); } - this.$('card-popup').hide(); + this.$.cardPopup.hide(); } ,onEraseClick: function() { - this.$('amount').value = 0; + this.$.amount.value = 0; this.items = {}; } ,onPopupClose: function() { this.onEraseClick(); - this.$('card').row = -1; - this.$('card-item').value = undefined; + this.$.$card.row = -1; + this.$.cardLot.value = undefined; } ,onCardLoad: function() { - this.$('card-popup').reset(); + this.$.cardPopup.reset(); } }); @@ -315,161 +326,3 @@ Hedera.Catalog.extend({ GRID: 1 } }); - -Vn.Filter = new Class({ - Extends: Htk.Field - ,Tag: 'vn-filter' - ,Child: 'model' - ,Properties: - { - model: - { - type: Db.Model - ,set: function(x) { - x.batch = this._batch; - this._model = x; - this._select.model = x; - } - ,get: function() { - return this._model; - } - }, - placeholder: - { - type: String - ,set: function(x) { - this._select.placeholder = x; - this._placeholder = x; - } - ,get: function() { - return this._placeholder; - } - }, - filter: - { - type: Sql.Filter - ,set: function(x) { - this._filter = x; - this._batch.addObject('filter', x); - } - ,get: function() { - return this._filter; - } - }, - } - - ,_valueColumnIndex: 0 - ,_showColumnIndex: 1 - - ,initialize: function(props) { - var node = this.createRoot('div'); - node.className = 'vn-filter'; - - this._select = new Htk.Select(); - this._select.on('mousedown', this._onMouseDown, this); - this._select.on('changed', this._onChange, this); - this._select.on('ready', this._onReady, this); - this.node.appendChild(this._select.node); - - this._ul = this.createElement('ul'); - this.node.appendChild(this._ul); - - this._batch = new Sql.Batch(); - this.parent(props); - } - - ,_onMouseDown: function() { - if (this._model && this._model.status === Db.Model.Status.CLEAN) - this._model.refresh(); - } - - ,_onCloseClick: function() { - this._removeSelectionNode(); - this._changeValue(undefined); - } - - ,_removeSelectionNode: function() { - if (this._lastLi) { - Vn.Node.remove(this._lastLi); - this._lastLi = null; - this._label = null; - } - } - - ,_onChange: function() { - if (this._select.value === null - || this._select.value === undefined) - return; - - this._realSetValue(this._select.value); - } - - ,_onReady: function() { - if (this._emptyLabel) - this._refreshLabel(); - } - - ,_changeValue: function(newValue) { - this._batch.block(); - this.value = newValue; - this._batch.unblock(); - } - - ,_onTimeout: function() { - this._select.value = null; - } - - ,putValue: function(value) { - this._onMouseDown(); - this._realSetValue(value); - } - - ,_realSetValue: function(value) { - this._removeSelectionNode(); - - if (value === null || value === undefined) - return; - - var li = this._lastLi = this.createElement('li'); - this._ul.appendChild(li); - - var button = this.createElement('button'); - button.addEventListener('click', - this._onCloseClick.bind(this, li)); - li.appendChild(button); - - var icon = new Htk.Icon({ - icon: 'close', - alt: _('Close') - }); - button.appendChild(icon.node); - - var text = this._label = this.createTextNode(''); - li.appendChild(text); - - setTimeout(this._onTimeout.bind(this)); - - this._changeValue(value); - this._refreshLabel(); - } - - ,_refreshLabel: function() { - if (!this._label) - return; - - var row = -1; - - if (this._model.ready) - row = this._model.searchByIndex(this._valueColumnIndex, this._value); - - if (row != -1) { - var label = this._model.getByIndex(row, this._showColumnIndex); - this._label.nodeValue = label; - this._emptyLabel = false; - } else { - this._emptyLabel = true; - this._label.nodeValue = _('Loading...'); - } - } -}); - diff --git a/forms/ecomerce/catalog/locale/ca.yml b/forms/ecomerce/catalog/locale/ca.yml index e57c6f2e..31ee9147 100644 --- a/forms/ecomerce/catalog/locale/ca.yml +++ b/forms/ecomerce/catalog/locale/ca.yml @@ -2,7 +2,7 @@ Catalog: Catàleg SearchResults: Resultats de cerca SelectFamily: Selecciona una família Choose filter from right menu: Tria un filtre en el menú de la dreta -Choose a realm: Tria un regne +Choose a realm: Tria un categoria ArticleNotFound: Artcle no trobat ArticleNotAvailable: Article no disponible List view: Vista de lista @@ -15,7 +15,7 @@ Warehouse: Magatzem Filter by: Filtrar per Order by: Ordenar per Search: Cercar -Change: Cambiar +Modify: Modificar Size: Mida Realm: Regne Family: Família @@ -35,6 +35,7 @@ Lower size: Mida més petita Higher size: Mida més gran '%.0d Units': '%.0d Unitats' for: per +Zoom image: Ampliar imatge AddToBasket: Afegir article Add: Afegir Erase: Esborrar diff --git a/forms/ecomerce/catalog/locale/en.yml b/forms/ecomerce/catalog/locale/en.yml index 93ca9434..6940d979 100644 --- a/forms/ecomerce/catalog/locale/en.yml +++ b/forms/ecomerce/catalog/locale/en.yml @@ -2,7 +2,7 @@ Catalog: Catalog SearchResults: Search results SelectFamily: Select family Choose filter from right menu: Choose a filter from the right menu -Choose a realm: Choose a realm +Choose a realm: Choose a category ArticleNotFound: Item not found ArticleNotAvailable: Item not available List view: List view @@ -15,7 +15,7 @@ Warehouse: Warehouse Filter by: Filter by Order by: Order by Search: Search -Change: Change +Modify: Modify Size: Size Realm: Realm Family: Family @@ -35,6 +35,7 @@ Lower size: Lower size Higher size: Higher size '%.0d Units': '%.0d Units' for: for +Zoom image: Zoom image AddToBasket: Add to basket Add: Add Erase: Remove diff --git a/forms/ecomerce/catalog/locale/es.yml b/forms/ecomerce/catalog/locale/es.yml index 6af7891a..776ef9ba 100644 --- a/forms/ecomerce/catalog/locale/es.yml +++ b/forms/ecomerce/catalog/locale/es.yml @@ -2,7 +2,7 @@ Catalog: Catálogo SearchResults: Resultados de búsqueda SelectFamily: Selecciona una familia Choose filter from right menu: Elige un filtro en el menú de la derecha -Choose a realm: Elige un reino +Choose a realm: Elige una categoría ArticleNotFound: Artículo no encontrado ArticleNotAvailable: Artículo no disponible List view: Vista de lista @@ -15,7 +15,7 @@ Warehouse: Almacén Filter by: Filtrar por Order by: Ordenar por Search: Buscar -Change: Cambiar +Modify: Modificar Size: Medida Realm: Reino Family: Familia @@ -35,6 +35,7 @@ Higher size: Medida más grande Relevancy: Relevancia '%.0d Units': '%.0d Unidades' for: por +Zoom image: Ampliar imagen AddToBasket: Añadir artículo Add: Añadir Erase: Borrar diff --git a/forms/ecomerce/catalog/locale/fr.yml b/forms/ecomerce/catalog/locale/fr.yml index 1aa1ae19..bd6266b7 100644 --- a/forms/ecomerce/catalog/locale/fr.yml +++ b/forms/ecomerce/catalog/locale/fr.yml @@ -2,7 +2,7 @@ Catalog: Catalogue SearchResults: Résultats de la recherche SelectFamily: Choisissez une famille Choose filter from right menu: Choisissez un filtre dans le menu de droite -Choose a realm: Choisissez un royaume +Choose a realm: Choisissez une catégorie ArticleNotFound: Article non trouvé ArticleNotAvailable: Article non disponible List view: Liste voir @@ -15,7 +15,7 @@ Warehouse: Entrepôt Filter by: Filtrer par Order by: Trier par Search: Recherche -Change: Modifier +Modify: Modifier Size: Mesure Realm: Famille Family: Sous-genre @@ -35,6 +35,7 @@ Lower size: Taille le plus bas Higher size: Taille le plus élevé '%.0d Units': '%.0d Unités' for: pour +Zoom image: Agrandir l'image AddToBasket: Ajouter article Add: Ajouter Erase: Effacer diff --git a/forms/ecomerce/catalog/locale/pt.yml b/forms/ecomerce/catalog/locale/pt.yml index 982b3fef..9ade502e 100644 --- a/forms/ecomerce/catalog/locale/pt.yml +++ b/forms/ecomerce/catalog/locale/pt.yml @@ -2,7 +2,7 @@ Catalog: Catálogo SearchResults: Resultados de busca SelectFamily: Seleccione uma família Choose filter from right menu: Escolha um filtro no menú da direita -Choose a realm: Escolha um reino +Choose a realm: Escolha uma categoria ArticleNotFound: Ítem não encontrado ArticleNotAvailable: Ítem não disponível List view: Ver como lista @@ -15,7 +15,7 @@ Warehouse: Armazém Filter by: Filtrar por Order by: Ordenar por Search: Buscar -Change: Modificar +Modify: Modificar Size: Medida Realm: Reino Family: Família @@ -35,6 +35,7 @@ Lower size: Tamanho menor Higher size: Tamanho maior '%.0d Units': '%.0d Unidades' por: para +Zoom image: Mais zoom AddToBasket: Adicionar à Cesta Add: Adicionar Erase: Eliminar diff --git a/forms/ecomerce/catalog/style.css b/forms/ecomerce/catalog/style.css index 7d8a8b6d..31aa4498 100644 --- a/forms/ecomerce/catalog/style.css +++ b/forms/ecomerce/catalog/style.css @@ -1,180 +1,131 @@ -.catalog -{ - margin-right: 17em; +.catalog { + margin-right: 18em; } - -/* Topbar */ - -.catalog-actions > .htk-search-entry -{ - margin-top: .8em; - margin-right: .4em; -} - -/* Right panel */ - -.right-panel -{ - position: fixed; - top: 3.9em; - bottom: 0; - right: 0; - width: 17em; - background-color: white; - box-shadow: 0 0 .2em rgba(1, 1, 1, .2); - overflow: auto; -} -.right-panel .basket-info -{ - background-color: #00ACC1; - color: white; - box-shadow: 0 .1em .1em rgba(1, 1, 1, .3); - padding: 1.2em 2em; -} -.right-panel .basket-info > button -{ - color: #E0F2F1; - margin: 0 auto; - display: block; - margin-top: .4em; -} -.right-panel .basket-info > p -{ - margin: 0; - padding: .4em 0; - font-size: 1.1em; - text-align: left; +.title ._subtitle { + font-size: .7rem; + color: #bbb; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } -.right-panel .filter -{ - padding: 1em; + +/* Right panel */ + +.right-panel { + position: fixed; + top: 4.4em; + bottom: 0; + right: 0; + width: 18em; + overflow: auto; + background-color: #fafafa; +} +.right-panel .basket-info { + background-color: #8cc63f; + color: white; + padding: 1.2em 2em; + border-radius: .5em; + margin: 1em; + text-align: center; +} +.right-panel .basket-info > button { + color: white; + background-color: rgba(0, 0, 0, .1); + margin: 0 auto; + display: block; + margin-top: 10px; + padding: 10px 15px; +} +.right-panel .basket-info > button:hover { + background-color: white; + color: #60872c; +} +.right-panel .basket-info > p { + margin: 0; + padding: .4em 0; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.right-panel .filter { + margin: 1em; +} +.right-panel .categories, +.right-panel .filters, +.right-panel .order { + margin: 1.5em 0; } .right-panel .filters, -.right-panel .order -{ +.right-panel .order { display: none; } -.right-panel .realm-msg -{ +.right-panel .realm-msg { margin-top: 1em; } -.right-panel .realm-msg > h1 -{ +.right-panel .realm-msg > h5 { font-weight: normal; text-align: center; padding: 2.5em 0; color: #777; } -.right-panel h2 -{ +.right-panel h2 { font-weight: normal; - padding: .4em 0; color: #777; font-size: 1.1em; } -.right-panel .realms > div > div -{ +.right-panel .realms > div > div { text-align: center; } -.right-panel .realms a -{ +.right-panel .realms a { display: inline-block; - width: 30%; + width: 25%; padding: .6em; box-sizing: border-box; + border-radius: 50%; } -.right-panel .realms a:hover -{ +.right-panel .realms a:hover { background-color: rgba(1, 1, 1, .05); - border-radius: .15em; } -.right-panel .realms a > img -{ +.right-panel .realms a > img { display: block; padding: 0; width: 100%; } -.right-panel .vn-filter, -.right-panel select -{ - margin: 0 auto; - margin-bottom: .7em; - width: 90%; - display: block; -} -.vn-filter > ul -{ - margin: 0; - list-style-type: none; - text-align: left; - color: #666; - padding-left: .8em; -} -.vn-filter li -{ - margin: 0; - margin-top: .3em; - line-height: 2em; - max-width: 90%; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} -.vn-filter li > button -{ - vertical-align: middle; - text-align: center; - padding: .2em; - margin: 0; - margin-right: .2em; -} -.right-panel .filters > button -{ - display: block; - margin: 0 auto; +.right-panel .filters > button { margin-top: 1em; } /* Items */ -.item-box -{ - transition: background-color 200ms ease-in; +.item-box { + display: flex; + box-sizing: border-box; } -.item-box:hover -{ - cursor: pointer; - background-color: #eee; +.item-box > .htk-image { + flex: none; } -.item-info -{ +.item-box > .item-info { + flex: auto; position: relative; } -.item-info .second-category -{ +.item-info .second-category { font-weight: bold; color: orange; } -.item-info .third-category -{ +.item-info .third-category { font-weight: bold; color: red; } -.item-info > h2 -{ +.item-info > h2 { padding: 0; margin-bottom: .15em; font-weight: normal; font-size: 1em; text-overflow: ellipsis; overflow: hidden; - max-height: 3.8em; + max-height: 3em; } -.item-info > p -{ +.item-info > p { margin: 0; padding: 0; color: #777; @@ -183,24 +134,29 @@ white-space: nowrap; overflow: hidden; } -.item-info .sub-name -{ +.item-info .sub-name { text-transform: uppercase; padding: 0; margin-bottom: .2em; font-size: .9em; } -.item-info > .htk-button -{ +.item-info > .htk-button { margin: -0.3em; padding: .3em; } -.item-info > .htk-button > img -{ +.item-info > .htk-button > img { vertical-align: middle; } -.item-info .available-price -{ +.item-info .item-id { + float: right; + font-size: .8rem; + line-height: 1.8em; + color: #777; +} +.item-info .available-price { + position: absolute; + bottom: 0; + right: 0; white-space: nowrap; font-size: .95em; text-align: right; @@ -208,32 +164,27 @@ column-gap: .2em; display: flex; } -.item-info .available-price > * -{ +.item-info .available-price > * { border-radius: .2em; - padding: .3em; + padding: .1em .3em; border: .1em transparent solid; - background-color: white; + box-sizing: border-box; } -.item-info .grouping -{ - width: 2em; +.item-info .grouping { + width: 38px; background-color: #ddd; } -.item-info .available -{ - width: 3.3em; +.item-info .available { + width: 65px; border-color: #bbb; color: #777; } -.item-info .price -{ - width: 4em; +.item-info .price { + width: 75px; border-color: #9cbc28; color: #748c1e; } -.tags -{ +.tags { font-size: .8em; display: table; color: #333; @@ -246,129 +197,38 @@ padding-right: .5em; } -/* List view */ - -.list-view -{ - max-width: 30em; - margin: 0 auto; - padding: 1em; -} -.list-view .item-box -{ - display: block; - position: relative; - width: 100%; - margin: 0; - height: 5.5em; - overflow: visible; - border-bottom: 1px solid #DDD; -} -.list-view .item-box > .htk-image -{ - margin: 1em; - width: 3.5em; - height: 3.5em; - float: left; - overflow: hidden; -} -.list-view .item-box > .htk-image > img -{ - border-radius: 50%; -} -.list-view .item-info -{ - position: absolute; - left: 5.5em; - right: 0; - top: 0; - bottom: 0; - margin: .8em; - margin-left: 0; -} -.list-view .item-info > h2 -{ - font-size: 1em; - white-space: nowrap; -} -.list-view .item-info > .color -{ - display: none; -} -.list-view .item-info > .htk-button -{ - float: right; -} -.list-view .item-info .available-price -{ - clear: both; - float: right; - position:absolute; - bottom: 0; - right: 0; -} -.list-view .item-info .tags -{ - display: block; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} -.list-view .item-info .tags > tr -{ - display: inline-block; -} -.list-view .item-info .tags td -{ - display: inline-block; - padding-right: .5em; -} -.list-view .item-info .tags td:first-child -{ - display: none; -} - /* Grid view */ -.grid-view -{ - padding: 1em; - padding-right: .2em; - padding-bottom: .4em; - text-align: center; +.grid-view > * { + display: flex; + gap: 16px; + flex-wrap: wrap; + justify-content: center; } -.grid-view .item-box -{ - text-align: left; - position: relative; - display: inline-block; - width: 24em; - margin: 0; - margin-right: .8em; - margin-bottom: .6em; - height: 11em; +.grid-view .item-box { + border-radius: .6em; + box-shadow: .05em .05em .2em rgba(0, 0, 0, .1); + overflow: hidden; + background-color: white; + + flex-direction: column; + width: 260px; + height: 425px; overflow: hidden; } -.grid-view .item-box > .htk-image -{ - width: 11em; - height: 100%; - float: left; +.grid-view .item-box:hover { + background-color: #efefef; } -.grid-view .item-info -{ - position: absolute; - left: 11.4em; - right: 0; - top: 0; - bottom: 0; - margin: .6em; +.grid-view .item-info { + margin: 10px; } -.grid-view .item-info .available-price -{ - position: absolute; - bottom: 0; - right: 0; +.grid-view .item-box > .htk-image { + width: 260px; + height: 260px; +} +.grid-view .item-box > .item-info { + flex: auto; + overflow: hidden; } .grid-view .item-info .tags td { overflow: hidden; @@ -379,109 +239,138 @@ line-height: 1.1em; } +/* List view */ + +.list-view { + border-radius: .6em; + box-shadow: .05em .05em .2em rgba(0, 0, 0, .1); + overflow: hidden; + background-color: white; + + max-width: 544px; + margin: 0 auto; +} +.list-view .item-box { + gap: 10px; + margin: 0; + padding: 10px; + height: 130px; + overflow: visible; + border-bottom: 1px solid #DDD; +} +.list-view .item-box:last-child { + border-bottom: none; +} +.list-view .item-box > .htk-image { + width: 110px; + height: 110px; + border-radius: 50%; +} +.list-view .item-info { + overflow: hidden; +} +.list-view .item-info > h2 { + font-size: 1rem; + white-space: nowrap; +} +.list-view .item-info > .color { + display: none; +} +.list-view .item-info > .htk-button { + float: right; +} +.list-view .item-info .tags { + display: block; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +.list-view .item-info .tags > tr { + display: inline-block; +} +.list-view .item-info .tags td { + display: inline-block; + padding-right: .5em; +} +.list-view .item-info .tags td:first-child { + display: none; +} + /* Card */ -.card-popup -{ +.card-popup { overflow: auto; } -.item-card -{ +.item-card { font-size: .9em; width: 20em; } -.item-card .top -{ +.item-card .top { padding: 1em; } -.item-card .item-info -{ +.item-card .item-info { margin-left: 9em; height: 8em; } -.item-card .htk-image -{ +.item-card .htk-image { height: 8em; width: 8em; float: left; border-radius: .3em; } -.item-card .desc -{ +.item-card .desc { clear: both; margin-top: 1em 0; font-size: .9em; } -.item-card .lots-grid -{ +.item-card .lots-grid { border-top: 1px solid #DDD; } -.item-card .lots-grid tr -{ +.item-card .lots-grid tr { height: 3em; } -.item-card .lots-grid .cell-spin -{ +.item-card .lots-grid .cell-spin { max-width: initial; width: 3em; } -.item-card .lots-grid .price-kg -{ +.item-card .lots-grid .price-kg { font-size: .8em; color: #999; width: 1px; } -.item-card .lots-grid .cell-text -{ +.item-card .lots-grid .cell-text { max-width: initial; width: auto; } -.item-card .lots-grid .cell-button -{ +.item-card .lots-grid .cell-button { max-width: initial; width: 1em; } -.item-card .footer -{ - text-align: center; - background-color: #009688; +.item-card .footer { + display: flex; + align-items: center; + justify-content: space-between; + background-color: #1a1a1a; color: white; - line-height: 2em; - padding: .4em; + padding: 10px; } -.item-card .footer > button -{ - margin: 0; +.item-card .footer > button:hover { + background-color: rgba(255, 255, 255, .1); } -.item-card .erase -{ - float: left; -} -.item-card .confirm -{ - float: right; -} -.item-card .erase > img, -.item-card .confirm > img -{ +.item-card .footer > button > .htk-icon { display: block; - height: 1em; } /* Mobile */ -.catalog-actions > button.menu -{ +.catalog-actions > button.menu { display: none; - padding: 1.1em .5em; } -.catalog-actions > button.menu > img -{ - height: 1.8em; +.catalog-actions > button.menu > .htk-icon { + display: block; } -@media (max-width: 960px) -{ +@media (max-width: 960px) { .catalog-actions > button.menu { display: block; @@ -489,15 +378,15 @@ .right-panel { top: 0; - right: -17em; + right: -18em; z-index: 20; transition: transform 200ms ease-out; -webkit-transition: transform 200ms ease-out; } .right-panel.show { - transform: translateZ(0) translateX(-17em); - -webkit-transform: translateZ(0) translateX(-17em); + transform: translateZ(0) translateX(-18em); + -webkit-transform: translateZ(0) translateX(-18em); } .catalog { diff --git a/forms/ecomerce/catalog/ui.xml b/forms/ecomerce/catalog/ui.xml index 9aa91d6b..5a33f867 100644 --- a/forms/ecomerce/catalog/ui.xml +++ b/forms/ecomerce/catalog/ui.xml @@ -1,46 +1,93 @@ <vn> +<div id="title"> + <h1 id="title-text"><t>Catalog</t></h1> + <div id="subtitle"></div> +</div> +<div id="actions" class="catalog-actions"> + <htk-search-entry form="params" column="search"/> + <htk-bar-button + id="view-button" + tip="_Switch view" + icon="view_list" + on-click="this.onSwitchViewClick()"/> + <htk-bar-button + icon="shopping_cart_checkout" + tip="_ShoppingBasket" + on-click="this.onBasketClick()"/> + <button + class="menu" + on-click="onShowMenuClick"> + <htk-icon name="menu" alt="_Menu"/> + </button> +</div> <vn-group> - <vn-param id="card-item"/> - <vn-param id="realm" on-changed="onRealmChange"/> - <vn-param id="type" on-changed="onTypeChange"/> - <vn-param id="search" on-changed="onFilterChange"/> - <vn-param id="color" on-changed="onFilterChange"/> - <vn-param id="origin" on-changed="onFilterChange"/> - <vn-param id="category" on-changed="onFilterChange"/> - <vn-param id="producer" on-changed="onFilterChange"/> - <vn-hash-param key="realm" param="realm"/> - <vn-hash-param key="type" param="type"/> - <sql-filter type="AND" id="filter"> - <sql-filter-item type="EQUAL" primary="false" id="op-realm"> - <sql-field target="t" name="categoryFk"/> - <sql-value id="realm-value"/> - </sql-filter-item> - <sql-filter-item type="EQUAL" id="op-type"> - <sql-field target="i" name="typeFk"/> - <sql-value id="type-value"/> - </sql-filter-item> - <sql-filter-item type="LIKE" id="op-name"> - <sql-field target="i" name="longName"/> - <sql-search-tags param="search"/> - </sql-filter-item> - <sql-filter-item type="EQUAL" id="op-color"> - <sql-field target="i" name="inkFk"/> - <sql-value param="color"/> - </sql-filter-item> - <sql-filter-item type="EQUAL" id="op-origin"> - <sql-field target="i" name="originFk"/> - <sql-value param="origin"/> - </sql-filter-item> - <sql-filter-item type="EQUAL" id="op-category"> - <sql-field target="i" name="category"/> - <sql-value param="category"/> - </sql-filter-item> - <sql-filter-item type="EQUAL" id="op-producer"> - <sql-field target="i" name="producerFk"/> - <sql-value param="producer"/> - </sql-filter-item> - </sql-filter> - <db-form id="basket" on-ready="onBasketReady"> + <vn-lot-query id="params" on-change="this.onFilterChange()"> + <vn-spec name="search" type="String"/> + <vn-spec name="realm" type="Number"/> + <vn-spec name="type" type="Number"/> + </vn-lot-query> + <vn-lot id="filter-lot"/> +</vn-group> +<vn-group> + <sql-filter-item + id="id-op" + type="EQUAL" + target="i" + field="id" + param="search"/> + <sql-operation + id="search-op" + type="OR"> + <sql-filter-item + type="LIKE" + target="i" + field="longName" + param="search"/> + <sql-filter-item + type="LIKE" + target="i" + field="subname" + param="search"/> + </sql-operation> + <sql-filter-item + id="realm-op" + type="EQUAL" + target="t" + field="categoryFk" + param="realm"/> + <sql-filter-item + id="type-op" + type="EQUAL" + target="i" + field="typeFk" + param="type"/> + <sql-filter-item + id="color-op" + type="EQUAL" + target="i" + field="inkFk" + param="color"/> + <sql-filter-item + type="EQUAL" + id="origin-op" + target="i" + field="originFk" + param="origin"/> + <sql-filter-item + type="EQUAL" + id="category-op" + target="i" + field="category" + param="category"/> + <sql-filter-item + id="producer-op" + type="EQUAL" + target="i" + field="producerFk" + param="producer"/> +</vn-group> +<vn-group> + <db-form v-model="basket"> <db-model property="model"> SELECT b.id, b.sent, a.description agency, m.code method FROM myBasket b @@ -49,7 +96,8 @@ </db-model> </db-form> <db-model - id="items-model" + id="items" + auto-load="false" result-index="3" on-status-changed="onItemsChange"> DROP TEMPORARY TABLE IF EXISTS tmp.item; @@ -61,7 +109,7 @@ JOIN vn.itemType t ON t.id = i.typeFk WHERE #filter; CALL myBasket_calcCatalogFull; - SELECT i.id, i.description, i.longName item, i.subName, + SELECT i.id, i.longName item, i.subName, i.tag5, i.value5, i.tag6, i.value6, i.tag7, i.value7, i.relevancy, i.size, i.category, k.name ink, p.name producer, o.name origin, @@ -85,87 +133,64 @@ tmp.ticketComponent, tmp.ticketLot, tmp.zoneGetShipped; - <sql-batch property="batch" id="filter-batch"> - <custom> - <item name="filter" object="filter"/> - </custom> - </sql-batch> </db-model> - <db-form id="card" model="items-model"/> - <sql-batch id="card-batch"> - <custom> - <item name="item" param="card-item"/> - </custom> - </sql-batch> + <db-form id="$card" v-model="card" model="items"/> + <vn-lot id="card-lot"/> </vn-group> -<div id="title"> - <h1 id="title-text"><t>Catalog</t></h1> -</div> -<div id="actions" class="catalog-actions"> - <button class="menu" on-click="onShowMenuClick"> - <img src="image/icon/dark/menu.svg" alt="_Menu"/> - </button> - <htk-bar-button - icon="basket" - tip="_ShoppingBasket" - on-click="onBasketClick"/> - <htk-bar-button - id="view-button" - tip="_Switch view" - on-click="onSwitchViewClick"/> - <htk-search-entry - param="search"/> -</div> <div id="form" class="catalog"> <div id="main" class="main"> <htk-repeater id="grid-view" empty-message="_Choose filter from right menu" form-id="item" - model="items-model" - renderer="repeaterFunc"> + model="items"> <custom> <div id="item-box" - class="box item-box" - title="_AddToBasket"> + class="item-box clickable" + title="{{_('AddToBasket')}}" + on-click="this.onAddItemClick($event, $iter)"> <htk-image directory="catalog" subdir="200x200" - form="item" + form="$iter" column="image" stamp-column="updated" - full-dir="1600x900"/> + full-dir="1600x900" + title="_Zoom image"/> <div class="item-info"> <h2> - <htk-text form="item" column="item"/> + <span class="item-id"> + #{{item.id}} + </span> + {{item.item}} </h2> <p class="sub-name"> - <htk-text form="item" column="subName"/> + {{item.subName}} </p> <table class="tags"> <tr> - <td><htk-text form="item" column="tag5"/></td> - <td><htk-text form="item" column="value5"/></td> + <td>{{item.tag5}}</td> + <td>{{item.value5}}</td> </tr> <tr> - <td><htk-text form="item" column="tag6"/></td> - <td><htk-text form="item" column="value6"/></td> + <td>{{item.tag6}}</td> + <td>{{item.value6}}</td> </tr> <tr> - <td><htk-text form="item" column="tag7"/></td> - <td><htk-text form="item" column="value7"/></td> + <td>{{item.tag7}}</td> + <td>{{item.value7}}</td> </tr> </table> <div class="available-price"> <span class="grouping" title="_MinimalGrouping"> - <htk-text form="item" column="grouping" format="x%.0d"/> + {{Vn.Value.format(item.grouping, 'x%.0d')}} </span> <span class="available" title="_Available"> - <htk-text form="item" column="available"/> + {{item.available}} </span> <span class="price" title="_GroupingPrice"> - <htk-text form="item" column="price" format="%.2d€"/> + {{Vn.Value.format(item.price, '%.02d€')}} </span> </div> </div> @@ -176,29 +201,26 @@ </div> <div id="right-panel" class="right-panel" on-click="onRightPanelClick"> <div class="basket-info"> + <p>{{Vn.Value.format(basket.sent, '%D')}}</p> <p> - <htk-text form="basket" column="sent" format="%D"/> + {{_(basket.method != 'PICKUP' ? 'Agency' : 'Warehouse')}} + {{basket.agency}} </p> - <p> - <span id="method"/> - <htk-text form="basket" column="agency"/> - </p> - <button class="thin" on-click="onConfigureClick"> - <t>Change</t> + <button class="thin" on-click="this.onConfigureClick()"> + <t>Modify</t> </button> </div> <div class="filter"> <div class="categories"> <div class="realms"> <htk-repeater - model="realms-model" - form-id="realm-form" + form-id="form" renderer="realmRenderer" class="realms-box"> <db-model - id="realms-model" + id="realms" property="model" - on-status-changed="refreshTitleColor"> + on-status-changed="refreshTitle"> SELECT c.id, l.name, c.color, c.code FROM vn.itemCategory c JOIN vn.itemCategoryL10n l ON l.id = c.id @@ -207,7 +229,11 @@ </db-model> <custom> <a id="link"> - <img id="image"/> + <img + id="image" + src="{{`image/family/black/${form.code}.svg`}}" + title="{{form.name}}" + alt="{{form.name}}"/> </a> </custom> </htk-repeater> @@ -215,17 +241,20 @@ </div> </div> <div id="realm-msg" class="realm-msg"> - <h1><t>Choose a realm</t></h1> + <h5><t>Choose a realm</t></h5> </div> <div id="filters" class="filters"> <h2><t>Filter by</t></h2> - <vn-filter + <htk-combo placeholder="_Family" - param="type"> + form="params" + column="type" + id="type-filter"> <db-model - id="types-model" + id="types" property="model" conn="conn" + lot="params" result-index="1" on-status-changed="refreshTitle"> CALL myBasket_getAvailable; @@ -234,21 +263,22 @@ JOIN vn.itemType t ON t.id = i.typeFk JOIN tmp.itemAvailable a ON a.id = i.id JOIN vn.itemTypeL10n l ON l.id = t.id - WHERE t.`order` >= 0 AND #filter + WHERE t.`order` >= 0 + AND t.categoryFk = #realm ORDER BY t.`order`, l.name; DROP TEMPORARY TABLE tmp.itemAvailable; </db-model> - <sql-filter property="filter" type="AND"> - <sql-filter-item type="EQUAL"> - <sql-field name="categoryFk" target="t"/> - <sql-value param="realm"/> - </sql-filter-item> - </sql-filter> - </vn-filter> - <vn-filter + </htk-combo> + <htk-combo placeholder="_Color" - param="color"> - <db-model property="model" auto-load="false" result-index="1"> + form="params" + column="color" + on-mousedown="colors.lazyRefresh()"> + <db-model + id="colors" + property="model" + auto-load="false" + result-index="1"> CALL myBasket_getAvailable; SELECT DISTINCT l.id, l.name FROM vn.item i @@ -259,19 +289,17 @@ ORDER BY name; DROP TEMPORARY TABLE tmp.itemAvailable; </db-model> - <sql-filter property="filter" always-ready="true" type="AND"> - <pointer object="op-realm"/> - <pointer object="op-type"/> - <pointer object="op-name"/> - <pointer object="op-origin"/> - <pointer object="op-category"/> - <pointer object="op-producer"/> - </sql-filter> - </vn-filter> - <vn-filter + </htk-combo> + <htk-combo placeholder="_Producer" - param="producer"> - <db-model property="model" auto-load="false" result-index="1"> + form="params" + column="producer" + on-mousedown="producers.lazyRefresh()"> + <db-model + id="producers" + property="model" + auto-load="false" + result-index="1"> CALL myBasket_getAvailable; SELECT DISTINCT p.id, p.name FROM vn.item i @@ -282,19 +310,17 @@ ORDER BY name; DROP TEMPORARY TABLE tmp.itemAvailable; </db-model> - <sql-filter property="filter" always-ready="true" type="AND"> - <pointer object="op-realm"/> - <pointer object="op-type"/> - <pointer object="op-name"/> - <pointer object="op-origin"/> - <pointer object="op-color"/> - <pointer object="op-category"/> - </sql-filter> - </vn-filter> - <vn-filter + </htk-combo> + <htk-combo placeholder="_Origin" - param="origin"> - <db-model property="model" auto-load="false" result-index="1"> + form="params" + column="origin" + on-mousedown="origins.lazyRefresh()"> + <db-model + id="origins" + property="model" + auto-load="false" + result-index="1"> CALL myBasket_getAvailable; SELECT DISTINCT o.id, l.name, o.code FROM vn.item i @@ -306,19 +332,17 @@ ORDER BY name; DROP TEMPORARY TABLE tmp.itemAvailable; </db-model> - <sql-filter property="filter" always-ready="true" type="AND"> - <pointer object="op-realm"/> - <pointer object="op-type"/> - <pointer object="op-name"/> - <pointer object="op-color"/> - <pointer object="op-category"/> - <pointer object="op-producer"/> - </sql-filter> - </vn-filter> - <vn-filter + </htk-combo> + <htk-combo placeholder="_Category" - param="category"> - <db-model property="model" auto-load="false" result-index="1"> + form="params" + column="category" + on-mousedown="categorys.lazyRefresh()"> + <db-model + id="categorys" + property="model" + auto-load="false" + result-index="1"> CALL myBasket_getAvailable; SELECT DISTINCT i.category, i.category FROM vn.item i @@ -328,15 +352,7 @@ ORDER BY category; DROP TEMPORARY TABLE tmp.itemAvailable; </db-model> - <sql-filter property="filter" always-ready="true" type="AND"> - <pointer object="op-realm"/> - <pointer object="op-type"/> - <pointer object="op-name"/> - <pointer object="op-color"/> - <pointer object="op-origin"/> - <pointer object="op-producer"/> - </sql-filter> - </vn-filter> + </htk-combo> </div> <div id="order" class="order"> <h2><t>Order by</t></h2> @@ -390,10 +406,10 @@ modal="true" on-closed="onPopupClose"> <div property="child-node" class="item-card"> - <db-form id="card-extend"> + <db-form vModel="extendedCard"> <db-model property="model" - batch="card-batch" + lot="card-lot" on-status-changed-after="onCardLoad"> SELECT i.description, o.name origin FROM vn.item i @@ -405,33 +421,23 @@ <htk-image directory="catalog" subdir="200x200" - form="card" + form="$card" column="image" stamp-column="updated" full-dir="1600x900" conn="conn" editable="true"/> <div class="item-info"> - <h2> - <htk-text form="card" column="item"/> - </h2> - <p class="sub-name"> - <htk-text form="card" column="subName"/> - </p> - <p> - #<htk-text form="card" column="id"/> - </p> - <p> - <htk-text form="card" column="stems" format="_%.0d Units"/> - </p> + <h2>{{card.item}}</h2> + <p class="sub-name">{{card.subname}}</p> + <p>#{{card.id}}</p> + <p>{{Vn.Value.format(card.stems, _('%.0d Units'))}}</p> </div> - <p class="desc"> - <htk-text form="card-extend" column="description" id="desc"/> - </p> + <p class="desc">{{extendedCard.description}}</p> <htk-repeater show-status="false" form-id="tag" class="tags"> <db-model property="model" - batch="card-batch" + lot="card-lot" on-status-changed-after="onCardLoad"> SELECT l.name, it.value FROM vn.itemTag it @@ -443,8 +449,8 @@ </db-model> <custom> <tr> - <td><htk-text form="tag" column="name"/></td> - <td><htk-text form="tag" column="value"/></td> + <td>{{tag.name}}</td> + <td>{{tag.value}}</td> </tr> </custom> </htk-repeater> @@ -455,7 +461,7 @@ property="model" result-index="1" on-status-changed-after="onCardLoad" - batch="card-batch"> + lot="card-lot"> CALL myBasket_calcCatalogFromItem(#item); SELECT l.warehouseFk, w.name warehouse, p.`grouping`, p.price, p.priceKg, p.rate, l.available @@ -480,20 +486,25 @@ on-clicked="onAddLotClick"/> </htk-grid> <div class="footer"> - <button on-click="onEraseClick" title="_Erase" class="erase"> + <button + title="_Erase" + on-click="this.onEraseClick()" + class="erase"> <htk-icon - icon="delete" + name="delete" theme="dark" alt="_Erase"/> </button> <htk-text id="amount"/> - <button on-click="onConfirmClick" title="_Confirm" class="confirm"> + <button + title="_Confirm" + on-click="this.onConfirmClick()" + class="confirm"> <htk-icon - icon="ok" + name="done" theme="dark" alt="_Confirm"/> </button> - <div class="clear"/> </div> </div> </htk-popup> diff --git a/forms/ecomerce/checkout/checkout.js b/forms/ecomerce/checkout/checkout.js index 216a5e38..b20e6ad9 100644 --- a/forms/ecomerce/checkout/checkout.js +++ b/forms/ecomerce/checkout/checkout.js @@ -4,32 +4,27 @@ Hedera.Checkout = new Class({ activate: function() { this.autoStepLocked = true; - this.$('assistant').stepsIndex = this.agencySteps; + this.$.assistant.stepsIndex = this.agencySteps; this.today = new Date(); this.today.setHours(0, 0, 0, 0); }, onValuesReady: function() { - var orderForm = this.$('order-form'); - var defaultsForm = this.$('defaults'); + const orderForm = this.$.orderForm; + const defaultsForm = this.$.defaults; if (!(orderForm.ready && defaultsForm.ready)) return; - var date; - - if (orderForm.numRows > 0) { - var i = orderForm; - date = i.get('sent'); - } else - var i = defaultsForm; + let date; + const row = orderForm.$ || defaultsForm.$ || {}; if (!date || date.getTime() < (new Date()).getTime()) { date = new Date(); date.setHours(0, 0, 0, 0); - var addDays = 0; + let addDays = 0; switch(date.getDay()) { case 6: // Saturday @@ -40,37 +35,31 @@ Hedera.Checkout = new Class({ break; } - if (i.get('deliveryMethod') != 'PICKUP') + if (row.deliveryMethod != 'PICKUP') addDays++; date.setDate(date.getDate() + addDays); } - - this.$('date').value = date; - this.$('method').value = i.get('deliveryMethod'); - this.$('agency').value = i.get('agencyModeFk'); - this.$('address').value = i.get('addressFk'); + this.$.lot.assign({ + date: date, + method: row.deliveryMethod, + agency: row.agencyModeFk, + address: row.addressFk + }); this.autoStepLocked = false; }, disableButtons: function(disable) { - this.$('assistant-bar').disabled = disable; + this.$.assistantBar.disabled = disable; }, onConfirmClick: function() { this.disableButtons(true); - var query = 'CALL myBasket_configure(#date, #method, #agency, #address)'; - - var batch = new Sql.Batch(); - batch.addParam('method', this.$('method')); - batch.addParam('date', this.$('date')); - batch.addParam('agency', this.$('agency')); - batch.addParam('address', this.$('address')); - + const query = 'CALL myBasket_configure(#date, #method, #agency, #address)'; this.conn.execQuery(query, - this.onBasketConfigured.bind(this), batch); + this.onBasketConfigured.bind(this), this.$.lot.$); }, onBasketConfigured: function(resultSet) { @@ -79,96 +68,91 @@ Hedera.Checkout = new Class({ if (!resultSet.fetchResult()) return; - if (this.$('order-form').numRows > 0) + if (this.$.orderForm.numRows > 0) Htk.Toast.showMessage(_('OrderUpdated')); else Htk.Toast.showMessage(_('OrderStarted')); - this.hash.set({form: 'ecomerce/catalog'}); + this.hash.setAll({form: 'ecomerce/catalog'}); }, onCancelClick: function() { - if (this.$('order-form').numRows > 0) + if (this.$.orderForm.numRows > 0) window.history.back(); else - this.hash.set({form: 'ecomerce/orders'}); + this.hash.setAll({form: 'ecomerce/orders'}); }, agencySteps: ['method', 'date', 'address', 'agency', 'confirm-delivery'], pickupSteps: ['method', 'date', 'address', 'pickup', 'confirm-pickup'], isDelivery: function() { - return this.$('rg-method').value != 'PICKUP'; + return this.$.rgMethod.value != 'PICKUP'; }, onMethodChange: function() { - this.$('assistant').stepsIndex = this.isDelivery() ? + this.$.assistant.stepsIndex = this.isDelivery() ? this.agencySteps : this.pickupSteps; this.onFieldChange(); }, methodValidate: function() { - if (!this.$('rg-method').isSelected()) + if (!this.$.rgMethod.isSelected()) throw new Error(_('Please select an option')); }, dateShow: function() { - Vn.Node.setText(this.$('date-question'), this.isDelivery() ? + Vn.Node.setText(this.$.dateQuestion, this.isDelivery() ? _('OrderDateDeliveryQuestion'): _('OrderDatePickupQuestion')); - this.$('calendar').goToSelectedMonth(); + this.$.calendar.goToSelectedMonth(); }, dateValidate: function() { - if (!this.$('calendar').value) + if (!this.$.calendar.value) throw new Error(_('Please select a date')); }, addressShow: function() { - Vn.Node.setText(this.$('address-question'), this.isDelivery() ? + Vn.Node.setText(this.$.addressQuestion, this.isDelivery() ? _('AddressQuestion'): _('AddressQuestionPickup')); }, addressValidate: function() { - if (this.$('address-form').row == -1) + if (this.$.addressForm.row == -1) throw new Error(_('Please select an address')); }, agencyShow: function() { - this.$('agencies').refresh(); + this.$.agencies.refresh(); }, agencyValidate: function() { - if (this.$('agency-combo').row == -1 && this.isDelivery()) + if (this.$.agencyCombo.row == -1 && this.isDelivery()) throw new Error(_('Please select an agency')); }, pickupShow: function() { - this.$('warehouses').refresh(); + this.$.warehouses.refresh(); }, pickupValidate: function() { - if (this.$('warehouse-combo').row == -1) + if (this.$.warehouseCombo.row == -1) throw new Error(_('Please select a store')); }, onFieldChange: function() { if (!this.autoStepLocked) - this.$('assistant').moveNext(); + this.$.assistant.moveNext(); }, goNextStep: function() { - this.$('assistant').moveNext(); - }, - - addressRenderer: function(builder, form) { - builder.$('address').addEventListener('click', - this.onAddressClick.bind(this, form.get('id'))); + this.$.assistant.moveNext(); }, onAddressClick: function(addressId) { - this.$('address').value = addressId; + this.$.lot.set('address', addressId); this.goNextStep(); }, @@ -176,37 +160,43 @@ Hedera.Checkout = new Class({ if (this.selectedNode) Vn.Node.removeClass(this.selectedNode, 'selected'); - var row = this.$('addresses').search('id', this.$('address').value); + const row = this.$.addresses.search('id', this.$.lot.$.address); if (row != -1) { - var builder = this.$('repeater').getBuilder(row); + const builder = this.$.repeater.getBuilder(row); - this.selectedNode = builder.$('address'); + this.selectedNode = builder.$.address; Vn.Node.addClass(this.selectedNode, 'selected'); } - this.$('address-form').row = row; + this.$.addressForm.row = row; }, onAgenciesReady: function(model) { if (!model.ready) return; if (model.numRows > 0) { - var agency; - var defaults = [ - this.$('order-form').get('agencyModeFk'), - this.$('defaults').get('agencyModeFk'), - this.$('defaults').get('defaultAgencyFk') - ]; + let agency; + const agencies = []; - for (var i = 0; i < defaults.length; i++) { - agency = defaults[i]; + if (this.$.orderForm.$) + agencies.push(this.$.orderForm.$); + + const defaults = this.$.defaults.$; + if (defaults) + agencies.push( + defaults.agencyModeFk, + defaults.defaultAgencyFk + ); + + for (let i = 0; i < agencies.length; i++) { + agency = agencies[i]; if (model.search('id', agency) !== -1) break; } this.autoStepLocked = true; - this.$('agency').value = agency; + this.$.lot.assign({agency}); this.autoStepLocked = false; } else Htk.Toast.showError(_('NoAgeciesAvailableForDate')); diff --git a/forms/ecomerce/checkout/locale/ca.yml b/forms/ecomerce/checkout/locale/ca.yml index 5846dff5..41a84a8f 100644 --- a/forms/ecomerce/checkout/locale/ca.yml +++ b/forms/ecomerce/checkout/locale/ca.yml @@ -11,7 +11,7 @@ AddressQuestion: On vols rebre la comanda? AddressQuestionPickup: A què direcció vols associar la comanda? (Opcional) AgencyQuestion: Com vols rebre la comanda? PickupWarehouseQuestion: En quin magatzem vols recollir la comanda? -ConfirmToAccessCatalog: Confirma les dades per accedir al catàleg +ConfirmData: Confirma les dades Arrival: Arribada Pickup: Recollida Agency: Agència diff --git a/forms/ecomerce/checkout/locale/en.yml b/forms/ecomerce/checkout/locale/en.yml index 45a54a7b..c9c94c90 100644 --- a/forms/ecomerce/checkout/locale/en.yml +++ b/forms/ecomerce/checkout/locale/en.yml @@ -11,7 +11,7 @@ AddressQuestion: Where do you want to receive the order? AddressQuestionPickup: To which address do you want to associate the order? (Optional) AgencyQuestion: How you want to receive the order? PickupWarehouseQuestion: What store you want to pickup your order? -ConfirmToAccessCatalog: Confirm the data to access the catalog +ConfirmData: Confirm the data Arrival: Arrival Pickup: Pickup Agency: Agency diff --git a/forms/ecomerce/checkout/locale/es.yml b/forms/ecomerce/checkout/locale/es.yml index a699f3e0..b2276376 100644 --- a/forms/ecomerce/checkout/locale/es.yml +++ b/forms/ecomerce/checkout/locale/es.yml @@ -11,7 +11,7 @@ AddressQuestion: ¿Dónde quieres recibir el pedido? AddressQuestionPickup: ¿A qué dirección quieres asociar el pedido? (Opcional) AgencyQuestion: ¿Cómo quieres recibir el pedido? PickupWarehouseQuestion: ¿En qué almacén quieres recoger el pedido? -ConfirmToAccessCatalog: Confirma los datos para acceder al catálogo +ConfirmData: Confirma los datos Arrival: Llegada Pickup: Recogida Agency: Agencia diff --git a/forms/ecomerce/checkout/locale/fr.yml b/forms/ecomerce/checkout/locale/fr.yml index 5a04e06a..53166061 100644 --- a/forms/ecomerce/checkout/locale/fr.yml +++ b/forms/ecomerce/checkout/locale/fr.yml @@ -11,7 +11,7 @@ AddressQuestion: Adresse livraison? AddressQuestionPickup: À quelle adresse voulez-vous associer la commande? (Optionnel) AgencyQuestion: Agence de livraison PickupWarehouseQuestion: Dans quel magasin vuoulez-vous retirer votre commande? -ConfirmToAccessCatalog: Confirmez les coordonnées pour accéder au catalogue +ConfirmData: Confirmez les coordonnées Arrival: Arrivée Pickup: Retrait Agency: Agence diff --git a/forms/ecomerce/checkout/locale/pt.yml b/forms/ecomerce/checkout/locale/pt.yml index aa4b59e2..c6f76484 100644 --- a/forms/ecomerce/checkout/locale/pt.yml +++ b/forms/ecomerce/checkout/locale/pt.yml @@ -11,7 +11,7 @@ AddressQuestion: Onde queres receber a encomenda? AddressQuestionPickup: Para qual endereço deseja associar o pedido? (Opcional) AgencyQuestion: Como queres receber a encomenda? PickupWarehouseQuestion: Em qual armazém queres levantar a encomenda? -ConfirmToAccessCatalog: Confirme os dados para entrar no catálogo +ConfirmData: Confirme os dados Arrival: Chegada Pickup: Recolhida Agency: Agência diff --git a/forms/ecomerce/checkout/style.css b/forms/ecomerce/checkout/style.css index d1dc875f..61885aad 100644 --- a/forms/ecomerce/checkout/style.css +++ b/forms/ecomerce/checkout/style.css @@ -1,89 +1,54 @@ -.checkout -{ - padding: 1em; - max-width: 40em; - margin: 0 auto; -} -.checkout .bar -{ - margin-bottom: 1em; -} -.checkout .form -{ - max-width: 40em; - padding: 4em 2em; + +.checkout .bar { + margin-bottom: 16px; } /* Step */ .answers button, .answers p, -.radio > div -{ +.radio > div { + font-size: 1.2em; +} +.answers .htk-select { + max-width: 15em; + margin: 0 auto; font-size: 1.4em; } -.answers .htk-select -{ - max-width: 10em; - display: block; - margin: 0 auto; - font-size: 1.6em; - height: 1.8em; -} -.answers p -{ +.answers p { margin: 0.3em 0; } -.target -{ +.target { max-width: 28em; margin: 0 auto; } -.address -{ +.address { border-radius: 0.1em; padding: 0.6em 1.4em; } -.address.selected -{ +.address.selected { background-color: rgba(1, 1, 1, .1); } -.address:hover -{ +.address:hover { cursor: pointer; background-color: rgba(1, 1, 1, .05); } -.address p.consignee -{ +.address p.consignee { font-weight: bold; } -.radio -{ +.radio { max-width: 20em; margin: 0 auto; } -.radio > div -{ +.radio > div { padding: 0.5em; - border-top: 1px solid #AAA; } -.radio > div:first-child -{ - border-top: none; -} -.thin-calendar -{ - width: inherit; +.thin-calendar { max-width: 24em; margin: 0 auto; - box-shadow: 0 0.1em 0.3em #ccc; + box-shadow: none; } -.thin-calendar tr > th -{ - color: white; -} -.htk-assistant .thin -{ +.htk-assistant .thin { float: right; } diff --git a/forms/ecomerce/checkout/ui.xml b/forms/ecomerce/checkout/ui.xml index 47100763..849b9286 100644 --- a/forms/ecomerce/checkout/ui.xml +++ b/forms/ecomerce/checkout/ui.xml @@ -1,9 +1,6 @@ <vn> <vn-group> - <vn-param id="method"/> - <vn-param id="date"/> - <vn-param id="agency"/> - <vn-param id="address" on-changed="onAddressChange"/> + <vn-lot id="lot" on-change="this.onAddressChange()"/> <db-form id="defaults" on-ready="onValuesReady"> <db-model property="model"> SELECT deliveryMethod, agencyModeFk, addressFk, defaultAgencyFk @@ -19,6 +16,7 @@ </db-form> <db-model id="agencies" auto-load="false" + lot="lot" result-index="1" on-status-changed="onAgenciesReady"> CALL vn.zone_getAgency(#address, #date); @@ -30,15 +28,10 @@ AND a.isVisible ORDER BY a.description; DROP TEMPORARY TABLE tmp.zoneGetAgency; - <sql-batch property="batch"> - <custom> - <item name="address" param="address"/> - <item name="date" param="date"/> - </custom> - </sql-batch> </db-model> <db-model id="warehouses" auto-load="false" + lot="lot" result-index="1" on-status-changed="onWarehousesReady"> CALL vn.zone_getAgency(#address, #date); @@ -50,12 +43,6 @@ AND a.isVisible ORDER BY a.description; DROP TEMPORARY TABLE tmp.zoneGetAgency; - <sql-batch property="batch"> - <custom> - <item name="address" param="address"/> - <item name="date" param="date"/> - </custom> - </sql-batch> </db-model> </vn-group> <div id="title"> @@ -68,144 +55,148 @@ on-click="onCancelClick"/> </div> <div id="form" class="checkout"> - <div class="box bar"> - <htk-assistant-bar - id="assistant-bar" - assistant="assistant"/> - </div> - <div class="box"> - <div class="form"> - <htk-assistant id="assistant" - endFunc="onConfirmClick"> - <htk-step - name="method" - validate-func="methodValidate"> - <h2><t>DeliveryOrPickupQuestion</t></h2> - <div class="answers radio"> - <htk-radio-group - id="rg-method" - param="method" - on-changed="onMethodChange"/> - <div> - <label> - <htk-radio radio-group="rg-method" value="AGENCY"/> - <t>Receive the order</t> - </label> + <div class="vn-w-sm"> + <div class="box bar"> + <htk-assistant-bar + id="assistant-bar" + assistant="assistant"/> + </div> + <div class="box vn-px-lg vn-py-xl"> + <div class="form"> + <htk-assistant id="assistant" + endFunc="onConfirmClick"> + <htk-step + name="method" + validate-func="methodValidate"> + <h2><t>DeliveryOrPickupQuestion</t></h2> + <div class="answers radio"> + <htk-radio-group + id="rg-method" + form="lot" + column="method" + on-changed="onMethodChange"/> + <div> + <label> + <htk-radio radio-group="rg-method" value="AGENCY"/> + <t>Receive the order</t> + </label> + </div> + <div> + <label> + <htk-radio radio-group="rg-method" value="PICKUP"/> + <t>PickupInStore</t> + </label> + </div> </div> - <div> - <label> - <htk-radio radio-group="rg-method" value="PICKUP"/> - <t>PickupInStore</t> - </label> + </htk-step> + <htk-step + name="date" + show-func="dateShow" + validate-func="dateValidate"> + <h2 id="date-question"/> + <div class="answers"> + <htk-calendar + id="calendar" + class="thin-calendar" + form="lot" + column="date" + restrict-func="calendarRestrict" + on-changed="onFieldChange"/> </div> - </div> - </htk-step> - <htk-step - name="date" - show-func="dateShow" - validate-func="dateValidate"> - <h2 id="date-question"/> - <div class="answers"> - <htk-calendar - id="calendar" - class="thin-calendar" - param="date" - restrict-func="calendarRestrict" - on-changed="onFieldChange"/> - </div> - </htk-step> - <htk-step - name="address" - show-func="addressShow" - validate-func="addressValidate"> - <h2 id="address-question"/> - <div class="answers target"> - <db-form id="address-form" model="addresses"/> - <htk-repeater - id="repeater" - form-id="iter" - on-change="onAddressChange" - renderer="addressRenderer"> - <db-model property="model" id="addresses"> - SELECT a.id, a.nickname, p.name province, a.city, a.street, a.isActive, c.country - FROM myAddress a - LEFT JOIN vn.province p ON p.id = a.provinceFk - JOIN vn.country c ON c.id = p.countryFk + </htk-step> + <htk-step + name="address" + show-func="addressShow" + validate-func="addressValidate"> + <h2 id="address-question"/> + <div class="answers target"> + <db-form id="address-form" model="addresses"/> + <htk-repeater + id="repeater" + form-id="iter" + on-change="onAddressChange"> + <db-model property="model" id="addresses"> + SELECT a.id, a.nickname, p.name province, a.city, a.street, a.isActive, c.country + FROM myAddress a + LEFT JOIN vn.province p ON p.id = a.provinceFk + JOIN vn.country c ON c.id = p.countryFk WHERE a.isActive - </db-model> - <custom> - <div class="address" id="address"> - <p class="consignee"> - <htk-text form="iter" column="nickname"/> - </p> - <p> - <htk-text form="iter" column="street"/> - </p> - </div> - </custom> - </htk-repeater> - </div> - </htk-step> - <htk-step - name="agency" - show-func="agencyShow" - validate-func="agencyValidate"> - <h2><t>AgencyQuestion</t></h2> - <div class="answers target"> - <htk-combo - id="agency-combo" - param="agency" - on-changed="onFieldChange" - model="agencies"/> - </div> - </htk-step> - <htk-step - name="pickup" - show-func="pickupShow" - validate-func="pickupValidate"> - <h2><t>PickupWarehouseQuestion</t></h2> - <div class="answers target"> - <htk-combo - id="warehouse-combo" - param="agency" - on-changed="onFieldChange" - model="warehouses"/> - </div> - </htk-step> - <htk-step - name="confirm-delivery"> - <h2><t>ConfirmToAccessCatalog</t></h2> - <div class="answers target"> - <p> - <t>Arrival</t> - <htk-text format="%D" param="date"/> - </p> - <p> - <htk-text form="address-form" column="street"/> - </p> - <p> - <t>Agency</t> - <htk-text form="agency-combo" column="description"/> - </p> - <div class="clear"/> - </div> - </htk-step> - <htk-step - name="confirm-pickup"> - <h2><t>ConfirmToAccessCatalog</t></h2> - <div class="answers target"> - <p> - <t>Pickup</t> - <htk-text format="%D" param="date"/> - </p> - <p> - <t>Warehouse</t> - <htk-text form="warehouse-combo" column="description"/> - </p> - <div class="clear"/> - </div> - </htk-step> - </htk-assistant> + </db-model> + <custom> + <div + class="address" + on-click="this.onAddressClick(iter.id)" + id="address"> + <p class="consignee">{{iter.nickname}}</p> + <p>{{iter.street}}</p> + </div> + </custom> + </htk-repeater> + </div> + </htk-step> + <htk-step + name="agency" + show-func="agencyShow" + validate-func="agencyValidate"> + <h2><t>AgencyQuestion</t></h2> + <div class="answers target"> + <htk-combo + id="agency-combo" + form="lot" + column="agency" + on-changed="onFieldChange" + model="agencies"/> + </div> + </htk-step> + <htk-step + name="pickup" + show-func="pickupShow" + validate-func="pickupValidate"> + <h2><t>PickupWarehouseQuestion</t></h2> + <div class="answers target"> + <htk-combo + id="warehouse-combo" + form="lot" + column="agency" + on-changed="onFieldChange" + model="warehouses"/> + </div> + </htk-step> + <htk-step + name="confirm-delivery"> + <h2><t>ConfirmData</t></h2> + <div class="answers target"> + <p> + <t>Arrival</t> + <htk-text format="%D" form="lot" column="date"/> + </p> + <p> + <htk-text form="address-form" column="street"/> + </p> + <p> + <t>Agency</t> + <htk-text form="agency-combo" column="description"/> + </p> + <div class="clear"/> + </div> + </htk-step> + <htk-step + name="confirm-pickup"> + <h2><t>ConfirmData</t></h2> + <div class="answers target"> + <p> + <t>Pickup</t> + <htk-text format="%D" form="lot" column="date"/> + </p> + <p> + <t>Warehouse</t> + <htk-text form="warehouse-combo" column="description"/> + </p> + <div class="clear"/> + </div> + </htk-step> + </htk-assistant> + </div> </div> </div> </div> diff --git a/forms/ecomerce/confirm/confirm.js b/forms/ecomerce/confirm/confirm.js index 7fec5102..38784c46 100644 --- a/forms/ecomerce/confirm/confirm.js +++ b/forms/ecomerce/confirm/confirm.js @@ -6,7 +6,7 @@ Hedera.Confirm = new Class({ this.close(); this.isOpen = true; - Hedera.BasketChecker.check(this.conn, + Hedera.BasketChecker.check(this.conn, this.hash, this.onBasketCheck.bind(this)); }, @@ -19,21 +19,21 @@ Hedera.Confirm = new Class({ if (form.row < 0) return; - if (form.get('method') != 'PICKUP') { - Vn.Node.show(this.$('address')); - Vn.Node.setText(this.$('method'), _('Agency')); + if (form.$.method != 'PICKUP') { + Vn.Node.show(this.$.address); + Vn.Node.setText(this.$.method, _('Agency')); } else { - Vn.Node.hide(this.$('address')); - Vn.Node.setText(this.$('method'), _('Warehouse')); + Vn.Node.hide(this.$.address); + Vn.Node.setText(this.$.method, _('Warehouse')); } - var total = form.get('taxableBase') + form.get('tax'); + var total = form.$.taxableBase + form.$.tax; if (total === null) total = 0; - var credit = form.get('credit'); - var debt = form.get('debt'); + var credit = form.$.credit; + var debt = form.$.debt; var totalDebt = debt + total; var exceededCredit = totalDebt - credit; @@ -43,21 +43,21 @@ Hedera.Confirm = new Class({ Htk.Toast.showWarning( _('You have exceeded your credit.')); - this.$('debt').value = debt; - this.$('total-debt').value = totalDebt; - this.$('total-amount').value = totalDebt; - this.$('credit-excess').value = exceededCredit; - this.$('excess-amount').value = exceededCredit; + this.$.debt.value = debt; + this.$.totalDebt.value = totalDebt; + this.$.totalAmount.value = totalDebt; + this.$.creditExcess.value = exceededCredit; + this.$.excessAmount.value = exceededCredit; - this.$('pay-amount').value = 'ALL'; + this.$.payAmount.value = 'ALL'; if (credit > 0) { - this.$('credit-info').style.display = 'table-row'; + this.$.creditInfo.style.display = 'table-row'; if (creditExceededCond) { - this.$('amount-selector').style.display = 'block'; - this.$('exceeded-info').style.display = 'table-row'; - this.$('pay-amount').value = 'EXCEEDED'; + this.$.amountSelector.style.display = 'block'; + this.$.exceededInfo.style.display = 'table-row'; + this.$.payAmount.value = 'EXCEEDED'; } } @@ -77,43 +77,43 @@ Hedera.Confirm = new Class({ } for (var i = 0; i < methods.length; i++) - this.$(methods[i] +'-method').style.display = 'block'; + this.$[`${methods[i]}Method`].style.display = 'block'; - this.$('pay-method').value = selectedMethod; + this.$.payMethod.value = selectedMethod; }, onPayMethodChange: function(payMethod) { var id = this.displayedInfo; - + if (id) - Vn.Node.removeClass(this.$(id), 'selected'); - + Vn.Node.removeClass(this.$[id], 'selected'); + switch (payMethod.value) { case 'BALANCE': - id = 'balance-method'; + id = 'balanceMethod'; break; case 'CREDIT': - id = 'credit-method'; + id = 'creditMethod'; break; case 'CARD': - id = 'card-method'; + id = 'cardMethod'; break; case 'TRANSFER': - id = 'transfer-method'; + id = 'transferMethod'; break; default: id = null; } - + this.displayedInfo = id; if (id) - Vn.Node.addClass(this.$(id), 'selected'); + Vn.Node.addClass(this.$[id], 'selected'); }, disableButtons: function(disable) { - this.$('modify').disabled = disable; - this.$('confirm').disabled = disable; + this.$.modify.disabled = disable; + this.$.confirm.disabled = disable; }, onModifyClick: function() { @@ -122,27 +122,30 @@ Hedera.Confirm = new Class({ onConfirmClick: function() { this.disableButtons(true); - this.$('confirm-query').execute(); + this.$.confirmQuery.execute(); }, onConfirm: function(query, resultSet) { this.disableButtons(false); if (resultSet.fetchResult()) - this.$('success-dialog').show(); + this.$.successDialog.show(); }, onDialogResponse: function() { - if (this.$('pay-method').value === 'CARD') { - if (this.$('pay-amount').value === 'EXCEEDED') - var payAmount = this.$('excess-amount').value; + if (this.$.payMethod.value === 'CARD') { + if (this.$.payAmount.value === 'EXCEEDED') + var payAmount = this.$.excessAmount.value; else - var payAmount = this.$('total-amount').value; + var payAmount = this.$.totalAmount.value; - var tpv = new Hedera.Tpv({conn: this.conn}); - tpv.pay(payAmount, this.$('order-form').get('companyFk')); + var tpv = new Hedera.Tpv({ + conn: this.conn, + hash: this.hash + }); + tpv.pay(payAmount, this.$.order.companyFk); } else - this.hash.set({'form': 'ecomerce/orders'}); + this.hash.setAll({form: 'ecomerce/orders'}); } }); diff --git a/forms/ecomerce/confirm/locale/ca.yml b/forms/ecomerce/confirm/locale/ca.yml index 969c8d00..5f84813a 100644 --- a/forms/ecomerce/confirm/locale/ca.yml +++ b/forms/ecomerce/confirm/locale/ca.yml @@ -1,5 +1,7 @@ Checkout: Finalitzar comanda Order summary: Resum de la comanda +ShippingInformation: Dades d'enviament +DeliveryAddress: Adreça de lliurament Delivery at: Lliurament el Agency: Agència Warehouse: Magatzem diff --git a/forms/ecomerce/confirm/locale/en.yml b/forms/ecomerce/confirm/locale/en.yml index e2b32f07..c480fa72 100644 --- a/forms/ecomerce/confirm/locale/en.yml +++ b/forms/ecomerce/confirm/locale/en.yml @@ -1,5 +1,7 @@ Checkout: Checkout Order summary: Order summary +ShippingInformation: Shipping information +DeliveryAddress: Delivery address Delivery at: Delivery at Agency: Agency Warehouse: Store diff --git a/forms/ecomerce/confirm/locale/es.yml b/forms/ecomerce/confirm/locale/es.yml index e344c094..08c65dac 100644 --- a/forms/ecomerce/confirm/locale/es.yml +++ b/forms/ecomerce/confirm/locale/es.yml @@ -1,5 +1,7 @@ Checkout: Finalizar pedido Order summary: Resumen del pedido +ShippingInformation: Datos de envío +DeliveryAddress: Dirección de entrega Delivery at: Entrega el Agency: Agencia Warehouse: Almacén diff --git a/forms/ecomerce/confirm/locale/fr.yml b/forms/ecomerce/confirm/locale/fr.yml index 743b0222..2bcdda8c 100644 --- a/forms/ecomerce/confirm/locale/fr.yml +++ b/forms/ecomerce/confirm/locale/fr.yml @@ -1,5 +1,7 @@ Checkout: Finir la commande Order summary: Résumé de la commande +ShippingInformation: Informations sur la livraison +DeliveryAddress: Addresse de livraison Delivery at: Livraison à Agency: Agence Warehouse: Entrepôt diff --git a/forms/ecomerce/confirm/locale/pt.yml b/forms/ecomerce/confirm/locale/pt.yml index efc04b53..6f44570a 100644 --- a/forms/ecomerce/confirm/locale/pt.yml +++ b/forms/ecomerce/confirm/locale/pt.yml @@ -1,5 +1,7 @@ Checkout: Finalizar encomenda Order summary: Resumo da encomenda +ShippingInformation: Dados de envio +DeliveryAddress: Endereço de entrega Delivery at: Entrega na Agency: Agência Warehouse: Armazém diff --git a/forms/ecomerce/confirm/style.css b/forms/ecomerce/confirm/style.css index 4dd4a61e..f5da4a6b 100644 --- a/forms/ecomerce/confirm/style.css +++ b/forms/ecomerce/confirm/style.css @@ -1,86 +1,33 @@ -.confirm -{ - padding: 1em; - max-width: 30em; - margin: 0 auto; - color: #555; + +.confirm .summary { + margin-bottom: 16px; } -.confirm .box -{ - padding: 2.2em 2.5em; -} -.confirm .summary -{ - margin-bottom: 1em; -} -.confirm .address -{ - margin-top: .8em; -} -.confirm h2 -{ - font-size: 1.1em; - font-weight: normal; - padding: 0; - margin: 0; - margin-bottom: .5em; - color: #333; -} -.confirm button -{ - font-size: 1.4em; -} -.confirm p -{ +.confirm p { margin: .2em 0; } -.confirm .modify-order -{ - float: left; -} -.confirm .confirm-order -{ - float: right; -} -.confirm .payment > div -{ - margin-bottom: 1.4em; -} -.confirm .payment > .button-bar -{ - margin: 0; - margin-top: 1.8em; -} /* Table */ -.confirm .debt-info -{ +.confirm .debt-info { padding: 0; } -.confirm .debt-info > table -{ +.confirm .debt-info > table { border-collapse: collapse; } -.confirm td -{ +.confirm td { padding: .15em 0; } -.confirm .sum-total > td -{ +.confirm .sum-total > td { border-top: solid 1px #DDD; font-weight: bold; } -.confirm .currency -{ +.confirm .currency { text-align: right; } -.confirm .credit-info -{ +.confirm .credit-info { display: none; } -.confirm .exceeded-info -{ +.confirm .exceeded-info { display: none; color: #E53935; } @@ -88,34 +35,59 @@ /* Pay */ .confirm .amount-selector, -.confirm .pay-methods > div -{ +.confirm .pay-methods > div { display: none; } -.confirm .pay-methods > div -{ +.confirm .pay-methods > div { margin: .3em 0; } -.confirm .pay-methods > div > label > input[type=radio] -{ +.confirm .pay-methods > div > label > input[type=radio] { margin: 0; margin-right: .5em; vertical-align: middle; } -.confirm .pay-methods > div > div -{ +.confirm .pay-methods > div > div { padding: .5em 1.5em; display: none; } -.confirm .pay-methods > div.selected > div -{ +.confirm .pay-methods > div.selected > div { display: block; } -.confirm .transfer-account -{ +.confirm .transfer-account { margin-top: .5em; } -.confirm .transfer-account > p -{ +.confirm .transfer-account > p { margin: .1em 0; } + +.confirm .payment > div { + margin-bottom: 1.4em; +} +.confirm .payment > .button-bar { + display: flex; + justify-content: space-between; + margin-bottom: 0; + margin-top: 32px; +} +.confirm .payment > .button-bar button{ + font-size: 1.2rem; + border-radius: 2rem; + padding: .5rem 1rem; + margin: 0; +} +.confirm .modify-order { + border: 1px solid #1a1a1a; +} +.confirm .modify-order:hover { + color: white; + background-color: #1a1a1a; +} +.confirm .confirm-order { + border: 1px solid #8cc63f; + background-color: #8cc63f; + color: white; +} +.confirm .confirm-order:hover { + background-color: transparent; + color: #6b5; +} \ No newline at end of file diff --git a/forms/ecomerce/confirm/ui.xml b/forms/ecomerce/confirm/ui.xml index 5ded7394..c9deba20 100644 --- a/forms/ecomerce/confirm/ui.xml +++ b/forms/ecomerce/confirm/ui.xml @@ -1,6 +1,6 @@ <vn> <vn-group> - <db-form id="order-form" on-ready="onOrderReady"> + <db-form v-model="order" on-ready="onOrderReady"> <db-model property="model" result-index="1"> CALL myBasket_getTax; SELECT o.id, o.sent, o.notes, o.companyFk, @@ -31,181 +31,177 @@ <h1><t>Order summary</t></h1> </div> <div id="form" class="confirm"> - <div class="box summary"> - <div> - <div class="delivery"> - <p> - <t>Delivery at</t> - <htk-text format="%D" form="order-form" column="sent"/> - </p> - <p> - <span id="method"><t>Agency</t></span> - <htk-text form="order-form" column="agency"/> - </p> - </div> - <div id="address" class="address"> - <p> - <htk-text form="order-form" column="nickname"/> - </p> - <p> - <htk-text form="order-form" column="street"/> - </p> - <p> - <htk-text form="order-form" column="postalCode"/>, - <htk-text form="order-form" column="city"/> - </p> - </div> - </div> - </div> - <div class="box payment"> - <div> - <table class="debt-info"> - <tbody> - <tr> - <td> - <t>Previous balance</t> - </td> - <td class="currency"> - <htk-text format="%.2d€" id="debt"/> - </td> - </tr> - <tr> - <td> - <t>Order total</t> - </td> - <td class="currency"> - <htk-text format="%.2d€" form="order-form" column="taxableBase"/> - </td> - </tr> - <tr> - <td> - <t>Order VAT</t> - </td> - <td class="currency"> - <htk-text format="%.2d€" form="order-form" column="tax"/> - </td> - </tr> - <tr class="total-debt sum-total"> - <td> - <t>Total debt</t> - </td> - <td class="currency"> - <htk-text format="%.2d€" id="total-debt"/> - </td> - </tr> - <tr id="credit-info" class="credit-info"> - <td> - <t>Credit</t> - </td> - <td class="currency"> - <htk-text format="%.2d€" form="order-form" column="credit"/> - </td> - </tr> - <tr id="exceeded-info" class="exceeded-info sum-total"> - <td> - <t>Exceeded credit</t> - </td> - <td class="currency"> - <htk-text format="%.2d€" id="credit-excess"/> - </td> - </tr> - </tbody> - </table> - </div> - <div id="amount-selector" class="amount-selector"> - <h2> - <t>Amount to pay</t> - </h2> - <div class="radio"> - <htk-radio-group - id="pay-amount"/> - <div> - <htk-radio radio-group="pay-amount" value="ALL"/> - <label> - <t>Total debt</t>, - <htk-text format="%.2d€" id="total-amount"/> - </label> + <div class="vn-w-sm"> + <div class="box vn-pa-lg summary"> + <div> + <div class="delivery"> + <h6><t>ShippingInformation</t></h6> + <p> + <t>Delivery at</t> {{Vn.Value.format(order.sent, _('%D'))}} + </p> + <p> + <span id="method"><t>Agency</t></span> {{order.agency}} + </p> </div> - <div> - <htk-radio radio-group="pay-amount" value="EXCEEDED"/> - <label> - <t>Exceeded credit</t>, - <htk-text format="%.2d€" id="excess-amount"/> - </label> + <div id="address" class="address vn-mt-md"> + <h6><t>DeliveryAddress</t></h6> + <p>{{order.nickname}}</p> + <p>{{order.street}}</p> + <p>{{order.postalCode}}, {{order.city}}</p> </div> </div> </div> - <div> - <h2> - <t>Pay method</t> - </h2> - <div class="pay-methods"> - <htk-radio-group - id="pay-method" - on-changed="onPayMethodChange"/> - <div id="balance-method"> - <label> - <htk-radio radio-group="pay-method" value="BALANCE"/> - <t>Use my balance</t> - </label> + <div class="box vn-pa-lg payment"> + <div> + <table class="debt-info"> + <tbody> + <tr> + <td><t>Previous balance</t></td> + <td class="currency"> + <htk-text format="%.2d€" id="debt"/> + </td> + </tr> + <tr> + <td> + <t>Order total</t> + </td> + <td class="currency"> + {{Vn.Value.format(order.taxableBase, _('%.2d€'))}} + </td> + </tr> + <tr> + <td> + <t>Order VAT</t> + </td> + <td class="currency"> + {{Vn.Value.format(order.tax, _('%.2d€'))}} + </td> + </tr> + <tr class="total-debt sum-total"> + <td> + <t>Total debt</t> + </td> + <td class="currency"> + <htk-text format="%.2d€" id="total-debt"/> + </td> + </tr> + <tr id="credit-info" class="credit-info"> + <td> + <t>Credit</t> + </td> + <td class="currency"> + {{Vn.Value.format(order.credit, _('%.2d€'))}} + </td> + </tr> + <tr id="exceeded-info" class="exceeded-info sum-total"> + <td> + <t>Exceeded credit</t> + </td> + <td class="currency"> + <htk-text format="%.2d€" id="credit-excess"/> + </td> + </tr> + </tbody> + </table> + </div> + <div id="amount-selector" class="amount-selector"> + <h2> + <t>Amount to pay</t> + </h2> + <div class="radio"> + <htk-radio-group + id="pay-amount"/> <div> - <t>You have a favorable balance.</t> + <htk-radio radio-group="pay-amount" value="ALL"/> + <label> + <t>Total debt</t>, + <htk-text format="%.2d€" id="total-amount"/> + </label> </div> - </div> - <div id="credit-method"> - <label> - <htk-radio radio-group="pay-method" value="CREDIT"/> - <t>Use my credit</t> - </label> <div> - <t>You have a favorable credit.</t> + <htk-radio radio-group="pay-amount" value="EXCEEDED"/> + <label> + <t>Exceeded credit</t>, + <htk-text format="%.2d€" id="excess-amount"/> + </label> </div> </div> - <div id="card-method"> - <label> - <htk-radio radio-group="pay-method" value="CARD"/> - <t>Credit card</t> - </label> - <div> - <t>You will be redirected to the payment.</t> - </div> - </div> - <div id="transfer-method"> - <label> - <htk-radio radio-group="pay-method" value="TRANSFER"/> - <t>Bank Transfer</t> - </label> - <div> - <t>Make a transfer to one account.</t> - <htk-repeater form-id="iter"> - <db-model property="model"> - SELECT name, iban FROM mainAccountBank - </db-model> - <custom> - <div class="transfer-account"> - <p><htk-text form="iter" column="name"/></p> - <p><htk-text form="iter" column="iban"/></p> - </div> - </custom> - </htk-repeater> - </div> - </div> - <div id="later-method"> - <label> - <htk-radio radio-group="pay-method" value="LATER"/> - <t>Pay later</t> - </label> - </div> </div> - </div> - <div class="button-bar"> - <button on-click="onModifyClick" id="modify" class="thin modify-order"> - <t>Modify</t> - </button> - <button on-click="onConfirmClick" id="confirm" class="thin confirm-order"> - <t>Confirm</t> - </button> - <div class="clear"/> + <div> + <h6><t>Pay method</t></h6> + <div class="pay-methods"> + <htk-radio-group + id="pay-method" + on-changed="onPayMethodChange"/> + <div id="balance-method"> + <label> + <htk-radio radio-group="pay-method" value="BALANCE"/> + <t>Use my balance</t> + </label> + <div> + <t>You have a favorable balance.</t> + </div> + </div> + <div id="credit-method"> + <label> + <htk-radio radio-group="pay-method" value="CREDIT"/> + <t>Use my credit</t> + </label> + <div> + <t>You have a favorable credit.</t> + </div> + </div> + <div id="card-method"> + <label> + <htk-radio radio-group="pay-method" value="CARD"/> + <t>Credit card</t> + </label> + <div> + <t>You will be redirected to the payment.</t> + </div> + </div> + <div id="transfer-method"> + <label> + <htk-radio radio-group="pay-method" value="TRANSFER"/> + <t>Bank Transfer</t> + </label> + <div> + <t>Make a transfer to one account.</t> + <htk-repeater form-id="iter"> + <db-model property="model"> + SELECT name, iban FROM mainAccountBank + </db-model> + <custom> + <div class="transfer-account"> + <p>{{iter.name}}</p> + <p>{{iter.iban}}</p> + </div> + </custom> + </htk-repeater> + </div> + </div> + <div id="later-method"> + <label> + <htk-radio radio-group="pay-method" value="LATER"/> + <t>Pay later</t> + </label> + </div> + </div> + </div> + <div class="button-bar vn-mt-md"> + <button + id="modify" + on-click="this.onModifyClick()" + class="modify-order"> + <t>Modify</t> + </button> + <button + id="confirm" + on-click="this.onConfirmClick()" + class="confirm-order"> + <t>Confirm</t> + </button> + </div> </div> </div> </div> diff --git a/forms/ecomerce/invoices/invoices.js b/forms/ecomerce/invoices/invoices.js index 8a052e92..c1d4c73b 100644 --- a/forms/ecomerce/invoices/invoices.js +++ b/forms/ecomerce/invoices/invoices.js @@ -3,9 +3,9 @@ Hedera.Invoices = new Class({ Extends: Hedera.Form, donwloadRenderer: function(column, invoice) { - var invoiceId = invoice.get('id'); + var invoiceId = invoice.$.id; - if (invoice.get('hasPdf') && invoiceId) { + if (invoice.$.hasPdf && invoiceId) { var params = { srv: 'rest:dms/invoice', invoice: invoiceId, diff --git a/forms/ecomerce/invoices/style.css b/forms/ecomerce/invoices/style.css index 35acf384..e69de29b 100644 --- a/forms/ecomerce/invoices/style.css +++ b/forms/ecomerce/invoices/style.css @@ -1,14 +0,0 @@ -.invoices -{ - padding: 1em; -} -.invoices .box -{ - max-width: 40em; -} -.invoices .box > .header, -.invoices .htk-grid > thead > tr -{ - background-color: #3F51B6; -} - diff --git a/forms/ecomerce/invoices/ui.xml b/forms/ecomerce/invoices/ui.xml index 5e9b5e05..e69a3ce7 100644 --- a/forms/ecomerce/invoices/ui.xml +++ b/forms/ecomerce/invoices/ui.xml @@ -3,9 +3,9 @@ <h1><t>Invoices</t></h1> </div> <div id="form" class="invoices"> - <div class="box"> - <div> - <htk-grid show-header="false"> + <htk-grid + class="box vn-w-sm" + show-header="false"> <db-model property="model" id="tickets"> SELECT id, ref, issued, amount, hasPdf FROM myInvoice @@ -19,7 +19,5 @@ renderer="donwloadRenderer" target="_blank"/> </htk-grid> - </div> - </div> </div> </vn> diff --git a/forms/ecomerce/orders/orders.js b/forms/ecomerce/orders/orders.js index 5f7d4078..47346e9d 100644 --- a/forms/ecomerce/orders/orders.js +++ b/forms/ecomerce/orders/orders.js @@ -3,23 +3,26 @@ Hedera.Orders = new Class({ Extends: Hedera.Form, activate: function() { - this.tpv = new Hedera.Tpv({conn: this.conn}); + this.tpv = new Hedera.Tpv({ + conn: this.conn, + hash: this.hash + }); this.tpv.check(this._onTpvCheck.bind(this)); }, _onTpvCheck: function(tpv, tpvOrder, tpvStatus) { if (tpvStatus === 'ko') - this.$('error-dialog').show(); + this.$.errorDialog.show(); }, onBasketClick: function() { - this.hash.set({form: 'ecomerce/basket'}); + this.hash.setAll({form: 'ecomerce/basket'}); }, repeaterFunc: function(res, form) { - res.$('link').href = this.hash.make({ + res.$.link.href = this.hash.make({ form: 'ecomerce/ticket', - ticket: form.get('id') + ticket: form.$.id }); }, @@ -27,13 +30,13 @@ Hedera.Orders = new Class({ balanceConditionalFunc: function(field, value) { if (value >= 0) - Vn.Node.removeClass(this.$('balance'), 'negative'); + Vn.Node.removeClass(this.$.balance, 'negative'); else - Vn.Node.addClass(this.$('balance'), 'negative'); + Vn.Node.addClass(this.$.balance, 'negative'); }, onPayButtonClick: function() { - var amount = -this.$('debt').value; + var amount = -this.$.debt.value; amount = amount <= 0 ? null : amount; var defaultAmountStr = ''; diff --git a/forms/ecomerce/orders/style.css b/forms/ecomerce/orders/style.css index c4d325a7..56776b17 100644 --- a/forms/ecomerce/orders/style.css +++ b/forms/ecomerce/orders/style.css @@ -1,73 +1,36 @@ -.orders -{ - padding: 1em; -} -.orders .box -{ - max-width: 25em; -} -/* Balance */ - -.balance -{ - margin-top: 1.2em; - margin-right: .5em; +.balance { + margin-right: 8px; } -.balance > * -{ +.balance > * { vertical-align: middle; } -.balance > .amount -{ +.balance > .amount { color: white; - padding: 0.3em; + padding: .3em; } -.balance > .info -{ +.balance > .info { display: inline; cursor: pointer; height: 1.2em; cursor: pointer; } -.balance > .negative -{ +.balance > .negative { background-color: #EF5350; - border-radius: 0.1em; - box-shadow: 0 0 0.4em #666; + border-radius: .1em; + box-shadow: 0 0 .4em #666; } -.balance-popup -{ +.balance-popup { width: 25em; } -.balance-grid -{ +.balance-grid { width: 100%; margin: auto; } /* List */ -.orders .item -{ - display: block; - padding: 1em; - border-bottom: 1px solid #DDD; -} -.orders .item:hover -{ - background-color: rgba(1, 1, 1, 0.05); -} -.orders .item > p -{ - margin: .1em 0; -} -.orders .item > p.important -{ - font-size: 1.2em; -} -.orders .item > p.total -{ +.orders .htk-list .total { float: right; } diff --git a/forms/ecomerce/orders/ui.xml b/forms/ecomerce/orders/ui.xml index e64c70e0..9d83e3c5 100644 --- a/forms/ecomerce/orders/ui.xml +++ b/forms/ecomerce/orders/ui.xml @@ -3,17 +3,6 @@ <h1><t>LastOrders</t></h1> </div> <div id="actions"> - <htk-bar-button - icon="basket" - tip="_ShoppingBasket" - show-text="false" - on-click="onBasketClick"/> - <htk-bar-button - id="pay-button" - icon="pay" - tip="_MakePayment" - show-text="false" - on-click="onPayButtonClick"/> <div class="balance"> <span class="label"> <t>Balance:</t> @@ -25,50 +14,50 @@ column="debt"> <db-form property="form"> <db-model property="model"> - <custom> - SELECT -myClient_getDebt(NULL) debt - </custom> + SELECT -myClient_getDebt(NULL) debt </db-model> </db-form> </htk-text> - </span> - <img - src="image/icon/dark/info.svg" + </span> + <htk-icon + name="info" title="_PaymentInfo" - class="info" - alt="Info"/> + class="info"/> </div> + <htk-bar-button + id="pay-button" + icon="payments" + tip="_MakePayment" + on-click="onPayButtonClick"/> + <htk-bar-button + icon="shopping_cart" + tip="_ShoppingBasket" + on-click="onBasketClick"/> </div> <div id="form" class="orders"> - <div class="box confirmed"> - <htk-repeater form-id="iter" renderer="repeaterFunc"> - <db-model property="model" id="tickets"> - <custom> - CALL myTicket_list (NULL, NULL); - </custom> - </db-model> - <custom> - <a id="link" class="item" title="_SeeOrder"> + <htk-repeater + class="htk-list box confirmed vn-w-sm" + form-id="iter" + renderer="repeaterFunc"> + <db-model property="model" id="tickets"> + CALL myTicket_list(NULL, NULL); + </db-model> + <custom> + <a id="link" class="item" title="{{_('SeeOrder')}}"> + <div class="content"> <p class="important total"> - <htk-text form="iter" column="total" format="%.2d€"/> + {{Vn.Value.format(iter.total, '%.2d€')}} </p> <p class="important"> - <htk-text form="iter" column="landed" format="%D"/> + {{Vn.Value.format(iter.landed, '%D')}} </p> - <p> - #<htk-text form="iter" column="id"/> - </p> - <p> - <htk-text form="iter" column="nickname"/> - </p> - <p> - <htk-text form="iter" column="agency"/> - </p> - <div class="clear"/> - </a> - </custom> - </htk-repeater> - </div> + <p>#{{iter.id}}</p> + <p>{{iter.nickname}}</p> + <p>{{iter.agency}}</p> + </div> + </a> + </custom> + </htk-repeater> </div> <htk-dialog id="error-dialog" diff --git a/forms/ecomerce/ticket/locale/ca.yml b/forms/ecomerce/ticket/locale/ca.yml index c0141846..680bc6d6 100644 --- a/forms/ecomerce/ticket/locale/ca.yml +++ b/forms/ecomerce/ticket/locale/ca.yml @@ -1,4 +1,6 @@ OrderDetail: Detall de l'encarrec +ShippingInformation: Dades d'enviament +DeliveryAddress: Adreça de lliurament Print delivery note: Imprimir albarà Agency: Agència Warehouse: Magatzem diff --git a/forms/ecomerce/ticket/locale/en.yml b/forms/ecomerce/ticket/locale/en.yml index 01412c9e..ae229f20 100644 --- a/forms/ecomerce/ticket/locale/en.yml +++ b/forms/ecomerce/ticket/locale/en.yml @@ -1,4 +1,6 @@ OrderDetail: Order detail +ShippingInformation: Shipping information +DeliveryAddress: Delivery address Print delivery note: Print delivery note Agency: Agency Warehouse: Store diff --git a/forms/ecomerce/ticket/locale/es.yml b/forms/ecomerce/ticket/locale/es.yml index 627786d3..f798dc7e 100644 --- a/forms/ecomerce/ticket/locale/es.yml +++ b/forms/ecomerce/ticket/locale/es.yml @@ -1,4 +1,6 @@ OrderDetail: Detalle del pedido +ShippingInformation: Datos de envío +DeliveryAddress: Dirección de entrega Print delivery note: Imprimir albarán Agency: Agencia Warehouse: Almacén diff --git a/forms/ecomerce/ticket/locale/fr.yml b/forms/ecomerce/ticket/locale/fr.yml index 6345329e..74cc068a 100644 --- a/forms/ecomerce/ticket/locale/fr.yml +++ b/forms/ecomerce/ticket/locale/fr.yml @@ -1,4 +1,6 @@ OrderDetail: Détails de la commande +ShippingInformation: Informations sur la livraison +DeliveryAddress: Addresse de livraison Print delivery note: Imprimer bulletin de livraison Agency: Agence Warehouse: Entrepôt diff --git a/forms/ecomerce/ticket/locale/pt.yml b/forms/ecomerce/ticket/locale/pt.yml index 2399b4fb..64bca977 100644 --- a/forms/ecomerce/ticket/locale/pt.yml +++ b/forms/ecomerce/ticket/locale/pt.yml @@ -1,4 +1,6 @@ OrderDetail: Detalhes da encomenda +ShippingInformation: Dados de envio +DeliveryAddress: Endereço de entrega Print delivery note: Imprimir nota de entrega Agency: Agência Warehouse: Armazém diff --git a/forms/ecomerce/ticket/style.css b/forms/ecomerce/ticket/style.css index 9fecbb6f..76aed3ac 100644 --- a/forms/ecomerce/ticket/style.css +++ b/forms/ecomerce/ticket/style.css @@ -1,47 +1,29 @@ -.ticket -{ - padding: 1em; -} -.ticket .box -{ - max-width: 30em; - margin: 0 auto; - padding: 2em; - color: #333; -} /* Header */ -.ticket .head -{ +.ticket .head { padding: 0; padding-bottom: .2em; border-bottom: 1px solid #DDD; margin-bottom: 1em; } -.ticket .address, -.ticket .total -{ - margin-top: .8em; +.ticket .head > div > div { + margin: 15px 0; } -.ticket .head > div -{ - padding-bottom: .8em; +.ticket .head > div > div:first-child { + margin: 0; } -.ticket .head p -{ - margin: .2em; +.ticket .head p { + margin: .2em 0; } -.ticket .head p.important -{ - font-size: 1.4em; +.ticket .head p.important { + font-size: 1.2rem; + font-weight: bold; } -.ticket .total -{ +.ticket .total { text-align: right; } -.ticket .packages -{ +.ticket .packages { margin-top: 1em; padding-top: 1em; border-top: 1px solid #DDD; @@ -50,47 +32,42 @@ /* Lines */ -.ticket .line -{ - padding: .5em 0; +.ticket .line { + display: flex; + gap: 20px; + margin: 24px 0; + height: 65px; } -.ticket .line > .photo -{ - margin-right: 1em; - float: left; +.ticket .line:last-child { + margin-bottom: 0; +} +.ticket .line > .photo { + flex: none; border-radius: 50%; - height: 4.25em; - width: 4.25em; + width: 65px; } -.ticket .line > .info -{ - margin-left: 5.25em; +.ticket .line > .info { + flex: 1; } -.ticket .line > .info > h2 -{ +.ticket .line > .info > h2 { font-size: 1em; font-weight: normal; padding: 0; padding-bottom: .1em; } -.ticket .line > .info > p -{ +.ticket .line > .info > p { margin: 0; } -.ticket .line > .info > .tags -{ +.ticket .line > .info > .tags { color: #777; } -.ticket .line > .info .discount -{ +.ticket .line > .info .discount { color: green; } -.ticket .line > .info > .amount -{ +.ticket .line > .info > .amount { float: left; } -.ticket .line > .info > .subtotal -{ +.ticket .line > .info > .subtotal { float: right; } diff --git a/forms/ecomerce/ticket/ticket.js b/forms/ecomerce/ticket/ticket.js index 5765a10d..eefbc435 100644 --- a/forms/ecomerce/ticket/ticket.js +++ b/forms/ecomerce/ticket/ticket.js @@ -6,16 +6,8 @@ Hedera.Ticket = new Class({ if (!ticket.value) return; - var batch = new Sql.Batch(); - batch.addValue('ticket', ticket.value); - this.conn.execQuery('CALL myTicket_logAccess(#ticket)', null, batch); - }, - - onTicketReady: function(form) { - if (form.get('method') != 'PICKUP') - Vn.Node.setText(this.$('method'), _('Agency')); - else - Vn.Node.setText(this.$('method'), _('Warehouse')); + var params = {ticket: ticket.value}; + this.conn.execQuery('CALL myTicket_logAccess(#ticket)', null, params); }, onPrintClick: function() { @@ -24,36 +16,29 @@ Hedera.Ticket = new Class({ recipientId: this.gui.user.id, type: 'deliveryNote' }); - window.open(`/api/Tickets/${this.$('ticket-id').value}/delivery-note-pdf?${params}`); + window.open(`/api/Tickets/${this.hash.$.ticket}/delivery-note-pdf?${params}`); }, - repeaterFunc: function(res, form) { - var discount = res.$('discount'); - discount.style.display = form.get('discount') ? 'inline' : 'none'; - res.$('discount-subtotal').value = this.discountSubtotal(form); - res.$('subtotal').value = this.subtotal(form); + repeaterFunc: function(scope, form) { + scope.$.discount.style.display = form.$.discount ? 'inline' : 'none'; }, - discountSubtotal: function(form) { - return form.get('quantity') * form.get('price'); + discountSubtotal: function(line) { + return line.quantity * line.price; }, - subtotal: function(form) { - var discount = form.get('discount'); - return this.discountSubtotal(form) * ((100 - discount) / 100); - }, - - servicesFunc: function(res, form) { - res.$('subtotal').value = form.get('quantity') * form.get('price'); + subtotal: function(line) { + var discount = line.discount; + return this.discountSubtotal(line) * ((100 - discount) / 100); }, onServicesChanged: function(model) { - this.$('services').node.style.display = + this.$.services.node.style.display = model.numRows > 0 ? 'block' : 'none'; }, onPackagesChanged: function(model) { - this.$('packages').node.style.display = + this.$.packages.node.style.display = model.numRows > 0 ? 'block' : 'none'; }, }); diff --git a/forms/ecomerce/ticket/ui.xml b/forms/ecomerce/ticket/ui.xml index c14ff6fa..000b6efb 100644 --- a/forms/ecomerce/ticket/ui.xml +++ b/forms/ecomerce/ticket/ui.xml @@ -1,18 +1,10 @@ <vn> -<vn-group> - <vn-param id="ticket-id" on-changed="onTicketChange"/> - <vn-hash-param key="ticket" param="ticket-id"/> - <sql-batch id="batch"> - <custom> - <item name="ticket" param="ticket-id"/> - </custom> - </sql-batch> - <db-form id="ticket" on-ready="onTicketReady"> - <db-model id="ticket-data" property="model" batch="batch"> - CALL myTicket_get(#ticket) - </db-model> - </db-form> -</vn-group> +<vn-lot-query id="params"> + <vn-spec name="ticket" type="Number"/> +</vn-lot-query> +<db-lot id="ticket-form" lot="params" v-model="ticket"> + CALL myTicket_get(#ticket) +</db-lot> <div id="title"> <h1><t>OrderDetail</t></h1> </div> @@ -20,46 +12,36 @@ <htk-bar-button icon="print" tip="_Print delivery note" - on-click="onPrintClick"/> + on-click="this.onPrintClick()"/> </div> <div id="form" class="ticket"> - <div class="box"> - <htk-loader class="head" form="ticket"> + <div class="box vn-w-sm vn-pa-lg"> + <htk-loader class="head" form="ticket-form"> + <h5>#{{ticket.id}}</h5> <div> - <p class="important ticket-id"> - #<htk-text column="id" form="ticket"/> + <h6><t>ShippingInformation</t></h6> + <p> + <t>Preparation</t> {{Vn.Value.format(ticket.shipped, '%D')}} </p> <p> - <t>Preparation</t> <htk-text form="ticket" column="shipped" format="%D"/> + <t>Delivery</t> {{Vn.Value.format(ticket.landed, '%D')}} </p> <p> - <t>Delivery</t> <htk-text form="ticket" column="landed" format="%D"/> - </p> - <p> - <span id="method"></span> <htk-text form="ticket" column="agency"/> + {{_(ticket.method != 'PICKUP' ? 'Agency' : 'Warehouse')}} {{ticket.agency}} </p> </div> <div class="address"> - <p> - <htk-text form="ticket" column="nickname"/> - </p> - <p> - <htk-text form="ticket" column="street"/> - </p> - <p> - <htk-text form="ticket" column="postalCode"/> - <htk-text form="ticket" column="city"/> - (<htk-text form="ticket" column="province"/>) - </p> + <h6><t>DeliveryAddress</t></h6> + <p>{{ticket.nickname}}</p> + <p>{{ticket.street}}</p> + <p>{{ticket.postalCode}} {{ticket.city}} ({{ticket.province}})</p> </div> <div class="total"> <p class="important total"> - <t>Total</t> - <htk-text format="%.2d€" form="ticket" column="taxBase"/> + <t>Total</t> {{Vn.Value.format(ticket.taxBase, '%.2d€')}} </p> <p class="important total"> - <t>Total + tax</t> - <htk-text format="%.2d€" form="ticket" column="total"/> + <t>Total + tax</t> {{Vn.Value.format(ticket.total, '%.2d€')}} </p> </div> </htk-loader> @@ -67,63 +49,53 @@ <db-model property="model" id="movements" - batch="batch"> + lot="params"> CALL myTicket_getRows(#ticket) </db-model> <custom> <div class="line"> <htk-image - form="iter" - column="image" + value="{{iter.image}}" stamp-column="updated" class="photo" directory="catalog" subdir="200x200" full-dir="1600x900"/> <div class="info"> - <h2> - <htk-text form="iter" column="concept"/> - </h2> + <h2>{{iter.concept}}</h2> <p class="tags"> - <htk-text form="iter" column="value5"/> - <htk-text form="iter" column="value6"/> - <htk-text form="iter" column="value7"/> + {{iter.value5}} {{iter.value6}} {{iter.value7}} </p> <p class="amount"> - <htk-text form="iter" column="quantity"/> x - <htk-text form="iter" column="price" format="%.2d€"/> + {{iter.quantity}} x {{Vn.Value.format(iter.price, '%.2d€')}} </p> <p class="subtotal"> <span class="discount" id="discount"> - <htk-text id="discount-subtotal" format="%.2d€"/> - - <htk-text form="iter" column="discount" format="%.0d%"/> = + {{Vn.Value.format(this.discountSubtotal(iter), '%.2d€')}} - + {{Vn.Value.format(iter.discount, '%.0d%')}} = </span> - <htk-text id="subtotal" format="%.2d€"/> + {{Vn.Value.format(this.subtotal(iter), '%.2d€')}} </p> </div> - <div class="clear"/> </div> </custom> </htk-repeater> - <htk-repeater form-id="iter" id="services" class="packages" renderer="servicesFunc"> + <htk-repeater form-id="iter" id="services" class="packages"> <db-model property="model" on-status-changed="onServicesChanged" - batch="batch"> + lot="params"> CALL myTicket_getServices(#ticket) </db-model> <custom> <div class="line"> <div class="info"> - <h2> - <htk-text form="iter" column="description"/> - </h2> + <h2>{{iter.description}}</h2> <p class="amount"> - <htk-text form="iter" column="quantity"/> x - <htk-text form="iter" column="price" format="%.2d€"/> + {{iter.quantity}} x {{Vn.Value.format(iter.price, '%.2d€')}} </p> <p class="subtotal"> - <htk-text id="subtotal" format="%.2d€"/> + {{Vn.Value.format(iter.quantity * iter.price, '%.2d€')}} </p> </div> <div class="clear"/> @@ -134,28 +106,21 @@ <db-model property="model" on-status-changed="onPackagesChanged" - batch="batch"> + lot="params"> CALL myTicket_getPackages(#ticket) </db-model> <custom> <div class="line"> <htk-image - form="iter" - column="image" + value="{{iter.image}}" class="photo" directory="catalog" subdir="200x200" full-dir="1600x900"/> <div class="info"> - <h2> - <htk-text form="iter" column="name"/> - </h2> - <p> - #<htk-text form="iter" column="id"/> - </p> - <p class="amount"> - <htk-text form="iter" column="quantity"/> - </p> + <h2>{{iter.name}}</h2> + <p>#{{iter.id}}</p> + <p class="amount">{{iter.quantity}}</p> </div> <div class="clear"/> </div> diff --git a/forms/news/new/new.js b/forms/news/new/new.js index 99a3466b..9581a1a1 100644 --- a/forms/news/new/new.js +++ b/forms/news/new/new.js @@ -7,13 +7,12 @@ Hedera.New = new Class({ ,editor: null ,activate: function() { - this.$('model').mode = Db.Model.Mode.ON_DEMAND; - this.$('model').setDefault('userFk', 'news', + this.$.model.mode = Db.Model.Mode.ON_DEMAND; + this.$.model.setDefault('userFk', 'news', new Sql.Function({schema: 'account', name: 'myUser_getId'})); tinymce.init({ - mode : 'exact' - ,target: this.$('html-editor') + target: this.$.htmlEditor ,plugins: [ "advlist autolink lists link image charmap print preview hr" ,"anchor pagebreak searchreplace wordcount visualblocks" @@ -29,7 +28,7 @@ Hedera.New = new Class({ +" | forecolor backcolor" ,image_advtab: true ,init_instance_callback: this._onEditorInit.bind(this) - }); + }); }, deactivate: function() { @@ -46,17 +45,13 @@ Hedera.New = new Class({ if (!this.editor) return; - var newHtml = this.$('iter').get('text'); - - if (!newHtml) - newHtml = ''; - - this.editor.setContent(newHtml); + const row = this.$.iter.$; + this.editor.setContent(row ? row.text : ''); }, - onStatusChange: function(form) { - if (this.$('new-id').value == 0) - form.insertRow(); + onStatusChange: function() { + if (!this.hash.$.new) + this.$.iter.insertRow(); }, onOperationsDone: function() { @@ -69,12 +64,12 @@ Hedera.New = new Class({ }, onAcceptClick: function() { - this.$('iter').set('text', this.editor.getContent()); - this.$('iter').performOperations(); + this.$.iter.set('text', this.editor.getContent()); + this.$.iter.performOperations(); }, - + onReturnClick: function() { - this.hash.set({'form': 'news/news'}); + this.hash.setAll({form: 'news/news'}); } }); }); diff --git a/forms/news/new/style.css b/forms/news/new/style.css index 85608368..e08051ce 100644 --- a/forms/news/new/style.css +++ b/forms/news/new/style.css @@ -1,24 +1,26 @@ - -.new -{ - padding: 1em; +.new .box { + position: relative; } -.new .box -{ - max-width: 38em; - padding: 2em; +.new .htk-image { + height: 100px; + overflow: hidden; + border-bottom: 1px solid #ddd; } - -/* Form */ - -.new textarea -{ - min-height: 20em; +.new .htk-image > button { + display: block; } - -.new .foot -{ - text-align: center; - margin-top: 1em; +.new .htk-image > img { + margin-top: -40%; + width: 100%; + height: initial; +} +.new .tag-priority { + display: flex; + gap: 16px; +} +.new .tag-priority > *{ + flex: 1; +} +.new textarea { + min-height: 500px; } - diff --git a/forms/news/new/ui.xml b/forms/news/new/ui.xml index 8ee6ecc9..54014e7f 100644 --- a/forms/news/new/ui.xml +++ b/forms/news/new/ui.xml @@ -1,60 +1,61 @@ <vn> <vn-group> - <vn-param id="new-id"/> - <vn-hash-param key="new" param="new-id"/> - <db-form id="iter" on-status-changed="onStatusChange"> + <db-form id="iter" on-status-changed="this.onStatusChange()"> <db-model id="model" property="model" updatable="true" - on-operations-done="onOperationsDone"> - <custom> - SELECT id, title, text, tag, priority - FROM news WHERE id = #new - </custom> - <sql-batch property="batch"> - <custom> - <item name="new" param="new-id"/> - </custom> - </sql-batch> + lot="hash" + on-operations-done="this.onOperationsDone()"> + SELECT id, title, text, tag, priority, image + FROM news WHERE id = #new </db-model> </db-form> - <db-param form="iter" column="text" on-changed="onBodyChange"/> + <db-param form="iter" column="text" on-changed="this.onBodyChange()"/> </vn-group> <div id="title"> <h1><t>AddEditNew</t></h1> </div> <div id="actions"> - <htk-bar-button - icon="ok" - tip="_Accept" - on-click="onAcceptClick"/> <htk-bar-button icon="close" tip="_Return" - on-click="onReturnClick"/> + on-click="this.onReturnClick()"/> + <htk-bar-button + icon="check" + tip="_Accept" + on-click="this.onAcceptClick()"/> </div> <div id="form" class="new"> - <div class="box"> - <div class="form"> + <div class="box form vn-w-sm"> + <htk-image + form="iter" + column="image" + class="photo" + directory="news" + subdir="full" + full-dir="full" + editable="true" + conn="conn"/> + <div class="vn-pa-lg"> <div class="form-group"> <label><t>Title</t></label> <htk-entry form="iter" column="title"/> </div> - <div class="form-group"> - <label><t>Tag</t></label> - <htk-combo form="iter" column="tag"> - <db-model property="model"> - <custom> + <div class="form-group tag-priority"> + <div> + <label><t>Tag</t></label> + <htk-combo form="iter" column="tag"> + <db-model property="model"> SELECT name, description FROM newsTag ORDER BY description - </custom> - </db-model> - </htk-combo> - </div> - <div class="form-group"> - <label><t>Priority</t></label> - <htk-entry form="iter" column="priority"/> + </db-model> + </htk-combo> + </div> + <div> + <label><t>Priority</t></label> + <htk-entry form="iter" column="priority"/> + </div> </div> <div class="form-group"> <label><t>NewBody</t></label> diff --git a/forms/news/news/news.js b/forms/news/news/news.js index 9da4dc08..c6707724 100644 --- a/forms/news/news/news.js +++ b/forms/news/news/news.js @@ -1,30 +1,29 @@ -Hedera.News = new Class -({ +Hedera.News = new Class({ Extends: Hedera.Form - ,editNew: function (newId) - { - this.hash.set ({ - 'form': 'news/new' - ,'new': newId + ,activate: function() { + this.$.newsModel.setInfo('n', 'news', 'hedera', ['id'], 'id'); + } + + ,editNew: function(newId) { + this.hash.setAll({ + form: 'news/new', + new: newId }); } - ,onEditClick: function (button, form) - { - this.editNew (button.value); + ,onEditClick: function(newId) { + this.editNew(newId); } - ,onDeleteClick: function (button, form) - { - if (confirm (_('ReallyDelete'))) - form.deleteRow (); + ,onDeleteClick: function(form) { + if (confirm(_('ReallyDelete'))) + form.deleteRow(); } - ,onAddClick: function () - { - this.editNew (0); + ,onAddClick: function() { + this.editNew(0); } }); diff --git a/forms/news/news/style.css b/forms/news/news/style.css index b1412acb..78f9dd40 100644 --- a/forms/news/news/style.css +++ b/forms/news/news/style.css @@ -1,41 +1,6 @@ -.news -{ - padding: 1em; -} -.news .box -{ - max-width: 35em; - margin: 0 auto; -} -/* Items */ - -.news .item -{ - padding: 1em; - border-bottom: 1px solid #DDD; -} -.news .item > p -{ - margin: .1em 0; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} -.news .item > p.important -{ - font-size: 1.2em; -} -.news .item > .photo -{ - float: left; - margin-right: 1em; - height: 4.2em; - width: 4.2em; - border-radius: .3em; -} -.news .item > button -{ - float: right; - margin: 0; +.news .item .photo { + height: 80px; + width: 80px; + border-radius: 10px; } diff --git a/forms/news/news/ui.xml b/forms/news/news/ui.xml index 0cde1a0a..d9c5d436 100644 --- a/forms/news/news/ui.xml +++ b/forms/news/news/ui.xml @@ -6,35 +6,25 @@ <htk-bar-button icon="add" tip="_AddNew" - on-click="onAddClick"/> + on-click="hash.setAll({form: 'news/new', new: null})"/> </div> <div id="form" class="news"> - <div class="box"> - <htk-repeater form-id="iter"> - <db-model property="model" id="news-model" updatable="true"> - <custom> - SELECT n.id, u.nickname, n.priority, n.image, n.title - FROM news n - JOIN account.user u ON u.id = n.userFk - ORDER BY priority, n.created DESC - </custom> - </db-model> + <htk-repeater form-id="iter" class="box htk-list vn-w-sm"> + <db-model property="model" id="news-model" updatable="true"> <custom> - <div class="item"> - <htk-button - form="iter" - column="id" - tip="_EditNew" - icon="edit" - on-click="onEditClick"/> - <htk-button - form="iter" - column="id" - tip="_Remove" - icon="delete" - on-click="onDeleteClick"/> + SELECT n.id, u.nickname, n.priority, n.image, n.title + FROM news n + JOIN account.user u ON u.id = n.userFk + ORDER BY priority, n.created DESC + </custom> + </db-model> + <custom> + <a class="item" + href="{{`#!form=news/new&new=${iter.id}`}}" + title="_EditNew"> + <div class="side vn-mr-md"> <htk-image - form="iter" + form="$iter" column="image" class="photo" directory="news" @@ -42,19 +32,24 @@ full-dir="full" editable="true" conn="conn"/> - <p class="important"> - <htk-text form="iter" column="title"/> - </p> - <p> - <htk-text form="iter" column="nickname"/> - </p> - <p> - <t>Priority</t> - <htk-text form="iter" column="priority"/> - </p> </div> - </custom> - </htk-repeater> - </div> + <div class="content"> + <p class="important"> + {{iter.title}} + </p> + <p>{{iter.nickname}}</p> + <p>{{iter.priority}}</p> + </div> + <div + class="actions" + on-click="$event.preventDefault()"> + <htk-button + tip="_Remove" + icon="delete" + on-click="this.onDeleteClick($iter)"/> + </div> + </a> + </custom> + </htk-repeater> </div> </vn> diff --git a/forms/reports/items-form/items-form.js b/forms/reports/items-form/items-form.js index 34a2b2bb..defdf2e3 100644 --- a/forms/reports/items-form/items-form.js +++ b/forms/reports/items-form/items-form.js @@ -1,23 +1,17 @@ -Hedera.ItemsForm = new Class -({ +Hedera.ItemsForm = new Class({ Extends: Hedera.Form - ,activate: function () - { - this.$('warehouse').value = 7; - this.$('realm').value = null; + ,activate: function() { + this.$.lot.assign({ + warehouse: 7, + realm: null + }); } - ,onPreviewClick: function () - { - var batch = new Sql.Batch (); - batch.addValues ({ - 'warehouse': this.$('warehouse').value - ,'realm': this.$('realm').value - ,'rate': this.$('rate').value - }); - this.gui.openReport ('items-report', batch); + ,onPreviewClick: function() { + this.$.lot.set('rate', this.$.rate.value); + this.gui.openReport('items-report', this.$.lot); } }); diff --git a/forms/reports/items-form/style.css b/forms/reports/items-form/style.css index ff9ba1be..e69de29b 100644 --- a/forms/reports/items-form/style.css +++ b/forms/reports/items-form/style.css @@ -1,43 +0,0 @@ - -.items -{ - padding: 1em; -} -.items .box -{ - max-width: 30em; - padding: 2em; -} -.items .form -{ - max-width: 25em; - margin: auto; -} -.items .form-group -{ - padding: 0.4em; -} -.items form label -{ - display: block; - margin-bottom: 0.5em; -} -.items input[type=text], -.items select -{ - margin: 0; - width: 100%; -} - -/* Footer */ - -.items .footer -{ - text-align: center; - margin-top: 1.5em; -} -.items .footer > button -{ - margin: 0 .2em; -} - diff --git a/forms/reports/items-form/ui.xml b/forms/reports/items-form/ui.xml index 07fc6174..8b6462db 100644 --- a/forms/reports/items-form/ui.xml +++ b/forms/reports/items-form/ui.xml @@ -1,4 +1,5 @@ <vn> +<vn-lot id="lot"/> <div id="title"> <h1><t>Item list</t></h1> </div> @@ -6,43 +7,35 @@ <htk-bar-button icon="print" tip="_Preview" - on-click="onPreviewClick"/> + on-click="this.onPreviewClick()"/> </div> <div id="form" class="items"> - <div class="box"> - <div class="form"> - <div class="form-group"> - <label><t>Store</t></label> - <htk-combo> - <vn-param property="param" id="warehouse"/> - <db-model property="model"> - <custom> - SELECT id, name FROM vn2008.warehouse - WHERE reserve ORDER BY name - </custom> - </db-model> - </htk-combo> - </div> - <div class="form-group"> - <label><t>Realm</t></label> - <htk-combo not-null="false"> - <vn-param property="param" id="realm"/> - <db-model property="model"> - <custom> - SELECT id, reino FROM vn2008.reinos - WHERE display != FALSE ORDER BY reino - </custom> - </db-model> - </htk-combo> - </div> - <div class="form-group"> - <label><t>Rate</t></label> - <select id="rate"> - <option>3</option> - <option>2</option> - <option>1</option> - </select> - </div> + <div class="form box vn-w-sm vn-pa-lg"> + <div class="form-group"> + <label><t>Store</t></label> + <htk-combo form="lot" column="warehouse"> + <db-model property="model"> + SELECT id, name FROM vn2008.warehouse + WHERE reserve ORDER BY name + </db-model> + </htk-combo> + </div> + <div class="form-group"> + <label><t>Realm</t></label> + <htk-combo form="lot" column="realm" not-null="false"> + <db-model property="model"> + SELECT id, reino FROM vn2008.reinos + WHERE display != FALSE ORDER BY reino + </db-model> + </htk-combo> + </div> + <div class="form-group"> + <label><t>Rate</t></label> + <select id="rate"> + <option>3</option> + <option>2</option> + <option>1</option> + </select> </div> </div> </div> diff --git a/forms/reports/shelves/shelves.js b/forms/reports/shelves/shelves.js index 483ebdfb..86cbe00b 100644 --- a/forms/reports/shelves/shelves.js +++ b/forms/reports/shelves/shelves.js @@ -1,53 +1,20 @@ -Hedera.Shelves = new Class -({ +Hedera.Shelves = new Class({ Extends: Hedera.Form - ,activate: function () - { - this.$('date').value = new Date (); - this.$('useIds').value = false; + ,activate: function() { + this.$.lot.assign({ + date: new Date(), + useIds: false + }); } - ,onConfigChange: function () - { - var fields = [ - 'realm' - ,'family' - ,'warehouse' - ,'shelf' - ,'namePrefix' - ,'maxAmount' - ,'reportTitle' - ,'showPacking' - ,'stack' - ]; - - for (var i = 0; i < fields.length; i++) - this.$(fields[i]).value = this.$('config').get (fields[i]); + ,onConfigChange: function() { + this.$.lot.assignLot(this.$.config); } - ,onPreviewClick: function () - { - var fields = [ - 'family' - ,'warehouse' - ,'shelf' - ,'namePrefix' - ,'maxAmount' - ,'reportTitle' - ,'showPacking' - ,'stack' - ,'useIds' - ,'date' - ]; - - var batch = new Sql.Batch (); - - for (var i = 0; i < fields.length; i++) - batch.addValue (fields[i], this.$(fields[i]).value); - - this.gui.openReport ('shelves-report', batch); + ,onPreviewClick: function() { + this.gui.openReport('shelves-report', this.$.lot); } }); diff --git a/forms/reports/shelves/style.css b/forms/reports/shelves/style.css index 0be2e7cf..e69de29b 100644 --- a/forms/reports/shelves/style.css +++ b/forms/reports/shelves/style.css @@ -1,30 +0,0 @@ - -.shelves -{ - padding: 1em; -} -.shelves .box -{ - max-width: 30em; - padding: 2em; -} -.shelves .form -{ - max-width: 25em; - margin: auto; -} -.shelves .form-group -{ - padding: 0.4em; -} -.shelves form label -{ - display: block; - margin-bottom: 0.5em; -} -.shelves input[type=text], -.shelves select -{ - margin: 0; - width: 100%; -} diff --git a/forms/reports/shelves/ui.xml b/forms/reports/shelves/ui.xml index e1fa2a94..376a1bff 100644 --- a/forms/reports/shelves/ui.xml +++ b/forms/reports/shelves/ui.xml @@ -1,14 +1,8 @@ <vn> -<vn-group> - <db-model property="model" id="configs-model"> - <custom> - SELECT c.id, c.name reportTitle, c.namePrefix, c.warehouse, c.family, - c.shelf, c.maxAmount, c.showPacking, c.stack, t.reino_id realm - FROM shelfConfig c - JOIN vn2008.Tipos t ON t.tipo_id = c.family - </custom> - </db-model> -</vn-group> +<vn-lot-query id="params"> + <vn-spec name="config" type="Number"/> +</vn-lot-query> +<vn-lot id="lot"/> <div id="title"> <h1><t>Shelves</t></h1> </div> @@ -16,96 +10,95 @@ <htk-bar-button icon="print" tip="_Preview" - on-click="onPreviewClick"/> + on-click="this.onPreviewClick()"/> </div> <div id="form" class="shelves"> - <div class="box"> - <div class="form"> - <div class="form-group"> - <label><t>Configuration</t></label> - <htk-combo - id="config" - placeholder="_Select config" - model="configs-model" - on-changed="onConfigChange" - on-ready="onConfigChange"/> - </div> - <div class="form-group"> - <label><t>Date</t></label> - <htk-date-chooser id="date"/> - </div> - <div class="form-group"> - <label><t>Reign</t></label> - <htk-combo id="realm"> - <db-model property="model" id="realms"> - <custom> - SELECT id, reino FROM vn2008.reinos - WHERE display != FALSE ORDER BY reino - </custom> - </db-model> - </htk-combo> - </div> - <div class="form-group"> - <label><t>Family</t></label> - <htk-combo id="family"> - <db-model property="model"> - <custom> - SELECT tipo_id, Tipo FROM vn2008.Tipos - WHERE reino_id = #realm ORDER BY Tipo - </custom> - <sql-batch property="batch"> - <custom> - <item name="realm" param="realm"/> - </custom> - </sql-batch> - </db-model> - </htk-combo> - </div> - <div class="form-group"> - <label><t>Store</t></label> - <htk-combo id="warehouse"> - <db-model property="model" id="warehouses"> - <custom> - SELECT id, name FROM vn2008.warehouse - WHERE reserve ORDER BY name - </custom> - </db-model> - </htk-combo> - </div> - <div class="form-group"> - <label><t>Shelf</t></label> - <htk-combo id="shelf"> - <db-model property="model" id="shelves"> - <custom> - SELECT id, name FROM shelf - </custom> - </db-model> - </htk-combo> - </div> - <div class="form-group"> - <label><t>Name prefix</t></label> - <htk-entry id="namePrefix"/> - </div> - <div class="form-group"> - <label><t>Limit amount per item</t></label> - <htk-entry id="maxAmount"/> - </div> - <div class="form-group"> - <label><t>Title</t></label> - <htk-entry id="reportTitle"/> - </div> - <div class="form-group"> - <label><t>Show packing</t></label> - <htk-check id="showPacking"/> - </div> - <div class="form-group"> - <label><t>Stack different items</t></label> - <htk-check id="stack"/> - </div> - <div class="form-group"> - <label><t>Use ids instead of names</t></label> - <htk-check id="useIds"/> - </div> + <div class="form box vn-w-sm vn-pa-lg"> + <div class="form-group"> + <label><t>Configuration</t></label> + <htk-combo + id="config" + placeholder="_Select config" + form="params" + column="config" + on-changed="this.onConfigChange()" + on-ready="this.onConfigChange()"> + <db-model property="model"> + SELECT c.id, c.name reportTitle, c.namePrefix, c.warehouse, c.family, + c.shelf, c.maxAmount, c.showPacking, c.stack, t.reino_id realm + FROM shelfConfig c + JOIN vn2008.Tipos t ON t.tipo_id = c.family + </db-model> + </htk-combo> + </div> + <div class="form-group"> + <label><t>Date</t></label> + <htk-date-chooser form="lot" name="date"/> + </div> + <div class="form-group"> + <label><t>Reign</t></label> + <htk-combo form="lot" name="realm"> + <db-model property="model"> + SELECT id, reino FROM vn2008.reinos + WHERE display != FALSE ORDER BY reino + </db-model> + </htk-combo> + </div> + <div class="form-group"> + <label><t>Family</t></label> + <htk-combo form="lot" name="family"> + <db-model property="model" lot="lot"> + SELECT tipo_id, Tipo FROM vn2008.Tipos + WHERE reino_id = #realm ORDER BY Tipo + </db-model> + </htk-combo> + </div> + <div class="form-group"> + <label><t>Store</t></label> + <htk-combo form="lot"> + <db-model property="model"> + SELECT id, name FROM vn2008.warehouse + WHERE reserve ORDER BY name + </db-model> + </htk-combo> + </div> + <div class="form-group"> + <label><t>Shelf</t></label> + <htk-combo form="lot" name="shelf"> + <db-model property="model"> + SELECT id, name FROM shelf + </db-model> + </htk-combo> + </div> + <div class="form-group"> + <label><t>Name prefix</t></label> + <htk-entry form="lot" name="namePrefix"/> + </div> + <div class="form-group"> + <label><t>Limit amount per item</t></label> + <htk-entry form="lot" name="maxAmount"/> + </div> + <div class="form-group"> + <label><t>Title</t></label> + <htk-entry form="lot" name="reportTitle"/> + </div> + <div class="form-group"> + <label> + <htk-check form="lot" name="showPacking"/> + <t>Show packing</t> + </label> + </div> + <div class="form-group"> + <label> + <htk-check form="lot" name="stack"/> + <t>Stack different items</t> + </label> + </div> + <div class="form-group"> + <label> + <htk-check form="lot" name="useIds"/> + <t>Use ids instead of names</t> + </label> </div> </div> </div> diff --git a/image/family/black/accessory.svg b/image/family/black/accessory.svg new file mode 100644 index 00000000..f49d134a --- /dev/null +++ b/image/family/black/accessory.svg @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 40 40" + xml:space="preserve" + sodipodi:docname="accessory.svg" + width="40" + height="40" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs9" /><sodipodi:namedview + id="namedview7" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="3.595" + inkscape:cx="100" + inkscape:cy="99.860918" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#1E1E1C;} + .st1{fill:none;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} + .st2{fill:#FFFFFF;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} +</style> +<path + class="st0" + d="M 37.313228,1.0829325 H 2.714188 C 1.233722,1.0829325 0,2.2892385 0,3.7971205 v 5.099383 c 0,1.4804655 1.206306,2.7141875 2.714188,2.7141875 h 2.083619 v 0.08225 L 7.978067,33.8451 c 0.411241,2.933516 2.63194,5.071968 5.236464,5.071968 h 13.543522 c 2.63194,0 4.825223,-2.138452 5.236464,-5.071968 l 3.207676,-22.234407 h 2.083619 C 38.766278,11.610693 40,10.404387 40,8.8965055 v -5.126801 c 0,-1.480466 -1.206306,-2.686772 -2.686772,-2.686772 z m -4.386566,10.6374225 -3.152844,21.79575 c -0.274161,1.809459 -1.535298,3.125429 -3.015765,3.125429 H 13.241947 c -1.480467,0 -2.76902,-1.31597 -3.015765,-3.125429 L 7.073338,11.583275 h 25.908156 z m 4.825223,-2.8238515 c 0,0.246744 -0.191912,0.466073 -0.466073,0.466073 H 2.714188 c -0.246745,0 -0.466073,-0.191913 -0.466073,-0.466073 v -5.126799 c 0,-0.246745 0.191912,-0.466073 0.466073,-0.466073 h 34.59904 c 0.246745,0 0.466073,0.191912 0.466073,0.466073 v 5.126799 z" + id="path4" + style="stroke-width:0.27416;fill:#1a1a1a;fill-opacity:1" /> +</svg> diff --git a/image/family/black/artificial.svg b/image/family/black/artificial.svg new file mode 100644 index 00000000..83000adc --- /dev/null +++ b/image/family/black/artificial.svg @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 40 40" + xml:space="preserve" + sodipodi:docname="artificial.svg" + width="40" + height="40" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs13" /><sodipodi:namedview + id="namedview11" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="3.595" + inkscape:cx="100" + inkscape:cy="99.860918" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#1E1E1C;} + .st1{fill:none;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} + .st2{fill:#FFFFFF;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} +</style> +<g + id="g8" + transform="matrix(0.26820887,0,0,0.26820887,-6.5074179,-6.820887)" + style="fill:#1a1a1a;fill-opacity:1"> + <path + class="st0" + d="m 113.7,83.3 c -4.1,0 -8.2,0 -12.4,0 -5.2,0 -10.4,0 -15.6,0 h -2 c -1.5,0 -1.8,0.2 -1.8,1.8 v 30.2 c 0,0.6 0,0.9 0.3,1.2 0.3,0.3 0.6,0.3 1.3,0.3 h 30.2 c 1.5,0 1.7,-0.3 1.7,-1.7 0,-10 0,-20.1 0,-30.1 0.1,-1.5 -0.2,-1.7 -1.7,-1.7 z m -6.4,17.5 v 7.6 h -0.6 c -1.3,0 -2.6,0 -3.9,0 h -1.7 -4.5 c -1.9,0 -3.9,0 -5.8,0 H 90.4 L 90.3,108 v 0 c 0,-5.5 0,-10.8 0,-16.2 v -0.4 h 0.5 c 6.4,0 11.4,0 16,0 h 0.3 l 0.2,0.3 c 0,0 0,0.1 0,0.2 0,3.1 0,6 0,8.9 z" + id="path4" + style="fill:#1a1a1a;fill-opacity:1" /> + <path + class="st0" + d="m 145.9,158.2 25.8,-44.7 c 0.3,-0.5 0.6,-1 0.9,-1.6 l 0.8,-1.4 L 155.2,100 173.4,89.5 173,88.7 c -0.1,-0.3 -0.3,-0.5 -0.4,-0.8 L 146.3,42.1 c -0.4,-0.8 -0.8,-1.1 -1.1,-1.2 -0.3,-0.1 -0.8,0.1 -1.5,0.5 l -4.6,2.6 c -3.8,2.2 -7.5,4.3 -11.3,6.5 L 127.1,51 V 31.7 c 0,-0.7 0,-1.1 -0.3,-1.4 C 126.5,30 126.2,30 125.4,30 H 72.5 c -0.1,0 -0.3,0 -0.5,0 -0.5,0 -0.8,0.1 -1.1,0.3 -0.2,0.2 -0.3,0.6 -0.3,1 0,0.2 0,0.4 0,0.6 v 0.4 3.6 c 0,4.8 0,9.6 0,14.4 V 51 L 52.9,40.8 52.4,40.7 52.1,41.1 c -0.1,0.1 -0.2,0.2 -0.3,0.3 L 25.1,87.5 c -1,1.7 -0.9,2 0.8,3 L 42.3,100 32,105.8 c -2.3,1.3 -4.5,2.6 -6.8,3.9 -0.4,0.2 -0.8,0.5 -0.9,1 -0.1,0.3 0,0.7 0.3,1.1 0.1,0.2 0.2,0.3 0.3,0.5 l 25.9,45 c 0.3,0.6 0.7,1.2 1.2,1.8 l 0.3,0.3 18.1,-10.4 v 2.5 c 0,1.6 0,3.1 0,4.6 l -0.1,12.1 c 0,1.5 0.2,1.7 1.6,1.7 h 2.5 c 1.6,0 3.1,0.1 4.7,0.1 h 45.1 c 2.4,0 2.6,-0.2 2.6,-2.7 v -17.4 -0.8 l 0.6,0.3 c 2.8,1.6 5.6,3.2 8.3,4.8 l 1.9,1.1 c 2.1,1.2 4.2,2.4 6.3,3.6 0.2,0.1 0.7,0.4 1.1,0.2 0.4,0 0.6,-0.2 0.9,-0.9 z m -3.8,-10 -0.3,-0.2 -22.7,-13.1 -0.2,0.5 c -0.3,0.6 -0.3,1.1 -0.2,1.6 v 0.3 c 0,6.4 0,12.8 0,19.3 v 4.1 c 0,0.2 0,0.4 0,0.7 v 0.4 h -40 v -0.7 c 0,-1.8 0,-3.6 0,-5.3 l 0.1,-20.9 -0.7,0.3 c -1.9,0.8 -3.5,1.8 -5.2,2.8 -0.9,0.5 -1.8,1 -2.6,1.5 -1.6,0.9 -3.2,1.8 -5,2.9 l -10,5.8 -19.9,-34.6 14.6,-8.4 9,-5.2 -6.5,-3.7 -17.2,-10 0.3,-0.6 19.2,-33.1 c 0.1,-0.2 0.2,-0.3 0.3,-0.5 l 0.2,-0.3 0.5,0.2 c 1.3,0.8 2.7,1.6 4,2.4 l 17.4,10.1 c 0.3,0.2 0.7,0.4 1.2,0.1 l 0.3,-0.2 c 0.2,-0.3 0.2,-0.7 0.2,-1.2 0,-0.9 0,-1.7 0,-2.5 0,-0.8 0,-1.5 0,-2.3 L 79,38.2 h 0.6 c 2.1,0 4.2,0 6.2,0.1 h 0.3 c 2.3,0.1 4.2,0.1 5.9,0.1 5.8,0 11.4,0 18.1,0 h 7.9 0.1 c 0.1,0 0.2,0 0.3,0 h 0.3 v 27.1 l 23.6,-13.5 19.9,34.6 -23.5,13.5 23.5,13.6 -0.2,0.3 z" + id="path6" + style="fill:#1a1a1a;fill-opacity:1" /> +</g> +</svg> diff --git a/image/family/black/flower.svg b/image/family/black/flower.svg new file mode 100644 index 00000000..cd941b4d --- /dev/null +++ b/image/family/black/flower.svg @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 40 40" + xml:space="preserve" + sodipodi:docname="flower.svg" + width="40" + height="40" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs13"><linearGradient + inkscape:collect="always" + id="linearGradient981"><stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop977" /><stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop979" /></linearGradient><linearGradient + inkscape:collect="always" + xlink:href="#linearGradient981" + id="linearGradient983" + x1="34.739397" + y1="99.599534" + x2="165.73375" + y2="99.599534" + gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview + id="namedview11" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="4.365" + inkscape:cx="102.29095" + inkscape:cy="63.459336" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#1E1E1C;} + .st1{fill:none;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} + .st2{fill:#FFFFFF;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} +</style> +<g + id="g8" + transform="matrix(0.28530481,0,0,0.28530481,-8.5979763,-8.4162261)" + style="stroke:none;stroke-opacity:1;fill:#1a1a1a;fill-opacity:1"> + <path + class="st0" + d="m 100.1,76.9 h -0.5 c -6.1,0 -11.8,2.3 -16.1,6.5 -4.4,4.3 -6.8,10.1 -6.8,16.3 0,6.2 2.4,12 6.7,16.2 4.2,4.2 10,6.5 15.9,6.5 h 0.3 0.3 c 5.9,0 11.6,-2.4 15.9,-6.5 4.3,-4.2 6.7,-10 6.7,-16.2 0,-12.5 -9.9,-22.5 -22.4,-22.8 z M 89.2,89.1 c 2.7,-2.7 6.4,-4.2 10,-4.2 h 0.4 c 3.8,-0.1 7.6,1.4 10.5,4.2 2.9,2.8 4.5,6.6 4.5,10.8 0,8.2 -6.8,14.9 -15,14.9 h -0.1 c -8,0 -14.8,-6.8 -14.8,-14.9 -0.1,-4.1 1.5,-8 4.5,-10.8 z" + id="path4" + style="stroke:none;stroke-opacity:1;fill:#1a1a1a;fill-opacity:1" /> + <path + class="st0" + d="m 157.2,102 -0.2,-0.2 0.2,-0.2 c 0.1,-0.1 0.2,-0.2 0.3,-0.3 6.1,-6.5 8.9,-14.4 8.1,-23.2 -0.7,-7.9 -4.1,-14.5 -10,-19.7 -5.1,-4.4 -10.9,-6.8 -17.3,-7.3 v 0 h -0.4 c -1.7,-0.1 -3.4,0 -5.2,0.1 -0.8,0.1 -1.5,0.1 -2.2,0.2 h -0.1 c -0.1,-0.1 -0.2,-0.4 -0.4,-1 -1.7,-5.4 -4.7,-10 -8.9,-13.6 -6.8,-5.8 -14.8,-8.2 -23.6,-7 -6.5,0.8 -12.3,3.7 -17.1,8.5 -3,3 -5.3,6.6 -6.8,10.7 L 73.4,49.5 73,49.3 C 68.6,48.2 64.2,48.2 59.9,49 53.3,50.4 47.8,53.5 43.6,58.4 37.1,66.1 34.8,75 36.9,85 c 1,4.6 3,8.7 6.1,12.4 L 43.3,97.8 43,98 c -2.7,2.8 -4.8,6 -6.2,9.6 v 0 c 0,0.1 -4.5,9.7 -0.2,21.5 0,0.1 0,0.1 0.1,0.2 0,0.1 0.1,0.2 0.1,0.4 0.4,1 0.8,2 1.3,2.9 0.4,0.9 0.8,1.5 1.1,2 3.3,5.4 8.2,9.4 14.4,11.8 5,2 10.4,2.5 16,1.6 l 0.3,-0.1 0.2,0.5 c 0.9,3.2 2.3,6.1 4.1,8.6 4.4,6.2 10.2,10.2 17.4,12 0.8,0.2 3.6,0.7 7.3,0.7 2.3,0 4.9,-0.2 7.6,-0.9 l 0.3,-0.1 c 0.3,-0.1 0.5,-0.1 0.7,-0.2 0.1,0 0.2,-0.1 0.4,-0.1 l 0.2,-0.1 c 4.2,-1.4 8.1,-3.7 11.5,-7 3.1,-3 5.5,-6.6 7,-10.7 0.1,-0.2 0.1,-0.3 0.2,-0.5 l 0.1,-0.2 h 0.2 c 0.1,0 0.3,0.1 0.5,0.1 3,0.7 5.8,0.9 8.6,0.8 4.3,-0.2 8.4,-1.3 12.1,-3.3 6,-3.2 10.5,-7.8 13.3,-13.9 2.9,-6.4 3.5,-13.1 1.8,-20.1 -1.3,-4.1 -3.3,-8.1 -6.2,-11.5 z M 149,98.3 c -0.8,0.6 -1.6,1.2 -2.3,1.7 l -1.7,1.2 0.4,0.5 c 0.7,0.9 1.6,1.6 2.3,2.2 0.4,0.3 0.8,0.6 1.1,1 4.6,4.2 7,9.2 7.4,15.3 0.3,5.9 -1.5,11.1 -5.3,15.4 -4.8,5.4 -10.8,7.9 -18,7.5 -2.6,-0.2 -5.2,-0.9 -8.1,-2.2 -0.6,-0.2 -1.1,-0.5 -1.7,-0.7 l -1.9,-0.8 -1.1,5.3 c -1.9,9.3 -9.8,16.4 -19.4,17.3 -0.7,0.1 -1.4,0.1 -2.1,0.1 -5,0 -9.9,-1.8 -13.9,-5.1 -3.9,-3.3 -6.6,-7.9 -7.5,-12.9 -0.2,-1.2 -0.4,-2.5 -0.5,-3.7 l -0.1,-0.9 c 0,-0.4 -0.1,-1 -0.5,-1.5 l -0.3,-0.3 -1.8,0.6 c -0.9,0.3 -1.8,0.6 -2.7,0.9 -8.9,3.1 -19,-0.1 -24.6,-7.8 -2.6,-3.6 -4,-7.6 -4.1,-11.8 -0.3,-7.8 2.9,-14.2 9.4,-19 L 55.4,98 55,97.7 c -0.7,-0.7 -1.5,-1.4 -2.2,-2 -0.9,-0.7 -1.7,-1.5 -2.5,-2.3 -4,-4.2 -6.1,-9.1 -6.2,-14.8 -0.1,-5.4 1.6,-10.2 5,-14.3 3.5,-4.2 8,-6.8 13.4,-7.7 4.2,-0.7 8.4,-0.1 12.6,1.8 0.8,0.4 1.6,0.7 2.6,1.1 0.6,0.2 0.9,0.4 1.3,0.2 0.4,-0.2 0.5,-0.6 0.6,-1.2 0.1,-0.6 0.2,-1.2 0.3,-1.8 v -0.1 c 0.2,-1.2 0.4,-2.3 0.8,-3.4 2.8,-8.5 8.6,-13.7 17.2,-15.3 7.4,-1.4 13.9,0.7 19.5,6.3 3.5,3.5 5.6,8 6.1,13.2 0.1,0.8 0.2,1.6 0.3,2.4 l 0.2,2 0.6,-0.1 c 1,-0.2 1.9,-0.5 2.7,-0.8 l 0.1,-0.1 c 0.3,-0.1 0.5,-0.2 0.8,-0.3 8,-2.8 15.3,-1.5 21.8,3.8 4.6,3.8 7.2,8.8 7.7,14.8 0.6,7.7 -2.4,14.2 -8.7,19.2 z" + id="path6" + style="stroke:none;stroke-opacity:1;fill:#1a1a1a;fill-opacity:1" /> +</g> +</svg> diff --git a/image/family/black/fruit.svg b/image/family/black/fruit.svg new file mode 100644 index 00000000..0c1ad7e0 --- /dev/null +++ b/image/family/black/fruit.svg @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 40 40" + xml:space="preserve" + sodipodi:docname="fruit.svg" + width="40" + height="40" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs9" /><sodipodi:namedview + id="namedview7" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="3.595" + inkscape:cx="100" + inkscape:cy="99.860918" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#1E1E1C;} + .st1{fill:none;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} + .st2{fill:#FFFFFF;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} +</style> +<path + class="st0" + d="m 4.6155643,32.24963 c 1.033877,0 2.041908,0.232623 2.998243,0.67202 0.18093,0.07754 0.387705,0.180928 0.568633,0.284316 l 0.103387,0.05169 c 1.9902137,0.982183 4.2388957,1.473275 6.4875777,1.473275 1.68005,0 3.3601,-0.284317 4.936762,-0.852949 h 0.02585 l 0.05169,0.02585 c 1.60251,0.568632 3.282559,0.852948 4.988456,0.852948 0.05169,0 0.103387,0 0.155081,0 h 0.103388 c 0.02585,0 0.02585,0 0.05169,0 0.02585,0 0.05169,0 0.07754,0 h 0.02585 c 3.980425,-0.103388 7.676536,-1.75759 10.468003,-4.600753 2.791467,-2.843161 4.316438,-6.616811 4.342284,-10.597237 0,-0.284317 -0.103387,-0.542786 -0.310162,-0.749561 -0.206776,-0.206776 -0.465245,-0.310163 -0.723717,-0.310163 h -9.434126 l -0.02585,-0.103388 c -0.28431,-2.50715 -1.188952,-4.910914 -2.662226,-6.952821 -0.232622,-0.336009 -0.516938,-0.697866 -0.852948,-1.059723 l -0.05169,-0.05169 0.05169,-0.07754 c 1.550815,-1.8351313 1.628356,-3.1274773 1.628356,-3.3859473 0,-0.542785 -0.413551,-0.982183 -0.982183,-1.008029 0,0 0,0 0,0 -0.516938,0 -1.00803,0.439397 -1.059723,0.956336 0,0 -0.07754,0.74956 -1.03388,1.938519 l -0.02585,0.02585 -0.07754,0.02585 -0.05169,-0.02585 C 21.493607,6.2993277 17.797496,5.0586757 13.997999,5.2654507 10.04342,5.4722267 6.4248503,7.2298167 3.7884643,10.176366 c -4.03211997,4.497365 -4.936762,10.933249 -2.274529,16.361101 l 0.05169,0.103388 c 0.103387,0.180931 0.206775,0.361857 0.310163,0.594479 0.568632,1.240652 0.775407,2.610541 0.594479,3.954581 -0.05169,0.310163 0.05169,0.646172 0.284316,0.878795 0.232622,0.232622 0.568632,0.33601 0.878795,0.284316 0.310163,-0.07754 0.646173,-0.103388 0.982183,-0.103388 z m 33.2391427,-11.682808 0.07754,0.07754 v 0.05169 c -0.232622,2.636385 -1.240652,5.117691 -2.920704,7.185445 l -0.02585,0.02585 h -0.103388 l -0.05169,-0.02585 -5.221077,-5.22108 c -0.387704,-0.387704 -1.033876,-0.439397 -1.42158,-0.103387 -0.232622,0.180928 -0.361859,0.465244 -0.361859,0.74956 0,0.284316 0.10339,0.568635 0.310162,0.77541 l 5.324467,5.324465 v 0.05169 0.05169 l -0.02585,0.02585 c -2.016059,1.757593 -4.497363,2.843163 -7.133751,3.127479 h -0.05169 l -0.07754,-0.05169 v -0.05169 -8.271015 c 0,-0.568632 -0.413551,-1.033877 -0.930489,-1.08557 -0.284316,-0.02585 -0.568632,0.07754 -0.775408,0.258469 -0.206775,0.206775 -0.33601,0.465244 -0.33601,0.74956 v 8.426097 l -0.07754,0.07754 h -0.05169 c -1.266499,-0.07754 -2.481304,-0.33601 -3.670265,-0.749561 -0.129232,-0.07754 -0.232622,-0.10339 -0.336009,-0.129237 -1.240652,-0.491089 -2.377916,-1.163111 -3.411793,-1.990212 l -0.02585,-0.02585 v -0.103382 l 0.02585,-0.05169 5.557089,-5.557086 c 0.387704,-0.387704 0.439398,-1.033879 0.103385,-1.421583 -0.180926,-0.232622 -0.465242,-0.361857 -0.749558,-0.361857 -0.284316,-0.02585 -0.568635,0.103388 -0.77541,0.310163 l -5.660475,5.660477 h -0.05169 -0.05169 l -0.02585,-0.02585 c -1.860989,-2.119449 -2.972406,-4.729988 -3.230875,-7.547301 v -0.05169 l 0.05169,-0.07754 h 0.05169 26.053699 z m -34.5056417,5.014302 -0.02585,-0.02585 C 1.0745333,20.90283 1.8499413,15.397433 5.3134283,11.546242 7.5879573,9.0132437 10.689589,7.5141217 14.101382,7.3331937 c 3.385947,-0.180928 6.668506,0.956336 9.201504,3.2308653 0.129234,0.103388 0.232622,0.206776 0.361857,0.33601 l 0.180931,0.180929 c 0.155079,0.155081 0.310163,0.310163 0.465242,0.491091 l 0.02585,0.02585 c 0.310163,0.33601 0.594479,0.723714 0.878795,1.085571 1.214805,1.68005 1.990212,3.670263 2.248681,5.738017 v 0.05169 l -0.05169,0.07754 h -0.05169 -16.774653 c -0.284316,0 -0.542785,0.103388 -0.7237137,0.310163 -0.206775,0.206776 -0.310163,0.465245 -0.310163,0.749562 0,5.221077 2.6363857,10.002759 7.0562097,12.845919 l 0.05169,0.02585 -0.02585,0.155081 -0.07754,0.02585 c -0.620326,0.07754 -1.214806,0.129231 -1.835132,0.129231 -1.912672,0 -3.77365,-0.413548 -5.5053937,-1.266498 h -0.02585 c -0.232619,-0.15508 -0.516934,-0.284314 -0.749557,-0.387702 -1.188958,-0.568632 -2.455457,-0.852948 -3.747804,-0.852948 h -0.103388 v -0.103388 c 0,-1.292348 -0.310163,-2.558847 -0.827101,-3.721958 -0.129235,-0.361857 -0.258469,-0.620326 -0.413551,-0.878795 z" + id="path4" + style="stroke-width:0.258469;fill:#1a1a1a;fill-opacity:1" /> +</svg> diff --git a/image/family/black/greenery.svg b/image/family/black/greenery.svg new file mode 100644 index 00000000..e99f102a --- /dev/null +++ b/image/family/black/greenery.svg @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 40 40" + xml:space="preserve" + sodipodi:docname="greenery.svg" + width="40" + height="40" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs9" /><sodipodi:namedview + id="namedview7" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="3.595" + inkscape:cx="100" + inkscape:cy="99.860918" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#1E1E1C;} + .st1{fill:none;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} + .st2{fill:#FFFFFF;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} +</style> +<path + class="st0" + d="M 34.045254,21.098493 C 33.702189,16.753004 30.814725,12.321749 25.46863,7.9190818 21.15173,4.3740778 16.405999,1.8582678 14.54773,0.94342876 l -0.02859,-0.05718 h -0.02859 l -0.02859,-0.02859 c -0.428827,-0.228707 -0.714715,-0.343062 -0.800481,-0.400239 L 12.575107,-2.4007925e-7 12.031921,1.0577838 C 5.4279214,14.065662 4.1700164,23.642891 8.2867954,29.503584 c 3.6307706,5.174562 10.2919476,5.946458 13.9227186,5.946458 0.571774,0 1.114961,-0.02859 1.600969,-0.05718 h 0.05718 l 0.02859,0.05718 c 0.886252,1.572381 1.743914,2.944641 2.601576,4.088191 0.200121,0.257299 0.486009,0.428831 0.829074,0.45742 0.343065,0.02859 0.68613,-0.08577 0.943428,-0.285888 l 0.02859,-0.02859 c 0.486009,-0.428832 0.543186,-1.14355 0.142944,-1.658148 -0.743308,-1.000606 -1.543792,-2.201333 -2.315689,-3.602181 l -0.05718,-0.08577 0.08577,-0.05718 c 5.631983,-4.031013 8.262147,-8.462268 7.890494,-13.179411 z M 22.466812,32.99141 c -0.05718,0 -0.114355,0 -0.200121,0 -7.433073,0 -10.69219,-3.058995 -11.950095,-4.888675 -3.1733496,-4.54561 -2.3156876,-12.493281 2.51581,-22.9567612 l 0.114355,-0.285888 0.08577,0.285888 c 1.686736,6.4610562 5.145974,18.6684502 9.520052,27.6739042 l 0.08577,0.142944 z m 2.601576,-0.943428 -0.114355,0.08577 -0.05718,-0.114355 C 20.608544,23.271238 17.092128,10.949489 15.376804,4.4026668 l -0.05718,-0.22871 0.22871,0.114355 c 2.630165,1.458026 6.461056,3.802303 9.720173,6.7469432 3.945247,3.516416 6.060814,6.975654 6.318113,10.291948 0.285887,3.659359 -1.915446,7.29013 -6.518234,10.720779 z" + id="path4" + style="stroke-width:0.285887;fill:#1a1a1a;fill-opacity:1" /> +</svg> diff --git a/image/family/black/handmade.svg b/image/family/black/handmade.svg new file mode 100644 index 00000000..1ff9644d --- /dev/null +++ b/image/family/black/handmade.svg @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 40 40" + xml:space="preserve" + sodipodi:docname="handmade.svg" + width="40" + height="40" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs13" /><sodipodi:namedview + id="namedview11" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="3.595" + inkscape:cx="100" + inkscape:cy="99.860918" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#1E1E1C;} + .st1{fill:none;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} + .st2{fill:#FFFFFF;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} +</style> +<g + id="g8" + transform="matrix(0.28579156,0,0,0.28579156,-8.7130268,-8.5559862)" + style="fill:#1a1a1a;fill-opacity:1"> + <path + class="st0" + d="m 165,128.6 c 1.6,-6.6 2,-12.7 1.5,-18.7 -0.6,-5.6 -2,-10.4 -4.5,-14.8 -4.2,-7.5 -10.6,-12.8 -19,-15.5 -1,-0.3 -2,-0.6 -3.1,-0.8 l -1.8,-0.4 1.9,-0.3 c 1.4,-0.2 2.8,-0.5 4.1,-0.7 l 0.7,-0.1 c 4.4,-0.8 8.9,-1.6 13.3,-2.9 3.3,-1 6.2,-2.7 8.8,-4.5 l 0.8,-0.6 -0.7,-0.7 c -0.6,-0.6 -1.3,-1.3 -1.9,-1.9 -2,-2 -4,-4 -6.2,-5.8 -7.8,-6.3 -15,-9.6 -22.9,-10.6 -5.7,-0.7 -11.2,-0.1 -16.2,1.9 -1.6,0.6 -3.1,1.4 -4.2,2 l -0.3,0.2 -0.2,-0.3 c -1.2,-2.2 -2.8,-4.2 -4.9,-6 -4.1,-3.4 -9,-5 -14.7,-4.6 H 95.1 L 95,43.1 C 94,40.3 92.4,37.8 90.1,35.6 83.4,29.1 73.3,28.1 65.4,33.1 62.1,35.2 59.6,38 58,41.6 L 57.8,42.1 57.3,42 c -1.9,-0.3 -3.8,-0.3 -5.9,0 -4.9,0.6 -9.5,3.2 -12.8,7.2 -3.5,4.3 -5,9.7 -4.3,15.3 0.4,3.4 1.6,6.4 3.5,9.1 0,0.1 0.1,0.1 0.1,0.1 l 0.1,0.2 -0.2,0.3 c -3.4,4.2 -4.9,8.9 -4.5,14.2 0.5,6.8 3.7,12.2 9.6,15.9 3.5,2.3 7.7,3.2 12.3,2.8 l 0.3,-0.1 0.1,0.3 c 1.2,3.4 3.2,6.2 5.8,8.4 3.4,2.9 7.2,4.4 11.3,4.7 0.3,0 0.4,0.1 0.7,0.5 l 6.5,8.8 c 2.5,3.3 5,6.8 7.5,10.2 0.5,0.7 0.5,1.1 0.3,1.6 -0.4,0.9 -0.6,1.9 -0.9,2.7 v 0.1 c -0.1,0.4 -0.2,0.8 -0.3,1.2 l -2,6.5 c -1.3,4.1 -2.5,8.2 -3.8,12.2 -0.5,1.6 -0.3,3 0.4,4.1 0.8,1.1 2.1,1.6 3.8,1.6 H 109 c 1,0 2,0 3,0 2.7,0 5.4,0 8.1,0 1.2,0 2.2,-0.3 3,-1 1.7,-1.5 1.5,-3.4 1,-4.9 l -1.8,-5.9 c -1.7,-5.6 -3.4,-11.3 -5.1,-17.1 -0.1,-0.5 -0.1,-0.8 0.2,-1.3 4.3,-6.8 8.5,-13.7 12.7,-20.4 l 5.2,-8.3 c 0.2,-0.3 0.4,-0.7 0.7,-1 l 0.3,-0.4 7.9,9.1 c 3.1,3.6 6.4,7.4 10,10.7 2.5,2.3 5.5,3.8 8.4,5.2 l 0.9,0.4 0.7,-2.9 c 0.2,-1.2 0.5,-2.3 0.8,-3.5 z M 113.9,75 c 2.4,-3.5 3.6,-7.4 3.5,-11.7 0,-0.5 0.1,-0.7 0.6,-1 5.2,-3.3 10.5,-4.6 16.5,-4 5.4,0.6 10.5,2.7 16,6.5 0.7,0.5 1.5,1 2.3,1.7 l 0.6,0.5 -0.7,0.2 c -1.5,0.4 -3,0.7 -4.3,0.9 -3.1,0.6 -6.1,1.1 -9.1,1.6 -4,0.7 -8.1,1.4 -12.2,2.3 -3.5,0.7 -8.1,1.8 -12.7,3.5 l -1.1,0.4 z m -39.6,37.4 c -2.9,0 -5.7,-1.1 -7.9,-3.3 -2.2,-2.1 -3.5,-4.8 -3.8,-8.2 -0.1,-0.7 -0.1,-1.3 -0.2,-2 L 62.2,97 H 61.3 C 60.1,97.1 59,97.6 58,98 l -0.4,0.2 c -3,1.2 -6.4,1.1 -9.3,-0.3 -3,-1.4 -5.4,-4.1 -6.4,-7.3 -1.5,-4.7 0.2,-10 4.2,-13 l 4,-3 -0.5,-0.7 C 49,73 48.2,72.4 47.4,71.8 l -0.1,-0.1 c -0.2,-0.2 -0.5,-0.4 -0.7,-0.5 -3,-2.5 -4.5,-5.7 -4.4,-9.3 0.1,-5.3 3,-9.4 8,-11.2 2.8,-1 5.6,-0.9 8.5,0.3 l 4.7,2 0.3,-0.9 c 0.4,-1.1 0.6,-2.2 0.7,-3.3 l 0.2,-1 c 0.8,-4.4 4.5,-9.3 10.9,-9.6 4.2,-0.2 7.7,1.4 10.3,5 1.4,1.9 2.1,4.2 2.3,7.1 0.1,0.9 0.1,1.8 0.4,2.7 L 88.7,53.8 91,53 c 0.8,-0.3 1.6,-0.6 2.4,-0.8 5.5,-2 11.6,0.4 14.3,5.5 2.2,4.1 2,8.3 -0.6,12.5 -1,1.6 -2.5,2.8 -4.2,3.9 l -0.5,0.4 c -1,0.7 -1.4,1.1 -1.4,1.7 0,0.6 0.4,1.1 1.3,1.8 1.6,1.4 3.2,2.8 4.3,4.7 1.9,3.1 2.1,7.1 0.6,10.7 -1.5,3.6 -4.4,6.1 -8.3,7 -2.3,0.6 -4.7,0.3 -7.1,-0.7 -0.7,-0.3 -1.4,-0.6 -2.1,-0.9 L 87.2,97.7 87,98.4 c -0.4,1 -0.5,1.9 -0.7,2.8 l -0.1,0.7 c -0.7,4 -2.7,7 -6.1,8.9 -1.9,1 -3.9,1.6 -5.8,1.6 z m 46,7.2 c -3.9,6.3 -7.4,11.9 -11,17.7 -0.8,1.3 -0.9,2.6 -0.4,4.3 l 4.5,15.1 c 0.5,1.5 0.9,3 1.3,4.5 l 0.1,0.5 h -0.5 c -2.1,0 -4.2,0 -6.3,0 h -2.7 c -4.7,0 -9.7,0 -14.8,0.2 H 90 l 0.1,-0.5 c 0.2,-0.7 0.4,-1.4 0.6,-2.1 0.1,-0.4 0.3,-0.9 0.4,-1.3 1.8,-6 3.4,-11 4.9,-15.7 0.7,-2.1 0.3,-4 -1,-5.8 -3.2,-4.3 -6.5,-8.7 -9.4,-12.7 l -3.5,-4.7 0.4,-0.2 c 3.4,-1.6 6,-3.8 8.1,-6.7 0.7,-1 1.3,-2.1 1.8,-3.1 l 0.2,-0.5 0.5,0.1 c 3,0.5 5.9,0.3 8.6,-0.5 6.9,-2.1 11.5,-6.6 13.7,-13.5 l 0.1,-0.5 0.5,0.1 c 3.1,0.5 5.7,2.3 8.3,4.2 1.4,1 2.6,2.2 3.9,3.3 0.5,0.5 1.1,1 1.7,1.4 l 0.3,0.2 z m 38.1,-3.2 c -0.1,1.6 -0.2,3.1 -0.4,4.6 l -0.1,0.8 -1.3,-1.4 c -2.8,-3 -5.5,-6.2 -8.1,-9.2 -2,-2.3 -4.2,-4.9 -6.4,-7.3 -3.5,-3.8 -7.3,-7.9 -11.7,-11.4 -2.4,-1.9 -4.7,-3.4 -7,-4.5 l -0.9,-0.4 0.9,-0.3 c 0.8,-0.2 1.6,-0.4 2.5,-0.6 6.4,-1.1 12.4,-0.4 17.7,2.2 7.1,3.5 11.7,9.3 13.7,17.5 1,3.2 1.3,6.5 1.1,10 z" + id="path4" + style="fill:#1a1a1a;fill-opacity:1" /> + <path + class="st0" + d="m 75.4,59.4 h -0.2 -0.1 c -8.7,0.1 -15.5,7.1 -15.5,15.9 0,4.3 1.6,8.3 4.6,11.3 2.9,2.9 6.9,4.6 11.2,4.6 8.8,0 15.8,-7 15.8,-15.8 0,-4.3 -1.6,-8.3 -4.6,-11.2 -3,-3.1 -7,-4.8 -11.2,-4.8 z m -0.1,23.5 c -2,0 -3.9,-0.8 -5.3,-2.3 -1.4,-1.5 -2.2,-3.4 -2.2,-5.4 0.1,-4.3 3.3,-7.6 7.6,-7.6 2,0 3.8,0.8 5.2,2.2 1.5,1.5 2.3,3.5 2.3,5.5 0,4.2 -3.4,7.6 -7.6,7.6 z" + id="path6" + style="fill:#1a1a1a;fill-opacity:1" /> +</g> +</svg> diff --git a/image/family/black/handmadeArtificial.svg b/image/family/black/handmadeArtificial.svg new file mode 100644 index 00000000..f4ea2768 --- /dev/null +++ b/image/family/black/handmadeArtificial.svg @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 40 40" + xml:space="preserve" + sodipodi:docname="handmadeArtificial.svg" + width="40" + height="40" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs13" /><sodipodi:namedview + id="namedview11" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="3.595" + inkscape:cx="100" + inkscape:cy="99.860918" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#1E1E1C;} + .st1{fill:none;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} + .st2{fill:#FFFFFF;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} +</style> +<g + id="g8" + transform="matrix(0.2875629,0,0,0.2875629,-8.75629,-8.7994244)" + style="fill:#1a1a1a;fill-opacity:1"> + <path + class="st0" + d="m 92.8,87.4 c 0,-0.2 0,-0.3 0,-0.4 V 65.7 c 0,-0.5 -0.1,-0.8 -0.3,-0.9 -0.2,-0.2 -0.5,-0.3 -1,-0.3 -0.1,0 -0.3,0 -0.4,0 h -20 -0.3 c -0.2,0 -0.4,0 -0.5,0 -0.4,0 -0.7,0.2 -0.8,0.2 -0.2,0.2 -0.3,0.5 -0.3,0.8 0,0.2 0,0.3 0,0.5 V 88 H 92.7 Z M 85.3,72.3 c 0,0.9 0,1.8 0,2.7 v 2.3 c 0,0.9 0,1.8 0,2.8 v 0.4 h -0.4 c -2.6,0 -5.2,0 -7.9,0 h -0.4 v -0.4 c 0,-2.6 0,-5.2 0,-7.9 V 71.8 H 77 c 2.6,0 5.1,0 7.9,0 h 0.2 z" + id="path4" + style="fill:#1a1a1a;fill-opacity:1" /> + <path + class="st0" + d="m 167.4,121.4 c -0.1,-0.4 -0.2,-0.7 -0.4,-1.1 L 153.1,81.9 C 152.2,79.8 150.9,80 150.9,80 l -16.9,4 1.2,-0.9 9.6,-6.7 v 0 l 19.6,-13.8 -39.3,-9.8 v 0 c -0.6,-0.1 -1.2,-0.3 -1.7,-0.4 -1,-0.2 -1.4,0.2 -1.8,0.9 -0.1,0.1 -0.1,0.3 -0.2,0.4 v 0 l -0.4,0.7 -9,-15.8 c -0.4,-0.8 -0.7,-1.1 -1.1,-1.2 -0.4,-0.1 -0.8,0.1 -1.5,0.5 l -2.7,1.5 c -2,1.2 -4,2.3 -6,3.5 l -0.6,0.3 -0.1,-0.6 v -2.3 c 0,-1.4 0,-2.7 0,-4.1 0,-0.5 0,-1 0,-1.5 0,-1.2 0,-2.4 -0.1,-3.5 V 30.6 H 64.1 C 62.4,30.7 62,32 62,32.7 V 33 c 0,3.2 0,6.4 0,9.6 v 0.6 L 61.4,42.9 C 60.7,42.5 60,42.1 59.3,41.7 l -1.6,-0.9 c -1.8,-1 -3.7,-2.1 -5.5,-3.2 -0.3,-0.2 -0.7,-0.4 -1.1,-0.2 -0.4,0.1 -0.6,0.6 -0.7,0.8 0,0.1 -0.1,0.2 -0.2,0.4 l -18.3,31.3 0.4,0.2 c 1.7,1.1 3.5,2.1 5.3,3.1 0.2,0.1 0.4,0.2 0.5,0.3 v 0 l 5,2.5 -2.8,1.6 c 0,0 -0.1,0 -0.1,0.1 l -8.3,4.8 0.2,0.4 c 1.9,3.7 17.8,31.4 18.8,32.4 l 0.2,0.3 6.2,-3.5 4.7,-3 -0.2,6.8 v 0 c 0,1.6 0,3.1 0,4.6 0,0.3 0,0.8 0.3,1.2 0.3,0.3 0.8,0.3 1,0.3 0.5,0 1.1,0 1.7,0.1 h 0.1 c 0.6,0.1 1.2,0.1 1.7,0.1 0.7,0 1.4,0 2.1,0 0.9,0 1.8,0 2.7,0 0.1,0 0.1,0 0.2,0 0.7,0 1.2,0.3 1.8,0.9 4,5.1 8.4,10.6 13.4,16.7 0.5,0.6 0.6,1.1 0.4,1.8 -1.9,5.9 -3.9,11.7 -5.8,17.6 l -2.8,7.9 c -0.2,0.6 -0.1,1.2 0.2,1.8 0.4,0.5 0.9,0.8 1.6,0.8 h 44.2 l -0.2,-1 c -0.1,-0.2 -0.1,-0.4 -0.1,-0.6 l -1.8,-6.1 c -1.9,-6.6 -3.9,-13.4 -5.9,-20.3 -0.3,-1 -0.2,-1.7 0.4,-2.7 4.4,-7 8.8,-14.1 13.2,-21.1 l 3.8,-6.1 c 0.1,-0.1 0.2,-0.3 0.2,-0.4 l 0.3,0.1 0.1,-0.4 c 0.2,0 0.4,0.1 0.8,0.3 l 30.3,11.3 c 0.3,0.1 0.6,0.2 1,0.3 l 1.4,0.5 z M 129.3,70.5 c 0.5,-0.3 0.6,-0.8 0.4,-1.3 l -0.9,-1.5 c -0.7,-1.3 -1.5,-2.5 -2.2,-3.8 l -2.6,-4 16.5,4 v 0 l 0.7,0.2 5.8,1.9 -2.6,1.7 -4.6,3 c -4.6,3 -9.2,5.9 -13.8,8.9 -0.2,0.2 -0.4,0.2 -0.6,0.2 -0.2,0 -0.3,-0.1 -0.5,-0.2 -1.5,-0.9 -3,-1.8 -4.5,-2.7 l -1.1,-0.6 z m -59,43.9 h -0.9 v -0.5 -17.6 l -0.7,0.3 c -1.7,0.8 -3.3,1.8 -4.9,2.7 l -0.1,0.1 c -0.9,0.5 -1.8,1.1 -2.7,1.6 -1.8,1 -3.7,2.1 -5.3,3.1 l -2,1.2 -0.6,-1.1 c -0.6,-1 -1.2,-2 -1.8,-3 -3,-5.1 -5.9,-10.3 -8.8,-15.4 L 42.2,85.3 42.7,85 56,77.3 c 0.2,-0.1 0.4,-0.3 0.7,-0.4 L 57.8,76.2 43.7,68 C 42.9,67.5 42.6,66.5 43.1,65.7 L 53,48.6 c 0.5,-0.8 1.5,-1.1 2.3,-0.6 L 68,55.3 c 0.3,0.2 0.6,0.2 0.9,0 0.3,-0.2 0.5,-0.5 0.5,-0.8 v -0.8 c 0,-1.2 0.1,-2.2 0.1,-3.3 0,-2.4 0,-4.8 0,-7.2 V 38 H 70 c 7.3,0 14.7,0 22,0 h 0.5 v 16.5 c 0,0.3 0.2,0.7 0.5,0.8 0.3,0.1 0.7,0.2 1,0 L 106.8,48 c 0.8,-0.5 1.9,-0.2 2.3,0.6 l 6.8,11.9 c 1.2,2 2.3,4 3.5,6.1 l 0.3,0.6 -14.3,8.2 c -0.3,0.2 -0.4,0.5 -0.4,0.8 0,0.3 0.2,0.6 0.5,0.8 l 12.8,7.4 c 0.8,0.5 1.1,1.5 0.6,2.3 l -9.9,17.1 c -0.2,0.4 -0.6,0.7 -1,0.8 -0.4,0.1 -0.9,0.1 -1.3,-0.2 L 93.2,96.6 92.9,97 c -0.4,0.4 -0.4,0.9 -0.3,1.4 v 8.4 3.7 c 0,1.3 0,2.4 -0.2,3.6 l -0.1,0.3 h -0.5 c -0.1,0 -0.2,0 -0.3,0 -7,0 -14.1,0.1 -21.2,0 z m 55.8,-4.5 -9.5,15.2 c -2.7,4.2 -5.3,8.5 -8,12.7 -0.5,0.8 -0.6,1.5 -0.3,2.5 1.5,5.3 3.1,10.5 4.6,15.8 l 1.7,5.9 h -0.5 c 0,0 -0.1,0 -0.1,0 h -0.1 l -20.2,-0.1 c -0.7,0 -1.4,0 -2.1,0 h -3.1 l 1.3,-4.1 c 1.8,-5.7 3.8,-11.6 5.7,-17.3 0.4,-1.1 0.2,-1.8 -0.5,-2.7 -3.4,-4.2 -6.7,-8.4 -10.7,-13.3 l -1.9,-2.4 h 16.2 c 0.7,0 1,0 1.2,-0.3 0.3,-0.3 0.3,-0.6 0.3,-1.4 v -11 l 0.6,0.4 c 0.2,0.1 0.3,0.2 0.5,0.3 1.6,0.9 3.1,1.8 4.7,2.7 l 3.9,2.3 c 1.1,0.6 1.4,0.5 2,-0.5 l 5.5,-9.4 c 0.1,-0.1 0.1,-0.2 0.2,-0.3 l 0.2,-0.2 0.6,0.2 c 2.4,0.9 4.7,1.8 7.1,2.6 0.5,0.2 0.9,0.6 1,1 0.1,0.4 -0.1,0.9 -0.3,1.4 z m 21.6,-2.2 -26.3,-9.8 0.3,-0.6 c 0.5,-0.9 1,-1.8 1.5,-2.7 0.1,-0.2 0.3,-0.2 0.7,-0.3 l 16.3,-3.9 c 2,-0.5 3.9,-0.9 5.9,-1.4 l 1,-0.1 1,1 V 90 c 1.5,4.1 2.9,8.1 4.4,12.2 l 3.6,8.7 z" + id="path6" + style="fill:#1a1a1a;fill-opacity:1" /> +</g> +</svg> diff --git a/image/family/black/mortuary.svg b/image/family/black/mortuary.svg new file mode 100644 index 00000000..979e5118 --- /dev/null +++ b/image/family/black/mortuary.svg @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 40 40" + xml:space="preserve" + sodipodi:docname="mortuary.svg" + width="40" + height="40" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs9" /><sodipodi:namedview + id="namedview7" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="3.595" + inkscape:cx="100" + inkscape:cy="99.860918" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#1E1E1C;} + .st1{fill:none;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} + .st2{fill:#FFFFFF;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} +</style> +<path + class="st0" + d="m 35.428571,16.4 c 0,-8.085714 -6.228572,-14.714286 -14.142857,-15.371429 V 0.314286 C 21.285715,0.142857 21.142858,0 20.971429,0 H 19.314286 C 19.142858,0 19,0.142857 19,0.314286 V 1 C 10.942858,1.514286 4.5714285,8.228571 4.5714285,16.4 c 0,5.6 3,10.514286 7.4857145,13.228571 L 9.3714285,37.4 c -0.171429,0.542857 0.08571,1.114286 0.628571,1.285714 l 0.2285725,0.08571 c 0.542856,0.171428 1.114286,-0.08571 1.285714,-0.628572 l 2.6,-7.485714 c 1.428572,0.6 2.999999,0.971428 4.628571,1.114286 v 7.2 C 18.742858,39.542857 19.2,40 19.771429,40 h 0.257143 C 20.6,40 21.057143,39.542857 21.057143,38.971429 V 31.8 c 1.657143,-0.114286 3.257143,-0.485714 4.714286,-1.085714 l 2.599999,7.514285 c 0.17143,0.542858 0.771429,0.8 1.285714,0.628572 l 0.228572,-0.08571 C 30.428571,38.6 30.685715,38 30.514286,37.485714 L 27.828572,29.714286 C 32.371428,27.028571 35.428571,22.057143 35.428571,16.4 Z m -2.285714,0 c 0,0.4 -0.02857,0.8 -0.05714,1.2 -1.6,-0.142857 -3.114285,-0.542857 -4.6,-1.085714 0,0 0,-0.02857 0,-0.02857 C 28.485715,11.8 24.685715,8 20,8 c -0.942857,0 -1.885715,0.142857 -2.771429,0.457143 -1.342857,-1.428572 -2.399999,-2.771429 -3.142856,-3.8 1.771428,-0.885714 3.771428,-1.4 5.914285,-1.4 7.257143,0 13.142857,5.885714 13.142857,13.142857 z M 19.085715,10.342857 c 0.285713,-0.05714 0.6,-0.05714 0.914285,-0.05714 3.085715,0 5.628571,2.257143 6.114285,5.2 -2.657142,-1.4 -5.057142,-3.257143 -7.02857,-5.142857 z M 12.114286,5.885714 C 13.228572,7.4 15.057143,9.685714 17.457143,12 c 4.857143,4.628571 10.085715,7.342857 15.199999,7.885714 -0.314285,1.142857 -0.771428,2.2 -1.371427,3.2 -11.2,-0.2 -19.742857,-11.971428 -21.6285725,-14.8 C 10.371429,7.371429 11.2,6.571429 12.114286,5.885714 Z m 1.914285,11.2 c 2.371428,2.285715 4.828572,4.114286 7.314286,5.485715 -0.428572,0.08571 -0.885714,0.142857 -1.342857,0.142857 -3.314285,0 -6,-2.6 -6.200001,-5.857143 0.08572,0.08571 0.142858,0.142857 0.228572,0.228571 z m 5.057144,12.428572 C 12.4,29.057143 7.0571425,23.485714 6.8571425,16.8 c -0.05714,-2.314286 0.457143,-4.485714 1.457143,-6.4 0.742857,1.057143 1.8857145,2.6 3.4000005,4.285714 -0.142857,0.6 -0.2,1.228572 -0.2,1.828572 C 11.514286,21.2 15.314285,25 20,25 c 1.485714,0 2.914285,-0.371429 4.171428,-1.085714 1.828571,0.714285 3.685715,1.2 5.514286,1.371428 -2.571429,2.828572 -6.4,4.514286 -10.599999,4.228572 z" + id="path4" + style="stroke-width:0.285714;fill:#1a1a1a;fill-opacity:1" /> +</svg> diff --git a/image/family/black/pets.svg b/image/family/black/pets.svg new file mode 100644 index 00000000..437f7648 --- /dev/null +++ b/image/family/black/pets.svg @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + width="40mm" + height="40mm" + viewBox="0 0 40 40" + version="1.1" + id="svg1600" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + sodipodi:docname="pets.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <defs + id="defs1594" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="3.0684205" + inkscape:cx="49.699837" + inkscape:cy="46.277881" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + inkscape:document-rotation="0" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:pagecheckerboard="0" /> + <metadata + id="metadata1597"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g885" + style="fill:#1a1a1a;fill-opacity:1"> + <path + id="path8" + style="fill:#1a1a1a;stroke-width:0.061654;fill-opacity:1" + d="m 19.703707,14.502266 v 0.0062 c -3.970522,0.06782 -7.694429,1.566152 -10.5120202,4.211112 -2.8854103,2.706613 -4.4694945,6.301341 -4.4694945,10.117727 v 0.301792 h 0.00568 c 0.1294733,4.451422 3.6995645,8.002625 9.5875287,9.519317 1.886615,0.487066 3.964124,0.746207 6.017203,0.746207 h 0.0925 c 2.108569,-0.01233 4.204824,-0.283607 6.060615,-0.801502 5.622848,-1.559849 8.829214,-5.074293 8.792223,-9.649024 -0.03699,-3.890372 -1.646645,-7.52801 -4.538221,-10.25312 -2.873078,-2.706614 -6.689241,-4.19871 -10.739912,-4.19871 z m 0.191202,2.306319 h 0.0987 c 3.471124,0 6.726416,1.270111 9.167917,3.569807 2.435336,2.293533 3.791643,5.345174 3.816302,8.600509 0.02466,3.452627 -2.564741,6.159413 -7.114809,7.423319 -1.670828,0.462407 -3.551369,0.709001 -5.450314,0.715203 h -0.0739 c -1.868119,0 -3.748181,-0.234566 -5.455998,-0.672311 C 9.9258243,35.168873 7.0587142,32.450255 7.0093913,28.929807 v -0.08061 c 0,-3.175187 1.3317326,-6.177643 3.7424067,-8.446514 2.42917,-2.281201 5.653491,-3.557105 9.143111,-3.594095 z" /> + <path + id="path26" + style="fill:#1a1a1a;stroke-width:0.061654;fill-opacity:1" + d="M 26.238191,0.59665452 C 25.201227,0.56851579 24.157001,1.0061208 23.235274,1.8627271 22.224144,2.8060343 21.46583,4.1686855 21.102071,5.7100374 20.738312,7.251389 20.799933,8.8113797 21.27467,10.09995 c 0.536391,1.455036 1.529238,2.422794 2.799312,2.724899 0.265113,0.06165 0.536424,0.0925 0.807703,0.0925 1.004962,1e-6 2.015954,-0.437841 2.916101,-1.264005 1.011129,-0.943308 1.769443,-2.3059584 2.133203,-3.8473105 C 30.294749,6.2646819 30.233125,4.7052079 29.758391,3.4166373 29.215834,1.9616013 28.223466,0.99332729 26.953392,0.69122239 26.71641,0.63457769 26.477491,0.60314808 26.238191,0.59665452 Z m -0.0863,2.29546728 c 0.09248,-3e-7 0.18495,0.01251 0.2651,0.031006 0.499396,0.1171429 0.912079,0.573587 1.177189,1.2826089 0.320601,0.875488 0.357614,1.9664889 0.0925,3.070097 -0.258947,1.103608 -0.782698,2.0593724 -1.460893,2.6944092 -0.554886,0.5117281 -1.134612,0.7336421 -1.634009,0.6164991 -0.493233,-0.117142 -0.906394,-0.57307 -1.171504,-1.2820916 -0.3206,-0.875488 -0.357614,-1.9670056 -0.0925,-3.0706136 0.258947,-1.1036078 0.783213,-2.0593725 1.461409,-2.6944092 0.456238,-0.425413 0.931128,-0.6475055 1.362708,-0.6475058 z" /> + <path + id="path32" + style="fill:#1a1a1a;stroke-width:0.061654;fill-opacity:1" + d="m 36.206575,6.0790071 c -0.733356,0.010554 -1.501195,0.2351881 -2.257226,0.6686931 -1.196092,0.6905254 -2.23805,1.8499745 -2.940905,3.2680178 -0.709025,1.42421 -0.998387,2.95298 -0.819589,4.3217 0.197294,1.535186 0.949338,2.700355 2.1146,3.279903 0.493231,0.240451 1.02331,0.363802 1.578197,0.363802 0.746014,0 1.535129,-0.221683 2.305802,-0.665593 1.196091,-0.690526 2.238049,-1.849974 2.940907,-3.268017 0.70902,-1.424209 0.998902,-2.952979 0.820105,-4.3217002 C 39.751174,8.190627 38.999128,7.0254581 37.833866,6.4459098 37.32676,6.1923575 36.776964,6.0707992 36.206575,6.0790071 Z m 0.04857,2.2965007 c 0.203459,0 0.394742,0.043388 0.561208,0.1297078 0.456239,0.22812 0.758661,0.7645595 0.85731,1.5229044 0.117145,0.924811 -0.09285,1.99131 -0.598413,3.008602 -0.50556,1.017292 -1.226796,1.837195 -2.028298,2.299601 -0.659699,0.37609 -1.275956,0.462214 -1.732196,0.234094 -0.456239,-0.22812 -0.758671,-0.770725 -0.857311,-1.522904 -0.117144,-0.924811 0.09233,-1.99131 0.597895,-3.008602 0.505563,-1.017292 1.227315,-1.8371952 2.028817,-2.2996011 0.419248,-0.240451 0.819563,-0.3638021 1.170988,-0.3638021 z" /> + <path + id="path26-6" + style="fill:#1a1a1a;stroke-width:0.061654;fill-opacity:1" + d="m 13.762467,0.59665452 c -0.239299,0.006494 -0.478218,0.0379232 -0.715202,0.0945679 -1.270074,0.3021049 -2.262958,1.27037888 -2.805513,2.72541488 -0.4747359,1.2885703 -0.5363581,2.8480446 -0.172599,4.3893962 0.363761,1.5413521 1.122075,2.9040025 2.133203,3.8473105 0.900148,0.826164 1.911656,1.264006 2.916618,1.264005 0.271279,0 0.542072,-0.03085 0.807185,-0.0925 1.270075,-0.302105 2.262922,-1.269863 2.799313,-2.724899 C 19.200209,8.8113797 19.26183,7.2513893 18.898071,5.7100374 18.534312,4.1686855 17.775998,2.8060343 16.764868,1.8627271 15.84314,1.0061207 14.799432,0.56851579 13.762467,0.59665452 Z m 0.0863,2.29546728 c 0.43158,0 0.905953,0.2220925 1.362191,0.6475055 0.678196,0.6350367 1.202462,1.5908014 1.461409,2.6944092 0.265113,1.103608 0.228099,2.1951256 -0.0925,3.0706136 C 16.314756,10.013672 15.901595,10.4696 15.408362,10.586742 14.908965,10.703885 14.329756,10.481971 13.77487,9.9702426 13.096676,9.3352058 12.572407,8.3794414 12.31346,7.2758334 c -0.265113,-1.1036081 -0.228099,-2.194609 0.0925,-3.070097 0.26511,-0.7090219 0.678309,-1.165466 1.177706,-1.2826089 0.08015,-0.018497 0.17262,-0.031006 0.2651,-0.031006 z" /> + <path + id="path32-9" + style="fill:#1a1a1a;stroke-width:0.061654;fill-opacity:1" + d="M 3.7935669,6.0790071 C 3.2231793,6.0707997 2.6733809,6.1923575 2.166276,6.4459098 1.001015,7.0254579 0.24896743,8.190627 0.05167643,9.7258128 c -0.178799,1.3687212 0.11056822,2.8974912 0.81958822,4.3217002 0.70285695,1.418043 1.74481575,2.577491 2.94090565,3.268017 0.7706752,0.44391 1.5603043,0.665593 2.3063192,0.665593 0.554886,0 1.0849652,-0.123351 1.5781983,-0.363802 1.165261,-0.579548 1.9173055,-1.744717 2.1145994,-3.279903 0.1787962,-1.36872 -0.1110818,-2.89749 -0.8201048,-4.3217 C 8.2883263,8.597675 7.2463667,7.4382256 6.0502767,6.7477002 5.2942444,6.3141952 4.5269224,6.0895602 3.7935669,6.0790071 Z m -0.049093,2.2965007 c 0.351427,0 0.7522567,0.1233511 1.1715046,0.3638021 0.801502,0.4624059 1.5227369,1.2823091 2.0283001,2.2996011 0.5055639,1.017292 0.7155568,2.083791 0.5984128,3.008602 -0.09864,0.752179 -0.4010707,1.294784 -0.8573119,1.522904 C 6.229142,15.798537 5.6128851,15.712413 4.9531859,15.336323 4.1516839,14.873917 3.4299313,14.054014 2.9243692,13.036722 2.4188063,12.01943 2.20933,10.952931 2.326473,10.02812 2.4251229,9.2697751 2.727544,8.7333356 3.1837849,8.5052156 3.3502499,8.4188955 3.5410153,8.3755078 3.7444739,8.3755078 Z" /> + </g> + </g> +</svg> diff --git a/image/family/black/plant.svg b/image/family/black/plant.svg new file mode 100644 index 00000000..67e2240a --- /dev/null +++ b/image/family/black/plant.svg @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 40 40" + xml:space="preserve" + sodipodi:docname="plant.svg" + width="40" + height="40" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs9" /><sodipodi:namedview + id="namedview7" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="4.365" + inkscape:cx="100" + inkscape:cy="100.11455" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#1E1E1C;} + .st1{fill:none;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} + .st2{fill:#FFFFFF;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} +</style> +<path + class="st0" + d="m 32.304555,8.9605096 0.135962,-0.02719 c 0.707002,-0.108769 1.441196,-0.244731 2.148198,-0.380693 0.842964,-0.163154 1.93066,-0.380693 3.018355,-0.734194 0.870156,-0.271924 1.658736,-0.78858 2.28416,-1.223658 L 40,6.4860026 39.918423,6.3500406 c -0.02719,-0.05438 -0.05439,-0.08158 -0.08158,-0.08158 -0.951734,-0.978926 -2.121006,-2.121007 -3.426241,-3.018355 -2.365738,-1.604351 -4.67709,-2.36573797 -7.07002,-2.31135297 -2.637662,0.05438 -4.921822,1.08769497 -6.852482,3.04554697 -1.03331,1.060503 -1.849082,2.338545 -2.365737,3.779742 l -0.10877,0.271924 -0.108769,-0.271924 c -0.190347,-0.57104 -0.462271,-1.14208 -0.815772,-1.740313 -1.087695,-1.849082 -2.556084,-3.235894 -4.377974,-4.10605 C 12.263763,0.74840563 9.653294,0.61244363 6.906863,1.5641776 5.520051,2.0536406 4.187624,2.7878346 2.855198,3.8483376 1.794694,4.6641096 0.897346,5.5070736 0.108767,6.4316146 L 0,6.5403866 l 0.135962,0.08158 c 1.223657,0.815771 1.577158,1.060503 3.127124,1.468388 1.414004,0.380694 2.855201,0.625425 4.269205,0.842964 0.407886,0.08158 0.842964,0.135962 1.25085,0.217539 1.386811,0.244732 3.018355,0.543848 4.568321,0.9789264 h 0.08158 v 0.217539 h -0.10877 c -0.707002,-0.08158 -1.414004,-0.08158 -2.175391,0 -2.556084,0.244732 -4.704282,1.25085 -6.39021,2.963971 -1.060503,1.087695 -1.82189,2.365737 -2.338546,3.942896 -0.516655,1.577158 -0.679809,3.371855 -0.489463,5.438477 0.10877,1.278042 0.380694,2.501699 0.78858,3.942896 0.02719,0.08158 0.05438,0.190346 0.190346,0.217539 h 0.05438 l 0.05438,-0.02719 c 0.46227,-0.217539 0.978926,-0.46227 1.441196,-0.761386 0.978926,-0.625425 1.767505,-1.495582 2.447315,-2.229776 0.707002,-0.788579 1.414004,-1.604351 2.093814,-2.39293 l 1.006118,-1.169273 0.02719,0.217539 c 0.02719,0.190347 0.05438,0.353501 0.08158,0.543848 l 1.03331,7.369137 c 0.380694,2.501699 0.78858,5.003399 1.196465,7.341944 0.10877,0.67981 0.435078,1.223657 1.006119,1.685928 0.543847,0.435078 1.196465,0.761387 2.121006,1.033311 1.441196,0.435078 3.018355,0.625425 4.813052,0.598232 1.359619,-0.02719 2.528892,-0.163154 3.616587,-0.407886 0.815772,-0.190346 1.767506,-0.489463 2.637662,-1.087695 0.67981,-0.489463 1.033311,-0.978926 1.114888,-1.604351 0.135962,-0.788579 0.244731,-1.604351 0.353501,-2.39293 0.08158,-0.489463 0.135962,-1.006118 0.217539,-1.495581 0.163154,-1.033311 0.299116,-2.093814 0.46227,-3.127124 l 0.516656,-3.507818 c 0.217539,-1.495581 0.435078,-3.018355 0.679809,-4.513936 0,-0.08158 0.02719,-0.135962 0.02719,-0.217539 0,-0.05438 0.02719,-0.135962 0.02719,-0.190347 l 0.02719,-0.217539 1.278042,1.495581 c 0.951733,1.114888 1.957851,2.28416 3.018355,3.344663 0.734194,0.707003 1.577158,1.278043 2.719238,1.794698 l 0.08158,0.02719 0.135962,-0.108769 v -0.05438 c 0.353501,-1.278042 0.761387,-2.991162 0.870157,-4.78586 0.08158,-1.685928 -0.08158,-3.181509 -0.516656,-4.595513 -0.489463,-1.577159 -1.278042,-2.96397 -2.39293,-4.078858 -1.414004,-1.441197 -3.235894,-2.39293 -5.3569,-2.800816 -0.870156,-0.163154 -1.794697,-0.217539 -2.746431,-0.163154 -0.135962,0 -0.244731,0.02719 -0.380693,0.02719 l -0.02719,-0.190346 c 0.734195,-0.190347 1.441197,-0.3535024 1.985045,-0.4894634 1.223657,-0.326309 2.474507,-0.543848 3.670972,-0.761387 z M 19.03467,16.547185 v 0 0 c 0.02719,0 2.664854,0.489463 3.344664,-1.087695 0.271924,-0.380693 0.598232,-0.57104 0.951733,-0.598232 v 0 h 0.02719 c 0.08158,0 0.135962,0.02719 0.217539,0.05438 0.761387,0.190347 1.386811,0.598233 1.876274,0.924541 0.543848,0.380694 1.495582,1.169273 1.93066,1.631544 l 0.08158,0.108769 -0.10877,0.05439 c -0.46227,0.244731 -0.951733,0.407886 -1.386811,0.543848 -1.114888,0.326308 -2.338545,0.543847 -3.834127,0.679809 -0.707002,0.05439 -1.414004,0.08158 -2.175391,0.08158 -0.598232,0 -1.196465,-0.02719 -1.821889,-0.05438 -1.93066,-0.10877 -3.480626,-0.380694 -4.867438,-0.870157 -0.244731,-0.08158 -0.516655,-0.190346 -0.761386,-0.326308 l -0.10877,-0.05438 0.08158,-0.10877 c 0.299116,-0.326308 0.652618,-0.625425 1.033311,-0.951733 0.707002,-0.598233 1.495581,-1.196465 2.447315,-1.549966 0.190346,-0.08158 0.46227,-0.163154 0.761386,-0.217539 0.299117,0 0.761387,0.217539 1.332427,1.14208 0.135962,0.326309 0.489463,0.543848 0.978926,0.598232 z M 8.266485,6.8395036 7.260367,6.6763486 C 6.145479,6.4860026 5.003399,6.2956556 3.861319,5.9965396 l -0.190347,-0.05438 0.163154,-0.135962 c 0.05438,-0.02719 0.10877,-0.08158 0.163155,-0.10877 L 4.133243,5.5886586 C 5.3569,4.6369246 6.580557,3.9571156 7.8586,3.5492296 c 0.679809,-0.217539 1.359619,-0.353501 2.039429,-0.380693 2.229775,-0.163155 4.187627,0.598232 5.873555,2.229775 1.169273,1.14208 1.957852,2.556084 2.365738,4.242012 l 0.05438,0.271924 -0.217539,-0.163154 c -1.386811,-0.978926 -2.936777,-1.468389 -4.432359,-1.876275 -1.740312,-0.435078 -3.53501,-0.734194 -5.275323,-1.03331 z M 7.668253,19.456771 7.450714,19.701502 C 7.233175,19.973426 6.988443,20.24535 6.770904,20.490081 5.982325,21.414623 5.193746,22.339164 4.350782,23.154935 L 4.21482,23.290897 4.16044,23.100551 C 4.13325,22.991781 4.13325,22.883011 4.10606,22.774242 L 4.07887,22.583895 C 3.888523,21.088314 3.9701,19.647117 4.323601,18.287498 c 0.78858,-3.072739 3.290279,-5.275323 6.498981,-5.710401 1.359619,-0.190347 2.692046,-0.08158 3.970088,0.353501 l 0.271924,0.08158 -0.244732,0.10877 c -1.223657,0.543848 -2.229775,1.332427 -3.018354,2.039429 -1.522774,1.305234 -2.855201,2.828008 -4.133243,4.296397 z m 20.067981,0.707002 -0.10877,-0.02719 0.10877,0.02719 c -0.05439,0.353501 -0.10877,0.707002 -0.135962,1.033311 l -0.924541,6.227056 c -0.190347,1.169273 -0.353501,2.338545 -0.516656,3.53501 l -0.108769,0.761387 c -0.163154,1.169273 -0.353501,2.311353 -0.489463,3.453433 -0.02719,0.271924 -0.163154,0.462271 -0.407886,0.598232 -0.543848,0.326309 -1.169272,0.571041 -2.039429,0.734195 -0.679809,0.135962 -1.414004,0.217539 -2.365737,0.271924 -0.271924,0.02719 -0.543848,0.02719 -0.815772,0.02719 -1.305234,0 -2.610469,-0.190347 -3.861319,-0.543848 -0.407886,-0.108769 -0.815771,-0.299116 -1.223657,-0.543847 -0.190347,-0.10877 -0.271924,-0.271924 -0.326309,-0.489463 -0.299116,-1.658736 -0.598232,-3.480626 -0.951733,-5.683209 -0.326309,-2.148198 -0.652618,-4.323589 -0.978926,-6.471788 L 12.290959,21.06112 c -0.05439,-0.299117 -0.08158,-0.571041 -0.135962,-0.870157 l -0.02719,-0.217539 0.163155,0.05439 c 2.17539,0.761387 4.541128,1.114888 7.668252,1.114888 h 0.05438 c 3.045547,0 5.46567,-0.380694 7.641061,-1.196465 l 0.163154,-0.05438 z M 27.57308,12.49552 c 1.631543,-0.05439 3.154316,0.326309 4.459551,1.087695 1.903467,1.142081 3.154317,2.882393 3.64378,5.193746 0.190346,0.924541 0.271923,1.876275 0.244731,2.800816 -0.02719,0.46227 -0.05439,1.006118 -0.163154,1.577158 l -0.02719,0.190347 -0.135962,-0.135962 C 35.431679,23.046166 35.241332,22.883011 35.078178,22.692665 34.53433,22.06724 33.990483,21.469007 33.473827,20.843582 L 33.365058,20.707621 C 32.467709,19.67431 31.515976,18.586614 30.591434,17.553304 29.721278,16.60157 28.552005,15.35072 27.138001,14.290217 26.621346,13.909524 25.914344,13.420061 25.125765,13.06656 l -0.244732,-0.108769 0.271924,-0.08158 c 0.788579,-0.217539 1.604351,-0.353501 2.420123,-0.380693 z M 25.805574,8.0631606 v 0 c -0.951733,0.271924 -2.039429,0.625425 -3.045547,1.196465 v 0 c 0,0 -0.05439,0.02719 -0.108769,0.08158 -0.135962,0.08158 -0.244732,0.135962 -0.380694,0.217539 -0.135962,0.08158 -0.299116,0.190347 -0.46227,0.299116 v -0.08158 c 0.271924,-1.14208 0.679809,-2.012236 0.842964,-2.311352 0.897348,-1.685928 2.229775,-2.936778 4.078858,-3.75255 0.652617,-0.299116 1.414004,-0.46227 2.28416,-0.543847 0.190347,-0.02719 0.380693,-0.02719 0.57104,-0.02719 1.332427,0 2.692046,0.353501 4.160435,1.087696 0.788579,0.407885 1.549966,0.897348 2.338545,1.577158 l 0.163155,0.135962 -0.190347,0.05438 c -0.924541,0.244731 -1.876275,0.407885 -2.909585,0.598232 -0.435078,0.08158 -0.842964,0.135962 -1.278042,0.217539 -2.039429,0.353501 -4.106051,0.67981 -6.063903,1.25085 z" + id="path4" + style="stroke-width:0.271924;fill:#1a1a1a;fill-opacity:1" /> +</svg> diff --git a/image/family/black/preserved.svg b/image/family/black/preserved.svg new file mode 100644 index 00000000..b88d5399 --- /dev/null +++ b/image/family/black/preserved.svg @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 40 40" + xml:space="preserve" + sodipodi:docname="preserved.svg" + width="40" + height="40" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs9" /><sodipodi:namedview + id="namedview7" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="3.595" + inkscape:cx="100" + inkscape:cy="99.860918" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#1E1E1C;} + .st1{fill:none;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} + .st2{fill:#FFFFFF;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} +</style> +<path + class="st0" + d="m 19.999996,39.999996 c 0.632411,0 1.121092,-0.517427 1.121092,-1.121092 v -8.39382 h 0.114984 c 2.874596,-0.08624 5.116781,-0.977363 6.669062,-2.644628 2.673374,-2.817104 2.443407,-6.927776 2.357169,-7.732663 v 0 c -0.05749,-0.603665 -0.546173,-1.092346 -1.149839,-1.149838 -0.287459,-0.02875 -1.322314,-0.114984 -2.644628,0.08624 l -0.488681,0.08624 0.431189,-0.258714 c 0.546174,-0.344951 1.034855,-0.747395 1.466044,-1.20733 2.673374,-2.817104 2.443407,-6.927776 2.357169,-7.732663 C 30.176067,9.328063 29.687384,8.839382 29.083719,8.78189 28.537545,8.7244 26.58282,8.609414 24.484365,9.356809 L 24.31189,9.414299 24.34064,9.213077 C 24.455623,8.609412 24.513115,7.977001 24.513115,7.373336 24.398131,3.492632 21.408552,0.790512 20.833633,0.301831 c -0.488682,-0.402444 -1.149839,-0.402444 -1.63852,0 -0.603665,0.459935 -3.593245,3.162055 -3.708228,7.042759 -0.02875,0.632411 0.02875,1.236076 0.172475,1.868487 l 0.02875,0.201222 -0.172475,-0.05749 C 13.41718,8.609414 11.433709,8.724398 10.887535,8.78189 10.28387,8.83938 9.7951894,9.328063 9.7376974,9.931728 c -0.08624,0.804887 -0.316205,4.915559 2.3571686,7.732663 0.431189,0.431189 0.891124,0.833633 1.437297,1.178584 l 0.402444,0.258714 -0.488681,-0.08624 c -0.632411,-0.08624 -1.178585,-0.114984 -1.609774,-0.114984 -0.431189,0 -0.747395,0.02875 -0.919871,0.02875 -0.603665,0.05749 -1.0923456,0.546173 -1.1498376,1.149838 -0.08624,0.804887 -0.316206,4.886813 2.3571686,7.732663 1.552281,1.63852 3.794466,2.529644 6.640316,2.644628 h 0.114984 v 8.39382 c 0,0.632411 0.488681,1.149838 1.121092,1.149838 z M 27.93388,21.171394 h 0.114984 v 0.114984 c -0.02875,1.20733 -0.28746,3.420769 -1.782249,5.001796 -1.121093,1.20733 -2.788358,1.839742 -4.973051,1.954725 H 21.17858 v -0.114983 c 0.08624,-2.299677 0.776141,-4.053181 2.012217,-5.203019 1.523536,-1.49479 3.621991,-1.753503 4.743083,-1.753503 z M 27.87639,10.966579 h 0.114984 v 0.114984 c -0.02875,1.20733 -0.287459,3.420769 -1.782249,5.001796 -1.121093,1.178585 -2.788358,1.839742 -4.973051,1.925979 H 21.12109 v -0.114983 c 0.08624,-2.299677 0.776141,-4.05318 2.012217,-5.203019 1.552282,-1.437298 3.650737,-1.696011 4.743083,-1.724757 z M 17.757811,7.40208 c 0.05749,-2.155947 1.379806,-3.880704 2.184693,-4.714337 l 0.08624,-0.08624 0.08624,0.08624 c 0.776141,0.833633 2.098455,2.55839 2.184693,4.714337 0.05749,1.696012 -0.689903,3.392023 -2.155947,5.030543 l -0.08624,0.08624 -0.08624,-0.08624 C 18.418968,10.794103 17.700319,9.098092 17.757811,7.40208 Z m -4.024434,8.681279 c -1.466044,-1.552281 -1.753503,-3.794466 -1.782249,-5.001796 v -0.114984 h 0.114984 c 1.35106,0.02875 3.277039,0.344951 4.743083,1.724757 v 0 c 1.236076,1.149839 1.897233,2.903342 2.012217,5.203019 v 0.114983 h -0.114984 c -2.184693,-0.08624 -3.851958,-0.747394 -4.973051,-1.925979 z m 5.001797,12.130794 c -2.184693,-0.08624 -3.851959,-0.747395 -4.973051,-1.925979 -1.466044,-1.552281 -1.753503,-3.794466 -1.782249,-5.001796 v -0.114984 h 0.114984 c 1.121092,0.02875 3.219547,0.287459 4.743083,1.724757 1.236076,1.149839 1.897233,2.903342 2.012217,5.203019 v 0.114983 z M 18.418968,21.228886 C 18.074017,20.91268 17.700319,20.625221 17.26913,20.337761 l -0.431189,-0.258714 0.488681,0.05749 c 0.833633,0.114984 1.638519,0.14373 2.500898,0.114984 0.02875,0 0.05749,0 0.08624,0 h 0.05749 0.05749 c 0.02875,0 0.05749,0 0.08624,0 0.201221,0 0.373697,0 0.574919,0 0.689903,0 1.379806,-0.05749 2.040963,-0.14373 l 0.517427,-0.08624 -0.431189,0.28746 c -0.43119,0.258714 -0.804887,0.574919 -1.149839,0.891125 -0.574919,0.546173 -1.092346,1.236076 -1.523535,2.012217 l -0.08624,0.172476 -0.08624,-0.172476 c -0.459931,-0.747391 -0.977359,-1.437294 -1.552278,-1.983467 z" + id="path4" + style="stroke-width:0.28746;fill-opacity:1;fill:#1a1a1a" /> +</svg> diff --git a/image/family/black/treatments.svg b/image/family/black/treatments.svg new file mode 100644 index 00000000..69dcbf82 --- /dev/null +++ b/image/family/black/treatments.svg @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> + +<svg + version="1.1" + id="Capa_1" + x="0px" + y="0px" + viewBox="0 0 40 40" + xml:space="preserve" + sodipodi:docname="treatments.svg" + width="40" + height="40" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs13" /><sodipodi:namedview + id="namedview11" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + showgrid="false" + inkscape:zoom="3.595" + inkscape:cx="100" + inkscape:cy="99.860918" + inkscape:window-width="1920" + inkscape:window-height="1011" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="Capa_1" /> +<style + type="text/css" + id="style2"> + .st0{fill:#1E1E1C;} + .st1{fill:none;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} + .st2{fill:#FFFFFF;stroke:#1E1E1C;stroke-width:8;stroke-miterlimit:10;} +</style> +<g + id="g8" + transform="matrix(0.28715004,0,0,0.28715004,-9.3036616,-8.6719315)" + style="fill:#1a1a1a;fill-opacity:1"> + <path + class="st0" + d="m 88.4,48.2 c -10.7,3.1 -16.5,10.9 -16.5,22 v 99.3 h 60.3 c 0,-0.1 0,-0.2 0,-0.3 0,-8.8 0,-17.6 0,-26.4 0,-24.2 0,-49.3 -0.1,-74.1 0,-7.7 -3.7,-13.9 -10.6,-18.1 v 0 c -1.3,-0.8 -2.8,-1.4 -4.4,-2 H 117 c -0.7,-0.3 -1.4,-0.6 -2.2,-0.9 l -0.2,-0.1 V 30.2 H 89.3 V 47.8 L 88.8,48 c -0.2,0.1 -0.3,0.2 -0.4,0.2 z m 35.7,113.4 H 79.9 V 73.2 h 44.2 z M 97.4,38.2 h 9.3 v 9.4 h -9.3 z m -4.3,17.4 h 3.4 c 4.8,0 9.7,-0.1 14.5,0 5.2,0.1 9.2,2.6 11.8,7.4 0.2,0.3 0.3,0.7 0.5,1 v 0.1 c 0.1,0.2 0,0.3 0,0.4 0,0 0,0.1 0,0.1 v 0.3 H 80.5 l 0.2,-0.5 c 0.7,-2.2 2,-4.1 3.9,-5.7 2.5,-2 5.4,-3.1 8.5,-3.1 z" + id="path4" + style="fill:#1a1a1a;fill-opacity:1" /> + <path + class="st0" + d="m 114.7,130.7 c 0.1,-3.1 0,-6.2 0,-9.3 v -1 c 0,-1.1 0,-2.2 0,-3.2 v -0.1 c 0,-1.1 0,-2.3 0,-3.4 v -0.2 c 0,-3 0,-6.1 0,-9.1 0,-1.4 -0.2,-2.6 -0.4,-3.6 -1.4,-5.5 -6.5,-9.5 -12.2,-9.5 -0.5,0 -1,0 -1.4,0.1 -6.5,0.8 -11.3,6.1 -11.4,12.5 -0.1,8.4 0,17.1 0,24.8 v 1.9 c 0,0.9 0.1,1.9 0.4,2.9 1.5,6.1 7.3,10.2 13.5,9.6 6.5,-0.7 11.4,-6 11.5,-12.4 z m -7.9,-9.7 c 0,3 0,6 0,9 0,3 -1.9,5.2 -4.7,5.2 -1.3,0 -2.4,-0.5 -3.3,-1.3 -1,-0.9 -1.5,-2.3 -1.5,-3.8 0,-8.5 0,-17.2 0,-25.7 0,-1.5 0.5,-2.9 1.5,-3.8 0.9,-0.8 2,-1.3 3.3,-1.3 2.8,0 4.7,2.2 4.7,5.2 0,3 0,6 0,9 v 3.8 z" + id="path6" + style="fill:#1a1a1a;fill-opacity:1" /> +</g> +</svg> diff --git a/image/logo-dark.svg b/image/logo-dark.svg index 6cf594a7..4d53b7b3 100644 --- a/image/logo-dark.svg +++ b/image/logo-dark.svg @@ -1,6 +1,4 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> - <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" @@ -18,113 +16,146 @@ enable-background="new 0 0 226.229 31.038" xml:space="preserve" id="svg2" - inkscape:version="0.91 r13725" - sodipodi:docname="logo.svg"><metadata - id="metadata61"><rdf:RDF><cc:Work - rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs - id="defs59" /><sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1016" - id="namedview57" - showgrid="false" - inkscape:zoom="4.0755163" - inkscape:cx="120.82882" - inkscape:cy="16.019257" - inkscape:window-x="1920" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /><g - id="Background" /><g - id="Guides" /><g - id="g9" - style="fill:#ffffff"><path - clip-rule="evenodd" - d="M 10.417,30.321 0,0 h 8.233 l 4.26,15.582 0.349,1.276 c 0.521,1.866 0.918,3.431 1.191,4.693 0.15,-0.618 0.335,-1.345 0.555,-2.182 0.219,-0.837 0.528,-1.935 0.925,-3.293 L 19.981,0 h 8.19 l -10.5,30.321 h -7.254 z" - id="path11" - inkscape:connector-curvature="0" - style="fill-rule:evenodd;fill:#ffffff" /></g><g - id="g13" - style="fill:#acb42a;fill-opacity:1"><path - clip-rule="evenodd" - d="m 139.809,19.787 c -0.665,0.357 -1.748,0.686 -3.25,0.988 -0.727,0.137 -1.283,0.254 -1.667,0.35 -0.95,0.247 -1.661,0.563 -2.134,0.947 -0.472,0.384 -0.799,0.899 -0.979,1.544 -0.223,0.796 -0.155,1.438 0.204,1.925 0.359,0.488 0.945,0.731 1.757,0.731 1.252,0 2.375,-0.36 3.369,-1.081 0.994,-0.721 1.653,-1.665 1.98,-2.831 l 0.72,-2.573 z m 5.106,10.534 h -7.458 c 0.017,-0.356 0.048,-0.726 0.094,-1.11 l 0.159,-1.192 c -1.318,1.026 -2.627,1.786 -3.927,2.279 -1.299,0.493 -2.643,0.739 -4.031,0.739 -2.158,0 -3.7,-0.593 -4.625,-1.779 -0.925,-1.187 -1.106,-2.788 -0.542,-4.804 0.519,-1.851 1.431,-3.356 2.737,-4.515 1.307,-1.159 3.021,-1.972 5.142,-2.438 1.169,-0.247 2.641,-0.515 4.413,-0.803 2.646,-0.412 4.082,-1.016 4.304,-1.812 l 0.151,-0.539 c 0.182,-0.65 0.076,-1.145 -0.317,-1.483 -0.393,-0.339 -1.071,-0.508 -2.033,-0.508 -1.045,0 -1.934,0.214 -2.666,0.643 -0.731,0.428 -1.289,1.058 -1.673,1.887 h -6.748 c 1.065,-2.53 2.64,-4.413 4.723,-5.65 2.083,-1.237 4.724,-1.856 7.923,-1.856 1.991,0 3.602,0.241 4.833,0.722 1.231,0.481 2.095,1.209 2.59,2.185 0.339,0.701 0.483,1.536 0.432,2.504 -0.052,0.969 -0.377,2.525 -0.978,4.669 l -2.375,8.483 c -0.284,1.014 -0.416,1.812 -0.396,2.395 0.02,0.583 0.188,0.962 0.503,1.141 l -0.235,0.842 z" - id="path15" - style="fill:#acb42a;fill-opacity:1;fill-rule:evenodd" - inkscape:connector-curvature="0" /></g><g - id="g17" - style="fill:#acb42a;fill-opacity:1"><path - clip-rule="evenodd" - d="m 185.7,30.321 6.27,-22.393 h 7.049 l -1.097,3.918 c 1.213,-1.537 2.502,-2.659 3.867,-3.366 1.365,-0.707 2.951,-1.074 4.758,-1.101 l -2.03,7.25 c -0.304,-0.042 -0.608,-0.072 -0.912,-0.093 -0.303,-0.02 -0.592,-0.03 -0.867,-0.03 -1.126,0 -2.104,0.168 -2.932,0.504 -0.829,0.336 -1.561,0.854 -2.197,1.555 -0.406,0.467 -0.789,1.136 -1.149,2.007 -0.361,0.872 -0.814,2.282 -1.359,4.232 l -2.104,7.516 H 185.7 z" - id="path19" - style="fill:#acb42a;fill-opacity:1;fill-rule:evenodd" - inkscape:connector-curvature="0" /></g><g - id="g21" - style="fill:#acb42a;fill-opacity:1"><path - clip-rule="evenodd" - d="m 217.631,19.787 c -0.664,0.357 -1.748,0.686 -3.25,0.988 -0.727,0.137 -1.282,0.254 -1.667,0.35 -0.95,0.247 -1.661,0.563 -2.134,0.947 -0.472,0.384 -0.799,0.899 -0.979,1.544 -0.223,0.796 -0.155,1.438 0.205,1.925 0.359,0.488 0.945,0.731 1.757,0.731 1.252,0 2.375,-0.36 3.369,-1.081 0.994,-0.721 1.654,-1.665 1.98,-2.831 l 0.719,-2.573 z m 5.106,10.534 h -7.458 c 0.017,-0.356 0.048,-0.726 0.094,-1.11 l 0.159,-1.192 c -1.318,1.026 -2.627,1.786 -3.927,2.279 -1.299,0.493 -2.643,0.739 -4.031,0.739 -2.158,0 -3.7,-0.593 -4.625,-1.779 -0.926,-1.187 -1.106,-2.788 -0.542,-4.804 0.519,-1.851 1.431,-3.356 2.737,-4.515 1.306,-1.159 3.02,-1.972 5.142,-2.438 1.169,-0.247 2.641,-0.515 4.413,-0.803 2.647,-0.412 4.082,-1.016 4.304,-1.812 l 0.151,-0.539 c 0.182,-0.65 0.077,-1.145 -0.317,-1.483 -0.393,-0.339 -1.071,-0.508 -2.033,-0.508 -1.045,0 -1.934,0.214 -2.666,0.643 -0.731,0.428 -1.289,1.058 -1.672,1.887 h -6.748 c 1.065,-2.53 2.64,-4.413 4.723,-5.65 2.083,-1.237 4.724,-1.856 7.923,-1.856 1.99,0 3.601,0.241 4.833,0.722 1.232,0.481 2.095,1.209 2.591,2.185 0.339,0.701 0.483,1.536 0.431,2.504 -0.051,0.969 -0.377,2.525 -0.978,4.669 l -2.375,8.483 c -0.284,1.014 -0.416,1.812 -0.396,2.395 0.02,0.583 0.188,0.962 0.503,1.141 l -0.236,0.842 z" - id="path23" - style="fill:#acb42a;fill-opacity:1;fill-rule:evenodd" - inkscape:connector-curvature="0" /></g><g - id="g25" - style="fill:#acb42a;fill-opacity:1"><path - clip-rule="evenodd" - d="m 188.386,7.928 -6.269,22.393 h -7.174 l 0.864,-3.085 c -1.227,1.246 -2.476,2.163 -3.746,2.751 -1.27,0.588 -2.625,0.882 -4.067,0.882 -2.471,0 -4.154,-0.634 -5.048,-1.901 -0.895,-1.268 -0.993,-3.149 -0.294,-5.644 l 4.31,-15.396 h 7.338 l -3.508,12.53 c -0.516,1.842 -0.641,3.109 -0.375,3.803 0.266,0.694 0.967,1.041 2.105,1.041 1.275,0 2.323,-0.422 3.142,-1.267 0.819,-0.845 1.497,-2.223 2.031,-4.133 l 3.353,-11.974 h 7.338 z" - id="path27" - style="fill:#acb42a;fill-opacity:1;fill-rule:evenodd" - inkscape:connector-curvature="0" /></g><g - id="g29" - style="fill:#acb42a;fill-opacity:1"><path - clip-rule="evenodd" - d="m 149.937,12.356 1.239,-4.428 h 2.995 l 1.771,-6.326 h 7.338 l -1.771,6.326 h 3.753 l -1.24,4.428 h -3.753 l -2.716,9.702 c -0.416,1.483 -0.498,2.465 -0.247,2.946 0.25,0.48 0.905,0.721 1.964,0.721 l 0.549,-0.011 0.39,-0.031 -1.31,4.678 c -0.811,0.148 -1.596,0.263 -2.354,0.344 -0.758,0.081 -1.48,0.122 -2.167,0.122 -2.543,0 -4.108,-0.621 -4.695,-1.863 -0.587,-1.242 -0.313,-3.887 0.82,-7.936 l 2.428,-8.672 h -2.994 z" - id="path31" - style="fill:#acb42a;fill-opacity:1;fill-rule:evenodd" - inkscape:connector-curvature="0" /></g><g - id="g33" - style="fill:#ffffff"><path - clip-rule="evenodd" - d="m 73.875,18.896 c -0.561,2.004 -0.616,3.537 -0.167,4.601 0.449,1.064 1.375,1.595 2.774,1.595 1.399,0 2.605,-0.524 3.62,-1.574 1.015,-1.05 1.806,-2.59 2.375,-4.622 0.526,-1.879 0.556,-3.334 0.09,-4.363 -0.466,-1.029 -1.393,-1.543 -2.778,-1.543 -1.304,0 -2.487,0.528 -3.551,1.585 -1.064,1.057 -1.852,2.496 -2.363,4.321 z M 96.513,0 88.024,30.321 h -7.337 l 0.824,-2.944 c -1.166,1.22 -2.369,2.121 -3.61,2.703 -1.241,0.582 -2.583,0.874 -4.025,0.874 -2.802,0 -4.772,-1.081 -5.912,-3.243 -1.139,-2.162 -1.218,-4.993 -0.238,-8.493 0.988,-3.528 2.668,-6.404 5.042,-8.627 2.374,-2.224 4.927,-3.336 7.661,-3.336 1.47,0 2.695,0.296 3.676,0.887 0.981,0.591 1.681,1.465 2.099,2.62 L 89.217,0 h 7.296 z" - id="path35" - inkscape:connector-curvature="0" - style="fill:#ffffff;fill-rule:evenodd" /><g - id="g37" - style="fill:#ffffff"><path - clip-rule="evenodd" - d="m 73.875,18.896 c -0.561,2.004 -0.616,3.537 -0.167,4.601 0.449,1.064 1.375,1.595 2.774,1.595 1.399,0 2.605,-0.524 3.62,-1.574 1.015,-1.05 1.806,-2.59 2.375,-4.622 0.526,-1.879 0.556,-3.334 0.09,-4.363 -0.466,-1.029 -1.393,-1.543 -2.778,-1.543 -1.304,0 -2.487,0.528 -3.551,1.585 -1.064,1.057 -1.852,2.496 -2.363,4.321 z M 96.513,0 88.024,30.321 h -7.337 l 0.824,-2.944 c -1.166,1.22 -2.369,2.121 -3.61,2.703 -1.241,0.582 -2.583,0.874 -4.025,0.874 -2.802,0 -4.772,-1.081 -5.912,-3.243 -1.139,-2.162 -1.218,-4.993 -0.238,-8.493 0.988,-3.528 2.668,-6.404 5.042,-8.627 2.374,-2.224 4.927,-3.336 7.661,-3.336 1.47,0 2.695,0.296 3.676,0.887 0.981,0.591 1.681,1.465 2.099,2.62 L 89.217,0 h 7.296 z" - id="path39" - inkscape:connector-curvature="0" - style="fill-rule:evenodd;fill:#ffffff" /></g></g><g - id="g41" - style="fill:#ffffff"><path - clip-rule="evenodd" - d="M 46.488,30.321 52.757,7.928 h 7.049 l -1.098,3.918 C 59.921,10.309 61.21,9.187 62.576,8.48 63.942,7.773 68.591,7.406 70.398,7.379 l -2.03,7.25 c -0.304,-0.042 -0.608,-0.072 -0.911,-0.093 -0.304,-0.02 -0.592,-0.03 -0.867,-0.03 -1.126,0 -5.167,0.168 -5.997,0.504 -0.829,0.336 -1.561,0.854 -2.196,1.555 -0.406,0.467 -0.789,1.136 -1.149,2.007 -0.361,0.872 -0.814,2.282 -1.36,4.232 l -2.104,7.516 h -7.296 z" - id="path43" - inkscape:connector-curvature="0" - style="fill-rule:evenodd;fill:#ffffff" /></g><g - id="g45" - style="fill:#ffffff"><path - clip-rule="evenodd" - d="m 32.673,16.742 8.351,-0.021 c 0.375,-1.436 0.308,-2.558 -0.201,-3.365 -0.509,-0.807 -1.402,-1.211 -2.68,-1.211 -1.209,0 -2.285,0.397 -3.229,1.19 -0.944,0.793 -1.69,1.93 -2.241,3.407 z m 6.144,6.536 h 7.043 c -1.347,2.456 -3.172,4.356 -5.477,5.7 -2.305,1.345 -4.885,2.017 -7.74,2.017 -3.473,0 -5.923,-1.054 -7.351,-3.161 -1.427,-2.107 -1.632,-4.98 -0.613,-8.618 1.038,-3.707 2.875,-6.641 5.512,-8.803 2.637,-2.163 5.678,-3.244 9.123,-3.244 3.555,0 6.04,1.099 7.456,3.298 1.417,2.198 1.582,5.234 0.498,9.109 l -0.239,0.814 -0.167,0.484 H 31.721 c -0.441,1.575 -0.438,2.777 0.01,3.606 0.448,0.829 1.332,1.244 2.65,1.244 0.975,0 1.836,-0.206 2.583,-0.617 0.747,-0.411 1.366,-1.021 1.853,-1.829 z" - id="path47" - inkscape:connector-curvature="0" - style="fill:#ffffff;fill-rule:evenodd" /><g - id="g49" - style="fill:#ffffff"><path - clip-rule="evenodd" - d="m 32.673,16.742 8.351,-0.021 c 0.375,-1.436 0.308,-2.558 -0.201,-3.365 -0.509,-0.807 -1.402,-1.211 -2.68,-1.211 -1.209,0 -2.285,0.397 -3.229,1.19 -0.944,0.793 -1.69,1.93 -2.241,3.407 z m 6.144,6.536 h 7.043 c -1.347,2.456 -3.172,4.356 -5.477,5.7 -2.305,1.345 -4.885,2.017 -7.74,2.017 -3.473,0 -5.923,-1.054 -7.351,-3.161 -1.427,-2.107 -1.632,-4.98 -0.613,-8.618 1.038,-3.707 2.875,-6.641 5.512,-8.803 2.637,-2.163 5.678,-3.244 9.123,-3.244 3.555,0 6.04,1.099 7.456,3.298 1.417,2.198 1.582,5.234 0.498,9.109 l -0.239,0.814 -0.167,0.484 H 31.721 c -0.441,1.575 -0.438,2.777 0.01,3.606 0.448,0.829 1.332,1.244 2.65,1.244 0.975,0 1.836,-0.206 2.583,-0.617 0.747,-0.411 1.366,-1.021 1.853,-1.829 z" - id="path51" - inkscape:connector-curvature="0" - style="fill-rule:evenodd;fill:#ffffff" /></g></g><g - id="g53" - style="fill:#acb42a;fill-opacity:1"><path - d="m 112.881,30.643 -6.404,-18.639 -6.455,18.639 h -7.254 l 9.565,-30.321 h 8.19 l 4.434,15.582 0.35,1.276 c 0.521,1.866 0.917,3.431 1.191,4.693 l 0.555,-2.182 c 0.219,-0.837 0.528,-1.935 0.925,-3.293 l 4.468,-16.076 h 8.19 l -10.501,30.321 h -7.254 z" - id="path55" - style="fill:#acb42a;fill-opacity:1" - inkscape:connector-curvature="0" /></g></svg> \ No newline at end of file + inkscape:version="1.0.2 (e86c870879, 2021-01-15)" + sodipodi:docname="logo-dark.svg"><metadata + id="metadata61"><rdf:RDF><cc:Work + rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs59"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + </defs><sodipodi:namedview + pagecolor="#1a1a1a" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="1920" + inkscape:window-height="1016" + id="namedview57" + showgrid="false" + inkscape:zoom="3.4054244" + inkscape:cx="112.21891" + inkscape:cy="27.15689" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="svg2" + inkscape:document-rotation="0" /> +<g + id="Background"> +</g> +<g + id="Guides"> +</g> +<path + fill-rule="evenodd" + clip-rule="evenodd" + d="M 10.417,30.321 0,0 h 8.233 l 4.26,15.582 0.349,1.276 c 0.521,1.866 0.918,3.431 1.191,4.693 0.15,-0.618 0.335,-1.345 0.555,-2.182 0.219,-0.837 0.528,-1.935 0.925,-3.293 L 19.981,0 h 8.19 l -10.5,30.321 z" + id="path11" + style="fill:#ffffff;fill-opacity:1" /><path + fill-rule="evenodd" + clip-rule="evenodd" + fill="#A0CE67" + d="m 139.809,19.787 c -0.665,0.357 -1.748,0.686 -3.25,0.988 -0.727,0.137 -1.283,0.254 -1.667,0.35 -0.95,0.247 -1.661,0.563 -2.134,0.947 -0.472,0.384 -0.799,0.899 -0.979,1.544 -0.223,0.796 -0.155,1.438 0.204,1.925 0.359,0.488 0.945,0.731 1.757,0.731 1.252,0 2.375,-0.36 3.369,-1.081 0.994,-0.721 1.653,-1.665 1.98,-2.831 z m 5.106,10.534 h -7.458 c 0.017,-0.356 0.048,-0.726 0.094,-1.11 l 0.159,-1.192 c -1.318,1.026 -2.627,1.786 -3.927,2.279 -1.299,0.493 -2.643,0.739 -4.031,0.739 -2.158,0 -3.7,-0.593 -4.625,-1.779 -0.925,-1.187 -1.106,-2.788 -0.542,-4.804 0.519,-1.851 1.431,-3.356 2.737,-4.515 1.307,-1.159 3.021,-1.972 5.142,-2.438 1.169,-0.247 2.641,-0.515 4.413,-0.803 2.646,-0.412 4.082,-1.016 4.304,-1.812 l 0.151,-0.539 c 0.182,-0.65 0.076,-1.145 -0.317,-1.483 -0.393,-0.339 -1.071,-0.508 -2.033,-0.508 -1.045,0 -1.934,0.214 -2.666,0.643 -0.731,0.428 -1.289,1.058 -1.673,1.887 h -6.748 c 1.065,-2.53 2.64,-4.413 4.723,-5.65 2.083,-1.237 4.724,-1.856 7.923,-1.856 1.991,0 3.602,0.241 4.833,0.722 1.231,0.481 2.095,1.209 2.59,2.185 0.339,0.701 0.483,1.536 0.432,2.504 -0.052,0.969 -0.377,2.525 -0.978,4.669 l -2.375,8.483 c -0.284,1.014 -0.416,1.812 -0.396,2.395 0.02,0.583 0.188,0.962 0.503,1.141 z" + id="path15" + style="fill:#97d700;fill-opacity:1" /><path + fill-rule="evenodd" + clip-rule="evenodd" + fill="#A0CE67" + d="m 185.7,30.321 6.27,-22.393 h 7.049 l -1.097,3.918 c 1.213,-1.537 2.502,-2.659 3.867,-3.366 1.365,-0.707 2.951,-1.074 4.758,-1.101 l -2.03,7.25 c -0.304,-0.042 -0.608,-0.072 -0.912,-0.093 -0.303,-0.02 -0.592,-0.03 -0.867,-0.03 -1.126,0 -2.104,0.168 -2.932,0.504 -0.829,0.336 -1.561,0.854 -2.197,1.555 -0.406,0.467 -0.789,1.136 -1.149,2.007 -0.361,0.872 -0.814,2.282 -1.359,4.232 l -2.104,7.516 H 185.7 Z" + id="path19" + style="fill:#97d700;fill-opacity:1" /><path + fill-rule="evenodd" + clip-rule="evenodd" + fill="#A0CE67" + d="m 217.631,19.787 c -0.664,0.357 -1.748,0.686 -3.25,0.988 -0.727,0.137 -1.282,0.254 -1.667,0.35 -0.95,0.247 -1.661,0.563 -2.134,0.947 -0.472,0.384 -0.799,0.899 -0.979,1.544 -0.223,0.796 -0.155,1.438 0.205,1.925 0.359,0.488 0.945,0.731 1.757,0.731 1.252,0 2.375,-0.36 3.369,-1.081 0.994,-0.721 1.654,-1.665 1.98,-2.831 z m 5.106,10.534 h -7.458 c 0.017,-0.356 0.048,-0.726 0.094,-1.11 l 0.159,-1.192 c -1.318,1.026 -2.627,1.786 -3.927,2.279 -1.299,0.493 -2.643,0.739 -4.031,0.739 -2.158,0 -3.7,-0.593 -4.625,-1.779 -0.926,-1.187 -1.106,-2.788 -0.542,-4.804 0.519,-1.851 1.431,-3.356 2.737,-4.515 1.306,-1.159 3.02,-1.972 5.142,-2.438 1.169,-0.247 2.641,-0.515 4.413,-0.803 2.647,-0.412 4.082,-1.016 4.304,-1.812 l 0.151,-0.539 c 0.182,-0.65 0.077,-1.145 -0.317,-1.483 -0.393,-0.339 -1.071,-0.508 -2.033,-0.508 -1.045,0 -1.934,0.214 -2.666,0.643 -0.731,0.428 -1.289,1.058 -1.672,1.887 h -6.748 c 1.065,-2.53 2.64,-4.413 4.723,-5.65 2.083,-1.237 4.724,-1.856 7.923,-1.856 1.99,0 3.601,0.241 4.833,0.722 1.232,0.481 2.095,1.209 2.591,2.185 0.339,0.701 0.483,1.536 0.431,2.504 -0.051,0.969 -0.377,2.525 -0.978,4.669 l -2.375,8.483 c -0.284,1.014 -0.416,1.812 -0.396,2.395 0.02,0.583 0.188,0.962 0.503,1.141 z" + id="path23" + style="fill:#97d700;fill-opacity:1" /><path + fill-rule="evenodd" + clip-rule="evenodd" + fill="#A0CE67" + d="m 188.386,7.928 -6.269,22.393 h -7.174 l 0.864,-3.085 c -1.227,1.246 -2.476,2.163 -3.746,2.751 -1.27,0.588 -2.625,0.882 -4.067,0.882 -2.471,0 -4.154,-0.634 -5.048,-1.901 -0.895,-1.268 -0.993,-3.149 -0.294,-5.644 l 4.31,-15.396 h 7.338 l -3.508,12.53 c -0.516,1.842 -0.641,3.109 -0.375,3.803 0.266,0.694 0.967,1.041 2.105,1.041 1.275,0 2.323,-0.422 3.142,-1.267 0.819,-0.845 1.497,-2.223 2.031,-4.133 l 3.353,-11.974 z" + id="path27" + style="fill:#97d700;fill-opacity:1" /><path + fill-rule="evenodd" + clip-rule="evenodd" + fill="#A0CE67" + d="m 149.937,12.356 1.239,-4.428 h 2.995 l 1.771,-6.326 h 7.338 l -1.771,6.326 h 3.753 l -1.24,4.428 h -3.753 l -2.716,9.702 c -0.416,1.483 -0.498,2.465 -0.247,2.946 0.25,0.48 0.905,0.721 1.964,0.721 l 0.549,-0.011 0.39,-0.031 -1.31,4.678 c -0.811,0.148 -1.596,0.263 -2.354,0.344 -0.758,0.081 -1.48,0.122 -2.167,0.122 -2.543,0 -4.108,-0.621 -4.695,-1.863 -0.587,-1.242 -0.313,-3.887 0.82,-7.936 l 2.428,-8.672 z" + id="path31" + style="fill:#97d700;fill-opacity:1" /><path + fill-rule="evenodd" + clip-rule="evenodd" + fill="#ffffff" + d="m 73.875,18.896 c -0.561,2.004 -0.616,3.537 -0.167,4.601 0.449,1.064 1.375,1.595 2.774,1.595 1.399,0 2.605,-0.524 3.62,-1.574 1.015,-1.05 1.806,-2.59 2.375,-4.622 0.526,-1.879 0.556,-3.334 0.09,-4.363 -0.466,-1.029 -1.393,-1.543 -2.778,-1.543 -1.304,0 -2.487,0.528 -3.551,1.585 -1.064,1.057 -1.852,2.496 -2.363,4.321 z M 96.513,0 88.024,30.321 h -7.337 l 0.824,-2.944 c -1.166,1.22 -2.369,2.121 -3.61,2.703 -1.241,0.582 -2.583,0.874 -4.025,0.874 -2.802,0 -4.772,-1.081 -5.912,-3.243 -1.139,-2.162 -1.218,-4.993 -0.238,-8.493 0.988,-3.528 2.668,-6.404 5.042,-8.627 2.374,-2.224 4.927,-3.336 7.661,-3.336 1.47,0 2.695,0.296 3.676,0.887 0.981,0.591 1.681,1.465 2.099,2.62 L 89.217,0 Z" + id="path35" + style="fill:#ffffff;fill-opacity:1" /><g + id="g37" + style="fill:#ffffff;fill-opacity:1"> + <path + fill-rule="evenodd" + clip-rule="evenodd" + d="m 73.875,18.896 c -0.561,2.004 -0.616,3.537 -0.167,4.601 0.449,1.064 1.375,1.595 2.774,1.595 1.399,0 2.605,-0.524 3.62,-1.574 1.015,-1.05 1.806,-2.59 2.375,-4.622 0.526,-1.879 0.556,-3.334 0.09,-4.363 -0.466,-1.029 -1.393,-1.543 -2.778,-1.543 -1.304,0 -2.487,0.528 -3.551,1.585 -1.064,1.057 -1.852,2.496 -2.363,4.321 z M 96.513,0 88.024,30.321 h -7.337 l 0.824,-2.944 c -1.166,1.22 -2.369,2.121 -3.61,2.703 -1.241,0.582 -2.583,0.874 -4.025,0.874 -2.802,0 -4.772,-1.081 -5.912,-3.243 -1.139,-2.162 -1.218,-4.993 -0.238,-8.493 0.988,-3.528 2.668,-6.404 5.042,-8.627 2.374,-2.224 4.927,-3.336 7.661,-3.336 1.47,0 2.695,0.296 3.676,0.887 0.981,0.591 1.681,1.465 2.099,2.62 L 89.217,0 Z" + id="path39" + style="fill:#ffffff;fill-opacity:1" /> + </g><path + fill-rule="evenodd" + clip-rule="evenodd" + d="M 46.488,30.321 52.757,7.928 h 7.049 l -1.098,3.918 C 59.921,10.309 61.21,9.187 62.576,8.48 63.942,7.773 68.591,7.406 70.398,7.379 l -2.03,7.25 c -0.304,-0.042 -0.608,-0.072 -0.911,-0.093 -0.304,-0.02 -0.592,-0.03 -0.867,-0.03 -1.126,0 -5.167,0.168 -5.997,0.504 -0.829,0.336 -1.561,0.854 -2.196,1.555 -0.406,0.467 -0.789,1.136 -1.149,2.007 -0.361,0.872 -0.814,2.282 -1.36,4.232 l -2.104,7.516 h -7.296 z" + id="path43" + style="fill:#ffffff;fill-opacity:1" /><path + fill-rule="evenodd" + clip-rule="evenodd" + fill="#ffffff" + d="m 32.673,16.742 8.351,-0.021 c 0.375,-1.436 0.308,-2.558 -0.201,-3.365 -0.509,-0.807 -1.402,-1.211 -2.68,-1.211 -1.209,0 -2.285,0.397 -3.229,1.19 -0.944,0.793 -1.69,1.93 -2.241,3.407 z m 6.144,6.536 h 7.043 c -1.347,2.456 -3.172,4.356 -5.477,5.7 -2.305,1.345 -4.885,2.017 -7.74,2.017 -3.473,0 -5.923,-1.054 -7.351,-3.161 -1.427,-2.107 -1.632,-4.98 -0.613,-8.618 1.038,-3.707 2.875,-6.641 5.512,-8.803 2.637,-2.163 5.678,-3.244 9.123,-3.244 3.555,0 6.04,1.099 7.456,3.298 1.417,2.198 1.582,5.234 0.498,9.109 l -0.239,0.814 -0.167,0.484 H 31.721 c -0.441,1.575 -0.438,2.777 0.01,3.606 0.448,0.829 1.332,1.244 2.65,1.244 0.975,0 1.836,-0.206 2.583,-0.617 0.747,-0.411 1.366,-1.021 1.853,-1.829 z" + id="path47" + style="fill:#ffffff;fill-opacity:1" /><g + id="g49" + style="fill:#ffffff;fill-opacity:1"> + <path + fill-rule="evenodd" + clip-rule="evenodd" + d="m 32.673,16.742 8.351,-0.021 c 0.375,-1.436 0.308,-2.558 -0.201,-3.365 -0.509,-0.807 -1.402,-1.211 -2.68,-1.211 -1.209,0 -2.285,0.397 -3.229,1.19 -0.944,0.793 -1.69,1.93 -2.241,3.407 z m 6.144,6.536 h 7.043 c -1.347,2.456 -3.172,4.356 -5.477,5.7 -2.305,1.345 -4.885,2.017 -7.74,2.017 -3.473,0 -5.923,-1.054 -7.351,-3.161 -1.427,-2.107 -1.632,-4.98 -0.613,-8.618 1.038,-3.707 2.875,-6.641 5.512,-8.803 2.637,-2.163 5.678,-3.244 9.123,-3.244 3.555,0 6.04,1.099 7.456,3.298 1.417,2.198 1.582,5.234 0.498,9.109 l -0.239,0.814 -0.167,0.484 H 31.721 c -0.441,1.575 -0.438,2.777 0.01,3.606 0.448,0.829 1.332,1.244 2.65,1.244 0.975,0 1.836,-0.206 2.583,-0.617 0.747,-0.411 1.366,-1.021 1.853,-1.829 z" + id="path51" + style="fill:#ffffff;fill-opacity:1" /> + </g><path + fill="#A0CE67" + d="m 112.881,30.643 -6.404,-18.639 -6.455,18.639 h -7.254 l 9.565,-30.321 h 8.19 l 4.434,15.582 0.35,1.276 c 0.521,1.866 0.917,3.431 1.191,4.693 l 0.555,-2.182 c 0.219,-0.837 0.528,-1.935 0.925,-3.293 l 4.468,-16.076 h 8.19 l -10.501,30.321 z" + id="path55" + style="fill:#97d700;fill-opacity:1" /> +</svg> diff --git a/image/logo-margin.svg b/image/logo-margin.svg new file mode 100644 index 00000000..57e0a756 --- /dev/null +++ b/image/logo-margin.svg @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 1343.3 428.9" style="enable-background:new 0 0 1343.3 428.9;" xml:space="preserve"> +<style type="text/css"> + .st0{display:none;} + .st1{display:inline;fill-rule:evenodd;clip-rule:evenodd;fill:#1A1A1A;} + .st2{fill-rule:evenodd;clip-rule:evenodd;fill:#1A1A1A;} + .st3{fill-rule:evenodd;clip-rule:evenodd;fill:#97D700;} + .st4{fill:#97D700;} + .st5{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;} + .st6{fill:#FFFFFF;} + .st7{fill:#1A1A1A;} + .st8{display:inline;fill-rule:evenodd;clip-rule:evenodd;fill:#E6E6E6;} + .st9{display:inline;fill-rule:evenodd;clip-rule:evenodd;fill:#333333;} +</style> +<g id="Capa_3" class="st0"> +</g> +<g id="Capa_1"> + <g> + <g> + <path class="st2" d="M190.3,284.2l-48.8-142h38.6l20,73l1.6,6c2.4,8.7,4.3,16.1,5.6,22c0.7-2.9,1.6-6.3,2.6-10.2 + c1-3.9,2.5-9.1,4.3-15.4l20.9-75.3h38.4l-49.2,142H190.3z"/> + <path class="st3" d="M1184.8,284.2h-34.9c0.1-1.7,0.2-3.4,0.4-5.2l0.7-5.6c-6.2,4.8-12.3,8.4-18.4,10.7 + c-6.1,2.3-12.4,3.5-18.9,3.5c-10.1,0-17.3-2.8-21.7-8.3c-4.3-5.6-5.2-13.1-2.5-22.5c2.4-8.7,6.7-15.7,12.8-21.1 + c6.1-5.4,14.1-9.2,24.1-11.4c5.5-1.2,12.4-2.4,20.7-3.8c12.4-1.9,19.1-4.8,20.2-8.5l0.7-2.5c0.9-3,0.4-5.4-1.5-6.9 + c-1.8-1.6-5-2.4-9.5-2.4c-4.9,0-9.1,1-12.5,3c-3.4,2-6,5-7.8,8.8h-31.6c5-11.8,12.4-20.7,22.1-26.5c9.7-5.8,22.1-8.7,37.1-8.7 + c9.3,0,16.9,1.1,22.6,3.4c5.8,2.2,9.8,5.7,12.1,10.2c1.6,3.3,2.3,7.2,2,11.7c-0.2,4.5-1.8,11.8-4.6,21.9l-11.1,39.7 + c-1.3,4.7-1.9,8.5-1.9,11.2c0.1,2.7,0.9,4.5,2.4,5.3L1184.8,284.2z M1160.9,234.9c-3.1,1.7-8.2,3.2-15.2,4.6 + c-3.4,0.6-6,1.2-7.8,1.6c-4.5,1.2-7.8,2.6-10,4.4c-2.2,1.8-3.7,4.2-4.6,7.2c-1,3.7-0.7,6.7,1,9c1.7,2.3,4.4,3.4,8.2,3.4 + c5.9,0,11.1-1.7,15.8-5.1c4.7-3.4,7.7-7.8,9.3-13.3L1160.9,234.9z"/> + <path class="st3" d="M1011.3,284.2l29.4-104.9h33l-5.1,18.4c5.7-7.2,11.7-12.5,18.1-15.8c6.4-3.3,13.8-5,22.3-5.2l-9.5,34 + c-1.4-0.2-2.8-0.3-4.3-0.4c-1.4-0.1-2.8-0.1-4.1-0.1c-5.3,0-9.8,0.8-13.7,2.4c-3.9,1.6-7.3,4-10.3,7.3c-1.9,2.2-3.7,5.3-5.4,9.4 + c-1.7,4.1-3.8,10.7-6.4,19.8l-9.9,35.2H1011.3z"/> + <path class="st3" d="M1023.9,179.4l-29.4,104.9h-33.6l4-14.5c-5.7,5.8-11.6,10.1-17.5,12.9c-5.9,2.7-12.3,4.1-19,4.1 + c-11.6,0-19.5-3-23.6-8.9c-4.2-5.9-4.6-14.7-1.4-26.4l20.2-72.1h34.4l-16.4,58.7c-2.4,8.6-3,14.6-1.8,17.8 + c1.2,3.2,4.5,4.9,9.9,4.9c6,0,10.9-2,14.7-5.9c3.8-4,7-10.4,9.5-19.4l15.7-56.1H1023.9z"/> + <path class="st3" d="M843.8,200.1l5.8-20.7h14l8.3-29.6h34.4l-8.3,29.6h17.6l-5.8,20.7h-17.6l-12.7,45.4 + c-1.9,6.9-2.3,11.5-1.2,13.8c1.2,2.2,4.2,3.4,9.2,3.4l2.6-0.1l1.8-0.1l-6.1,21.9c-3.8,0.7-7.5,1.2-11,1.6 + c-3.6,0.4-6.9,0.6-10.2,0.6c-11.9,0-19.2-2.9-22-8.7c-2.7-5.8-1.5-18.2,3.8-37.2l11.4-40.6H843.8z"/> + <path class="st3" d="M820.3,284.2h-34.9c0.1-1.7,0.2-3.4,0.4-5.2l0.7-5.6c-6.2,4.8-12.3,8.4-18.4,10.7 + c-6.1,2.3-12.4,3.5-18.9,3.5c-10.1,0-17.3-2.8-21.7-8.3c-4.3-5.6-5.2-13.1-2.5-22.5c2.4-8.7,6.7-15.7,12.8-21.1 + c6.1-5.4,14.1-9.2,24.1-11.4c5.5-1.2,12.4-2.4,20.7-3.8c12.4-1.9,19.1-4.8,20.2-8.5l0.7-2.5c0.9-3,0.4-5.4-1.5-6.9 + c-1.8-1.6-5-2.4-9.5-2.4c-4.9,0-9.1,1-12.5,3c-3.4,2-6,5-7.8,8.8h-31.6c5-11.8,12.4-20.7,22.1-26.5c9.8-5.8,22.1-8.7,37.1-8.7 + c9.3,0,16.9,1.1,22.6,3.4c5.8,2.2,9.8,5.7,12.1,10.2c1.6,3.3,2.3,7.2,2,11.7c-0.2,4.5-1.8,11.8-4.6,21.9l-11.1,39.7 + c-1.3,4.7-1.9,8.5-1.9,11.2c0.1,2.7,0.9,4.5,2.4,5.3L820.3,284.2z M796.4,234.9c-3.1,1.7-8.2,3.2-15.2,4.6 + c-3.4,0.6-6,1.2-7.8,1.6c-4.5,1.2-7.8,2.6-10,4.4c-2.2,1.8-3.7,4.2-4.6,7.2c-1,3.7-0.7,6.7,1,9c1.7,2.3,4.4,3.4,8.2,3.4 + c5.9,0,11.1-1.7,15.8-5.1c4.7-3.4,7.7-7.8,9.3-13.3L796.4,234.9z"/> + <path class="st2" d="M593.6,142.2l-39.8,142h-34.4l3.9-13.8c-5.5,5.7-11.1,9.9-16.9,12.7c-5.8,2.7-12.1,4.1-18.9,4.1 + c-13.1,0-22.4-5.1-27.7-15.2c-5.3-10.1-5.7-23.4-1.1-39.8c4.6-16.5,12.5-30,23.6-40.4c11.1-10.4,23.1-15.6,35.9-15.6 + c6.9,0,12.6,1.4,17.2,4.2c4.6,2.8,7.9,6.9,9.8,12.3l14.1-50.4H593.6z M487.5,230.7c-2.6,9.4-2.9,16.6-0.8,21.5 + c2.1,5,6.4,7.5,13,7.5c6.6,0,12.2-2.5,17-7.4c4.7-4.9,8.5-12.1,11.1-21.6c2.5-8.8,2.6-15.6,0.4-20.4c-2.2-4.8-6.5-7.2-13-7.2 + c-6.1,0-11.6,2.5-16.6,7.4C493.6,215.4,489.9,222.2,487.5,230.7z"/> + <path class="st2" d="M359.3,284.2l29.4-104.9h33l-5.1,18.4c5.7-7.2,11.7-12.5,18.1-15.8c6.4-3.3,28.2-5,36.6-5.2l-9.5,34 + c-1.4-0.2-2.8-0.3-4.3-0.4c-1.4-0.1-2.8-0.1-4.1-0.1c-5.3,0-24.2,0.8-28.1,2.4c-3.9,1.6-7.3,4-10.3,7.3c-1.9,2.2-3.7,5.3-5.4,9.4 + c-1.7,4.1-3.8,10.7-6.4,19.8l-9.9,35.2H359.3z"/> + <path class="st2" d="M323.3,251.3h33c-6.3,11.5-14.9,20.4-25.7,26.7c-10.8,6.3-22.9,9.4-36.3,9.4c-16.3,0-27.7-4.9-34.4-14.8 + c-6.7-9.9-7.6-23.3-2.9-40.4c4.9-17.4,13.5-31.1,25.8-41.2c12.4-10.1,26.6-15.2,42.7-15.2c16.7,0,28.3,5.1,34.9,15.4 + c6.6,10.3,7.4,24.5,2.3,42.7l-1.1,3.8L361,240h-70.9c-2.1,7.4-2.1,13,0,16.9c2.1,3.9,6.2,5.8,12.4,5.8c4.6,0,8.6-1,12.1-2.9 + C318.2,257.9,321.1,255,323.3,251.3z M294.6,220.6l39.1-0.1c1.8-6.7,1.4-12-0.9-15.8c-2.4-3.8-6.6-5.7-12.5-5.7 + c-5.7,0-10.7,1.9-15.1,5.6C300.6,208.4,297.1,213.7,294.6,220.6z"/> + <path class="st4" d="M670.3,285.8l-30-87.3L610,285.8h-34l44.8-142h38.4l20.8,73l1.6,6c2.4,8.7,4.3,16.1,5.6,22l2.6-10.2 + c1-3.9,2.5-9.1,4.3-15.4l20.9-75.3h38.4l-49.2,142H670.3z"/> + </g> + </g> +</g> +<g id="Guías" class="st0"> + <path class="st8" d="M640.2,142.4l-48.8-142H630l20,73l1.6,6c2.4,8.7,4.3,16.1,5.6,22c0.7-2.9,1.6-6.3,2.6-10.2 + c1-3.9,2.5-9.1,4.3-15.4L685,0.3h38.4l-49.2,142H640.2z"/> + <path class="st8" d="M675.7,286.8l48.8,142h-38.6l-20-73l-1.6-6c-2.4-8.7-4.3-16.1-5.6-22c-0.7,2.9-1.6,6.3-2.6,10.2 + c-1,3.9-2.5,9.1-4.3,15.4l-20.9,75.3h-38.4l49.2-142H675.7z"/> + <path class="st8" d="M141.5,231l-142,48.8v-38.6l73-20l6-1.6c8.7-2.4,16.1-4.3,22-5.6c-2.9-0.7-6.3-1.6-10.2-2.6 + c-3.9-1-9.1-2.5-15.4-4.3l-75.3-20.9v-38.4l142,49.2V231z"/> + <path class="st8" d="M1201.1,196.3l142-48.8V186l-73,20l-6,1.6c-8.7,2.4-16.1,4.3-22,5.6c2.9,0.7,6.3,1.6,10.2,2.6 + c3.9,1,9.1,2.5,15.4,4.3l75.3,20.9v38.4l-142-49.2V196.3z"/> +</g> +</svg> diff --git a/image/logo.svg b/image/logo.svg index bba010e3..23b6df49 100644 --- a/image/logo.svg +++ b/image/logo.svg @@ -1,6 +1,4 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> - <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" @@ -18,12 +16,47 @@ enable-background="new 0 0 226.229 31.038" xml:space="preserve" id="svg2" - inkscape:version="0.48.1 r9760" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)" sodipodi:docname="logo.svg"><metadata id="metadata61"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs - id="defs59" /><sodipodi:namedview + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs + id="defs59"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + </defs><sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" @@ -32,135 +65,94 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1366" - inkscape:window-height="710" + inkscape:window-width="1920" + inkscape:window-height="1016" id="namedview57" showgrid="false" - inkscape:zoom="4.0755163" - inkscape:cx="138.56745" + inkscape:zoom="4.8159974" + inkscape:cx="90.91814" inkscape:cy="16.509992" inkscape:window-x="0" - inkscape:window-y="26" + inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> + inkscape:current-layer="svg2" + inkscape:document-rotation="0" /> <g id="Background"> </g> <g id="Guides"> </g> -<g - id="Foreground"> - <g - id="g7"> - <g - id="g9"> - <path +<path fill-rule="evenodd" clip-rule="evenodd" - d="M10.417,30.321L0,0h8.233l4.26,15.582l0.349,1.276 c0.521,1.866,0.918,3.431,1.191,4.693c0.15-0.618,0.335-1.345,0.555-2.182c0.219-0.837,0.528-1.935,0.925-3.293L19.981,0h8.19 L17.671,30.321H10.417z" - id="path11" /> - </g> - <g - id="g13"> - <path + d="M 10.417,30.321 0,0 h 8.233 l 4.26,15.582 0.349,1.276 c 0.521,1.866 0.918,3.431 1.191,4.693 0.15,-0.618 0.335,-1.345 0.555,-2.182 0.219,-0.837 0.528,-1.935 0.925,-3.293 L 19.981,0 h 8.19 l -10.5,30.321 z" + id="path11" + style="fill:#1a1a1a;fill-opacity:1" /><path fill-rule="evenodd" clip-rule="evenodd" fill="#A0CE67" - d="M139.809,19.787c-0.665,0.357-1.748,0.686-3.25,0.988 c-0.727,0.137-1.283,0.254-1.667,0.35c-0.95,0.247-1.661,0.563-2.134,0.947c-0.472,0.384-0.799,0.899-0.979,1.544 c-0.223,0.796-0.155,1.438,0.204,1.925c0.359,0.488,0.945,0.731,1.757,0.731c1.252,0,2.375-0.36,3.369-1.081 c0.994-0.721,1.653-1.665,1.98-2.831L139.809,19.787z M144.915,30.321h-7.458c0.017-0.356,0.048-0.726,0.094-1.11l0.159-1.192 c-1.318,1.026-2.627,1.786-3.927,2.279c-1.299,0.493-2.643,0.739-4.031,0.739c-2.158,0-3.7-0.593-4.625-1.779 c-0.925-1.187-1.106-2.788-0.542-4.804c0.519-1.851,1.431-3.356,2.737-4.515c1.307-1.159,3.021-1.972,5.142-2.438 c1.169-0.247,2.641-0.515,4.413-0.803c2.646-0.412,4.082-1.016,4.304-1.812l0.151-0.539c0.182-0.65,0.076-1.145-0.317-1.483 c-0.393-0.339-1.071-0.508-2.033-0.508c-1.045,0-1.934,0.214-2.666,0.643c-0.731,0.428-1.289,1.058-1.673,1.887h-6.748 c1.065-2.53,2.64-4.413,4.723-5.65s4.724-1.856,7.923-1.856c1.991,0,3.602,0.241,4.833,0.722s2.095,1.209,2.59,2.185 c0.339,0.701,0.483,1.536,0.432,2.504c-0.052,0.969-0.377,2.525-0.978,4.669l-2.375,8.483c-0.284,1.014-0.416,1.812-0.396,2.395 s0.188,0.962,0.503,1.141L144.915,30.321z" + d="m 139.809,19.787 c -0.665,0.357 -1.748,0.686 -3.25,0.988 -0.727,0.137 -1.283,0.254 -1.667,0.35 -0.95,0.247 -1.661,0.563 -2.134,0.947 -0.472,0.384 -0.799,0.899 -0.979,1.544 -0.223,0.796 -0.155,1.438 0.204,1.925 0.359,0.488 0.945,0.731 1.757,0.731 1.252,0 2.375,-0.36 3.369,-1.081 0.994,-0.721 1.653,-1.665 1.98,-2.831 z m 5.106,10.534 h -7.458 c 0.017,-0.356 0.048,-0.726 0.094,-1.11 l 0.159,-1.192 c -1.318,1.026 -2.627,1.786 -3.927,2.279 -1.299,0.493 -2.643,0.739 -4.031,0.739 -2.158,0 -3.7,-0.593 -4.625,-1.779 -0.925,-1.187 -1.106,-2.788 -0.542,-4.804 0.519,-1.851 1.431,-3.356 2.737,-4.515 1.307,-1.159 3.021,-1.972 5.142,-2.438 1.169,-0.247 2.641,-0.515 4.413,-0.803 2.646,-0.412 4.082,-1.016 4.304,-1.812 l 0.151,-0.539 c 0.182,-0.65 0.076,-1.145 -0.317,-1.483 -0.393,-0.339 -1.071,-0.508 -2.033,-0.508 -1.045,0 -1.934,0.214 -2.666,0.643 -0.731,0.428 -1.289,1.058 -1.673,1.887 h -6.748 c 1.065,-2.53 2.64,-4.413 4.723,-5.65 2.083,-1.237 4.724,-1.856 7.923,-1.856 1.991,0 3.602,0.241 4.833,0.722 1.231,0.481 2.095,1.209 2.59,2.185 0.339,0.701 0.483,1.536 0.432,2.504 -0.052,0.969 -0.377,2.525 -0.978,4.669 l -2.375,8.483 c -0.284,1.014 -0.416,1.812 -0.396,2.395 0.02,0.583 0.188,0.962 0.503,1.141 z" id="path15" - style="fill:#8ed300;fill-opacity:1" /> - </g> - <g - id="g17"> - <path + style="fill:#97d700;fill-opacity:1" /><path fill-rule="evenodd" clip-rule="evenodd" fill="#A0CE67" - d="M185.7,30.321l6.27-22.393h7.049l-1.097,3.918 c1.213-1.537,2.502-2.659,3.867-3.366c1.365-0.707,2.951-1.074,4.758-1.101l-2.03,7.25c-0.304-0.042-0.608-0.072-0.912-0.093 c-0.303-0.02-0.592-0.03-0.867-0.03c-1.126,0-2.104,0.168-2.932,0.504c-0.829,0.336-1.561,0.854-2.197,1.555 c-0.406,0.467-0.789,1.136-1.149,2.007c-0.361,0.872-0.814,2.282-1.359,4.232l-2.104,7.516H185.7z" + d="m 185.7,30.321 6.27,-22.393 h 7.049 l -1.097,3.918 c 1.213,-1.537 2.502,-2.659 3.867,-3.366 1.365,-0.707 2.951,-1.074 4.758,-1.101 l -2.03,7.25 c -0.304,-0.042 -0.608,-0.072 -0.912,-0.093 -0.303,-0.02 -0.592,-0.03 -0.867,-0.03 -1.126,0 -2.104,0.168 -2.932,0.504 -0.829,0.336 -1.561,0.854 -2.197,1.555 -0.406,0.467 -0.789,1.136 -1.149,2.007 -0.361,0.872 -0.814,2.282 -1.359,4.232 l -2.104,7.516 H 185.7 Z" id="path19" - style="fill:#8ed300;fill-opacity:1" /> - </g> - <g - id="g21"> - <path + style="fill:#97d700;fill-opacity:1" /><path fill-rule="evenodd" clip-rule="evenodd" fill="#A0CE67" - d="M217.631,19.787c-0.664,0.357-1.748,0.686-3.25,0.988 c-0.727,0.137-1.282,0.254-1.667,0.35c-0.95,0.247-1.661,0.563-2.134,0.947c-0.472,0.384-0.799,0.899-0.979,1.544 c-0.223,0.796-0.155,1.438,0.205,1.925c0.359,0.488,0.945,0.731,1.757,0.731c1.252,0,2.375-0.36,3.369-1.081 c0.994-0.721,1.654-1.665,1.98-2.831L217.631,19.787z M222.737,30.321h-7.458c0.017-0.356,0.048-0.726,0.094-1.11l0.159-1.192 c-1.318,1.026-2.627,1.786-3.927,2.279c-1.299,0.493-2.643,0.739-4.031,0.739c-2.158,0-3.7-0.593-4.625-1.779 c-0.926-1.187-1.106-2.788-0.542-4.804c0.519-1.851,1.431-3.356,2.737-4.515c1.306-1.159,3.02-1.972,5.142-2.438 c1.169-0.247,2.641-0.515,4.413-0.803c2.647-0.412,4.082-1.016,4.304-1.812l0.151-0.539c0.182-0.65,0.077-1.145-0.317-1.483 c-0.393-0.339-1.071-0.508-2.033-0.508c-1.045,0-1.934,0.214-2.666,0.643c-0.731,0.428-1.289,1.058-1.672,1.887h-6.748 c1.065-2.53,2.64-4.413,4.723-5.65s4.724-1.856,7.923-1.856c1.99,0,3.601,0.241,4.833,0.722s2.095,1.209,2.591,2.185 c0.339,0.701,0.483,1.536,0.431,2.504c-0.051,0.969-0.377,2.525-0.978,4.669l-2.375,8.483c-0.284,1.014-0.416,1.812-0.396,2.395 c0.02,0.583,0.188,0.962,0.503,1.141L222.737,30.321z" + d="m 217.631,19.787 c -0.664,0.357 -1.748,0.686 -3.25,0.988 -0.727,0.137 -1.282,0.254 -1.667,0.35 -0.95,0.247 -1.661,0.563 -2.134,0.947 -0.472,0.384 -0.799,0.899 -0.979,1.544 -0.223,0.796 -0.155,1.438 0.205,1.925 0.359,0.488 0.945,0.731 1.757,0.731 1.252,0 2.375,-0.36 3.369,-1.081 0.994,-0.721 1.654,-1.665 1.98,-2.831 z m 5.106,10.534 h -7.458 c 0.017,-0.356 0.048,-0.726 0.094,-1.11 l 0.159,-1.192 c -1.318,1.026 -2.627,1.786 -3.927,2.279 -1.299,0.493 -2.643,0.739 -4.031,0.739 -2.158,0 -3.7,-0.593 -4.625,-1.779 -0.926,-1.187 -1.106,-2.788 -0.542,-4.804 0.519,-1.851 1.431,-3.356 2.737,-4.515 1.306,-1.159 3.02,-1.972 5.142,-2.438 1.169,-0.247 2.641,-0.515 4.413,-0.803 2.647,-0.412 4.082,-1.016 4.304,-1.812 l 0.151,-0.539 c 0.182,-0.65 0.077,-1.145 -0.317,-1.483 -0.393,-0.339 -1.071,-0.508 -2.033,-0.508 -1.045,0 -1.934,0.214 -2.666,0.643 -0.731,0.428 -1.289,1.058 -1.672,1.887 h -6.748 c 1.065,-2.53 2.64,-4.413 4.723,-5.65 2.083,-1.237 4.724,-1.856 7.923,-1.856 1.99,0 3.601,0.241 4.833,0.722 1.232,0.481 2.095,1.209 2.591,2.185 0.339,0.701 0.483,1.536 0.431,2.504 -0.051,0.969 -0.377,2.525 -0.978,4.669 l -2.375,8.483 c -0.284,1.014 -0.416,1.812 -0.396,2.395 0.02,0.583 0.188,0.962 0.503,1.141 z" id="path23" - style="fill:#8ed300;fill-opacity:1" /> - </g> - <g - id="g25"> - <path + style="fill:#97d700;fill-opacity:1" /><path fill-rule="evenodd" clip-rule="evenodd" fill="#A0CE67" - d="M188.386,7.928l-6.269,22.393h-7.174l0.864-3.085 c-1.227,1.246-2.476,2.163-3.746,2.751s-2.625,0.882-4.067,0.882c-2.471,0-4.154-0.634-5.048-1.901 c-0.895-1.268-0.993-3.149-0.294-5.644l4.31-15.396h7.338l-3.508,12.53c-0.516,1.842-0.641,3.109-0.375,3.803 s0.967,1.041,2.105,1.041c1.275,0,2.323-0.422,3.142-1.267c0.819-0.845,1.497-2.223,2.031-4.133l3.353-11.974H188.386z" + d="m 188.386,7.928 -6.269,22.393 h -7.174 l 0.864,-3.085 c -1.227,1.246 -2.476,2.163 -3.746,2.751 -1.27,0.588 -2.625,0.882 -4.067,0.882 -2.471,0 -4.154,-0.634 -5.048,-1.901 -0.895,-1.268 -0.993,-3.149 -0.294,-5.644 l 4.31,-15.396 h 7.338 l -3.508,12.53 c -0.516,1.842 -0.641,3.109 -0.375,3.803 0.266,0.694 0.967,1.041 2.105,1.041 1.275,0 2.323,-0.422 3.142,-1.267 0.819,-0.845 1.497,-2.223 2.031,-4.133 l 3.353,-11.974 z" id="path27" - style="fill:#8ed300;fill-opacity:1" /> - </g> - <g - id="g29"> - <path + style="fill:#97d700;fill-opacity:1" /><path fill-rule="evenodd" clip-rule="evenodd" fill="#A0CE67" - d="M149.937,12.356l1.239-4.428h2.995l1.771-6.326h7.338 l-1.771,6.326h3.753l-1.24,4.428h-3.753l-2.716,9.702c-0.416,1.483-0.498,2.465-0.247,2.946c0.25,0.48,0.905,0.721,1.964,0.721 l0.549-0.011l0.39-0.031l-1.31,4.678c-0.811,0.148-1.596,0.263-2.354,0.344c-0.758,0.081-1.48,0.122-2.167,0.122 c-2.543,0-4.108-0.621-4.695-1.863c-0.587-1.242-0.313-3.887,0.82-7.936l2.428-8.672H149.937z" + d="m 149.937,12.356 1.239,-4.428 h 2.995 l 1.771,-6.326 h 7.338 l -1.771,6.326 h 3.753 l -1.24,4.428 h -3.753 l -2.716,9.702 c -0.416,1.483 -0.498,2.465 -0.247,2.946 0.25,0.48 0.905,0.721 1.964,0.721 l 0.549,-0.011 0.39,-0.031 -1.31,4.678 c -0.811,0.148 -1.596,0.263 -2.354,0.344 -0.758,0.081 -1.48,0.122 -2.167,0.122 -2.543,0 -4.108,-0.621 -4.695,-1.863 -0.587,-1.242 -0.313,-3.887 0.82,-7.936 l 2.428,-8.672 z" id="path31" - style="fill:#8ed300;fill-opacity:1" /> - </g> - <g - id="g33"> - <path + style="fill:#97d700;fill-opacity:1" /><path fill-rule="evenodd" clip-rule="evenodd" - fill="#FFFFFF" - d="M73.875,18.896c-0.561,2.004-0.616,3.537-0.167,4.601 s1.375,1.595,2.774,1.595c1.399,0,2.605-0.524,3.62-1.574s1.806-2.59,2.375-4.622c0.526-1.879,0.556-3.334,0.09-4.363 c-0.466-1.029-1.393-1.543-2.778-1.543c-1.304,0-2.487,0.528-3.551,1.585S74.386,17.071,73.875,18.896z M96.513,0l-8.489,30.321 h-7.337l0.824-2.944c-1.166,1.22-2.369,2.121-3.61,2.703s-2.583,0.874-4.025,0.874c-2.802,0-4.772-1.081-5.912-3.243 c-1.139-2.162-1.218-4.993-0.238-8.493c0.988-3.528,2.668-6.404,5.042-8.627c2.374-2.224,4.927-3.336,7.661-3.336 c1.47,0,2.695,0.296,3.676,0.887c0.981,0.591,1.681,1.465,2.099,2.62L89.217,0H96.513z" - id="path35" /> - <g + fill="#ffffff" + d="m 73.875,18.896 c -0.561,2.004 -0.616,3.537 -0.167,4.601 0.449,1.064 1.375,1.595 2.774,1.595 1.399,0 2.605,-0.524 3.62,-1.574 1.015,-1.05 1.806,-2.59 2.375,-4.622 0.526,-1.879 0.556,-3.334 0.09,-4.363 -0.466,-1.029 -1.393,-1.543 -2.778,-1.543 -1.304,0 -2.487,0.528 -3.551,1.585 -1.064,1.057 -1.852,2.496 -2.363,4.321 z M 96.513,0 88.024,30.321 h -7.337 l 0.824,-2.944 c -1.166,1.22 -2.369,2.121 -3.61,2.703 -1.241,0.582 -2.583,0.874 -4.025,0.874 -2.802,0 -4.772,-1.081 -5.912,-3.243 -1.139,-2.162 -1.218,-4.993 -0.238,-8.493 0.988,-3.528 2.668,-6.404 5.042,-8.627 2.374,-2.224 4.927,-3.336 7.661,-3.336 1.47,0 2.695,0.296 3.676,0.887 0.981,0.591 1.681,1.465 2.099,2.62 L 89.217,0 Z" + id="path35" /><g id="g37"> <path fill-rule="evenodd" clip-rule="evenodd" - d="M73.875,18.896c-0.561,2.004-0.616,3.537-0.167,4.601s1.375,1.595,2.774,1.595 c1.399,0,2.605-0.524,3.62-1.574s1.806-2.59,2.375-4.622c0.526-1.879,0.556-3.334,0.09-4.363 c-0.466-1.029-1.393-1.543-2.778-1.543c-1.304,0-2.487,0.528-3.551,1.585S74.386,17.071,73.875,18.896z M96.513,0l-8.489,30.321 h-7.337l0.824-2.944c-1.166,1.22-2.369,2.121-3.61,2.703s-2.583,0.874-4.025,0.874c-2.802,0-4.772-1.081-5.912-3.243 c-1.139-2.162-1.218-4.993-0.238-8.493c0.988-3.528,2.668-6.404,5.042-8.627c2.374-2.224,4.927-3.336,7.661-3.336 c1.47,0,2.695,0.296,3.676,0.887c0.981,0.591,1.681,1.465,2.099,2.62L89.217,0H96.513z" - id="path39" /> - </g> - </g> - <g - id="g41"> - <path + d="m 73.875,18.896 c -0.561,2.004 -0.616,3.537 -0.167,4.601 0.449,1.064 1.375,1.595 2.774,1.595 1.399,0 2.605,-0.524 3.62,-1.574 1.015,-1.05 1.806,-2.59 2.375,-4.622 0.526,-1.879 0.556,-3.334 0.09,-4.363 -0.466,-1.029 -1.393,-1.543 -2.778,-1.543 -1.304,0 -2.487,0.528 -3.551,1.585 -1.064,1.057 -1.852,2.496 -2.363,4.321 z M 96.513,0 88.024,30.321 h -7.337 l 0.824,-2.944 c -1.166,1.22 -2.369,2.121 -3.61,2.703 -1.241,0.582 -2.583,0.874 -4.025,0.874 -2.802,0 -4.772,-1.081 -5.912,-3.243 -1.139,-2.162 -1.218,-4.993 -0.238,-8.493 0.988,-3.528 2.668,-6.404 5.042,-8.627 2.374,-2.224 4.927,-3.336 7.661,-3.336 1.47,0 2.695,0.296 3.676,0.887 0.981,0.591 1.681,1.465 2.099,2.62 L 89.217,0 Z" + id="path39" + style="fill:#1a1a1a;fill-opacity:1" /> + </g><path fill-rule="evenodd" clip-rule="evenodd" - d="M46.488,30.321l6.269-22.393h7.049l-1.098,3.918 c1.213-1.537,2.502-2.659,3.868-3.366s6.015-1.074,7.822-1.101l-2.03,7.25c-0.304-0.042-0.608-0.072-0.911-0.093 c-0.304-0.02-0.592-0.03-0.867-0.03c-1.126,0-5.167,0.168-5.997,0.504c-0.829,0.336-1.561,0.854-2.196,1.555 c-0.406,0.467-0.789,1.136-1.149,2.007c-0.361,0.872-0.814,2.282-1.36,4.232l-2.104,7.516H46.488z" - id="path43" /> - </g> - <g - id="g45"> - <path + d="M 46.488,30.321 52.757,7.928 h 7.049 l -1.098,3.918 C 59.921,10.309 61.21,9.187 62.576,8.48 63.942,7.773 68.591,7.406 70.398,7.379 l -2.03,7.25 c -0.304,-0.042 -0.608,-0.072 -0.911,-0.093 -0.304,-0.02 -0.592,-0.03 -0.867,-0.03 -1.126,0 -5.167,0.168 -5.997,0.504 -0.829,0.336 -1.561,0.854 -2.196,1.555 -0.406,0.467 -0.789,1.136 -1.149,2.007 -0.361,0.872 -0.814,2.282 -1.36,4.232 l -2.104,7.516 h -7.296 z" + id="path43" + style="fill:#1a1a1a;fill-opacity:1" /><path fill-rule="evenodd" clip-rule="evenodd" - fill="#FFFFFF" - d="M32.673,16.742l8.351-0.021 c0.375-1.436,0.308-2.558-0.201-3.365s-1.402-1.211-2.68-1.211c-1.209,0-2.285,0.397-3.229,1.19S33.224,15.265,32.673,16.742z M38.817,23.278h7.043c-1.347,2.456-3.172,4.356-5.477,5.7c-2.305,1.345-4.885,2.017-7.74,2.017 c-3.473,0-5.923-1.054-7.351-3.161c-1.427-2.107-1.632-4.98-0.613-8.618c1.038-3.707,2.875-6.641,5.512-8.803 c2.637-2.163,5.678-3.244,9.123-3.244c3.555,0,6.04,1.099,7.456,3.298c1.417,2.198,1.582,5.234,0.498,9.109l-0.239,0.814 l-0.167,0.484H31.721c-0.441,1.575-0.438,2.777,0.01,3.606c0.448,0.829,1.332,1.244,2.65,1.244c0.975,0,1.836-0.206,2.583-0.617 S38.33,24.086,38.817,23.278z" - id="path47" /> - <g - id="g49"> + fill="#ffffff" + d="m 32.673,16.742 8.351,-0.021 c 0.375,-1.436 0.308,-2.558 -0.201,-3.365 -0.509,-0.807 -1.402,-1.211 -2.68,-1.211 -1.209,0 -2.285,0.397 -3.229,1.19 -0.944,0.793 -1.69,1.93 -2.241,3.407 z m 6.144,6.536 h 7.043 c -1.347,2.456 -3.172,4.356 -5.477,5.7 -2.305,1.345 -4.885,2.017 -7.74,2.017 -3.473,0 -5.923,-1.054 -7.351,-3.161 -1.427,-2.107 -1.632,-4.98 -0.613,-8.618 1.038,-3.707 2.875,-6.641 5.512,-8.803 2.637,-2.163 5.678,-3.244 9.123,-3.244 3.555,0 6.04,1.099 7.456,3.298 1.417,2.198 1.582,5.234 0.498,9.109 l -0.239,0.814 -0.167,0.484 H 31.721 c -0.441,1.575 -0.438,2.777 0.01,3.606 0.448,0.829 1.332,1.244 2.65,1.244 0.975,0 1.836,-0.206 2.583,-0.617 0.747,-0.411 1.366,-1.021 1.853,-1.829 z" + id="path47" /><g + id="g49" + style="fill:#1a1a1a;fill-opacity:1"> <path fill-rule="evenodd" clip-rule="evenodd" - d="M32.673,16.742l8.351-0.021c0.375-1.436,0.308-2.558-0.201-3.365 s-1.402-1.211-2.68-1.211c-1.209,0-2.285,0.397-3.229,1.19S33.224,15.265,32.673,16.742z M38.817,23.278h7.043 c-1.347,2.456-3.172,4.356-5.477,5.7c-2.305,1.345-4.885,2.017-7.74,2.017c-3.473,0-5.923-1.054-7.351-3.161 c-1.427-2.107-1.632-4.98-0.613-8.618c1.038-3.707,2.875-6.641,5.512-8.803c2.637-2.163,5.678-3.244,9.123-3.244 c3.555,0,6.04,1.099,7.456,3.298c1.417,2.198,1.582,5.234,0.498,9.109l-0.239,0.814l-0.167,0.484H31.721 c-0.441,1.575-0.438,2.777,0.01,3.606c0.448,0.829,1.332,1.244,2.65,1.244c0.975,0,1.836-0.206,2.583-0.617 S38.33,24.086,38.817,23.278z" - id="path51" /> - </g> - </g> - <g - id="g53"> - <path + d="m 32.673,16.742 8.351,-0.021 c 0.375,-1.436 0.308,-2.558 -0.201,-3.365 -0.509,-0.807 -1.402,-1.211 -2.68,-1.211 -1.209,0 -2.285,0.397 -3.229,1.19 -0.944,0.793 -1.69,1.93 -2.241,3.407 z m 6.144,6.536 h 7.043 c -1.347,2.456 -3.172,4.356 -5.477,5.7 -2.305,1.345 -4.885,2.017 -7.74,2.017 -3.473,0 -5.923,-1.054 -7.351,-3.161 -1.427,-2.107 -1.632,-4.98 -0.613,-8.618 1.038,-3.707 2.875,-6.641 5.512,-8.803 2.637,-2.163 5.678,-3.244 9.123,-3.244 3.555,0 6.04,1.099 7.456,3.298 1.417,2.198 1.582,5.234 0.498,9.109 l -0.239,0.814 -0.167,0.484 H 31.721 c -0.441,1.575 -0.438,2.777 0.01,3.606 0.448,0.829 1.332,1.244 2.65,1.244 0.975,0 1.836,-0.206 2.583,-0.617 0.747,-0.411 1.366,-1.021 1.853,-1.829 z" + id="path51" + style="fill:#1a1a1a;fill-opacity:1" /> + </g><path fill="#A0CE67" - d="M112.881,30.643l-6.404-18.639l-6.455,18.639h-7.254l9.565-30.321h8.19l4.434,15.582l0.35,1.276 c0.521,1.866,0.917,3.431,1.191,4.693l0.555-2.182c0.219-0.837,0.528-1.935,0.925-3.293l4.468-16.076h8.19l-10.501,30.321 H112.881z" + d="m 112.881,30.643 -6.404,-18.639 -6.455,18.639 h -7.254 l 9.565,-30.321 h 8.19 l 4.434,15.582 0.35,1.276 c 0.521,1.866 0.917,3.431 1.191,4.693 l 0.555,-2.182 c 0.219,-0.837 0.528,-1.935 0.925,-3.293 l 4.468,-16.076 h 8.19 l -10.501,30.321 z" id="path55" - style="fill:#8ed300;fill-opacity:1" /> - </g> - </g> -</g> -</svg> \ No newline at end of file + style="fill:#97d700;fill-opacity:1" /> +</svg> diff --git a/image/social/mail.svg b/image/social/mail.svg new file mode 100644 index 00000000..d94d03c3 --- /dev/null +++ b/image/social/mail.svg @@ -0,0 +1 @@ +<svg id="Capa_1" enable-background="new 0 0 479.058 479.058" height="512" viewBox="0 0 479.058 479.058" width="512" xmlns="http://www.w3.org/2000/svg"><path d="m434.146 59.882h-389.234c-24.766 0-44.912 20.146-44.912 44.912v269.47c0 24.766 20.146 44.912 44.912 44.912h389.234c24.766 0 44.912-20.146 44.912-44.912v-269.47c0-24.766-20.146-44.912-44.912-44.912zm0 29.941c2.034 0 3.969.422 5.738 1.159l-200.355 173.649-200.356-173.649c1.769-.736 3.704-1.159 5.738-1.159zm0 299.411h-389.234c-8.26 0-14.971-6.71-14.971-14.971v-251.648l199.778 173.141c2.822 2.441 6.316 3.655 9.81 3.655s6.988-1.213 9.81-3.655l199.778-173.141v251.649c-.001 8.26-6.711 14.97-14.971 14.97z"/></svg> \ No newline at end of file diff --git a/image/social/phone.svg b/image/social/phone.svg new file mode 100644 index 00000000..34fb46ff --- /dev/null +++ b/image/social/phone.svg @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 405.333 405.333" style="enable-background:new 0 0 405.333 405.333;" xml:space="preserve"> +<g> + <g> + <path d="M373.333,266.88c-25.003,0-49.493-3.904-72.704-11.563c-11.328-3.904-24.192-0.896-31.637,6.699l-46.016,34.752 + c-52.8-28.181-86.592-61.952-114.389-114.368l33.813-44.928c8.512-8.512,11.563-20.971,7.915-32.64 + C142.592,81.472,138.667,56.96,138.667,32c0-17.643-14.357-32-32-32H32C14.357,0,0,14.357,0,32 + c0,205.845,167.488,373.333,373.333,373.333c17.643,0,32-14.357,32-32V298.88C405.333,281.237,390.976,266.88,373.333,266.88z"/> + </g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +</svg> diff --git a/index.js b/index.js new file mode 100644 index 00000000..aa8a23f4 --- /dev/null +++ b/index.js @@ -0,0 +1,60 @@ +__webpack_public_path__ = _PUBLIC_PATH; + +require('hedera/hedera'); + +window.onload = function() { + loadLocale(main); +} + +function main(req) { + if (req) + onLocaleLoad(req); + + hederaWeb = new Hedera.App(); + hederaWeb.run(); +} + +function loadLocale(cb) { + Vn.Locale.init(); + var lang = Vn.Locale.language; + + var req = require.context('js', true, /locale\/en.yml$/); + onLocaleLoad(req); + + switch (lang) { + case 'ca': + require([], function() { + cb(require.context('js', true, /locale\/ca.yml$/)); + }); + break; + case 'es': + require([], function() { + cb(require.context('js', true, /locale\/es.yml$/)); + }); + break; + case 'fr': + require([], function() { + cb(require.context('js', true, /locale\/fr.yml$/)); + }); + break; + case 'mn': + require([], function() { + cb(require.context('js', true, /locale\/mn.yml$/)); + }); + break; + case 'pt': + require([], function() { + cb(require.context('js', true, /locale\/pt.yml$/)); + }); + break; + default: + cb(); + } +} + +function onLocaleLoad(req) { + var keys = req.keys(); + + for (var i = 0; i < keys.length; i++) + Vn.Locale.add(req(keys[i])); +} diff --git a/js/db/calc-sum.js b/js/db/calc-sum.js index 8755e65e..9314a236 100644 --- a/js/db/calc-sum.js +++ b/js/db/calc-sum.js @@ -3,7 +3,7 @@ var Calc = require ('./calc'); /** * Computes a sum of data in the model. - **/ + */ module.exports = new Class ({ Extends: Calc diff --git a/js/db/calc.js b/js/db/calc.js index 17e8d91f..17851a6b 100644 --- a/js/db/calc.js +++ b/js/db/calc.js @@ -4,7 +4,7 @@ var SimpleIterator = require ('./simple-iterator'); /** * Interface for handle foreach operations on the model. - **/ + */ module.exports = new Class ({ Extends: Vn.Param @@ -132,23 +132,23 @@ module.exports = new Class * You don't need to define it if model isn't updatable. * * @param {integer} row The row number - **/ + */ ,before: function (row) {} /** * Called after each update or insert row operation. * * @param {integer} row The row number - **/ + */ ,after: function (row) {} /** * Called before each model refresh. - **/ + */ ,init: function () {} /** * Called when an operation in the model is complete. - **/ + */ ,done: function () {} }); diff --git a/js/db/connection.js b/js/db/connection.js index e82d25a3..90b16d67 100644 --- a/js/db/connection.js +++ b/js/db/connection.js @@ -12,15 +12,13 @@ var Connection = new Class(); module.exports = Connection; -var Flag = -{ +var Flag = { NOT_NULL : 1 ,PRI_KEY : 2 ,AI : 512 | 2 | 1 }; -var Type = -{ +var Type = { BOOLEAN : 1 ,INTEGER : 3 ,DOUBLE : 4 @@ -53,10 +51,10 @@ Connection.implement({ * * @param {Sql.Stmt} stmt The statement * @param {Function} callback The function to call when operation is done - * @param {Sql.Batch} batch The batch used to set the parameters + * @param {Object} params The query params */ - ,execStmt: function(stmt, callback, batch) { - this.execSql(stmt.render(batch), callback); + ,execStmt: function(stmt, callback, params) { + this.execSql(stmt.render(params), callback); } /** @@ -64,10 +62,10 @@ Connection.implement({ * * @param {String} query The SQL statement * @param {Function} callback The function to call when operation is done - * @param {Sql.Batch} batch The batch used to set the parameters + * @param {Object} params The query params */ - ,execQuery: function(query, callback, batch) { - this.execStmt(new Sql.String({query: query}), callback, batch); + ,execQuery: function(query, callback, params) { + this.execStmt(new Sql.String({query: query}), callback, params); } /* @@ -81,18 +79,34 @@ Connection.implement({ * Called when a query is executed. */ ,_onExec: function(callback, json, error) { + const results = []; + if (json) try { if (json && json instanceof Array) - for (var i = 0; i < json.length; i++) + for (let i = 0; i < json.length; i++) if (json[i] !== true) { - var data = json[i].data; - var columns = json[i].columns; + const rows = json[i].data; + const columns = json[i].columns; - for (var j = 0; j < columns.length; j++) { - var castFunc = null; + const data = new Array(rows.length); + results.push({ + data, + columns, + tables: json[i].tables + }); + + for (let j = 0; j < rows.length; j++) { + const row = data[j] = {}; + for (let k = 0; k < columns.length; k++) + row[columns[k].name] = rows[j][k]; + } + + for (let j = 0; j < columns.length; j++) { + let castFunc = null; + const col = columns[j]; - switch (columns[j].type) { + switch (col.type) { case Type.DATE: case Type.DATE_TIME: case Type.TIMESTAMP: @@ -101,21 +115,22 @@ Connection.implement({ } if (castFunc !== null) { - if (columns[j].def != null) - columns[j].def = castFunc(columns[j].def); + if (col.def != null) + col.def = castFunc(col.def); - for (var k = 0; k < data.length; k++) - if (data[k][j] != null) - data[k][j] = castFunc(data[k][j]); + for (let k = 0; k < data.length; k++) + if (data[k][col.name] != null) + data[k][col.name] = castFunc(data[k][col.name]); } } - } + } else + results.push(json[i]); } catch (e) { error = e; } if (callback) - callback(new Db.ResultSet(json, error)); + callback(new Db.ResultSet(results, error)); } }); diff --git a/js/db/db-lot.js b/js/db/db-lot.js new file mode 100644 index 00000000..67a3b3c6 --- /dev/null +++ b/js/db/db-lot.js @@ -0,0 +1,109 @@ + +var Connection = require('./connection'); +var Model = require('./model'); + +module.exports = new Class({ + Extends: Vn.Form + ,Tag: 'db-lot' + ,Properties: { + /** + * The connection used to execute the statement. + */ + conn: { + type: Connection + ,set: function(x) { + this.model.conn = x; + } + ,get: function() { + return this.model.conn; + } + }, + /** + * The model query. + */ + query: { + type: String + ,set: function(x) { + this.model.query = x; + } + ,get: function() { + return this.model.query; + } + }, + /** + * The model select statement. + */ + stmt: { + type: Sql.Stmt + ,set: function(x) { + this.model.stmt = x; + } + ,get: function() { + return this.model.stmt; + } + }, + /** + * The lot used to execute the statement. + */ + lot: { + type: Vn.Lot + ,set: function(x) { + this.model.lot = x; + } + ,get: function() { + return this.model.lot; + } + } + } + + ,initialize: function(props) { + this.model = new Model(); + Vn.Form.prototype.initialize.call(this, props); + } + + ,appendChild: function(child) { + if (child.nodeType === Node.TEXT_NODE) + this.query = child.textContent; + } + + ,refresh: function() { + if (this._model) + this._model.refresh(); + } + + ,performOperations: function() { + if (this._model) + this._model.performOperations(); + } + + /** + * Get the index of the column from its name. + * + * @param {string} columnName The column name + * @return {integer} The column index or -1 if column not exists + */ + ,getColumnIndex: function(columnName) { + return this._model ? + this._model.getColumnIndex(columnName) : -1; + } + + /** + * Gets a value from the form using the column index. + * + * @param {string} columnName The column index + * @return {Object} The value + */ + ,getByIndex: function(column) { + return this._model.getByIndex(this._row, column); + } + + /** + * Sets a value on the form using the column index. + * + * @param {string} columnName The column index + * @param {Object} value The new value + */ + ,setByIndex: function(column, value) { + return this._model.setByIndex(this._row, column, value); + } +}); diff --git a/js/db/db.js b/js/db/db.js index e1ba4ec9..073799ae 100644 --- a/js/db/db.js +++ b/js/db/db.js @@ -1,17 +1,17 @@ -require ('sql/sql'); +require('sql/sql'); Db = module.exports = { - Connection : require ('./connection') - ,Result : require ('./result') - ,ResultSet : require ('./result-set') - ,Model : require ('./model') - ,Iterator : require ('./iterator') - ,SimpleIterator : require ('./simple-iterator') - ,Form : require ('./form') - ,Param : require ('./param') - ,Query : require ('./query') - ,Calc : require ('./calc') - ,CalcSum : require ('./calc-sum') + Connection : require('./connection') + ,Result : require('./result') + ,ResultSet : require('./result-set') + ,Model : require('./model') + ,Iterator : require('./iterator') + ,SimpleIterator : require('./simple-iterator') + ,Form : require('./form') + ,Query : require('./query') + ,Calc : require('./calc') + ,CalcSum : require('./calc-sum') + ,Lot : require('./db-lot') }; diff --git a/js/db/form.js b/js/db/form.js index b97b8edb..5df50d51 100644 --- a/js/db/form.js +++ b/js/db/form.js @@ -1,62 +1,51 @@ -var Iterator = require ('./iterator'); -var Model = require ('./model'); +var Iterator = require('./iterator'); +var Model = require('./model'); -module.exports = new Class -({ +module.exports = new Class({ Extends: Vn.Object ,Implements: Iterator ,Tag: 'db-form' - ,Properties: - { + ,Properties: { /** * The model associated to this form. - **/ - model: - { + */ + model: { type: Model - ,set: function (x) - { - this.link ({_model: x}, - { + ,set: function(x) { + this.link({_model: x}, { 'status-changed': this.onModelChange ,'row-updated': this.onRowUpdate }); } - ,get: function () - { + ,get: function() { return this._model; } }, /** * The row where the form positioned, has -1 if the row is unselected. - **/ - row: - { + */ + row: { type: Number - ,set: function (x) - { + ,set: function(x) { if (!this._model || this._model.numRows <= x || x < -1) x = -1; if (x == this._row) return; this._row = x; - this.iterChanged (); + this.iterChanged(); } - ,get: function () - { + ,get: function() { return this._row; } }, /** * The number of rows in the form. - **/ - numRows: - { + */ + numRows: { type: Number - ,get: function () - { + ,get: function() { if (this._model) return this._model.numRows; @@ -65,14 +54,21 @@ module.exports = new Class }, /** * Checks if the form data is ready. - **/ - ready: - { + */ + ready: { type: Boolean - ,get: function () - { + ,get: function() { return this._ready; } + }, + /** + * The row object. + */ + $: { + type: Object + ,get: function() { + return this._model && this._model.getObject(this._row); + } } } @@ -81,32 +77,29 @@ module.exports = new Class ,_row: -1 ,_ready: false - ,onModelChange: function () - { + ,onModelChange: function() { var ready = this._model && this._model.ready; - if (ready != this._ready) - { + if (ready != this._ready) { if (this._row != -1) this.lastRow = this._row; this._ready = ready; - this.signalEmit ('status-changed'); + this.emit('status-changed'); if (this._row == -1) this.row = this.lastRow; if (ready) - this.signalEmit ('ready'); + this.emit('ready'); - this.iterChanged (); + this.iterChanged(); } } - ,onRowUpdate: function (model, row, column) - { + ,onRowUpdate: function(model, row) { if (row == this._row) - this.iterChanged (); + this.iterChanged(); } }); diff --git a/js/db/iterator.js b/js/db/iterator.js index 346f4d7e..98f3078e 100644 --- a/js/db/iterator.js +++ b/js/db/iterator.js @@ -1,55 +1,53 @@ -var Model = require ('./model'); +var Model = require('./model'); -module.exports = new Class -({ - Properties: - { +module.exports = new Class({ + Properties: { /** * The model associated to this form. - **/ - model: - { + */ + model: { type: Model }, /** * The row where the form positioned, has -1 if the row is unselected. - **/ - row: - { + */ + row: { type: Number }, /** * The number of rows in the form. - **/ - numRows: - { + */ + numRows: { type: Number }, /** * Checks if the form data is ready. - **/ - ready: - { + */ + ready: { type: Boolean + }, + /** + * The row object. + */ + $: { + type: Object } } ,_model: null ,_row: -1 - ,refresh: function () - { + ,refresh: function() { if (this._model) - this._model.refresh (); + this._model.refresh(); } /** - * Emits the 'iter-changed' signal on the form. - **/ - ,iterChanged: function () - { - this.signalEmit ('iter-changed'); + * Emits the 'change' signal on the form. + */ + ,iterChanged: function() { + this.emit('change'); } /** @@ -57,45 +55,49 @@ module.exports = new Class * * @param {String} columnName The column name * @return {integer} The column index or -1 if column not exists - **/ - ,getColumnIndex: function (columnName) - { + */ + ,getColumnIndex: function(columnName) { if (this._model) - return this._model.getColumnIndex (columnName); + return this._model.getColumnIndex(columnName); return -1; } - ,insertRow: function () - { + ,insertRow: function() { if (this._model) - this.row = this._model.insertRow (); + this.row = this._model.insertRow(); } - ,performOperations: function () - { + ,performOperations: function() { if (this._model) - this._model.performOperations (); + this._model.performOperations(); } /** * Removes the current row. - **/ - ,deleteRow: function () - { + */ + ,deleteRow: function() { if (this._row >= 0) - this._model.deleteRow (this._row); + this._model.deleteRow(this._row); } - + /** - * Gets a value from the form. + * Gets the row as object. + * + * @return {Object} The row + */ + ,getObject: function() { + return this._model.getObject(this._row); + } + + /** + * Sets a value on the form. * * @param {String} columnName The column name - * @return {Object} The value - **/ - ,get: function (columnName) - { - return this._model.get (this._row, columnName); + */ + ,get: function(columnName) { + if (!this._model) return undefined; + return this._model.get(this._row, columnName); } /** @@ -103,10 +105,9 @@ module.exports = new Class * * @param {String} columnName The column name * @param {Object} value The new value - **/ - ,set: function (columnName, value) - { - return this._model.set (this._row, columnName, value); + */ + ,set: function(columnName, value) { + return this._model.set(this._row, columnName, value); } /** @@ -114,10 +115,9 @@ module.exports = new Class * * @param {String} columnName The column index * @return {Object} The value - **/ - ,getByIndex: function (column) - { - return this._model.getByIndex (this._row, column); + */ + ,getByIndex: function(column) { + return this._model.getByIndex(this._row, column); } /** @@ -125,10 +125,9 @@ module.exports = new Class * * @param {String} columnName The column index * @param {Object} value The new value - **/ - ,setByIndex: function (column, value) - { - return this._model.setByIndex (this._row, column, value); + */ + ,setByIndex: function(column, value) { + return this._model.setByIndex(this._row, column, value); } }); diff --git a/js/db/model.js b/js/db/model.js index 469140d7..92d245ee 100644 --- a/js/db/model.js +++ b/js/db/model.js @@ -1,5 +1,5 @@ -var Connection = require ('./connection'); +var Connection = require('./connection'); /** * Class to handle the Database select results. Also allows @@ -9,174 +9,144 @@ var Connection = require ('./connection'); * Note that table and column names must be unique in the selection query, * otherwise updates are not allowed on that table/column. If two tables or * columns have the same name, an alias should be used to make it updatable. - **/ -var Model = new Class (); + */ +var Model = new Class(); module.exports = Model; -var Status = -{ +var Status = { CLEAN : 1 ,LOADING : 2 ,READY : 3 ,ERROR : 4 }; -var Mode = -{ +var Mode = { ON_CHANGE : 1 ,ON_DEMAND : 2 }; -var Operation = -{ +var Operation = { INSERT : 1 << 1 ,UPDATE : 1 << 2 ,DELETE : 1 << 3 }; -var SortWay = -{ +var SortWay = { ASC : 1 ,DESC : 2 }; -Model.extend -({ +Model.extend({ Status: Status ,Mode: Mode ,Operation: Operation ,SortWay: SortWay }); -Model.implement -({ +Model.implement({ Extends: Vn.Object ,Tag: 'db-model' - ,Properties: - { + ,Properties: { /** * The connection used to execute the statement. - **/ - conn: - { + */ + conn: { type: Connection - ,set: function (x) - { + ,set: function(x) { this._conn = x; - this._autoLoad (); + this._autoLoad(); } - ,get: function () - { + ,get: function() { return this._conn; } }, /** * The result index. - **/ - resultIndex: - { + */ + resultIndex: { type: Number - ,set: function (x) - { + ,set: function(x) { this._resultIndex = x; } - ,get: function () - { + ,get: function() { return this._resultIndex; } }, /** - * The batch used to execute the statement. - **/ - batch: - { - type: Sql.Batch - ,set: function (x) - { - this.link ({_batch: x}, {'changed': this._autoLoad}); - this._autoLoad (); + * The lot used to execute the statement. + */ + lot: { + type: Vn.LotIface + ,set: function(x) { + this.link({_lot: x}, {'change': this._onLotChange}); + this._onLotChange(); } - ,get: function () - { - return this._batch; + ,get: function() { + return this._lot; } }, /** * The model select statement. - **/ - stmt: - { + */ + stmt: { type: Sql.Stmt - ,set: function (x) - { + ,set: function(x) { this._stmt = x; - this._autoLoad (); + this._autoLoad(); } - ,get: function () - { + ,get: function() { return this._stmt; } }, /** * The model query. - **/ - query: - { + */ + query: { type: String - ,set: function (x) - { - this.stmt = new Sql.String ({query: x}); + ,set: function(x) { + this.stmt = new Sql.String({query: x}); } - ,get: function () - { + ,get: function() { if (this._stmt) - return this._stmt.render (null); + return this._stmt.render(null); else return null; } }, /** * The main table. - **/ - mainTable: - { + */ + mainTable: { type: String - ,set: function (x) - { + ,set: function(x) { this._mainTable = null; this._requestedMainTable = x; - this._refreshMainTable (); + this._refreshMainTable(); } - ,get: function () - { + ,get: function() { return this._mainTable; } }, /** * Determines if the model is updatable. - **/ - updatable: - { + */ + updatable: { type: Boolean - ,set: function (x) - { + ,set: function(x) { this._updatable = false; this._requestedUpdatable = x; - this._refreshUpdatable (); + this._refreshUpdatable(); } - ,get: function () - { + ,get: function() { return this._updatable; } }, /** * The number of rows in the model. - **/ - numRows: - { + */ + numRows: { type: Number - ,get: function () - { + ,get: function() { if (this.data) return this.data.length; @@ -185,39 +155,33 @@ Model.implement }, /** * The current status of the model. - **/ - status: - { + */ + status: { type: Number - ,get: function () - { + ,get: function() { return this._status; } }, /** * Checks if the model data is ready. - **/ - ready: - { + */ + ready: { type: Boolean - ,get: function () - { + ,get: function() { return this._status == Status.READY; } }, /** * Update mode. - **/ - mode: - { + */ + mode: { enumType: Mode ,value: Mode.ON_CHANGE }, /** * Wether to execute the model query automatically. - **/ - autoLoad: - { + */ + autoLoad: { type: Boolean ,value: true } @@ -225,7 +189,7 @@ Model.implement ,_conn: null ,_resultIndex: 0 - ,_batch: null + ,_lot: null ,_stmt: null ,_status: Status.CLEAN ,data: null @@ -233,6 +197,7 @@ Model.implement ,columns: null ,columnMap: null ,_updatable: false + ,_paramsChanged: true ,_requestedSortIndex: -1 ,_requestedSortName: null @@ -248,99 +213,136 @@ Model.implement ,_defaults: [] ,_requestedMainTable: null - ,initialize: function (props) - { - this.parent (props); - this._cleanData (); - this._setStatus (Status.CLEAN); + ,initialize: function(props) { + Vn.Object.prototype.initialize.call(this, props); + this._cleanData(); + this._setStatus(Status.CLEAN); } - ,appendChild: function (child) - { + ,appendChild: function(child) { if (child.nodeType === Node.TEXT_NODE) this.query = child.textContent; } - ,loadXml: function (builder, node) - { - this.parent (builder, node); + ,loadXml: function(builder, node) { + Vn.Object.prototype.loadXml.call(this, builder, node); var query = node.firstChild.nodeValue; if (query) this.query = query; } - - ,_autoLoad: function () - { + + ,_getHolders(stmt) { + if (!stmt) return null; + let holders = this._stmt.findHolders(); + if (!holders) return null; + + if (this._lot) { + const params = this._lot.params; + for (const holder of holders) + if (params[holder] instanceof Sql.Object) { + const paramHolders = params[holder].findHolders(); + if (paramHolders) + holders = holders.concat(paramHolders); + } + } + + return holders; + } + + ,_getHolderValues: function() { + let holders = this._getHolders(this._stmt); + if (!holders) return null; + + const lotParams = this._lot ? this._lot.params : {}; + const params = {}; + for (const holder of holders) + if (!(lotParams[holder] instanceof Sql.Object)) + params[holder] = lotParams[holder]; + + return params; + } + + ,_getHolderParams: function() { + let holders = this._getHolders(this._stmt); + if (!holders) return null; + + const lotParams = this._lot ? this._lot.params : {}; + const params = {}; + for (const holder of holders) + params[holder] = lotParams[holder]; + + return params; + } + + ,_onLotChange: function() { + const params = this._getHolderValues(); + this._paramsChanged = !Vn.Value.equals(params, this._lastParams); + if (this.autoLoad) - this.refresh (); + this.lazyRefresh(); + } + + ,_autoLoad: function() { + if (this.autoLoad) + this.refresh(); else - this.clean (); + this.clean(); + } + + ,_isReady: function(params) { + if (!this._stmt || !this._conn) + return false; + + for (const param in params) + if (params[param] === undefined) + return false; + + return true; + } + + ,lazyRefresh: function() { + if (this._paramsChanged) + this.refresh(); } /** * Refresh the model data reexecuting the query on the database. - **/ - ,refresh: function () - { - var ready = false; - - if (this._stmt && this._conn) - { - var ids = this._stmt.findHolders (); - - if (ids) - { - if (this._batch && this._batch.isReady ()) - { - ready = true; + */ + ,refresh: function() { + const params = this._getHolderParams(); - for (var i = 0; i < ids.length; i++) - if (!this._batch.get (ids[i])) - { - ready = false; - break; - } - } - } - else - ready = true; - } - - if (ready) - { - this._setStatus (Status.LOADING); - this._conn.execStmt (this._stmt, this._selectDone.bind (this), this._batch); - } - else - this.clean (); - } - - ,clean: function () - { - this._cleanData (); - this._setStatus (Status.CLEAN); + if (this._isReady(params)) { + this._setStatus(Status.LOADING); + this._lastParams = this._getHolderValues(); + this._paramsChanged = false; + this._conn.execStmt(this._stmt, + this._selectDone.bind(this), params); + } else + this.clean(); } - ,_selectDone: function (resultSet) - { + ,clean: function() { + this._cleanData(); + this._setStatus(Status.CLEAN); + } + + ,_selectDone: function(resultSet) { var result; var dataResult; - this._cleanData (); + this._cleanData(); try { - for (var i = 0; result = resultSet.fetchResult (); i++) + for (var i = 0; result = resultSet.fetchResult(); i++) if (i == this._resultIndex) dataResult = result; if (!dataResult || typeof dataResult !== 'object') - throw new Error ('The provided statement doesn\'t return a result set'); - } - catch (e) - { - this._setStatus (Status.ERROR); + throw new Error('The provided statement doesn\'t return a result set'); + } catch (e) { + this._setStatus(Status.ERROR); throw e; } @@ -348,34 +350,32 @@ Model.implement this.tables = dataResult.tables; this.columns = dataResult.columns; this.columnMap = dataResult.columnMap; - this._repairColumns (); - this._refreshRowIndexes (0); - this._refreshMainTable (); + this._repairColumns(); + this._refreshRowIndexes(0); + this._refreshMainTable(); for (column in this._requestedIndexes) - this._buildIndex (column); + this._buildIndex(column); var sortColumn = -1; if (this._requestedSortName) - sortColumn = this.getColumnIndex (this._requestedSortName); + sortColumn = this.getColumnIndex(this._requestedSortName); else if (this._requestedSortIndex !== -1 - && this.checkColExists (this._requestedSortIndex)) + && this.checkColExists(this._requestedSortIndex)) sortColumn = this._requestedSortIndex; if (sortColumn !== -1) - this._realSort (sortColumn, this._sortWay); + this._realSort(sortColumn, this._sortWay); - this._setStatus (Status.READY); + this._setStatus(Status.READY); } - ,_refreshRowIndexes: function (start) - { + ,_refreshRowIndexes: function(start) { for (var i = start; i < this.data.length; i++) this.data[i].index = i; - if (this._operationsMap) - { + if (this._operationsMap) { this._operationsMap = {}; for (var i = 0; i < this._operations.length; i++) @@ -383,28 +383,25 @@ Model.implement } } - ,_cleanData: function () - { + ,_cleanData: function() { this.data = null; this.tables = null; this.columns = null; this.columnMap = null; this._sortColumn = -1; this._indexes = []; - this._resetOperations (); + this._resetOperations(); } - ,_refreshUpdatable: function () - { + ,_refreshUpdatable: function() { var oldValue = this._updatable; this._updatable = this._mainTable !== null && this._requestedUpdatable; if (oldValue != this._updatable) - this.signalEmit ('updatable-changed'); + this.emit('updatable-changed'); } - ,_refreshMainTable: function () - { + ,_refreshMainTable: function() { var newMainTable = null; var tables = this.tables; @@ -412,14 +409,13 @@ Model.implement for (var i = 0; i < tables.length; i++) if (tables[i].pks.length > 0) if (!this._requestedMainTable - || tables[i].name === this._requestedMainTable) - { + || tables[i].name === this._requestedMainTable) { newMainTable = i; break; } this._mainTable = newMainTable; - this._refreshUpdatable (); + this._refreshUpdatable(); } /** @@ -428,15 +424,9 @@ Model.implement * @param {String} field The destination field name * @param {String} table The destination table name * @param {Sql.Expr} srcColumn The default value expression - **/ - ,setDefault: function (field, table, expr) - { - this._defaults.push - ({ - field: field - ,table: table - ,expr: expr - }); + */ + ,setDefault: function(field, table, expr) { + this._defaults.push({field, table, expr}); } /** @@ -445,15 +435,9 @@ Model.implement * @param {String} field The destination field name * @param {String} table The destination table name * @param {Object} value The default value - **/ - ,setDefaultFromValue: function (field, table, value) - { - this._defaults.push - ({ - field: field - ,table: table - ,value: value - }); + */ + ,setDefaultFromValue: function(field, table, value) { + this._defaults.push({field, table, value}); } /** @@ -463,71 +447,99 @@ Model.implement * @param {String} field The destination field name * @param {String} table The destination table name * @param {String} srcColumn The source column - **/ - ,setDefaultFromColumn: function (field, table, srcColumn) - { - this._defaults.push - ({ - field: field - ,table: table - ,srcColumn: srcColumn - }); + */ + ,setDefaultFromColumn: function(field, table, srcColumn) { + this._defaults.push({field, table, srcColumn}); } /** - * Checks if the column exists. + * Checks if column index exists. * * @param {integer} column The column index * @return {Boolean} %true if column exists, %false otherwise - **/ - ,checkColExists: function (column) - { + */ + ,checkColExists: function(column) { return this.columns && column >= 0 && column < this.columns.length; } + /** + * Checks if column name exists. + * + * @param {string} columnName The column name + * @return {Boolean} %true if column exists, %false otherwise + */ + ,checkColName: function(columnName) { + return this.columnMap + && this.columnMap[columnName] != null; + } + /** * Checks if the row exists. * * @param {integer} rowIndex The row index * @return {Boolean} %true if row exists, %false otherwise - **/ - ,checkRowExists: function (rowIndex) - { + */ + ,checkRowExists: function(rowIndex) { return this.data && rowIndex >= 0 && rowIndex < this.data.length; } - ,_checkTableUpdatable: function (tableIndex) - { + ,_checkTableUpdatable: function(tableIndex) { var tableUpdatable = tableIndex !== null && this.tables[tableIndex].pks.length > 0; - - if (!tableUpdatable) - console.warn ("Db.Model: Table %s is not updatable", - this.tables[tableIndex].name); + + if (!tableUpdatable && !tableIndex) { + if (tableIndex) + console.warn("Db.Model: Table %s is not updatable", + this.tables[tableIndex].name); + else + console.warn("Db.Model: Model not updatable"); + } return tableUpdatable; } - + /** * Get the index of the column from its name. * * @param {string} columnName The column name * @return {number} The column index or -1 if column not exists - **/ - ,getColumnIndex: function (columnName) - { - var index; - - if (this.columnMap - && (index = this.columnMap[columnName]) !== undefined) - return index; + */ + ,getColumnIndex: function(columnName) { + if (this.checkColName(columnName)) + return this.columnMap[columnName].index; return -1; } + + /** + * Get the index of the column from its name. + * + * @param {number} columnIndex The column name + * @return {string} The column index or -1 if column not exists + */ + ,getColumnName: function(columnIndex) { + if (this.checkColExists(columnIndex)) + return this.columns[columnIndex].name; + + return null; + } + + /** + * Gets the row as object. + * + * @param {number} rowIndex The row index + * @return {Object} The row + */ + ,getObject: function(rowIndex) { + if (!this.checkRowExists(rowIndex)) + return undefined; + + return this.data[rowIndex]; + } /** * Gets a value from the model. @@ -535,15 +547,10 @@ Model.implement * @param {number} rowIndex The row index * @param {string} columnName The column name * @return {mixed} The value - **/ - ,get: function (rowIndex, columnName) - { - var index = this.getColumnIndex (columnName); - - if (index != -1) - return this.getByIndex (rowIndex, index); - - return undefined; + */ + ,get: function(rowIndex, columnName) { + if (this.checkRowExists(rowIndex)) + return this.data[rowIndex][columnName]; } /** @@ -552,53 +559,20 @@ Model.implement * @param {number} rowIndex The row index * @param {string} columnName The column name * @param {mixed} value The new value - **/ - ,set: function (rowIndex, columnName, value) - { - var index = this.getColumnIndex (columnName); - - if (index != -1) - this.setByIndex (rowIndex, index, value); - else - console.warn ('Db.Model: Column %s doesn\'t exist', columnName); - } - - /** - * Gets a value from the model using the column index. - * - * @param {number} rowIndex The row index - * @param {number} column The column index - * @return {mixed} The value - **/ - ,getByIndex: function (rowIndex, column) - { - if (this.checkRowExists (rowIndex) && this.checkColExists (column)) - return this.data[rowIndex][column]; - - return undefined; - } - - /** - * Updates a value on the model using the column index. - * - * @param {number} rowIndex The row index - * @param {number} col The column index - * @param {mixed} value The new value - **/ - ,setByIndex: function (rowIndex, col, value) - { - if (!this.checkRowExists (rowIndex) - && !this.checkColExists (col)) + */ + ,set: function(rowIndex, columnName, value) { + if (!this.checkRowExists(rowIndex) + && !this.checkColName(columnName)) return; - var tableIndex = this.columns[col].table; + var tableIndex = this.columnMap[columnName].table; - if (!this._checkTableUpdatable (tableIndex)) + if (!this._checkTableUpdatable(tableIndex)) return; var row = this.data[rowIndex]; - var op = this._createOperation (rowIndex); + var op = this._createOperation(rowIndex); op.type |= Operation.UPDATE; if (!op.oldValues) @@ -608,14 +582,12 @@ Model.implement var tableOp = op.tables[tableIndex]; - if (!tableOp) - { + if (!tableOp) { tableOp = Operation.UPDATE; var pks = this.tables[tableIndex].pks; - for (var i = 0; i < pks.length; i++) - if (!row[pks[i]] && !op.oldValues[pks[i]]) - { + for (const pk of pks) + if (!row[pk] && !op.oldValues[pk]) { tableOp = Operation.INSERT; break; } @@ -624,42 +596,70 @@ Model.implement } if (tableOp & Operation.UPDATE - && op.oldValues[col] === undefined) - op.oldValues[col] = row[col]; + && op.oldValues[columnName] === undefined) + op.oldValues[columnName] = row[columnName]; - this.signalEmit ('row-updated-before', rowIndex); - row[col] = value; - this.signalEmit ('row-updated', rowIndex, [col]); + this.emit('row-updated-before', rowIndex); + row[columnName] = value; + this.emit('row-updated', rowIndex, [columnName]); if (this.mode == Mode.ON_CHANGE && !(op.type & Operation.INSERT)) - this.performOperations (); + this.performOperations(); + } + + /** + * Gets a value from the model using the column index. + * + * @param {number} rowIndex The row index + * @param {number} columnIndex The column index + * @return {mixed} The value + */ + ,getByIndex: function(rowIndex, columnIndex) { + var columnName = this.getColumnName(columnIndex); + + if (columnName) + return this.get(rowIndex, columnName); + + return undefined; + } + + /** + * Updates a value on the model using the column index. + * + * @param {number} rowIndex The row index + * @param {number} columnIndex The column index + * @param {mixed} value The new value + */ + ,setByIndex: function(rowIndex, columnIndex, value) { + var columnName = this.getColumnName(columnIndex); + + if (columnName) + this.set(rowIndex, columnName, value); + else + console.warn('Db.Model: Column %d doesn\'t exist', columnIndex); } /** * Deletes a row from the model. * * @param {number} rowIndex The row index - **/ - ,deleteRow: function (rowIndex) - { - if (!this.checkRowExists (rowIndex) - || !this._checkTableUpdatable (this._mainTable)) + */ + ,deleteRow: function(rowIndex) { + if (!this.checkRowExists(rowIndex) + || !this._checkTableUpdatable(this._mainTable)) return; - var op = this._createOperation (rowIndex); + var op = this._createOperation(rowIndex); op.type |= Operation.DELETE; - if (!this._requestedMainTable) - { - this.signalEmit ('row-deleted-before', rowIndex); - this.data.splice (rowIndex, 1); - this.signalEmit ('row-deleted', rowIndex); - this._refreshRowIndexes (rowIndex); - } - else - { - this.signalEmit ('row-updated-before', rowIndex); + if (!this._requestedMainTable) { + this.emit('row-deleted-before', rowIndex); + this.data.splice(rowIndex, 1); + this.emit('row-deleted', rowIndex); + this._refreshRowIndexes(rowIndex); + } else { + this.emit('row-updated-before', rowIndex); if (!op.oldValues) op.oldValues = []; @@ -667,199 +667,171 @@ Model.implement var updatedCols = []; for (var i = 0; i < this.columns.length; i++) - if (this.columns[i].table == this._mainTable) - { - if (op.oldValues[i] === undefined) - op.oldValues[i] = op.row[i]; + if (this.columns[i].table == this._mainTable) { + const colName = this.columns[i].name; - op.row[i] = null; - updatedCols.push (i); + if (op.oldValues[colName] === undefined) + op.oldValues[colName] = op.row[colName]; + + op.row[colName] = null; + updatedCols.push(i); } - this.signalEmit ('row-updated', rowIndex, updatedCols); + this.emit('row-updated', rowIndex, updatedCols); } if (this.mode === Mode.ON_CHANGE) - this.performOperations (); + this.performOperations(); } /** * Inserts a new row on the model. * * @return The index of the inserted row - **/ - ,insertRow: function () - { - if (!this._checkTableUpdatable (this._mainTable)) + */ + ,insertRow: function() { + if (!this._checkTableUpdatable(this._mainTable)) return -1; var cols = this.columns; - var newRow = new Array (cols.length); + var newRow = {}; for (var i = 0; i < cols.length; i++) if (cols[i].table === this._mainTable) - newRow[i] = cols[i].def; + newRow[cols[i].name] = cols[i].def; else - newRow[i] = null; + newRow[cols[i].name] = null; - var rowIndex = this.data.push (newRow) - 1; + var rowIndex = this.data.push(newRow) - 1; newRow.index = rowIndex; - var op = this._createOperation (rowIndex); + var op = this._createOperation(rowIndex); op.type |= Operation.INSERT; - this.signalEmit ('row-inserted', rowIndex); + this.emit('row-inserted', rowIndex); return rowIndex; } /** * Performs all model changes on the database. - **/ - ,performOperations: function () - { + */ + ,performOperations: function() { var ops = this._operations; - if (ops.length === 0) - { - this.signalEmit ('operations-done'); + if (ops.length === 0) { + this.emit('operations-done'); return; } - var stmts = new Sql.MultiStmt (); + var stmts = new Sql.MultiStmt(); - var query = new Sql.String ({query: 'START TRANSACTION'}); - stmts.addStmt (query); + var query = new Sql.String({query: 'START TRANSACTION'}); + stmts.push(query); - for (var i = 0; i < ops.length; i++) - { + for (var i = 0; i < ops.length; i++) { query = null; var op = ops[i]; - if (op.type & Operation.DELETE) - { + if (op.type & Operation.DELETE) { if (op.type & Operation.INSERT) continue; - var where = this._createWhere (this._mainTable, op, true); + var where = this._createWhere(this._mainTable, op, true); - if (where) - { - query = new Sql.Delete ({where: where}); - query.addTarget (this._createTarget (this._mainTable)); + if (where) { + query = new Sql.Delete({where}); + query.addTarget(this._createTarget(this._mainTable)); } - } - else if (op.type & (Operation.INSERT | Operation.UPDATE)) - { - query = new Sql.MultiStmt (); + } else if (op.type & (Operation.INSERT | Operation.UPDATE)) { + query = new Sql.MultiStmt(); - for (var tableIndex in op.tables) - { - var stmt = this._createDmlQuery (op, parseInt (tableIndex)); - query.addStmt (stmt); + for (var tableIndex in op.tables) { + var stmt = this._createDmlQuery(op, parseInt(tableIndex)); + query.push(stmt); } } - if (query) - { - stmts.addStmt (query); - } - else - { - console.warn ('Db.Model: %s', _('ErrorSavingChanges')); + if (query) { + stmts.push(query); + } else { + console.warn('Db.Model: %s', _('ErrorSavingChanges')); return; } } - var query = new Sql.String ({query: 'COMMIT'}); - stmts.addStmt (query); + var query = new Sql.String({query: 'COMMIT'}); + stmts.push(query); - this._conn.execStmt (stmts, - this._onOperationsDone.bind (this, ops)); + this._conn.execStmt(stmts, + this._onOperationsDone.bind(this, ops)); - this._resetOperations (); + this._resetOperations(); } - ,_createDmlQuery: function (op, tableIndex) - { - var where = this._createWhere (tableIndex, op, false); + ,_createDmlQuery: function(op, tableIndex) { + var where = this._createWhere(tableIndex, op, false); if (!where) return null; - var multiStmt = new Sql.MultiStmt (); - var target = this._createTarget (tableIndex); + var multiStmt = new Sql.MultiStmt(); + var target = this._createTarget(tableIndex); - var select = new Sql.Select ({where: where}); - select.addTarget (target); + var select = new Sql.Select({where}); + select.addTarget(target); var row = op.row; var cols = this.columns; - if (op.tables[tableIndex] & Operation.INSERT) - { - var dmlQuery = new Sql.Insert (); + if (op.tables[tableIndex] & Operation.INSERT) { + var dmlQuery = new Sql.Insert(); var table = this.tables[tableIndex]; - for (var i = 0; i < this._defaults.length; i++) - { - var def = this._defaults[i]; - - if (def.table === table.name) - { - if (def.value) - dmlQuery.addSet (def.field, def.value); - else if (def.expr) - dmlQuery.addExpr (def.field, def.expr); - else if (def.srcColumn) - { - var columnIndex = this.getColumnIndex (def.srcColumn); - dmlQuery.addSet (def.field, row[columnIndex]); - } - } + for (const def of this._defaults) + if (def.table === table.name) { + if (def.value) + dmlQuery.addSet(def.field, def.value); + else if (def.expr) + dmlQuery.addExpr(def.field, def.expr); + else if (def.srcColumn) + dmlQuery.addSet(def.field, row[def.srcColumn]); } - for (var i = 0; i < cols.length; i++) - if (cols[i].table === tableIndex) - { - if (row[i] !== null) - dmlQuery.addSet (cols[i].orgname, row[i]); - - select.addField (cols[i].orgname); + for (const col of cols) + if (col.table === tableIndex) { + if (row[col.name] !== null) + dmlQuery.addSet(col.orgname, row[col.name]); + select.addField(col.orgname); } - } - else - { - var updateWhere = this._createWhere (tableIndex, op, true); + } else { + var updateWhere = this._createWhere(tableIndex, op, true); if (!updateWhere) return null; - var dmlQuery = new Sql.Update ({where: updateWhere}); + var dmlQuery = new Sql.Update({where: updateWhere}); - for (var i = 0; i < cols.length; i++) - if (cols[i].table === tableIndex && op.oldValues[i] !== undefined) - { - var fieldName = cols[i].orgname; - dmlQuery.addSet (fieldName, row[i]); - select.addField (fieldName); + for (const col of cols) + if (col.table === tableIndex && op.oldValues[col.name] !== undefined) { + var fieldName = col.orgname; + dmlQuery.addSet(fieldName, row[col.name]); + select.addField(fieldName); } } - dmlQuery.addTarget (target); + dmlQuery.addTarget(target); - multiStmt.addStmt (dmlQuery); - multiStmt.addStmt (select); + multiStmt.push(dmlQuery); + multiStmt.push(select); return multiStmt; } - ,_onOperationsDone: function (ops, resultSet) - { - var error = resultSet.getError (); + ,_onOperationsDone: function(ops, resultSet) { + var error = resultSet.getError(); - if (error) - { - this._operations = this._operations.concat (ops); + if (error) { + this._operations = this._operations.concat(ops); for (var i = 0; i < ops.length; i++) this._operationsMap[ops[i].row.index] = ops[i]; @@ -867,108 +839,93 @@ Model.implement throw error; } - resultSet.fetchResult (); + resultSet.fetchResult(); var isOperation = false; - for (var i = 0; i < ops.length; i++) - { + for (var i = 0; i < ops.length; i++) { var op = ops[i]; var row = op.row; if (!(op.type & Operation.DELETE && op.type & Operation.INSERT)) + // eslint-disable-next-line no-unused-vars isOperation = true; - if (op.type & Operation.DELETE) - { - resultSet.fetchResult (); - } - else if (op.type & (Operation.INSERT | Operation.UPDATE)) - { - this.signalEmit ('row-updated-before', row.index); + if (op.type & Operation.DELETE) { + resultSet.fetchResult(); + } else if (op.type & (Operation.INSERT | Operation.UPDATE)) { + this.emit('row-updated-before', row.index); var updatedCols = []; var cols = this.columns; - for (var tableIndex in op.tables) - { + for (var tableIndex in op.tables) { var j = 0; - tableIndex = parseInt (tableIndex); + tableIndex = parseInt(tableIndex); - resultSet.fetchResult (); - var newValues = resultSet.fetchRow (); + resultSet.fetchResult(); + var newValues = resultSet.fetchRow(); - if (op.tables[tableIndex] & Operation.INSERT) - { + if (op.tables[tableIndex] & Operation.INSERT) { for (var i = 0; i < cols.length; i++) - if (cols[i].table === tableIndex) - { - row[i] = newValues[j++]; - updatedCols.push (i); + if (cols[i].table === tableIndex) { + row[cols[i].name] = newValues[j++]; + updatedCols.push(i); } - } - else - { + } else { for (var i = 0; i < cols.length; i++) if (cols[i].table === tableIndex - && op.oldValues[i] !== undefined) - { - row[i] = newValues[j++]; - updatedCols.push (i); + && op.oldValues[i] !== undefined) { + row[cols[i].name] = newValues[j++]; + updatedCols.push(i); } } } - this.signalEmit ('row-updated', row.index, updatedCols); + this.emit('row-updated', row.index, updatedCols); } } - resultSet.fetchResult (); + resultSet.fetchResult(); // if (isOperation) - this.signalEmit ('operations-done'); + this.emit('operations-done'); } /** * Undoes all unsaved changes made to the model. - **/ - ,reverseOperations: function () - { - for (var i = 0; i < this._operations.length; i++) - { + */ + ,reverseOperations: function() { + for (var i = 0; i < this._operations.length; i++) { var op = this._operations[i]; var row = op.row; if (op.type & Operation.DELETE - && !(op.type & Operation.INSERT)) - { - this.data.splice (row.index, 0, row); - this.signalEmit ('row-inserted', row.index); - } - else if (op.type & Operation.UPDATE) - { - this.signalEmit ('row-updated-before', row.index); + && !(op.type & Operation.INSERT)) { + this.data.splice(row.index, 0, row); + this.emit('row-inserted', row.index); + } else if (op.type & Operation.UPDATE) { + this.emit('row-updated-before', row.index); var updatedCols = []; var cols = this.columns; for (var i = 0; i < cols.length; i++) - if (op.oldValues[i] !== undefined) - { - row[i] = op.oldValues[i]; - updatedCols.push (i); + if (op.oldValues[i] !== undefined) { + const colName = cols[i].name; + row[colName] = op.oldValues[colName]; + updatedCols.push(i); } - this.signalEmit ('row-updated', row.index, updatedCols); + this.emit('row-updated', row.index, updatedCols); } } - this._resetOperations (); - this._refreshRowIndexes (0); + this._resetOperations(); + this._refreshRowIndexes(0); } - ,_resetOperations: function () - { + ,_resetOperations: function() { this._operations = []; this._operationsMap = {}; } @@ -976,8 +933,7 @@ Model.implement /* * Function used to sort the model ascending. */ - ,sortFunctionAsc: function (column, a, b) - { + ,sortFunctionAsc: function(column, a, b) { if (a[column] < b[column]) return -1; else if (a[column] > b[column]) @@ -989,8 +945,7 @@ Model.implement /* * Function used to sort the model descending. */ - ,sortFunctionDesc: function (column, a, b) - { + ,sortFunctionDesc: function(column, a, b) { if (a[column] > b[column]) return -1; else if (a[column] < b[column]) @@ -1002,18 +957,15 @@ Model.implement /** * Orders the model by the specified column name. * - * @param {integer} column The column name + * @param {integer} columnName The column name * @param {SortWay} way The sort way - **/ - ,sortByName: function (columnName, way) - { + */ + ,sortByName: function(columnName, way) { this._requestedSortIndex = -1; this._requestedSortName = columnName; - var index = this.getColumnIndex (columnName); - - if (index != -1) - this._sort (index, way); + if (this.checkColName(columnName)) + this._sort(columnName, way); } /** @@ -1021,43 +973,38 @@ Model.implement * * @param {integer} column The column index * @param {SortWay} way The sort way - **/ - ,sort: function (column, way) - { + */ + ,sort: function(column, way) { this._requestedSortIndex = column; this._requestedSortName = null; - if (!this.checkColExists (column)) - return; + const columnName = this.getColumnName(column); + if (columnName) return; - this._sort (column, way); + this._sort(columnName, way); } - ,_sort: function (column, way) - { - this._setStatus (Status.LOADING); - this._realSort (column, way); - this._setStatus (Status.READY); + ,_sort: function(column, way) { + this._setStatus(Status.LOADING); + this._realSort(column, way); + this._setStatus(Status.READY); } - ,_realSort: function (column, way) - { - if (column !== this._sortColumn) - { + ,_realSort: function(column, way) { + if (column !== this._sortColumn) { if (way === SortWay.DESC) var sortFunction = this.sortFunctionDesc; else var sortFunction = this.sortFunctionAsc; - this.data.sort (sortFunction.bind (this, column)); - } - else if (way !== this._sortWay) - this.data.reverse (); + this.data.sort(sortFunction.bind(this, column)); + } else if (way !== this._sortWay) + this.data.reverse(); this._sortColumn = column; this._sortWay = way; - this._refreshRowIndexes (0); + this._refreshRowIndexes(0); } /** @@ -1068,38 +1015,32 @@ Model.implement * FIXME: Not fully implemented. * * @param {String} column The column name - **/ - ,indexColumn: function (column) - { + */ + ,indexColumn: function(column) { this._requestedIndexes[column] = true; if (this._status === Status.READY) - this._buildIndex (column); + this._buildIndex(column); } - ,_buildIndex: function (column) - { - var columnIndex = this.getColumnIndex (column); - - if (columnIndex !== -1) - { + ,_buildIndex: function(columnName) { + if (this.checkColName(columnName)) { var index = {}; var data = this.data; - switch (this.columns[columnIndex].type) - { + switch (this.columns[columnName].type) { case Connection.Type.TIMESTAMP: case Connection.Type.DATE_TIME: case Connection.Type.DATE: for (var i = 0; i < data.length; i++) - index[data[i][columnIndex].toString ()] = i; + index[data[i][columnName].toString()] = i; break; default: for (var i = 0; i < data.length; i++) - index[data[i][columnIndex]] = i; + index[data[i][columnName]] = i; } - this._indexes[columnIndex] = index; + this._indexes[columnName] = index; } } @@ -1109,129 +1050,118 @@ Model.implement * If an index have been built on that column, it will be used, for more * information see the indexColumn() method. * - * @param {String} column The column name + * @param {String} columnName The column name * @param {Object} value The value to search * @return {integer} The column index - **/ - ,search: function (column, value) - { - var index = this.getColumnIndex (column); - return this.searchByIndex (index, value); + */ + ,search: function(columnName, value) { + if (!this.checkColName(columnName)) + return -1; + + if (value) + switch (this.columnMap[columnName].type) { + case Connection.Type.BOOLEAN: + value = !!value; + break; + case Connection.Type.INTEGER: + value = parseInt(value); + break; + case Connection.Type.DOUBLE: + value = parseFloat(value); + break; + default: + value = value.toString(); + } + + let rowIndex = -1; + const index = this._indexes[columnName]; + + if (index) { + // Searchs the value using an internal index + + if (index[value] !== undefined) + rowIndex = index[value]; + } else { + // Searchs the value using a loop + + var data = this.data; + + switch (this.columnMap[columnName].type) { + case Connection.Type.TIMESTAMP: + case Connection.Type.DATE_TIME: + case Connection.Type.DATE: + for (var i = 0; i < data.length; i++) + if (value === data[i][columnName].toString()) { + rowIndex = i; + break; + } + break; + default: + for (var i = 0; i < data.length; i++) + if (value === data[i][columnName]) { + rowIndex = i; + break; + } + } + } + + return rowIndex; } /** * Searchs a value on the model and returns the row index of the first * ocurrence. * - * @param {integer} col The column index + * @param {integer} columnIndex The column index * @param {Object} value The value to search * @return {integer} The column index - **/ - ,searchByIndex: function (col, value) - { - if (!this.checkColExists (col)) - return -1; - - if (value) - switch (this.columns[col].type) - { - case Connection.Type.BOOLEAN: - value = !!value; - break; - case Connection.Type.INTEGER: - value = parseInt (value); - break; - case Connection.Type.DOUBLE: - value = parseFloat (value); - break; - default: - value = value.toString (); - } - - // Searchs the value using an internal index. - - var index = this._indexes[col]; - - if (index) - { - if (index[value] !== undefined) - return index[value]; - - return -1; - } - - // Searchs the value using a loop. - - var data = this.data; - - switch (this.columns[col].type) - { - case Connection.Type.TIMESTAMP: - case Connection.Type.DATE_TIME: - case Connection.Type.DATE: - { - for (var i = 0; i < data.length; i++) - if (value === data[i][col].toString ()) - return i; - - break; - } - default: - for (var i = 0; i < data.length; i++) - if (value === data[i][col]) - return i; - } - - return -1; + */ + ,searchByIndex: function(columnIndex, value) { + var columnName = this.getColumnName(columnIndex); + return this.search(columnName, value); } - ,_setStatus: function (status) - { + ,_setStatus: function(status) { this._status = status; - this.signalEmit ('status-changed', status); - this.signalEmit ('status-changed-after', status); + this.emit('status-changed', status); + this.emit('status-changed-after', status); } - ,_createTarget: function (tableIndex) - { + ,_createTarget: function(tableIndex) { var table = this.tables[tableIndex]; - return new Sql.Table - ({ + return new Sql.Table({ name: table.orgname ,schema: table.schema }); } - ,_createWhere: function (tableIndex, op, useOldValues) - { - var where = new Sql.Operation ({type: Sql.Operation.Type.AND}); - var pks = this.tables[tableIndex].pks; + ,_createWhere: function(tableIndex, op, useOldValues) { + const where = new Sql.Operation({type: Sql.Operation.Type.AND}); + const pks = this.tables[tableIndex].pks; if (pks.length === 0) return null; - for (var i = 0; i < pks.length; i++) - { - var col = pks[i]; - var column = this.columns[col]; + for (const pk of pks) { + const column = this.columnMap[pk]; - var equalOp = new Sql.Operation ({type: Sql.Operation.Type.EQUAL}); - equalOp.exprs.add (new Sql.Field ({name: column.orgname})); - where.exprs.add (equalOp); + const equalOp = new Sql.Operation({type: Sql.Operation.Type.EQUAL}); + equalOp.push(new Sql.Field({name: column.orgname})); + where.push(equalOp); - var pkValue = null; + let pkValue = null; if (useOldValues && op.oldValues - && op.oldValues[col] !== undefined) - pkValue = op.oldValues[col]; + && op.oldValues[pk] !== undefined) + pkValue = op.oldValues[pk]; else - pkValue = op.row[col]; + pkValue = op.row[pk]; if (pkValue) - equalOp.exprs.add (new Sql.Value ({value: pkValue})); + equalOp.push(new Sql.Value({value: pkValue})); else if (column.flags & Connection.Flag.AI && !useOldValues) - equalOp.exprs.add (new Sql.Function ({name: 'LAST_INSERT_ID'})); + equalOp.push(new Sql.Function({name: 'LAST_INSERT_ID'})); else return null; } @@ -1239,17 +1169,15 @@ Model.implement return where; } - ,_createOperation: function (rowIndex) - { + ,_createOperation: function(rowIndex) { var op = this._operationsMap[rowIndex]; - if (!op) - { + if (!op) { op = { type: 0, row: this.data[rowIndex] }; - this._operations.push (op); + this._operations.push(op); this._operationsMap[rowIndex] = op; } @@ -1270,30 +1198,26 @@ Model.implement * @param {String} schema The original table schema * @param {Array} pks Array with the names of primary keys * @param {String} ai The autoincrement column name - **/ - ,setInfo: function (table, orgname, schema, pks, ai) - { + */ + ,setInfo: function(table, orgname, schema, pks, ai) { if (!this.tableInfo) this.tableInfo = {}; - this.tableInfo[table] = - { - orgname: orgname, - schema: schema, - pks: pks, - ai: ai + this.tableInfo[table] = { + orgname, + schema, + pks, + ai }; - this._repairColumns (); + this._repairColumns(); } - ,_repairColumns: function () - { + ,_repairColumns: function() { // Repairs wrong table info if (this.tableInfo && this.tables) - for (var i = 0; i < this.tables.length; i++) - { + for (var i = 0; i < this.tables.length; i++) { var table = this.tables[i]; var tableInfo = this.tableInfo[table.name]; @@ -1303,32 +1227,25 @@ Model.implement table.orgname = tableInfo.orgname; table.schema = tableInfo.schema; - if (tableInfo.pks) - { + if (tableInfo.pks) { table.pks = []; - for (var j = 0; j < tableInfo.pks.length; j++) - { - var colIndex = this.getColumnIndex (tableInfo.pks[j]); - - if (colIndex !== -1) - table.pks.push (colIndex); + for (const pk of tableInfo.pks) { + if (this.checkColName(pk)) + table.pks.push(pk); else - console.warn ('Db.Model: Can\'t repair primary key: `%s`.`%s`' + console.warn('Db.Model: Can\'t repair primary key: `%s`.`%s`' ,tableInfo.orgname - ,tableInfo.pks[j] + ,pk ); } } - if (tableInfo.ai) - { - var colIndex = this.getColumnIndex (tableInfo.ai); - - if (colIndex !== -1) - this.columns[colIndex].flags |= Connection.Flag.AI; + if (tableInfo.ai) { + if (this.checkColName(tableInfo.ai)) + this.columnMap[tableInfo.ai].flags |= Connection.Flag.AI; else - console.warn ('Db.Model: Can\'t repair autoincrement column: `%s`.`%s`' + console.warn('Db.Model: Can\'t repair autoincrement column: `%s`.`%s`' ,tableInfo.orgname ,tableInfo.ai ); diff --git a/js/db/param.js b/js/db/param.js deleted file mode 100644 index 02058053..00000000 --- a/js/db/param.js +++ /dev/null @@ -1,118 +0,0 @@ - -var Form = require ('./form'); - -module.exports = new Class -({ - Extends: Vn.Param - ,Tag: 'db-param' - ,Parent: 'form' - ,Properties: - { - /** - * The form field referenced by this param. - **/ - column: - { - type: String - ,set: function (x) - { - this._columnName = x; - this.refresh (); - } - ,get: function () - { - this._columnName; - } - }, - /** - * The form referenced by this param. - **/ - form: - { - type: Form - ,set: function (x) - { - this.link ({_form: x}, - { - 'status-changed': this.onFormChange - ,'iter-changed': this.onIterChange - }); - - this.refresh (); - } - ,get: function () - { - return this._form; - } - }, - /** - * Determines whether the link to the form is unidirectional, ie, a - * change in the form updates the parameter but not vice versa. - **/ - oneWay: - { - type: Boolean - ,set: function (x) - { - this._oneWay = x; - } - ,get: function () - { - return this._oneWay; - } - } - } - - ,_columnName: null - ,_form: null - ,_formLock: false - ,_columnIndex: -1 - ,_oneWay: false - ,_formValue: null - - ,initialize: function (props) - { - this.parent (props); - this.on ('changed', this.onChange, this); - } - - ,refresh: function () - { - if (this._form) - { - this.onFormChange (); - this.onIterChange (); - } - } - - ,onFormChange: function () - { - if (this._columnName != null) - this._columnIndex = this._form.getColumnIndex (this._columnName); - } - - ,onIterChange: function () - { - if (this._oneWay && this.value != null) - return; - - this._formLock = true; - - var formValue; - - if (this._columnIndex !== -1) - formValue = this._form.getByIndex (this._columnIndex); - else - formValue = undefined; - - this.value = formValue; - this._formLock = false; - } - - ,onChange: function () - { - if (!this._formLock && this._columnIndex != -1 && !this.oneWay) - this._form.setByIndex (this._columnIndex, this._value); - } -}); - diff --git a/js/db/query.js b/js/db/query.js index c0e9f64c..95685a25 100644 --- a/js/db/query.js +++ b/js/db/query.js @@ -1,100 +1,78 @@ -var Connection = require ('./connection'); +var Connection = require('./connection'); -module.exports = new Class -({ +module.exports = new Class({ Extends: Vn.Object ,Tag: 'db-query' - ,Properties: - { + ,Properties: { /** * The connection used to execute the statement. - **/ - conn: - { + */ + conn: { type: Connection - ,set: function (x) - { + ,set: function(x) { this._conn = x; - this.onChange (); + this.onChange(); } - ,get: function () - { + ,get: function() { return this._conn; } }, /** * The model query. - **/ - query: - { + */ + query: { type: String - ,set: function (x) - { - this._stmt = new Sql.String ({query: x}); - this.onChange (); + ,set: function(x) { + this._stmt = new Sql.String({query: x}); + this.onChange(); } - ,get: function () - { - return this._stmt.render (null); + ,get: function() { + return this._stmt.render(null); } }, /** * The model select statement. - **/ - stmt: - { + */ + stmt: { type: Sql.Stmt - ,set: function (x) - { + ,set: function(x) { this._stmt = x; - this.onChange (); + this.onChange(); } - ,get: function () - { + ,get: function() { return this._stmt; } }, /** - * The batch used to execute the statement. - **/ - batch: - { - type: Sql.Batch - ,set: function (x) - { - this.link ({_batch: x}, {'changed': this.onChange}); - this.onChange (); + * The lot used to execute the statement. + */ + lot: { + type: Vn.LotIface + ,set: function(x) { + this.link({_lot: x}, {'change': this.onChange}); + this.onChange(); } - ,get: function () - { - return this._batch; + ,get: function() { + return this._lot; } }, /** * Wether to execute automatically de query que it's ready. - **/ - autoLoad: - { + */ + autoLoad: { type: Boolean, value: false } } - ,initialize: function (props) - { - this.parent (props); - } - - ,appendChild: function (child) - { + ,appendChild: function(child) { if (child.nodeType === Node.TEXT_NODE) this.query = child.textContent; } - ,loadXml: function (builder, node) - { - this.parent (builder, node); + ,loadXml: function(builder, node) { + Vn.Object.prototype.loadXml.call(this, builder, node); var query = node.firstChild.nodeValue; @@ -102,21 +80,18 @@ module.exports = new Class this.query = query; } - ,execute: function () - { - this._conn.execStmt (this._stmt, - this.onQueryDone.bind (this), this._batch); + ,execute: function() { + this._conn.execStmt(this._stmt, + this.onQueryDone.bind(this), this._lot); } - ,onQueryDone: function (resultSet) - { - this.signalEmit ('ready', resultSet); + ,onQueryDone: function(resultSet) { + this.emit('ready', resultSet); } - ,onChange: function () - { - if (this.autoLoad && this._conn && this._stmt && this._batch) - this.execute (); + ,onChange: function() { + if (this.autoLoad && this._conn && this._stmt && this._lot) + this.execute(); } }); diff --git a/js/db/result-set.js b/js/db/result-set.js index 241a219b..8d4d4d94 100644 --- a/js/db/result-set.js +++ b/js/db/result-set.js @@ -3,14 +3,14 @@ var Result = require('./result'); /** * This class stores the database results. - **/ + */ module.exports = new Class({ results: null ,error: null /** * Initilizes the resultset object. - **/ + */ ,initialize: function(results, error) { this.results = results; this.error = error; @@ -20,7 +20,7 @@ module.exports = new Class({ * Gets the query error. * * @return {Db.Err} the error or null if no errors hapened - **/ + */ ,getError: function() { return this.error; } @@ -40,7 +40,7 @@ module.exports = new Class({ * Fetchs the next result from the resultset. * * @return {Db.Result} the result or %null if error or there are no more results - **/ + */ ,fetchResult: function() { var result = this.fetch(); @@ -53,35 +53,34 @@ module.exports = new Class({ return null; } - + /** - * Fetchs the first row from the next resultset. + * Fetchs the first row object from the next resultset. * * @return {Array} the row if success, %null otherwise - **/ - ,fetchRow: function() { + */ + ,fetchObject: function() { var result = this.fetch(); if (result !== null && result.data instanceof Array && result.data.length > 0) return result.data[0]; - + return null; } - ,fetchObject: function() { + /** + * Fetchs data from the next resultset. + * + * @return {Array} the data + */ + ,fetchData: function() { var result = this.fetch(); if (result !== null - && result.data instanceof Array - && result.data.length > 0) { - var row = result.data[0]; - var object = {}; - for(var i = 0; i < row.length; i++) - object[result.columns[i].name] = row[i]; - return object; - } + && result.data instanceof Array) + return result.data; return null; } @@ -90,7 +89,7 @@ module.exports = new Class({ * Fetchs the first row and column value from the next resultset. * * @return {Object} the value if success, %null otherwise - **/ + */ ,fetchValue: function() { var row = this.fetchRow(); @@ -99,5 +98,26 @@ module.exports = new Class({ return null; } + + /** + * Fetchs the first row from the next resultset. + * + * @return {Array} the row if success, %null otherwise + */ + ,fetchRow: function() { + var result = this.fetch(); + + if (result !== null + && result.data instanceof Array + && result.data.length > 0) { + var object = result.data[0]; + var row = new Array(result.columns.length); + for(var i = 0; i < row.length; i++) + row[i] = object[result.columns[i].name]; + return row; + } + + return null; + } }); diff --git a/js/db/result.js b/js/db/result.js index 90466c93..b8395ba1 100644 --- a/js/db/result.js +++ b/js/db/result.js @@ -1,26 +1,25 @@ /** * This class stores a database result. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ /** * Initilizes the result object. - **/ - initialize: function (result) - { + */ + initialize: function(result) { this.data = result.data; this.tables = result.tables; this.columns = result.columns; this.row = -1; - if (this.columns) - { + if (this.columns) { this.columnMap = {}; - for (var i = 0; i < this.columns.length; i++) - this.columnMap[this.columns[i].name] = i; - } - else + for (var i = 0; i < this.columns.length; i++) { + const col = this.columns[i]; + col.index = i; + this.columnMap[col.name] = col; + } + } else this.columnMap = null; } @@ -29,26 +28,31 @@ module.exports = new Class * * @param {String} columnName The column name * @return {Object} The cell value - **/ - ,get: function (columnName) - { - var columnIndex = this.columnMap[columnName]; - return this.data[this.row][columnIndex]; + */ + ,get: function(columnName) { + return this.data[this.row][columnName]; + } + + /** + * Gets a row. + * + * @return {Object} The cell value + */ + ,getObject: function() { + return this.data[this.row]; } /** * Resets the result iterator. - **/ - ,reset: function () - { + */ + ,reset: function() { this.row = -1; } /** * Moves the internal iterator to the next row. - **/ - ,next: function () - { + */ + ,next: function() { this.row++; if (this.row >= this.data.length) diff --git a/js/db/simple-iterator.js b/js/db/simple-iterator.js index 7aca8a49..564e207e 100644 --- a/js/db/simple-iterator.js +++ b/js/db/simple-iterator.js @@ -1,54 +1,44 @@ -var Iterator = require ('./iterator'); -var Model = require ('./model'); +var Iterator = require('./iterator'); +var Model = require('./model'); /** * A light iterator for models. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Vn.Object ,Implements: Iterator - ,Properties: - { + ,Properties: { /** * The model associated to this form. - **/ - model: - { + */ + model: { type: Model - ,set: function (x) - { + ,set: function(x) { this._model = x; } - ,get: function () - { + ,get: function() { return this._model; } }, /** * The row where the form positioned, has -1 if the row is unselected. - **/ - row: - { + */ + row: { type: Number - ,set: function (x) - { + ,set: function(x) { this._row = x; } - ,get: function () - { + ,get: function() { return this._row; } }, /** * The number of rows in the form. - **/ - numRows: - { + */ + numRows: { type: Number - ,get: function () - { + ,get: function() { if (this._model) return this._model.numRows; @@ -57,17 +47,24 @@ module.exports = new Class }, /** * Checks if the form data is ready. - **/ - ready: - { + */ + ready: { type: Boolean - ,get: function () - { + ,get: function() { if (this._model) return this._model.ready; return false; } + }, + /** + * The row object. + */ + $: { + type: Object + ,get: function() { + return this._model.getObject(this._row); + } } } }); diff --git a/js/hedera/app.js b/js/hedera/app.js index a27fa926..0c325c4a 100644 --- a/js/hedera/app.js +++ b/js/hedera/app.js @@ -16,7 +16,7 @@ module.exports = new Class({ ,initialize: function() { window.onerror = this._onWindowError.bind(this); window.onunload = this._onWindowUnload.bind(this); - Vn.Hash.initialize(); + this._hash = new Vn.Hash({window: window}); var conn = new Db.Connection(); this.link({_conn: conn}, {'error': this._onConnError}); @@ -28,7 +28,10 @@ module.exports = new Class({ if (this.tryAutoLogin()) return; - var login = this._login = new Login({conn: this._conn}); + var login = this._login = new Login({ + conn: this._conn, + hash: this._hash + }); login.on('login', this._onLogin, this); login.show(); } @@ -39,7 +42,10 @@ module.exports = new Class({ if (this._gui) return; - var gui = this._gui = new Gui({conn: this._conn}); + var gui = this._gui = new Gui({ + conn: this._conn, + hash: this._hash + }); gui.on('logout', this._onLogout, this); gui.show(); } @@ -62,38 +68,42 @@ module.exports = new Class({ } ,_onConnError: function(conn, error) { - if (error instanceof Vn.JsonException) - switch (error.exception) { - case 'BadLogin': - Htk.Toast.showError(_('Invalid login')); - this._logout(); - break; - case 'Forbidden': - Htk.Toast.showError(_('You don\'t have enough privileges')); - break; - case 'UserDisabled': - Htk.Toast.showError(_('User disabled')); - this._logout(); - break; - case 'SessionExpired': - Htk.Toast.showError(_('Session expired')); - this._logout(); - break; - case 'OutdatedVersion': - this._newVersion(error); - break; - default: + if (error instanceof Vn.JsonException) { + if (error.message) Htk.Toast.showError(error.message); - } else if (error.statusCode) - switch (error.statusCode) { + else + switch (error.exception) { + case 'BadLogin': + Htk.Toast.showError(_('Invalid login')); + this._logout(); + break; + case 'Forbidden': + Htk.Toast.showError(_('You don\'t have enough privileges')); + break; + case 'UserDisabled': + Htk.Toast.showError(_('User disabled')); + this._logout(); + break; + case 'SessionExpired': + Htk.Toast.showError(_('Session expired')); + this._logout(); + break; + case 'OutdatedVersion': + this._newVersion(error); + break; + default: + Htk.Toast.showError(error.message); + } + } else if (error.statusCode) { + switch (error.statusCode) { case 401: Htk.Toast.showError(_('Invalid login')); this._logout(); break; default: Htk.Toast.showError(error.message); - } - else { + } + } else { console.error(error); this._notifyError(error); } @@ -160,6 +170,7 @@ module.exports = new Class({ this._freeGui(); this.deinitAutoLogin(); this._conn.unref(); + this._hash.unref(); } // Auto login functionality @@ -167,15 +178,17 @@ module.exports = new Class({ ,_firstLogin: true ,initAutoLogin: function() { - var isGuest = new Vn.HashParam({ + var isGuest = new Vn.Param({ + lot: this._hash, type: Boolean, - key: 'guest' + name: 'guest' }); this.link({_isGuest: isGuest}, {'changed': this._onGuestChange}); - var token = new Vn.HashParam({ + var token = new Vn.Param({ + lot: this._hash, type: String, - key: 'token' + name: 'token' }); this.link({_token: token}, {'changed': this._onTokenChange}); } diff --git a/js/hedera/basket-checker.js b/js/hedera/basket-checker.js index abde2365..624a76ff 100644 --- a/js/hedera/basket-checker.js +++ b/js/hedera/basket-checker.js @@ -1,6 +1,7 @@ module.exports = { - check: function(conn, callback) { + check: function(conn, hash, callback) { + this.hash = hash; conn.execQuery('CALL myBasket_check', this._onBasketCheck.bind(this, callback)); }, @@ -18,7 +19,7 @@ module.exports = { if (callback) callback(isOk); if (!isOk) - Vn.Hash.set({form: 'ecomerce/checkout'}); + this.hash.setAll({form: 'ecomerce/checkout'}); } }; diff --git a/js/hedera/form.js b/js/hedera/form.js index 7040315c..f07f3b38 100644 --- a/js/hedera/form.js +++ b/js/hedera/form.js @@ -1,125 +1,110 @@ -module.exports = new Class -({ +module.exports = new Class({ Extends: Vn.Object ,isOpen: false ,uiLoaded: false - ,initialize: function (gui, formInfo) - { + ,initialize: function(gui, formInfo) { this.gui = gui; this.conn = gui.conn; this.hash = gui.hash; this.formInfo = formInfo; } - - /** - * Gets an object from the builder associated to this form. - * - * @param {string} objectId The object identifier - * @return {Object} The object, or %null if not found - **/ - ,$: function (objectId) - { - if (this.builder) - return this.builder.getById (objectId); - - return null; - } - ,loadUi: function () - { + ,loadUi: function() { if (!this.isOpen) return; + + const conn = this.conn; + const hash = this.hash; - var builder = new Vn.Builder (); - builder.signalData = this; - builder.add ('conn', this.conn); - builder.loadXml ('forms/'+ this.formInfo.path +'/ui.xml'); + const builder = new Vn.Builder(); + builder.compileFile(`forms/${this.formInfo.path}/ui.xml`); - var res = this.builder = builder.load (); - this.node = res.$('form'); - res.link (); + const scope = this.builder = builder.load(null, this); + this.$ = scope.$; + scope.link({conn, hash}); + this.node = scope.$.form; + this.node.$ctrl = this; - var models = res.getByTagName ('db-model'); + const paramsLot = this.$.params; + if (paramsLot) { + paramsLot.source = hash; + this.params = paramsLot; + } - for (var i = 0; i < models.length; i++) - models[i].conn = this.conn; + function setConnection(tagName) { + const objects = scope.getByTagName(tagName); + for (let i = 0; i < objects.length; i++) + objects[i].conn = conn; + } - var queries = res.getByTagName ('db-query'); - - for (var i = 0; i < queries.length; i++) - queries[i].conn = this.conn; + const tags = ['db-model', 'db-query', 'db-lot']; + for (let i = 0; i < tags.length; i++) + setConnection(tags[i]); - if (this.node) - { - this.gui.setForm (this.node); - this.gui.setTitle (res.$('title')); - this.gui.setActions (res.$('actions')); - this.activate (); + if (this.node) { + this.gui.setForm(this.node); + this.gui.setTitle(scope.$.title); + this.gui.setActions(scope.$.actions); + this.activate(); } this.uiLoaded = true; } - ,unloadUi: function () - { + ,unloadUi: function() { if (!this.uiLoaded) return; - if (this.node) - { - this.deactivate (); - this.gui.setTitle (null); - this.gui.setActions (null); - Vn.Node.remove (this.node); - this.deactivate (); + if (this.node) { + this.deactivate(); + this.gui.setTitle(null); + this.gui.setActions(null); + Vn.Node.remove(this.node); + this.deactivate(); this.node = null; } - if (this.builder) - { - this.builder.unref (); + if (this.builder) { + this.builder.unref(); this.builder = null; } } /** * Called when the form is opened. - **/ - ,open: function () - { - this.close (); + */ + ,open: function() { + this.close(); this.isOpen = true; - this.loadUi (); + this.loadUi(); } /** * Called when the form is closed. - **/ - ,close: function () - { + */ + ,close: function() { if (!this.isOpen) return; this.isOpen = false; - this.unloadUi (); + this.unloadUi(); } /** * Called when the form is activated. - **/ - ,activate: function () {} + */ + ,activate: function() {} /** * Called when the form is deactivated. - **/ - ,deactivate: function () {} + */ + ,deactivate: function() {} - ,_destroy: function () - { - this.close (); - this.parent (); + ,_destroy: function() { + this.close(); + Vn.Object.prototype._destroy.call(this); } }); diff --git a/js/hedera/gui.css b/js/hedera/gui.css deleted file mode 100644 index e747901e..00000000 --- a/js/hedera/gui.css +++ /dev/null @@ -1,375 +0,0 @@ - -.vn-gui -{ - height: inherit; -} - -/* Font */ - -.vn-gui .user-info, -.vn-gui .menu-title, -.vn-gui .main-menu -{ - font-size: 1.1em; -} - -/* Navigation bar */ - -.vn-gui .navbar -{ - position: fixed; - background-color: #009688; - left: 15em; - top: 0; - right: 0; - z-index: 1; - overflow: hidden; - box-shadow: 0 0 .2em rgba(1, 1, 1, .3); - height: 3.9em; - color: white; - - transition-property: left, background-color, transform; - transition-duration: 200ms; - transition-timing-function: ease-in-out; -} -.vn-gui .menu-button -{ - position: absolute; - left: 0; - display: none; - border: none; - background-color: transparent; - padding: 0 .4em; - margin: 0; - height: 100%; -} -.vn-gui .menu-button:hover -{ - background-color: rgba(0, 0, 0, .2); -} -.vn-gui .menu-button img -{ - vertical-align: middle; - height: 1.8em; -} -.vn-gui .title -{ - float: left; -} -.vn-gui .title h1 -{ - font-weight: normal; - font-size: 1.4em; - padding: .8em .6em; - padding-right: .3em; - margin: 0; -} -.vn-gui .navbar > .htk-spinner -{ - float: left; - margin: 1.05em .8em; -} - -/* Action bar */ - -.vn-gui .action-bar -{ - float: right; - padding: 0; - margin: 0; - height: 100%; -} -.vn-gui .action-bar > div -{ - padding: 0; - margin: 0; - height: 100%; -} -.vn-gui .action-bar > div > * -{ - float: right; -} -.vn-gui .action-bar button -{ - margin: 0; - padding: 1.25em .5em; -} -.vn-gui .action-bar button:hover -{ - background-color: rgba(1, 1, 1, .2); -} -.vn-gui .action-bar button > img -{ - vertical-align: middle; - height: 1.4em; -} - -/* Background */ - -.vn-gui > .background -{ - z-index: 10; - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - visibility: hidden; - background-color: rgba(1, 1, 1, .7); - opacity: 0; -} -.vn-gui > .background.show -{ - visibility: visible; - transition: opacity 200ms ease-out; - opacity: 1; -} - -/* Left panel */ - -.vn-gui .left-panel -{ - z-index: 20; - position: fixed; - left: 0; - bottom: 0; - top: 0; - background-color: white; - z-index: 20; - box-shadow: 0 .2em .2em rgba(1, 1, 1, .4); - width: 15em; -} -.vn-gui .menu-overflow -{ - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 4em; - overflow: auto; -} -.vn-gui .menu-header -{ - background-color: #333; - color: white; - padding: 1em; -} -.vn-gui .logo -{ - display: block; - width: 12em; - margin-bottom: .8em; -} -.vn-gui .user-info -{ - width: 100%; - overflow: hidden; -} -.vn-gui .user-info > p -{ - margin: 0; - margin-top: .2em; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.vn-gui button.logout -{ - float: right; - margin: 0; - padding: .2em; - display: block; -} -.vn-gui button.logout > img -{ - height: 1.2em; - display: block; -} -.vn-gui .supplant -{ - margin-top: .2em; - display: none; -} - -/* Test link */ - -.vn-gui .test-link -{ - display: none; - margin: .5em; - background-color: #3f51b5; - color: white; - padding: 0 1em; - line-height: 2em; - border-radius: .1em; - text-align: center; -} -.vn-gui .test-link:hover -{ - background-color: #4f61c5; -} -.vn-gui .dev-info -{ - display: none; - padding: .3em .5em; - color: white; - background-color: #3f51b5; - font-size: .9em; - margin: .5em; - border-radius: .1em; -} -.vn-gui .dev-info > p -{ - margin: .2em 0; -} -.vn-gui .dev-info > .mode -{ - color: #BBF; -} - -/* Menu */ - -.vn-gui .main-menu, -.vn-gui ul.submenu -{ - list-style-type: none; - padding: 0; - margin: 0; -} -.vn-gui .main-menu > li -{ - display: block; - padding: 0; - margin: 0; - width: 100%; -} -.vn-gui .main-menu a -{ - width: 70%; - padding: 0 15%; - display: block; - line-height: 2.8em; -} -.vn-gui .main-menu a:hover, -.vn-gui .main-menu a.selected -{ - background-color: rgba(1, 1, 1, .1); -} -.vn-gui ul.submenu -{ - display: none; -} -.vn-gui ul.submenu.popup -{ - display: inline; - position: fixed; - border: none; - border-radius: 1px; - background-color: white; - box-shadow: 0 0 .3em rgba(1, 1, 1, .3); - z-index: 50; - width: 13em; - max-height: 30em; -} - -/* Social */ - -.vn-gui .social -{ - position: absolute; - bottom: 0; - right: 0; - padding: .8em; -} - -/* Body */ - -.vn-gui > .body -{ - margin-left: 15em; - padding-top: 3.9em; - height: inherit; - box-sizing: border-box; - height: inherit; - - transition-property: margin-left, margin-right; - transition-duration: 200ms; -} -.vn-gui .form-holder -{ - position: relative; - height: inherit; - - opacity: 0; - transform: translateZ(0) translateX(-2em); - -webkit-transform: translateZ(0) translateX(-2em); - - transition-property: opacity, transform; - transition-duration: 200ms; - transition-timing-function: ease-out; -} -.vn-gui .form-holder.show -{ - opacity: 1; - transform: translateZ(0) translateX(0em); - -webkit-transform: translateZ(0) translateX(0em); -} - -/* Mobile */ - -@media (max-width: 960px) -{ - .vn-gui .action-bar span.label, - .vn-gui .htk-button > span - { - display: none; - } - .vn-gui > .navbar - { - padding-left: 2.8em; - left: 0; - } - .vn-gui > .body - { - margin-left: 0; - } - .vn-gui .menu-button - { - display: block; - } - .vn-gui .left-panel - { - top: 0; - left: -15em; - box-shadow: 0 0 .2em rgba(1, 1, 1, .3); - - transition: transform 200ms ease-out; - -webkit-transition: transform 200ms ease-out; - } - .vn-gui .left-panel.show - { - transform: translateZ(0) translateX(15em); - -webkit-transform: translateZ(0) translateX(15em); - } - .vn-gui .form-holder - { - left: 0; - } - .vn-gui ul.submenu - { - display: block; - background-color: #888; - color: white; - box-shadow: inset 0 0 .2em rgba(1, 1, 1, .2); - overflow: hidden; - - max-height: 0; - transition: max-height 300ms ease-out; - webkit-transition: max-height 300ms ease-out; - } - .vn-gui .main-menu li:hover > ul.submenu - { - max-height: 20em; - } -} - diff --git a/js/hedera/gui.js b/js/hedera/gui.js index 1409d1f2..355ea778 100644 --- a/js/hedera/gui.js +++ b/js/hedera/gui.js @@ -1,11 +1,11 @@ var Module = require('./module'); -var Tpl = require('./gui.xml'); +var Tpl = require('./gui.xml').default; -require('./gui.css'); +require('./gui.scss'); module.exports = new Class({ - Extends: Htk.Component, + Extends: Vn.Component, Properties: { conn: { type: Db.Connection @@ -30,28 +30,21 @@ module.exports = new Class({ ,_navbarVisible: true ,initialize: function(props) { - this.builderInitString(Tpl); + this.loadTemplateFromString(Tpl); this.loadingCount = 0; - this.$('background').onclick = function() {}; + this.$.background.onclick = function() {}; - this.$('menu-button').addEventListener('click', function(event) { - event.stopPropagation(); - this.showMenu(); - }.bind(this)); - - this.$('left-panel').addEventListener('click', function(event) { + this.$.leftPanel.addEventListener('click', function(event) { event.stopPropagation(); }); - this.parent(props); - - this.$('social-bar').conn = this._conn; + Vn.Component.prototype.initialize.call(this, props); var sql = 'SELECT id, name, nickname FROM account.myUser;' +'SELECT defaultForm FROM config;' +'SELECT url FROM imageConfig;' - +'SELECT dbproduccion FROM vn2008.tblContadores;' + +'SELECT dbproduccion FROM vn.config;' +'SELECT productionDomain, testDomain FROM config;'; this._conn.execQuery(sql, this.onMainQueryDone.bind(this)); @@ -64,15 +57,17 @@ module.exports = new Class({ this._shown = true; this.doc.body.appendChild(this.node); - Htk.Toast.pushTop(this.$('form-holder')); + Htk.Toast.pushTop(this.$.formHolder); if (Vn.isMobile()) { this._onScrollHandler = this._onScroll.bind(this); window.addEventListener('scroll', this._onScrollHandler ); } - this.hash = Vn.Hash; - this.formParam = new Vn.HashParam({key: 'form'}); + this.formParam = new Vn.Param({ + lot: this.hash, + name: 'form', + }); this.formParam.on('changed', this._onFormChange, this); if (!localStorage.getItem('hederaCookies')) { @@ -108,7 +103,7 @@ module.exports = new Class({ } ,_onConnClose: function() { - this.signalEmit('logout'); + this.emit('logout'); } ,_onConnLoadChange: function(conn, isLoading) { @@ -122,7 +117,7 @@ module.exports = new Class({ // Retrieving the user name this.user = resultSet.fetchObject(); - Vn.Node.setText(this.$('user-name'), this.user.nickname); + Vn.Node.setText(this.$.userName, this.user.nickname); // Retrieving configuration parameters @@ -142,16 +137,16 @@ module.exports = new Class({ var isTesting = !resultSet.fetchValue(); if (isTesting) { - this.$('dev-info').style.display = 'block'; - this.$('version').textContent = Vn.Cookie.get('vnVersion'); + this.$.devInfo.style.display = 'block'; + this.$.version.textContent = Vn.Cookie.get('vnVersion'); } // Retrieving configuration parameters - var res = resultSet.fetchResult(); + var res = resultSet.fetchObject(); - if (res.next() && res.get('testDomain')) { - if (location.host != res.get('productionDomain')) { + if (res && res.testDomain) { + if (location.host != res.productionDomain) { var linkText = 'Old website'; var linkField = 'productionDomain'; } else { @@ -159,11 +154,11 @@ module.exports = new Class({ var linkField = 'testDomain'; } - Vn.Node.setText(this.$('test-link'), _(linkText)); - this.$('test-link').href = '//'+ res.get(linkField); - this.$('test-link').style.display = 'block'; + Vn.Node.setText(this.$.testLink, _(linkText)); + this.$.testLink.href = '//'+ res.get(linkField); + this.$.testLink.style.display = 'block'; } else - this.$('test-link').style.display = 'none'; + this.$.testLink.style.display = 'none'; // Loading the default form @@ -178,21 +173,21 @@ module.exports = new Class({ ,_onMenuLoad: function(resultSet) { // Retrieving menu sections - var res = resultSet.fetchResult(); + var res = resultSet.fetchData(); var sectionMap = {}; - - if (res) - for (var i = 0; res.next(); i++) { - var parent = res.get('parentFk'); + let i = 0; + + for (const row of res) { + var parent = row.parentFk; if (!sectionMap[parent]) sectionMap[parent] = []; - sectionMap[parent].push(i); + sectionMap[parent].push(i++); } - Vn.Node.removeChilds(this.$('main-menu')); - this.createMenu(res, sectionMap, null, this.$('main-menu')); + Vn.Node.removeChilds(this.$.mainMenu); + this.createMenu(res, sectionMap, null, this.$.mainMenu); } //++++++++++++++++++++++++++++++++++++++++++++++++++++++ Menu @@ -203,23 +198,24 @@ module.exports = new Class({ for (var i = 0; i < sections.length; i++) { res.row = sections[i]; + const row = res[sections[i]]; var li = this.createElement('li'); ul.appendChild(li); - var text = this.createTextNode(_(res.get('description'))); + var text = this.createTextNode(_(row.description)); var a = this.createElement('a'); - if (res.get('path')) { - a.href = Vn.Hash.make({'form': res.get('path')}); - this.menuOptions[res.get('path')] = a; + if (row.path) { + a.href = this.hash.make({form: row.path}); + this.menuOptions[row.path] = a; } a.appendChild(text); li.appendChild(a); - var formId = res.get('id'); + var formId = row.id; if (sectionMap[formId]) { var submenu = this.createElement('ul'); @@ -266,9 +262,14 @@ module.exports = new Class({ } } + ,onMenuClick(event) { + event.stopPropagation(); + this.showMenu(); + } + ,showMenu: function() { this.showBackground(); - Vn.Node.addClass(this.$('left-panel'), 'show'); + Vn.Node.addClass(this.$.leftPanel, 'show'); this.menuShown = true; this.hideMenuCallback = this.hideMenu.bind(this); @@ -280,7 +281,7 @@ module.exports = new Class({ return; this.hideBackground(); - Vn.Node.removeClass(this.$('left-panel'), 'show'); + Vn.Node.removeClass(this.$.leftPanel, 'show'); this.menuShown = false; this.doc.removeEventListener('click', this.hideMenuCallback); @@ -299,7 +300,7 @@ module.exports = new Class({ if (!this._shown) return; - var navbar = this.$('top-bar'); + var navbar = this.$.topBar; var yOffset = Vn.Browser.getPageYOffset(); var showNavbar = this._lastYOffset > yOffset || yOffset < navbar.offsetHeight; @@ -321,11 +322,11 @@ module.exports = new Class({ //++++++++++++++++++++++++++++++++++++++++++++++++++++++ Background ,showBackground: function() { - Vn.Node.addClass(this.$('background'), 'show'); + Vn.Node.addClass(this.$.background, 'show'); } ,hideBackground: function() { - Vn.Node.removeClass(this.$('background'), 'show'); + Vn.Node.removeClass(this.$.background, 'show'); } //++++++++++++++++++++++++++++++++++++++++++++++++++++++ Spinner @@ -334,7 +335,7 @@ module.exports = new Class({ this.loadingCount++; if (this.loadingCount == 1) - this.$('loader').start(); + this.$.loader.start(); } ,loaderPop: function() { @@ -344,7 +345,7 @@ module.exports = new Class({ this.loadingCount--; if (this.loadingCount == 0) - this.$('loader').stop(); + this.$.loader.stop(); } //++++++++++++++++++++++++++++++++++++++++++++++++++++++ Forms @@ -399,35 +400,35 @@ module.exports = new Class({ } ,setForm: function(form) { - Vn.Node.removeChilds(this.$('form-holder')); + Vn.Node.removeChilds(this.$.formHolder); if (form) { - this.$('form-holder').appendChild(form); + this.$.formHolder.appendChild(form); setTimeout(this._onSetFormTimeout.bind(this), 0); } } ,_onSetFormTimeout: function() { - Vn.Node.addClass(this.$('form-holder'), 'show'); + Vn.Node.addClass(this.$.formHolder, 'show'); } ,setTitle: function(title) { - Vn.Node.removeChilds(this.$('title')); + Vn.Node.removeChilds(this.$.title); if (title) - this.$('title').appendChild(title); + this.$.title.appendChild(title); } ,setActions: function(actions) { - Vn.Node.removeChilds(this.$('action-bar')); + Vn.Node.removeChilds(this.$.actionBar); if (actions) - this.$('action-bar').appendChild(actions); + this.$.actionBar.appendChild(actions); } ,closeForm: function() { if (this.activeForm) { - Vn.Node.removeClass(this.$('form-holder'), 'show'); + Vn.Node.removeClass(this.$.formHolder, 'show'); this.activeForm.close(); this.activeForm.unref(); this.activeForm = null; @@ -446,14 +447,14 @@ module.exports = new Class({ //++++++++++++++++++++++++++++++++++++++++++++++++++++++ Reports - ,openReport: function(reportName, batch) { + ,openReport: function(reportName, lot) { this.loaderPush(); var module = new Module('reports', reportName); - module.addCallback(this._onReportLoad.bind(this, batch)); + module.addCallback(this._onReportLoad.bind(this, lot)); } - ,_onReportLoad: function(batch, module) { + ,_onReportLoad: function(lot, module) { this.loaderPop(); if (module.error) { @@ -462,7 +463,7 @@ module.exports = new Class({ } var report = new module.klass(module, this); - report.open(batch); + report.open(lot); } //++++++++++++++++++++++++++++++++++++++++++++++++++++++ Supplant @@ -479,9 +480,8 @@ module.exports = new Class({ this._onUserSupplant.bind(this, callback, user)); } - ,_onUserSupplant: function(callback, user, supplantOk) { - if (!supplantOk) - return; + ,_onUserSupplant: function(callback, user, supplantOk, err) { + if (err) throw err; sessionStorage.setItem('supplantUser', user); this.loadMenu(); @@ -495,12 +495,12 @@ module.exports = new Class({ ,_onSupplantName: function(resultSet) { var userName = resultSet.fetchValue(); - Vn.Node.setText(this.$('supplanted'), userName); - Vn.Node.show(this.$('supplant')); + Vn.Node.setText(this.$.supplanted, userName); + this.$.supplant.classList.toggle('show', true); } ,onSupplantExitClick: function() { - Vn.Node.hide(this.$('supplant')); + this.$.supplant.classList.toggle('show', false); this._conn.supplantEnd(); sessionStorage.removeItem('supplantUser', sessionStorage.getItem('supplantUser')); @@ -512,7 +512,6 @@ module.exports = new Class({ ,_destroy: function() { this.hide(); - this.parent(); + Vn.Component.prototype.initialize.call(this); } }); - diff --git a/js/hedera/gui.scss b/js/hedera/gui.scss new file mode 100644 index 00000000..e78c9721 --- /dev/null +++ b/js/hedera/gui.scss @@ -0,0 +1,357 @@ + +@import "../htk/style/classes"; + +$side-panel-width: 250px; +$navbar-height: 64px; + +.vn-gui { + height: inherit; + + /* Font */ + + .user-name, + .menu-title { + font-size: 1.1em; + } + + /* Navigation bar */ + + .navbar { + position: fixed; + background-color: #1A1A1A; + left: $side-panel-width; + top: 0; + right: 0; + z-index: 1; + overflow: hidden; + height: $navbar-height; + color: white; + display: flex; + align-items: center; + + transition-property: left, background-color, transform; + transition-duration: 200ms; + transition-timing-function: ease-in-out; + + & > .menu-button { + flex: none; + display: none; + border: none; + + &:hover { + background-color: rgba(255, 255, 255, .1); + } + & > .htk-icon { + display: block; + } + } + & > .title-wraper { + flex: auto; + display: flex; + align-items: center; + gap: 12px; + overflow: hidden; + padding-left: 12px; + + & > .title { + overflow: hidden; + + h1 { + font-weight: normal; + font-size: 1.4em; + margin: 0; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + } + } + & > .action-bar { + flex: none; + height: 100%; + + & > div { + height: 100%; + display: flex; + align-items: center; + padding-right: 12px; + padding-left: 4px; + gap: 2px; + + & > * { + float: right; + } + } + button { + margin: 0; + padding: 8px 13px; + + &:hover { + background-color: rgba(2550, 255, 255, .2); + } + } + } + } + + /* Background */ + + & > .background { + z-index: 10; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + visibility: hidden; + background-color: rgba(1, 1, 1, .7); + opacity: 0; + + &.show { + visibility: visible; + transition: opacity 200ms ease-out; + opacity: 1; + } + } + + /* Left panel */ + + .left-panel { + z-index: 20; + position: fixed; + left: 0; + bottom: 0; + top: 0; + background-color: white; + z-index: 20; + width: $side-panel-width; + } + .menu-overflow { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 4em; + overflow: auto; + } + .menu-header { + background-color: #1A1A1A; + color: white; + height: $navbar-height; + display: flex; + } + .logo { + display: block; + width: 160px; + margin-left: 37px; + } + .user-info { + margin: 25px; + + & > div { + display: flex; + justify-content: space-between; + align-items: center; + overflow: hidden; + font-weight: bold; + border: 1px solid #eaeaea; + + & > span { + padding: 10px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .logout { + display: block; + margin: 0; + text-align: left; + border-radius: 0; + + &:hover { + background-color: #1a1a1a; + color: white; + } + & > .htk-icon { + display: block; + } + } + &.supplant { + display: none; + border-top: none; + + &.show { + display: flex; + } + } + } + } + + /* Test link */ + + .test-link { + display: none; + margin: .5em; + background-color: #3f51b5; + color: white; + padding: 0 1em; + line-height: 2em; + border-radius: .1em; + text-align: center; + + &:hover { + background-color: #4f61c5; + } + } + .dev-info { + display: none; + padding: .3em .5em; + color: white; + background-color: #3f51b5; + font-size: .9em; + margin: .5em; + border-radius: .1em; + + & > p { + margin: .2em 0; + } + & > .mode { + color: #BBF; + } + } + + /* Menu */ + + .main-menu, + ul.submenu { + list-style-type: none; + padding: 0; + margin: 0; + } + .main-menu > li { + display: block; + padding: 0; + margin: 0; + width: 100%; + } + .main-menu a { + width: 70%; + padding: 0 15%; + display: block; + line-height: 2.8em; + } + .main-menu a:hover, + .main-menu a.selected { + background-color: rgba(1, 1, 1, .1); + } + ul.submenu { + display: none; + } + ul.submenu.popup { + display: inline; + position: fixed; + border: none; + border-radius: 1px; + background-color: white; + box-shadow: 0 0 .3em rgba(1, 1, 1, .3); + z-index: 50; + width: 13em; + max-height: 30em; + } + + /* Social */ + + .menu-footer { + position: absolute; + bottom: 0; + right: 0; + left: 0; + } + + /* Body */ + + & > .body { + margin-left: $side-panel-width; + padding-top: $navbar-height; + height: inherit; + box-sizing: border-box; + height: inherit; + + transition-property: margin-left, margin-right; + transition-duration: 200ms; + } + .form-holder { + position: relative; + height: inherit; + + opacity: 0; + transform: translateZ(0) translateX(-2em); + -webkit-transform: translateZ(0) translateX(-2em); + + transition-property: opacity, transform; + transition-duration: 200ms; + transition-timing-function: ease-out; + + &.show { + opacity: 1; + transform: translateZ(0) translateX(0em); + -webkit-transform: translateZ(0) translateX(0em); + } + & > * { + padding: $spacing-md; + } + } + + /* Mobile */ + + @media (max-width: 960px) { + & > .navbar { + padding-left: 12px; + left: 0; + + & > .menu-button { + display: block; + } + & > .action-bar { + button { + padding: 8px; + } + span.label, + button > .text { + display: none; + } + } + } + & > .body { + margin-left: 0; + } + .left-panel { + top: 0; + left: -250px; + box-shadow: 0 0 .2em rgba(1, 1, 1, .3); + + transition: transform 200ms ease-out; + -webkit-transition: transform 200ms ease-out; + } + .left-panel.show { + transform: translateZ(0) translateX(250px); + -webkit-transform: translateZ(0) translateX(250px); + } + .form-holder { + left: 0; + } + ul.submenu { + display: block; + background-color: #888; + color: white; + box-shadow: inset 0 0 .2em rgba(1, 1, 1, .2); + overflow: hidden; + + max-height: 0; + transition: max-height 300ms ease-out; + webkit-transition: max-height 300ms ease-out; + } + .main-menu li:hover > ul.submenu { + max-height: 20em; + } + } +} diff --git a/js/hedera/gui.xml b/js/hedera/gui.xml index 261c6b64..d083ad2c 100644 --- a/js/hedera/gui.xml +++ b/js/hedera/gui.xml @@ -1,39 +1,45 @@ <vn> <div id="main" class="vn-gui"> <div id="top-bar" class="navbar"> - <div id="action-bar" class="action-bar"/> - <button id="menu-button" class="menu-button"> - <img src="image/icon/dark/menu.svg" alt="_Menu"/> + <button + id="menu-button" + class="menu-button" + on-click="onMenuClick"> + <htk-icon name="menu" alt="_Menu"/> </button> - <div id="title" class="title"/> - <htk-spinner id="loader" class="loader dark"/> + <div class="title-wraper"> + <div id="title" class="title"/> + <htk-spinner id="loader" class="loader dark"/> + </div> + <div id="action-bar" class="action-bar"/> </div> <div id="left-panel" class="left-panel"> <div class="menu-overflow"> <div class="menu-header" id="menu-header"> <img class="logo" src="image/logo-dark.svg" alt="Verdnatura"/> - <div class="user-info"> - <button class="logout" on-click="onLogoutClick" title="_Exit"> - <img src="image/icon/dark/exit.svg" alt="_Exit"/> + </div> + <div class="user-info"> + <div> + <span id="user-name"/> + <button class="logout" on-click="this.onLogoutClick()"> + <htk-icon name="logout" alt="_Exit"/> </button> - <p id="user-name"/> </div> - <div id="supplant" class="supplant user-info"> - <button class="logout" on-click="onSupplantExitClick" title="_Exit"> - <img src="image/icon/dark/exit.svg" alt="_Exit"/> + <div id="supplant" class="supplant"> + <span id="supplanted"/> + <button class="logout" on-click="this.onSupplantExitClick()"> + <htk-icon name="logout" alt="_Exit"/> </button> - <p id="supplanted"/> </div> </div> + <ul id="main-menu" class="main-menu"/> + </div> + <div class="menu-footer"> <div id="dev-info" class="dev-info"> <p class="mode">Testing</p> <p><t>Version</t> <span id="version"/></p> </div> <a id="test-link" class="test-link" href="#">Old website</a> - <ul id="main-menu" class="main-menu"/> - </div> - <div class="social"> - <htk-social-bar id="social-bar" priority="2"/> </div> </div> <div class="body"> diff --git a/js/hedera/hedera.js b/js/hedera/hedera.js index 051c3cb2..5389daea 100644 --- a/js/hedera/hedera.js +++ b/js/hedera/hedera.js @@ -1,16 +1,15 @@ -require ('htk/htk'); -require ('./style.css'); +require('htk/htk'); Hedera = module.exports = { - Login : require ('./login') - ,SocialBar : require ('./social-bar') - ,Gui : require ('./gui') - ,Module : require ('./module') - ,Form : require ('./form') - ,Report : require ('./report') - ,App : require ('./app') - ,Tpv : require ('./tpv') - ,BasketChecker : require ('./basket-checker') + Login : require('./login') + ,SocialBar : require('./social-bar') + ,Gui : require('./gui') + ,Module : require('./module') + ,Form : require('./form') + ,Report : require('./report') + ,App : require('./app') + ,Tpv : require('./tpv') + ,BasketChecker : require('./basket-checker') }; diff --git a/js/hedera/locale/ca.yml b/js/hedera/locale/ca.yml index 7ad360ee..4de7b265 100644 --- a/js/hedera/locale/ca.yml +++ b/js/hedera/locale/ca.yml @@ -1,10 +1,10 @@ User: Usuari Password: Contrasenya Beta: Beta -Do not sign out: No tancar sessió +Remind me: No tancar sessió Log in as guest: Accedir com a convidat -Enter: Entrar -Login mail: clientes@verdnatura.es +Login: Iniciar sesió +Login mail: info@verdnatura.es Login phone: +34 607 562 391 Password forgotten? Push here: ¿Has oblidat la teva contrasenya? Yet you are not a customer?: Encara no ets client? @@ -61,4 +61,4 @@ Training: Formació Agencies: Agències Configuration: Configuració Account: Compte -Addresses: Direccions +Addresses: Adreces diff --git a/js/hedera/locale/en.yml b/js/hedera/locale/en.yml index efe920dd..cac2c0f5 100644 --- a/js/hedera/locale/en.yml +++ b/js/hedera/locale/en.yml @@ -1,10 +1,10 @@ User: User Password: Password Beta: Beta -Do not sign out: Do not sign out +Remind me: Remind me Log in as guest: Log in as guest -Enter: Enter -Login mail: clientes@verdnatura.es +Login: Login +Login mail: info@verdnatura.es Login phone: +34 607 562 391 Password forgotten? Push here: Password forgotten? Push here Yet you are not a customer?: Yet you are not a customer? diff --git a/js/hedera/locale/es.yml b/js/hedera/locale/es.yml index e769c5c5..7617afe7 100644 --- a/js/hedera/locale/es.yml +++ b/js/hedera/locale/es.yml @@ -1,10 +1,10 @@ User: Usuario Password: Contraseña Beta: Beta -Do not sign out: No cerrar sesión +Remind me: Recuérdame Log in as guest: Entrar como invitado -Enter: Entrar -Login mail: clientes@verdnatura.es +Login: Iniciar sesión +Login mail: info@verdnatura.es Login phone: +34 963 242 100 Password forgotten? Push here: ¿Has olvidado tu contraseña? Yet you are not a customer?: ¿Todavía no eres cliente? diff --git a/js/hedera/locale/fr.yml b/js/hedera/locale/fr.yml index db5d4fcc..7f02f468 100644 --- a/js/hedera/locale/fr.yml +++ b/js/hedera/locale/fr.yml @@ -1,9 +1,9 @@ User: Utilisateur Password: Mot de passe Beta: Beta -Do not sign out: Garder ma session active +Remind me: Garder ma session active Log in as guest: Entrez en tant qu'invité -Enter: Entrer +Login: Entrer Login mail: ruben@verdnatura.es Login phone: +33 781 533 900 Password forgotten? Push here: as tu oublié ton mot de passe? diff --git a/js/hedera/locale/mn.yml b/js/hedera/locale/mn.yml index 87c8f0e1..80edf0e5 100644 --- a/js/hedera/locale/mn.yml +++ b/js/hedera/locale/mn.yml @@ -1,10 +1,10 @@ User: Хэрэглэгчийн Password: нууц үг Beta: Бета -Do not sign out: Гаргаж гарын үсэг зураагүй байна +Remind me: Гаргаж гарын үсэг зураагүй байна Log in as guest: Зочин байдлаар оруулна уу -Enter: энд бичнэ үү -Login mail: clientes@verdnatura.es +Login: энд бичнэ үү +Login mail: info@verdnatura.es Login phone: +34 607 562 391 Password forgotten? Push here: Нууц үг мартсан? энд түлхэх Yet you are not a customer?: Гэсэн хэдий ч та хэрэглэгчийн биш гэж үү? diff --git a/js/hedera/locale/pt.yml b/js/hedera/locale/pt.yml index 05f68099..31ae763a 100644 --- a/js/hedera/locale/pt.yml +++ b/js/hedera/locale/pt.yml @@ -1,10 +1,10 @@ User: Usuario Password: Palavra-Passe Beta: Beta -Do not sign out: Não finalizar Sessão +Remind me: Não finalizar Sessão Log in as guest: Entrar como convidado -Enter: Entrar -Login mail: clientes@verdnatura.es +Login: Entrar +Login mail: info@verdnatura.es Login phone: +34 963 242 100 Password forgotten? Push here: Não lembro minha palavra-passe Yet you are not a customer?: Ainda não és cliente? diff --git a/js/hedera/login.css b/js/hedera/login.css deleted file mode 100644 index 940435b9..00000000 --- a/js/hedera/login.css +++ /dev/null @@ -1,220 +0,0 @@ - -.vn-login -{ - color: #333; - font-size: 1.1em; - font-weight: normal; - height: inherit; -} - -/* Navigation bar */ - -.vn-login .navbar -{ - z-index: 10; - position: fixed; - background-color: #333; - width: 100%; - height: 3.5em; - top: 0; - color: white; - -} -.vn-login .navbar div -{ - margin-top: 1em; - text-align: center; -} - -/* Body */ - -.vn-login .body -{ - height: inherit; -} -.vn-login .column -{ - position: relative; - margin: 0 auto; - max-width: 40em; - height: inherit; - background-color: white; - box-shadow: 0 0 .3em 0 rgba(1, 1, 1, 0.4); - min-height: -} - -/* Login */ - -.vn-login .login -{ - position: relative; - height: inherit; - max-width: 15em; - margin: 0 auto; -} -.vn-login form -{ - position: absolute; - top: 50%; - margin-top: -20em; - width: 100%; - padding: 2em 0; -} -.vn-login form > div -{ - margin: 1em 0; -} -.vn-login p -{ - margin: .4em 0; -} - -/* Header */ - -.vn-login .header -{ - margin-bottom: 2em; -} -.vn-login .header img -{ - display: block; - width: 100%; -/* box-shadow: 0 0 .3em 0 rgba(1, 1, 1, 0.4);*/ -} -.vn-login .version-code -{ - color: red; - text-align: right; - margin: .2em auto; - font-weight: bold; - height: 1.4em; - display: none; -} - -/* Body */ - -.vn-login .form-inputs -{ - margin: 0 auto; - max-width: 15em; -} -.vn-login label -{ - margin: 0; -} -.vn-login .form-group label -{ - display: block; - font-size: inherit; -} -.vn-login input -{ - margin: 0.3em; -} -.vn-login input[type=text], -.vn-login input[type=password] -{ - margin: 0; - margin-top: .5em; - padding: 0 .5em; - width: 100%; - border: 1px solid #AAA; - height: 2.6em; -} -.vn-login input[type=text], -.vn-login input[type=password], -.vn-login input[type=submit], -.vn-login input[type=button], -.vn-login input[type=reset], -.vn-login button, -.vn-login .button -{ - border-radius: .1em; - box-shadow: 0 .1em .1em rgba(1, 1, 1, 0.4); -} -.vn-login input[type=checkbox] -{ - padding: 0; - margin: 0; - width: initial; - height: initial; - margin-right: .5em; -} -.vn-login input[type=submit], -.vn-login input[type=button], -.vn-login input[type=reset], -.vn-login button, -.vn-login .button -{ - margin: 0 auto; - background-color: #9CBC28; - border: 1px solid #8A1; - height: 2.4em; - width: 100%; - color: #240; - text-transform: uppercase; -} -.vn-login input[type=submit]:hover, -.vn-login input[type=button]:hover, -.vn-login input[type=reset]:hover, -.vn-login button:hover, -.vn-login .button:hover -{ - background-color: #8A1; -} -hr -{ - border: solid 1px #333; - margin: 0; - padding: 0; - display: block; -} -.vn-login .enter -{ - position: relative; -} -.vn-login .wrapper -{ - width: 0; - overflow: visible; - position: absolute; - top: 0; - right: 0; -} -.vn-login .htk-spinner -{ - margin: .3em 1em; - position: absolute; -} - -/* Footer */ - -.vn-login .footer -{ - margin-top: 2em; -} -.vn-login .contact -{ - text-align: center; -} - -@media (max-height: 50em) -{ - .vn-login .column - { - min-height: 45em; - } - .vn-login .login - { - display: flex; - align-items: center; - } - .vn-login form - { - top: 0; - position: relative; - margin-top: 0; - padding-top: 5.5em; - } -} - diff --git a/js/hedera/login.js b/js/hedera/login.js index 71dbef8f..d3b8450c 100644 --- a/js/hedera/login.js +++ b/js/hedera/login.js @@ -1,9 +1,9 @@ -require('./login.css'); -var Tpl = require('./login.xml'); +require('./login.scss'); +var Tpl = require('./login.xml').default; module.exports = new Class({ - Extends: Htk.Component, + Extends: Vn.Component, Properties: { conn: @@ -19,13 +19,13 @@ module.exports = new Class({ } ,initialize: function(props) { - this.parent(props); - this.builderInitString(Tpl); + Vn.Component.prototype.initialize.call(this, props); + this.loadTemplateFromString(Tpl); - this.$('social-bar').conn = this._conn; + //this.$.socialBar.conn = this._conn; var self = this; - this.$('form').onsubmit = function() { + this.$.form.onsubmit = function() { self._onSubmit(); return false; }; @@ -33,9 +33,9 @@ module.exports = new Class({ ,_onConnLoadChange: function(conn, isLoading) { if (isLoading) - this.$('spinner').start(); + this.$.spinner.start(); else - this.$('spinner').stop(); + this.$.spinner.stop(); } ,show: function() { @@ -44,32 +44,32 @@ module.exports = new Class({ var lastUser = localStorage.getItem('hederaLastUser'); if (lastUser) - this.$('user').value = lastUser; + this.$.user.value = lastUser; this._focusUserInput(); } ,_onSubmit: function() { this._conn.open( - this.$('user').value, - this.$('pass').value, - this.$('remember').checked, + this.$.user.value, + this.$.pass.value, + this.$.remember.checked, this._onConnOpen.bind(this) ); this._disableUi(true); } ,_onConnOpen: function(conn, success, error) { - this.$('pass').value = ''; + this.$.pass.value = ''; this._disableUi(false); if (success) { - var user = this.$('user').value; + var user = this.$.user.value; if (user) localStorage.setItem('hederaLastUser', user); - this.signalEmit('login'); + this.emit('login'); } else { this._focusUserInput(); throw error; @@ -81,24 +81,24 @@ module.exports = new Class({ } ,_focusUserInput: function() { - var userEntry = this.$('user'); + var userEntry = this.$.user; userEntry.focus(); userEntry.select(); } ,_disableUi: function(disabled) { - this.$('user').disabled = disabled; - this.$('pass').disabled = disabled; - this.$('submit').disabled = disabled; + this.$.user.disabled = disabled; + this.$.pass.disabled = disabled; + this.$.submit.disabled = disabled; } ,onPasswordLost: function() { - var user = this.$('user').value; + var user = this.$.user.value; if (!user) Htk.Toast.showError(_('Please write your user name')); else - this._conn.send('core/recover-password', {recoverUser: user}, + this._conn.send('user/recover-password', {recoverUser: user}, this._onPasswordRecovered.bind(this)); } diff --git a/js/hedera/login.scss b/js/hedera/login.scss new file mode 100644 index 00000000..5238e4ec --- /dev/null +++ b/js/hedera/login.scss @@ -0,0 +1,142 @@ + +.vn-login { + display: flex; + align-items: center; + justify-content: center; + color: #333; + font-weight: normal; + height: inherit; + background-color: white; + + a:hover { + text-decoration: underline; + } + input { + margin: .3em; + } + input[type=text], + input[type=password] { + margin: 0; + padding: 0 5px; + width: 100%; + height: 2.6em; + border-radius: 0; + border-top: none; + border-left: none; + border-right: none; + background-color: none; + } + input[type=checkbox] { + padding: 0; + margin: 0; + width: initial; + height: initial; + margin-right: .5em; + } + input[type=submit], + input[type=button], + input[type=reset], + button, + .button { + margin: 0 auto; + background-color: #0d1115; + border-radius: 25px; + height: 50px; + width: 100%; + color: white; + transition: transform 200ms ease-out; + transition-property: background-color; + + &:hover { + background-color: #3d3f42; + } + } + @media (max-height: 680px) { + height: initial; + } +} + +$login-margin-top: 50px; +$login-margin-between: 55px; + +.vn-login > .column { + max-width: 300px; + + & > .header { + margin-top: $login-margin-top; + margin-bottom: $login-margin-between; + + img { + display: block; + margin: 0 auto; + width: 90%; + } + .version-code { + color: red; + text-align: right; + margin: .2em auto; + font-weight: bold; + height: 1.4em; + display: none; + } + } + & > .footer { + margin-bottom: $login-margin-top; + margin-top: $login-margin-between; + text-align: center; + font-size: .85rem; + + .contact { + margin-top: 15px; + color: grey; + } + a { + font-weight: bold; + } + } + & > form { + & > div { + margin: 20px 0; + } + p { + margin: 5px 0; + } + & > .remind-block { + margin-top: 20px; + margin-bottom: 40px; + } + .button.guest { + display: flex; + align-items: center; + justify-content: center; + border: 1px solid #0d1115; + background-color: white; + color: #0d1115; + text-decoration: none; + + &:hover { + background-color: rgba(0, 0, 0, .1); + } + } + .password-forgotten { + text-align: center; + font-size: .85rem; + margin-top: 30px; + } + .enter { + position: relative; + } + .wrapper { + width: 0; + overflow: visible; + position: absolute; + top: 0; + right: 0; + } + .htk-spinner { + margin: .3em 1em; + position: absolute; + } + } +} + diff --git a/js/hedera/login.xml b/js/hedera/login.xml index edfc286a..c391edba 100644 --- a/js/hedera/login.xml +++ b/js/hedera/login.xml @@ -1,68 +1,56 @@ <vn> <div id="main" class="vn-login"> - <div class="navbar"> - <div> - <a href="#!form=cms/home&guest=true"> - <t>Log in as guest</t> - </a> + <div class="column"> + <div class="header"> + <img src="image/logo.svg" alt="VerdNatura"/> + <div class="version-code"/> </div> - </div> - <div class="body"> - <div class="column"> - <div class="login"> <form id="form"> - <div class="header"> - <img src="image/banner.svg" alt=""/> - <div class="version-code"/> + <div class="form-group"> + <input + placeholder="_User" + type="text" + id="user" + name="user"/> </div> <div class="form-group"> - <label> - <t>User</t> - <input type="text" id="user" name="user"/> - </label> + <input + placeholder="_Password" + type="password" + id="pass" + name="password"/> </div> - <div class="form-group"> - <label> - <t>Password</t> - <input type="password" id="pass" name="password"/> - </label> - </div> - <div> + <div class="remind-block"> <label> <input type="checkbox" id="remember" name="remember"/> - <t>Do not sign out</t> + <t>Remind me</t> </label> </div> <div class="enter"> - <input id="submit" type="submit" value="_Enter"/> + <input id="submit" type="submit" value="_Login"/> <div class="wrapper"> <htk-spinner id="spinner"/> </div> - <p> - <a href="#" on-click="onPasswordLost"> - <t>Password forgotten? Push here</t> - </a> - </p> </div> <div> - <hr/> - </div> - <div> - <p><t>Yet you are not a customer?</t></p> - <a class="button" href="_Sign up link" target="_blank"> - <t>Sign up</t> + <a class="button guest" href="#!form=cms/home&guest=true"> + <t>Log in as guest</t> </a> </div> - <div class="footer"> - <htk-social-bar id="social-bar" priority="1"/> - <div id="social" class="social"/> - <div class="contact"> - <p><t>Login mail</t></p> - <p><t>Login phone</t></p> - </div> - </div> + <p class="password-forgotten"> + <a href="#" on-click="onPasswordLost"> + <t>Password forgotten? Push here</t> + </a> + </p> </form> - </div> + <div class="footer"> + <p> + <t>Yet you are not a customer?</t> + <a href="_Sign up link" target="_blank"><t>Sign up</t></a> + </p> + <p class="contact"> + <t>Login phone</t> · <t>Login mail</t> + </p> </div> </div> </div> diff --git a/js/hedera/module.js b/js/hedera/module.js index 2810921b..6961ef61 100644 --- a/js/hedera/module.js +++ b/js/hedera/module.js @@ -1,6 +1,5 @@ -module.exports = new Class -({ +module.exports = new Class({ basePath: null ,path: null ,moduleName: null @@ -11,84 +10,74 @@ module.exports = new Class ,error: false ,ready: false - ,initialize: function (basePath, path) - { + ,initialize: function(basePath, path) { var absPath = basePath +'/'+ path; - var aux = path.split ('/'); + var aux = path.split('/'); var moduleName = aux[aux.length - 1]; - Vn.Locale.load (absPath, - this.onLocaleReady.bind (this)); - Vn.includeJs (absPath +'/'+ moduleName +'.js', - this.onJsReady.bind (this)); - Vn.loadXml (absPath +'/ui.xml', - this.onUiReady.bind (this)); + Vn.Locale.load(absPath, + this.onLocaleReady.bind(this)); + Vn.includeJs(absPath +'/'+ moduleName +'.js', + this.onJsReady.bind(this)); + Vn.loadXml(absPath +'/ui.xml', + this.onUiReady.bind(this)); this.basePath = basePath; this.path = path; this.moduleName = moduleName; } - ,addCallback: function (callback) - { + ,addCallback: function(callback) { if (!this.ready) - this.callbacks.push (callback); + this.callbacks.push(callback); else - callback (this); + callback(this); } - ,onLocaleReady: function (success) - { + ,onLocaleReady: function() { this.localeReady = true; - this.onReady (); + this.onReady(); } - ,onJsReady: function (success) - { + ,onJsReady: function(success) { this.jsReady = true; this.error = !success; - this.onReady (); + this.onReady(); } - ,onUiReady: function (success) - { + ,onUiReady: function(success) { this.uiReady = true; this.error = !success; - this.onReady (); + this.onReady(); } - ,onReady: function () - { + ,onReady: function() { if (!(this.localeReady && this.jsReady && this.uiReady)) return; this.ready = true; - var klassName = this.toCamelCase (this.moduleName); + var klassName = this.toCamelCase(this.moduleName); try { this.klass = Hedera[klassName]; - } - catch (e) - { + } catch (e) { this.error = true; - console.error (e); + console.error(e); } var callbacks = this.callbacks; this.callbacks = null; for (var i = 0; i < callbacks.length; i++) - callbacks[i] (this); + callbacks[i](this); } - ,toCamelCase: function (dashedName) - { - var camelCase = dashedName.charAt (0).toUpperCase (); - camelCase += dashedName.substr (1).replace (/\w\-\w/g, function (token) - { - return token.charAt (0) + token.charAt (2).toUpperCase (); + ,toCamelCase: function(dashedName) { + var camelCase = dashedName.charAt(0).toUpperCase(); + camelCase += dashedName.substr(1).replace(/\w-\w/g, function(token) { + return token.charAt(0) + token.charAt(2).toUpperCase(); }); return camelCase; } diff --git a/js/hedera/report.css b/js/hedera/report.css index e2cbfd99..2fd9b179 100644 --- a/js/hedera/report.css +++ b/js/hedera/report.css @@ -1,8 +1,8 @@ @font-face { - font-family: 'Roboto'; - src: url('roboto.ttf') format('truetype'); + font-family: 'Roboto'; + src: url('roboto.ttf') format('truetype'); } @media print { diff --git a/js/hedera/report.js b/js/hedera/report.js index 9129715b..c0221059 100644 --- a/js/hedera/report.js +++ b/js/hedera/report.js @@ -1,103 +1,81 @@ -module.exports = new Class -({ +module.exports = new Class({ Extends: Vn.Object - ,initialize: function (moduleInfo, gui) - { + ,initialize: function(moduleInfo, gui) { this.info = moduleInfo; this.gui = gui; this.conn = gui.conn; - this.parent (null); + Vn.Object.prototype.initialize.call(this); } - /** - * Gets an object from the builder associated to this report. - * - * @param {string} objectId The object identifier - * @return {Object} The object, or %null if not found - **/ - ,$: function (objectId) - { - if (this.builderResult) - return this.builderResult.getById (objectId); - - return null; - } - - ,open: function (batch) - { - this.batch = batch; - this.createWindow (); + ,open: function(lot) { + this.lot = lot; + this.createWindow(); } - ,print: function () - { - this.window.print (); + ,print: function() { + this.window.print(); } - ,includeCss: function (path) - { + ,includeCss: function(path) { var basePath = location.protocol +'//'+ location.host; basePath += location.port ? ':'+ location.port : ''; - basePath += location.pathname.substring (0, - location.pathname.lastIndexOf ('/')); + basePath += location.pathname.substring(0, + location.pathname.lastIndexOf('/')); - var link = this.doc.createElement ('link'); + var link = this.doc.createElement('link'); link.rel = 'stylesheet'; link.type = 'text/css'; - link.href = basePath +'/'+ path + Vn.getVersion (); + link.href = basePath +'/'+ path + Vn.getVersion(); - var head = this.doc.getElementsByTagName ('head')[0]; - head.appendChild (link); + var head = this.doc.getElementsByTagName('head')[0]; + head.appendChild(link); } - ,createWindow: function () - { - var reportWindow = window.open ( + ,createWindow: function() { + var reportWindow = window.open( 'js/hedera/report.html', '_blank', 'height=650, width=950, resizable=yes, fullscreen=no,'+ 'titlebar=no, menubar=no, toolbar=no, location=no, scrollbars=yes' ); - if (!reportWindow) - { - Htk.Toast.showError ( + if (!reportWindow) { + Htk.Toast.showError( _('Please unlock popups and try again')); return false; } - reportWindow.addEventListener ('load', - this._onWindowLoad.bind (this)); + reportWindow.addEventListener('load', + this._onWindowLoad.bind(this)); this.window = reportWindow; return true; } - ,_onWindowLoad: function () - { + ,_onWindowLoad: function() { this.doc = this.window.document - this.includeCss ('reports/'+ this.info.path +'/style.css'); + this.includeCss('reports/'+ this.info.path +'/style.css'); - var printButton = this.doc.getElementById ('print'); - printButton.addEventListener ('click', this.print.bind (this)); - Vn.Node.setText (printButton, _('Print')); + var printButton = this.doc.getElementById('print'); + printButton.addEventListener('click', this.print.bind(this)); + Vn.Node.setText(printButton, _('Print')); - this.onWindowCreate (); + this.onWindowCreate(); } - ,onWindowCreate: function () - { - var builder = new Vn.Builder (); - builder.signalData = this; - builder.add ('batch', this.batch); - builder.add ('conn', this.conn); - builder.loadXml ('reports/'+ this.info.path +'/ui.xml'); + ,onWindowCreate: function() { + var builder = new Vn.Builder(); + builder.compileFile('reports/'+ this.info.path +'/ui.xml'); - var res = this.builderResult = builder.load (); - res.link (); + var scope = this.scope = builder.load(this.doc, this); + scope.link({ + lot: this.lot, + conn: this.conn + }); + this.$ = scope.$; - this.doc.body.appendChild (res.$('report')); + this.doc.body.appendChild(scope.$.report); } }); diff --git a/js/hedera/social-bar.js b/js/hedera/social-bar.js index d082068c..b70bf398 100644 --- a/js/hedera/social-bar.js +++ b/js/hedera/social-bar.js @@ -1,33 +1,26 @@ +require('./social-bar.scss'); -module.exports = new Class -({ - Extends: Htk.Widget +module.exports = new Class({ + Extends: Vn.Component ,Tag: 'htk-social-bar' - ,Properties: - { - conn: - { + ,Properties: { + conn: { type: Db.Connection - ,set: function (x) - { + ,set: function(x) { this._conn = x; - this._refresh (); + this._refresh(); } - ,get: function () - { + ,get: function() { return this._conn; } }, - priority: - { + priority: { type: Number - ,set: function (x) - { + ,set: function(x) { this._priority = x; - this._refresh (); + this._refresh(); } - ,get: function () - { + ,get: function() { return this._priority; } } @@ -35,42 +28,37 @@ module.exports = new Class ,_priority: 0 - ,initialize: function () - { - var node = this.createRoot ('div'); + ,initialize: function() { + var node = this.createRoot('div'); node.className = 'htk-social-bar'; } - ,_refresh: function () - { + ,_refresh: function() { if (!this._conn || this._priority === null) return; - var batch = new Sql.Batch (); - batch.addValue ('priority', this._priority); + const params = {priority: this._priority}; var query = 'SELECT title, link, icon FROM social ' +'WHERE priority >= #priority ORDER BY priority'; - this._conn.execQuery (query, this._onQueryDone.bind (this), batch); + this._conn.execQuery(query, this._onQueryDone.bind(this), params); } - ,_onQueryDone: function (resultSet) - { - Vn.Node.removeChilds (this._node); - var res = resultSet.fetchResult (); + ,_onQueryDone: function(resultSet) { + Vn.Node.removeChilds(this._node); + var res = resultSet.fetchResult(); - while (res.next ()) - { - var a = this.createElement ('a'); - a.href = res.get ('link'); + while (res.next()) { + var a = this.createElement('a'); + a.href = res.get('link'); a.target = '_blank'; - this._node.appendChild (a); + this._node.appendChild(a); - var img = this.createElement ('img'); - img.src = 'image/social/'+ res.get ('icon'); - img.alt = res.get ('title'); - img.title = res.get ('title'); - a.appendChild (img); + var img = this.createElement('img'); + img.src = 'image/social/'+ res.get('icon'); + img.alt = res.get('title'); + img.title = res.get('title'); + a.appendChild(img); } } }); diff --git a/js/hedera/social-bar.scss b/js/hedera/social-bar.scss new file mode 100644 index 00000000..e540930a --- /dev/null +++ b/js/hedera/social-bar.scss @@ -0,0 +1,13 @@ + +.htk-social-bar { + text-align: center; + + a { + display: inline-block; + margin: 0 .1em; + } + img { + height: 1.8em; + width: 1.8em; + } +} diff --git a/js/hedera/style.css b/js/hedera/style.css deleted file mode 100644 index af4cd28c..00000000 --- a/js/hedera/style.css +++ /dev/null @@ -1,483 +0,0 @@ - -@font-face -{ - font-family: 'Roboto'; - src: url('roboto.ttf') format('truetype'); -} - -/* Responsive */ - -/* Standard */ -@media screen -{ - body { font-size: 10pt; } -} - -/* Desktop - Laptop 1360x768 */ -@media (max-resolution: 119dpi) and (min-device-width: 1340px) and (max-device-width: 1899px) -{ - body { font-size: 10pt; } -} - -/* Desktop - FHD 1920x1080 */ -@media (max-resolution: 119dpi) and (min-device-width: 1900px) -{ - body { font-size: 13pt; } -} - -/* Mobile - Low DPI */ -@media - (min-resolution: 120dpi), - (-webkit-min-device-pixel-ratio: 1.5) -{ - body { font-size: 9pt; } -} -@media - (min-resolution: 144dpi), - (-webkit-min-device-pixel-ratio: 1.5) -{ - body { font-size: 11pt; } -} - -/* Mobile - Normal DPI */ -@media - (max-device-width: 383px) and (min-resolution: 192dpi), - (max-device-width: 383px) and (-webkit-min-device-pixel-ratio: 2) -{ - body { font-size: 10pt; } -} -@media - (min-device-width: 384px) and (min-resolution: 192dpi), - (min-device-width: 384px) and (-webkit-min-device-pixel-ratio: 2) -{ - body { font-size: 11pt; } -} - -/* Mobile - High DPI */ -@media - (max-device-width: 411px) and (min-resolution: 249dpi), - (max-device-width: 411px) and (-webkit-min-device-pixel-ratio: 3) -{ - body { font-size: 10pt; } -} -@media - (min-device-width: 412px) and (min-resolution: 249dpi), - (min-device-width: 412px) and (-webkit-min-device-pixel-ratio: 3) -{ - body { font-size: 11pt; } -} - -/* Global */ - -body -{ - font-family: 'Roboto', 'Verdana', 'Sans'; - background-color: #EEE; - color: #333; - position: absolute; - height: 100%; - width: 100%; - margin: 0; - overflow: auto; - z-index: -2; -} -label, -button, -input, -select, -textarea, -option -{ - font-size: inherit; - font-family: inherit; - color: inherit; -} -iframe -{ - border: none; -} -fieldset -{ - margin: 0; -} -form -{ - padding: 0; - margin: 0; -} -table -{ - width: 100%; -} -a:link, -a:visited, -a:active -{ - color: inherit; - text-decoration: none; -} -a:hover -{ - text-decoration: none; - cursor: pointer; -} -a img -{ - padding: 1px; -} -a img:hover -{ - opacity: 0.9; -} -h1, h2, h3, h4, h5, h6 -{ - margin: 0; - padding: .2em 0; -} -h1 -{ - font-size: 1.5em; -} -h2 -{ - font-size: 1.2em; -} -p -{ - margin: 0.8em 0; -} - -/* Focus outline */ - -a:focus, -input:focus, -button:focus -{ - outline: 1px solid rgba(1, 1, 1, 0.15); - -moz-outline-radius: .1em; -} -button::-moz-focus-inner, -input[type=submit]::-moz-focus-inner, -input[type=button]::-moz-focus-inner, -input[type=reset]::-moz-focus-inner -{ - border: none; -} -select:-moz-focusring -{ -/* color: transparent; - text-shadow: 0 0 0 #333;*/ -} - -/* Inputs */ - -input[type=text], -input[type=password], -input[type=file], -input[type=number], -textarea, -select, -.input -{ - border: none; - border-bottom: 1px solid #999; - margin: .2em 0; - box-sizing: border-box; - color: #333; - border-radius: 0; - text-align: left; - width: 100%; -} -input[type=text], -input[type=password], -input[type=number], -textarea, -.input -{ - padding: 0 .2em; -} -input[type=text], -input[type=password], -input[type=file], -input[type=number], -select, -.input -{ - height: 2.2em; -} -textarea -{ - height: 3.5em; - width: 20em; -} -input[type=text]:focus, -input[type=password]:focus, -input[type=file]:focus, -input[type=number]:focus, -textarea:focus, -.input:focus -{ - border-color: #333; -} -input[type=checkbox], -input[type=radio] -{ - cursor: pointer; - margin: .2em; - padding: .3em; -} -select -{ - background-color: white; - -moz-appearance: none; - appearance: none; -} -option -{ - padding: .4em; - border-width: 0; - font-weight: normal; - font-size: 1em; -} -select, -option -{ - cursor: pointer; -} - -/* Buttons */ - -input[type=submit], -input[type=button], -input[type=reset], -button, -.button -{ - border: none; - background-color: transparent; - padding: .5em; - cursor: pointer; - border-radius: 0.1em; - margin: -0.5em; -} -.button -{ - display: inline-block; - text-align: center; - box-sizing: border-box; -} -input[type=submit]:hover, -input[type=button]:hover, -input[type=reset]:hover, -button:hover, -.button:hover -{ - background-color: rgba(1, 1, 1, 0.1); -} - -/* Flat button */ - -button.flat, -.button.flat -{ - border: none; - border-radius: 0.1em; - box-shadow: 0 0.2em 0.2em #DDD; - background-color: #AD4; - color: black; -} -button.flat:hover, -.button.flat:hover -{ - background-color: #9C3; - cursor: pointer; -} -button.flat:disabled, -.button.flat:disabled -{ - color: gray; -} - -/* Thin button */ - -input[type=submit].thin, -input[type=button].thin, -input[type=reset].thin, -button.thin, -.button.thin -{ - color: #008D77; - text-transform: uppercase; -} -input[type=submit].thin:disabled, -input[type=button].thin:disabled, -input[type=reset].thin:disabled, -button.thin:disabled -.button.thin:disabled -{ - color: gray; -} - -/* Image */ - -img.editable -{ - cursor: pointer; -} - -/* Button */ - -.htk-button img -{ - height: 1.5em; -} - -/* Float */ - -.clear -{ - clear: both !important; -} - -/* Box */ - -.box -{ - background-color: white; - margin: 0 auto; - border-radius: 0.1em; - box-shadow: 0 0.2em 0.2em #CCC; -} -.box .header -{ - padding: 0.6em 0.8em; - margin: 0; - background-color: #009688; - color: white; -} -.box .header > h1 -{ - color: white; - text-align: left; - font-size: 1.6em; - line-height: 2em; - font-weight: normal; - display: inline; -} -.box .body -{ - padding: 2em; -} - -/* Form */ - -.form -{ - margin: 0 auto; -} -.form-group -{ - margin-bottom: 1.2em; -} -.form-group:last-child -{ - margin-bottom: 0; -} -.form-group > label -{ - display: block; - margin: 0; - margin-bottom: .2em; - font-size: .9em; - color: #222; -} -.form-group > input[type=text], -.form-group > input[type=password], -.form-group > input[type=file], -.form-group > input[type=number], -.form-group > select, -.form-group > textarea -{ - margin: 0; - width: 100%; -} - -/* Form */ - -table.form -{ - padding: 1em; - border-collapse: separate; - border-spacing: 0.3em; -} -table.form td.label -{ - width: 45%; - text-align: right; -} -table.form tr -{ - height: 2.8em; -} - -/* Icon */ - -img.icon -{ - height: 1.5em; -} - -/* Masonry */ - -.masonry -{ - margin: 0 auto; - text-align: left; -} -.masonry-box -{ - width: 100%; - display: inline-block; - vertical-align: top; -} -@media screen and (min-width: 1000px) and (max-width: 1399px) -{ - .masonry-box - { - width: 50%; - display: block; - float: left; - clear: left; - } - .masonry-box:nth-child(2n+0) - { - float: right; - clear: right; - } -} -@media screen and (min-width: 1400px) -{ - .masonry-box { width: 33.3%; } -} -@media screen and (min-width: 2000px) -{ - .masonry-box { width: 25%; } -} - -/* Social bar */ - -.htk-social-bar -{ - text-align: center; -} -.htk-social-bar a -{ - display: inline-block; - margin: 0 .1em; -} -.htk-social-bar img -{ - height: 1.8em; - width: 1.8em; -} - diff --git a/js/hedera/tpv.js b/js/hedera/tpv.js index ee59267d..19c4567a 100644 --- a/js/hedera/tpv.js +++ b/js/hedera/tpv.js @@ -1,22 +1,21 @@ -module.exports = new Class -({ +module.exports = new Class({ Extends: Vn.Object ,tpvOrder: null ,tpvStatus: null ,check: function(callback) { - this.tpvOrder = Vn.Hash.get('tpvOrder'); - this.tpvStatus = Vn.Hash.get('tpvStatus'); + this.tpvOrder = this.hash.$.tpvOrder; + this.tpvStatus = this.hash.$.tpvStatus; if (this.tpvStatus) { - var batch = new Sql.Batch(); - batch.addValue('transaction', this.tpvOrder); - batch.addValue('status', this.tpvStatus); - - var query = 'CALL myTpvTransaction_end(#transaction, #status)'; - this.conn.execQuery(query, null, batch); + const params = { + transaction: this.tpvOrder, + status: this.tpvStatus + }; + const query = 'CALL myTpvTransaction_end(#transaction, #status)'; + this.conn.execQuery(query, null, params); } if (callback) @@ -29,7 +28,7 @@ module.exports = new Class ,_realPay: function(amount, company) { if (isNumeric(amount) && amount > 0) { - var params = { + const params = { amount: parseInt(amount) ,urlOk: this._makeUrl('ok') ,urlKo: this._makeUrl('ko') @@ -44,15 +43,15 @@ module.exports = new Class ,_onTransactionStart: function(json) { if (json) { - var postValues = json.postValues; + const postValues = json.postValues; - var form = document.createElement('form'); + const form = document.createElement('form'); form.method = 'POST'; form.action = json.url; document.body.appendChild(form); for (var field in postValues) { - var input = document.createElement('input'); + const input = document.createElement('input'); input.type = 'hidden'; input.name = field; form.appendChild(input); @@ -67,37 +66,38 @@ module.exports = new Class } ,retryPay: function() { - var batch = new Sql.Batch(); - batch.addValue('transaction', parseInt(this.tpvOrder)); + const params = {transaction: parseInt(this.tpvOrder)}; - var query = 'SELECT t.amount, m.companyFk ' + const query = 'SELECT t.amount, m.companyFk ' +'FROM myTpvTransaction t ' +'JOIN tpvMerchant m ON m.id = t.merchantFk ' +'WHERE t.id = #transaction'; this.conn.execQuery(query, - this._onRetryPayDone.bind(this), batch); + this._onRetryPayDone.bind(this), params); } ,_onRetryPayDone: function(resultSet) { - var res = resultSet.fetchResult(); + const res = resultSet.fetchObject(); - if (res.next()) - this._realPay(res.get('amount'), res.get('companyFk')); + if (res) + this._realPay(res.amount, res.companyFk); else Htk.Toast.showError(_('AmountError')); } ,_makeUrl: function(status) { - var path = location.protocol +'//'+ location.host; + let path = location.protocol +'//'+ location.hostname; path += location.port ? ':'+ location.port : ''; path += location.pathname; path += location.search ? location.search : ''; - path += Vn.Hash.make({ + path += this.hash.make({ form: 'ecomerce/orders', tpvStatus: status, tpvOrder: '_transactionId_' }, true); + alert(path); + return path; } }); diff --git a/js/htk/assistant-bar.js b/js/htk/assistant-bar/index.js similarity index 72% rename from js/htk/assistant-bar.js rename to js/htk/assistant-bar/index.js index 420872cd..dbcc2ddf 100644 --- a/js/htk/assistant-bar.js +++ b/js/htk/assistant-bar/index.js @@ -1,9 +1,9 @@ - -var Widget = require('./widget'); -var Assistant = require('./assistant'); +require('./style.scss'); +var Component = require('vn/component'); +var Assistant = require('../assistant'); module.exports = new Class({ - Extends: Widget, + Extends: Component, Tag: 'htk-assistant-bar', Properties: { assistant: { @@ -38,42 +38,35 @@ module.exports = new Class({ _disabled: false, render: function() { - var bar = this.createRoot('div'); - bar.className = 'htk-assistant-bar'; - - var previousButton = this.createElement('button'); - previousButton.className = 'previous'; - previousButton.title = _('Previous'); + var node = this.createRoot('div'); + + var previousButton = new Htk.Button({ + icon: 'arrow_back_ios', + tip: 'Previous' + }).node; + previousButton.classList.add('previous'); previousButton.addEventListener('click', this.movePrevious.bind(this)); - bar.appendChild(previousButton); - - var img = this.createElement('img'); - img.src = 'image/icon/light/go-previous.svg'; - previousButton.appendChild(img); + node.appendChild(previousButton); var steps = this.createElement('div'); steps.className = 'steps'; - bar.appendChild(steps); + node.appendChild(steps); - var nextButton = this.createElement('button'); - nextButton.className = 'next'; - nextButton.title = _('Next'); + var nextButton = new Htk.Button({ + icon: 'arrow_forward_ios', + tip: 'Next' + }).node; + nextButton.classList.add('next'); nextButton.addEventListener('click', this.moveNext.bind(this)); - bar.appendChild(nextButton); + node.appendChild(nextButton); - var img = this.createElement('img'); - img.src = 'image/icon/light/go-next.svg'; - nextButton.appendChild(img); - - var endButton = this.createElement('button'); - endButton.className = 'end'; - endButton.title = _('Confirm'); + var endButton = new Htk.Button({ + icon: 'done', + tip: 'Confirm' + }).node; + endButton.classList.add('end'); endButton.addEventListener('click', this.end.bind(this)); - bar.appendChild(endButton); - - var img = this.createElement('img'); - img.src = 'image/icon/light/ok.svg'; - endButton.appendChild(img); + node.appendChild(endButton); this._steps = steps; this._previousButton = previousButton; diff --git a/js/htk/assistant-bar/style.scss b/js/htk/assistant-bar/style.scss new file mode 100644 index 00000000..4b6877d3 --- /dev/null +++ b/js/htk/assistant-bar/style.scss @@ -0,0 +1,66 @@ + +.htk-assistant-bar { + position: relative; + padding: .8em; + display: flex; + align-items: center; + justify-content: space-between; + box-sizing: border-box; + width: 100%; + + & > button { + border-radius: 50%; + padding: .5em; + margin: 0; + text-align: center; + + & > img { + display: block; + width: 1.8em; + padding: .5em; + } + } + & > .end { + display: none; + color: #8cc63f; + + & > .icon { + font-size: 1.6rem; + } + } + & > .steps { + display: flex; + align-items: center; + + & > div { + background-color: #AAA; + width: .5em; + height: .5em; + cursor: pointer; + border-radius: 50%; + margin: .5em; + + transition-property: width, height; + transition-duration: 100ms; + transition-timing-function: ease-in-out; + + &.selected { + background-color: #666; + width: 1em; + height: 1em; + } + &:hover { + opacity: .7; + } + } + & > img { + width: 1.3em; + margin: 0 .2em; + cursor: pointer; + + &:hover { + opacity: .7; + } + } + } +} diff --git a/js/htk/assistant.js b/js/htk/assistant/index.js similarity index 90% rename from js/htk/assistant.js rename to js/htk/assistant/index.js index 1a17dc68..486f781a 100644 --- a/js/htk/assistant.js +++ b/js/htk/assistant/index.js @@ -1,13 +1,13 @@ - -var Widget = require('./widget'); -var Step = require('./step'); -var Toast = require('./toast'); +require('./style.scss'); +var Component = require('vn/component'); +var Step = require('../step'); +var Toast = require('../toast'); /** * A simple assistant with steps. */ module.exports = new Class({ - Extends: Widget, + Extends: Component, Tag: 'htk-assistant', Properties: { /** @@ -42,7 +42,7 @@ module.exports = new Class({ set: function(x) { this._stepsIndex = x; this.setStep(this._stepIndex); - this.signalEmit('steps-change'); + this.emit('steps-change'); }, get: function() { return this._stepsIndex; @@ -81,9 +81,8 @@ module.exports = new Class({ steps: {}, initialize: function(props) { - var node = this.createRoot('div'); - node.className = 'htk-assistant'; - this.parent(props); + Component.prototype.initialize.call(this, props); + this.createRoot('div'); }, appendChild: function(step) { @@ -132,7 +131,7 @@ module.exports = new Class({ this._stepName = stepName; this.currentStep = step; step.show(); - this.signalEmit('step-change', stepIndex); + this.emit('step-change', stepIndex); if (this.stepFunc) this.stepFunc(step); diff --git a/js/htk/assistant/style.scss b/js/htk/assistant/style.scss new file mode 100644 index 00000000..b5261194 --- /dev/null +++ b/js/htk/assistant/style.scss @@ -0,0 +1,14 @@ + +.htk-assistant > div { + display: none; + + & > h2 { + text-align: center; + font-weight: normal; + font-size: 1.5rem; + margin: 0; + padding: 0; + margin-bottom: 1em; + font-weight: bold; + } +} \ No newline at end of file diff --git a/js/htk/bar-button/index.js b/js/htk/bar-button/index.js new file mode 100644 index 00000000..aad3e764 --- /dev/null +++ b/js/htk/bar-button/index.js @@ -0,0 +1,9 @@ + +var Button = require('../button'); + +module.exports = new Class({ + Extends: Button + ,Tag: 'htk-bar-button' + + ,_showText: true +}); diff --git a/js/htk/button/index.js b/js/htk/button/index.js new file mode 100644 index 00000000..bba8e449 --- /dev/null +++ b/js/htk/button/index.js @@ -0,0 +1,61 @@ +require('./style.scss'); + +module.exports = new Class({ + Extends: Htk.Field + ,Tag: 'htk-button' + ,Properties: { + image: { + type: String + ,set: function(x) { + this.iconNode.name = x; + } + }, + icon: { + type: String + ,set: function(x) { + this.iconNode.name = x; + } + }, + tip: { + type: String + ,set: function(x) { + this.node.title = x ? _(x) : ''; + this.renderContent(); + } + ,get: function() { + return this.node.title; + } + }, + showText: { + type: Boolean + ,set: function(x) { + this._showText = x; + this.renderContent(); + } + ,get: function() { + return this._showText; + } + } + } + + ,_showText: false + + ,render: function() { + var node = this.createRoot('button'); + + this.iconNode = new Htk.Icon(); + node.appendChild(this.iconNode.node); + } + + ,renderContent: function() { + if (this._textNode) + Vn.Node.remove(this._textNode); + + if (this._showText && this.node.title) { + this._textNode = this.createElement('span'); + this._textNode.className = 'text'; + this._textNode.appendChild(this.createTextNode(this.node.title)); + this.node.appendChild(this._textNode); + } + } +}); diff --git a/js/htk/button/style.scss b/js/htk/button/style.scss new file mode 100644 index 00000000..4ac5ef43 --- /dev/null +++ b/js/htk/button/style.scss @@ -0,0 +1,10 @@ + +.htk-button { + display: flex; + align-items: center; + gap: 8px; + + & > .htk-icon { + display: block; + } +} \ No newline at end of file diff --git a/js/htk/field/calendar.js b/js/htk/calendar/index.js similarity index 89% rename from js/htk/field/calendar.js rename to js/htk/calendar/index.js index 0a1eb085..aeaeb569 100644 --- a/js/htk/field/calendar.js +++ b/js/htk/calendar/index.js @@ -1,16 +1,15 @@ +require('./style.scss'); module.exports = new Class({ Extends: Htk.Field ,Tag: 'htk-calendar' - ,Properties: - { - restrictFunc: - { + ,Properties: { + restrictFunc: { type: Function ,set: function(x) { this._restrictFunc = x; } - ,get: function(x) { + ,get: function() { return this._restrictFunc; } } @@ -22,10 +21,7 @@ module.exports = new Class({ ,month: null ,render: function() { - var len = Vn.Date.WDays.length; - - var node = this.createRoot('div'); - node.className = 'htk-calendar'; + this.createRoot('div'); var table = this.createElement('table'); this.node.appendChild(table); @@ -33,6 +29,7 @@ module.exports = new Class({ var colgroup = this.createElement('colgroup'); table.appendChild(colgroup); + var len = Vn.Date.WDays.length; for (var i = 0; i < len; i++) colgroup.appendChild(this.createElement('col')); @@ -43,12 +40,17 @@ module.exports = new Class({ thead.appendChild(tr); var th = this.createElement('th'); - th.appendChild(this.createTextNode('<')); - th.className = 'button'; - th.addEventListener('click', this.prevMonthClicked.bind(this)); + th.className = 'previous'; tr.appendChild(th); + var previousButton = new Htk.Button({ + icon: 'arrow_back_ios' + }).node; + previousButton.addEventListener('click', this.prevMonthClicked.bind(this)); + th.appendChild(previousButton); + var th = this.createElement('th'); + th.className = 'month-year'; th.colSpan = 5; tr.appendChild(th); @@ -62,12 +64,17 @@ module.exports = new Class({ th.appendChild(yearNode); var th = this.createElement('th'); - th.appendChild(this.createTextNode('>')); - th.className = 'button'; - th.addEventListener('click', this.nextMonthClicked.bind(this)); + th.className = 'next'; tr.appendChild(th); + + var nextButton = new Htk.Button({ + icon: 'arrow_forward_ios' + }).node; + nextButton.addEventListener('click', this.nextMonthClicked.bind(this)); + th.appendChild(nextButton); var tr = this.createElement('tr'); + tr.className = 'weekdays'; thead.appendChild(tr); for (var i = 1; i <= len; i++) { diff --git a/js/htk/calendar/style.scss b/js/htk/calendar/style.scss new file mode 100644 index 00000000..56761078 --- /dev/null +++ b/js/htk/calendar/style.scss @@ -0,0 +1,94 @@ +@import "../style/variables"; +@import "../style/classes"; + +.htk-calendar { + @extend %box; + width: 20em; + + table { + border-collapse: collapse; + } + thead tr, + tfoot tr { + font-weight: normal; + vertical-align: middle; + text-align: center; + height: 3em; + } + thead > tr { + &.weekdays > th { + font-weight: normal; + color: #999; + text-transform: lowercase; + } + & > th { + &.previous, &.next { + font-size: .8rem; + + button { + border-radius: 50%; + padding: 10px; + display: block; + margin: 0 auto; + + & > .htk-icon { + font-size: 1rem; + } + } + } + &.month-year { + font-size: 1.2rem; + text-transform: lowercase; + } + } + } + tfoot tr { + border-top: none; + } + th.button { + display: table-cell; + } + th.button:hover { + cursor: pointer; + background-color: rgba(1, 1, 1, 0.2); + } + col { + width: 14.2%; + } + tr { + height: 2em; + } + tbody td { + text-align: right; + } + tbody td > div { + height: 2em; + width: 2em; + line-height: 2em; + text-align: center; + border-radius: 2em; + padding: 0.3em; + margin: 0 auto; + color: #555; + } + div { + &.disabled { + color: #bbb; + } + &.today { + font-weight: bold; + color: black; + } + &.selected { + color: white; + background-color: $color-primary; + } + &.enabled { + @extend %clickable; + + &:hover { + background-color: rgba(140, 198, 63, 0.8); + } + } + } +} diff --git a/js/htk/check/index.js b/js/htk/check/index.js new file mode 100644 index 00000000..56d4f8e8 --- /dev/null +++ b/js/htk/check/index.js @@ -0,0 +1,26 @@ + +module.exports = new Class({ + Extends: Htk.Field + ,Tag: 'htk-check' + + ,render: function() { + var node = this.createRoot('input'); + node.type = 'checkbox'; + node.addEventListener('change', this.changed.bind(this)); + } + + ,changed: function() { + this.valueChanged(this.node.checked); + } + + ,putValue: function(value) { + if (value) + this.node.checked = true; + else + this.node.checked = false; + } + + ,setEditable: function(editable) { + this.node.disabled = !editable; + } +}); diff --git a/js/htk/column/check.js b/js/htk/column/check.js deleted file mode 100644 index 950187d0..00000000 --- a/js/htk/column/check.js +++ /dev/null @@ -1,34 +0,0 @@ - -module.exports = new Class -({ - Extends: Htk.Column - ,Tag: 'htk-column-check' - - ,initialize: function (props) - { - this._cssClass = 'cell-check'; - this.parent (props); - } - - ,render: function (tr) - { - var checkButton = this.createElement ('input'); - checkButton.type = 'checkbox'; - checkButton.checked = this.value; - - if (this.editable) - checkButton.addEventListener ('changed', - this.inputChanged.bind (this, tr, node)); - else - checkButton.disabled = true; - - var td = this.parent (tr); - td.appendChild (checkButton); - return td; - } - - ,inputChanged: function (tr, node) - { - this.changed (tr, node.value); - } -}); diff --git a/js/htk/column.js b/js/htk/column/index.js similarity index 53% rename from js/htk/column.js rename to js/htk/column/index.js index fbd701e3..e5f9385b 100644 --- a/js/htk/column.js +++ b/js/htk/column/index.js @@ -1,51 +1,41 @@ -var NodeBuilder = require ('./node-builder'); +var NodeBuilder = require('../../vn/node-builder'); /** * Represents a grid column. This is an abstract class and should not be * instantiated directly. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: NodeBuilder ,Tag: 'htk-column' - ,Properties: - { - value: - { + ,Properties: { + value: { type: String ,value: null }, - column: - { + column: { type: String ,value: null }, - columnIndex: - { + columnIndex: { type: Number ,value: -1 }, - title: - { + title: { type: String ,value: null }, - editable: - { + editable: { type: Boolean ,value: false }, - renderer: - { + renderer: { type: Function ,value: false }, - class: - { + class: { type: String - ,set: function (x) - { + ,set: function(x) { this._userCssClass = x; if (this._cssClass) @@ -53,8 +43,7 @@ module.exports = new Class else this._cssClass = x; } - ,get: function () - { + ,get: function() { return this._userCssClass; } } @@ -65,19 +54,17 @@ module.exports = new Class /** * Initializes the column. - **/ - ,initialize: function (props) - { - this.parent (props); - this.td = this.createElement ('td'); + */ + ,initialize: function(props) { + NodeBuilder.prototype.initialize.call(this, props); + this.td = this.createElement('td'); } - ,renderHeader: function () - { - var th = this.createElement ('th'); + ,renderHeader: function() { + var th = this.createElement('th'); if (this.title) - th.appendChild (this.createTextNode (this.title)); + th.appendChild(this.createTextNode(this.title)); return th; } @@ -86,10 +73,9 @@ module.exports = new Class * Draws the cell and returns its associated td. * * @return {HTMLTableData} the rendered cell - **/ - ,render: function () - { - var td = this.td.cloneNode (true); + */ + ,render: function() { + var td = this.td.cloneNode(true); if (this._cssClass) td.className = this._cssClass; @@ -97,15 +83,13 @@ module.exports = new Class return td; } - ,updateColumnIndex: function (model) - { - if (this.column) - this.columnIndex = model.getColumnIndex (this.column); + ,updateColumnName: function(model) { + if (this.columnIndex !== -1) + this.column = model.getColumnName(this.columnIndex); } - ,changed: function (tr, newValue) - { - this.signalEmit ('changed', tr.rowIndex - 1, newValue); + ,changed: function(tr, newValue) { + this.emit('changed', tr.rowIndex - 1, newValue); } }); diff --git a/js/htk/column/radio.js b/js/htk/column/radio.js deleted file mode 100644 index a10235d2..00000000 --- a/js/htk/column/radio.js +++ /dev/null @@ -1,39 +0,0 @@ - -module.exports = new Class -({ - Extends: Htk.Column - ,Tag: 'htk-column-radio' - ,Properties: - { - param: - { - type: Vn.Param - ,set: function (x) - { - this.radioGroup.master = x; - } - } - } - - ,initialize: function (props) - { - this._cssClass = 'cell-radio'; - this.radioGroup = new Htk.RadioGroup (this.doc); - this.parent (props); - } - - ,render: function (tr) - { - var td = this.parent (tr); - - var radio = this.radioGroup.createButton (this.value); - td.appendChild (radio); - - return td; - } - - ,clear: function () - { - this.radioGroup.clear (); - } -}); diff --git a/js/htk/column/spin.js b/js/htk/column/spin.js deleted file mode 100644 index eaed6852..00000000 --- a/js/htk/column/spin.js +++ /dev/null @@ -1,73 +0,0 @@ - -module.exports = new Class -({ - Extends: Htk.Column - ,Tag: 'htk-column-spin' - ,Properties: - { - /** - * The text to append to the number. - **/ - unit: - { - type: String - ,value: null - }, - /** - * The number of decimal places to display. - **/ - digits: { - type: Number - ,value: 0 - } - } - - ,initialize: function (props) - { - this._cssClass = 'cell-spin'; - this.parent (props); - } - - ,renderHeader: function () - { - var th = this.parent (); - th.className = 'cell-spin'; - return th; - } - - ,render: function (tr) - { - var td = this.parent (tr); - - var valueString = null; - - if (this.value !== null && this.value !== undefined) - valueString = new Number (this.value).toFixed (this.digits); - - if (this.editable) - { - var entry = this.createElement ('input'); - entry.type = 'text'; - entry.addEventListener ('change', this.inputChanged.bind (this, tr, entry)); - td.appendChild (entry); - - if (valueString) - entry.value = valueString; - } - else if (valueString) - { - if (this.unit) - valueString = valueString + this.unit; - - var text = this.createTextNode (valueString); - td.appendChild (text); - } - - return td; - } - - ,inputChanged: function (tr, entry) - { - this.changed (tr, parseInt (entry.value)); - } -}); diff --git a/js/htk/column/text.js b/js/htk/column/text.js deleted file mode 100644 index ae1eb277..00000000 --- a/js/htk/column/text.js +++ /dev/null @@ -1,60 +0,0 @@ - -module.exports = new Class -({ - Extends: Htk.Column - ,Tag: 'htk-column-text' - ,Properties: - { - /** - * Format that applies to the value. - **/ - format: - { - type: String - ,set: function (x) - { - this._format = _(x); - } - ,get: function () - { - return this._format; - } - } - } - - ,_format: null - - ,initialize: function (props) - { - this._cssClass = 'cell-text'; - this.parent (props); - } - - ,render: function (tr) - { - var node; - - if (this.editable) - { - var value = this.value ? this.value : ''; - - node = this.createElement ('input'); - node.type = 'text'; - node.value = value; - node.addEventListener ('changed', - this.inputChanged.bind (this, tr, node)); - } - else - node = this.createTextNode ( - Vn.Value.format (this.value, this._format)); - - var td = this.parent (tr); - td.appendChild (node); - return td; - } - - ,inputChanged: function (tr, node) - { - this.changed (tr, node.value); - } -}); diff --git a/js/htk/column/button.js b/js/htk/columns/button/index.js similarity index 72% rename from js/htk/column/button.js rename to js/htk/columns/button/index.js index e799a121..552a39e5 100644 --- a/js/htk/column/button.js +++ b/js/htk/columns/button/index.js @@ -1,3 +1,4 @@ +require('./style.scss'); module.exports = new Class({ Extends: Htk.Column, @@ -9,13 +10,10 @@ module.exports = new Class({ }, icon: { type: String - ,set: function(x) - { + ,set: function(x) { this._icon = x; - this.image = 'image/icon/light/'+ x +'.svg'; } - ,get: function() - { + ,get: function() { return this._icon; } }, @@ -39,13 +37,13 @@ module.exports = new Class({ initialize: function(props) { this._cssClass = 'cell-button'; - this.parent(props); + Htk.Column.prototype.initialize.call(this, props); }, render: function(tr) { - var td = this.parent(tr); + const td = Htk.Column.prototype.render.call(this, tr); - var button; + let button; if (this.href == null) { button = this.createElement('button'); @@ -57,22 +55,21 @@ module.exports = new Class({ button.target = this.target; } + if (this.tip) + button.title = _(this.tip); + button.disabled = this.disabled; td.appendChild(button); - var img = this.createElement('img'); - img.src = this.image; - button.appendChild(img); - - if (this.tip) { - button.title = _(this.tip); - img.title = _(this.tip); - } + const icon = new Htk.Icon({ + name: this._icon + }); + button.appendChild(icon.node); return td; }, buttonClicked: function(value, tr, button) { - this.signalEmit('clicked', value, tr.rowIndex - 1, button); + this.emit('clicked', value, tr.rowIndex - 1, button); } }); diff --git a/js/htk/columns/button/style.scss b/js/htk/columns/button/style.scss new file mode 100644 index 00000000..e9e60890 --- /dev/null +++ b/js/htk/columns/button/style.scss @@ -0,0 +1,34 @@ +@import "../../style/classes"; + +td.cell-button { + max-width: 20px; + text-align: center; + + & > button, + & > a { + @extend %clickable; + display: block; + height: 44px; + width: 44px; + margin: 0 auto; + border: none; + border-radius: 50%; + padding: 10px; + background-color: transparent; + box-sizing: border-box; + + & > .htk-icon { + display: block; + } + &:hover { + background-color: rgba(1, 1, 1, 0.1); + } + } + img { + height: 1.5em; + width: 1.5em; + display: block; + margin: auto; + padding: 0; + } +} diff --git a/js/htk/columns/check/index.js b/js/htk/columns/check/index.js new file mode 100644 index 00000000..0face4d1 --- /dev/null +++ b/js/htk/columns/check/index.js @@ -0,0 +1,31 @@ +require('./style.scss'); + +module.exports = new Class({ + Extends: Htk.Column + ,Tag: 'htk-column-check' + + ,initialize: function(props) { + this._cssClass = 'cell-check'; + Htk.Column.prototype.initialize.call(this, props); + } + + ,render: function(tr) { + var checkButton = this.createElement('input'); + checkButton.type = 'checkbox'; + checkButton.checked = this.value; + + if (this.editable) + checkButton.addEventListener('changed', + this.inputChanged.bind(this, tr, node)); + else + checkButton.disabled = true; + + var td = Htk.Column.prototype.render.call(this, tr); + td.appendChild(checkButton); + return td; + } + + ,inputChanged: function(tr, node) { + this.changed(tr, node.value); + } +}); diff --git a/js/htk/columns/check/style.scss b/js/htk/columns/check/style.scss new file mode 100644 index 00000000..bdee6773 --- /dev/null +++ b/js/htk/columns/check/style.scss @@ -0,0 +1,5 @@ + +th.cell-check, +th.cell-radio { + text-align: center; +} diff --git a/js/htk/column/date.js b/js/htk/columns/date/index.js similarity index 50% rename from js/htk/column/date.js rename to js/htk/columns/date/index.js index 94866871..336573fc 100644 --- a/js/htk/column/date.js +++ b/js/htk/columns/date/index.js @@ -7,16 +7,14 @@ module.exports = new Class { /** * Format that applies to the value. - **/ + */ format: { type: String - ,set: function (x) - { + ,set: function(x) { this._format = _(x); } - ,get: function () - { + ,get: function() { return this._format; } } @@ -24,18 +22,16 @@ module.exports = new Class ,_format: _('%a, %e %b %Y') - ,initialize: function (props) - { + ,initialize: function(props) { this._cssClass = 'cell-date'; - this.parent (props); + Htk.Column.prototype.initialize.call(this, props); } - ,render: function (tr) - { - var text = Vn.Date.strftime (this.value, this._format); + ,render: function(tr) { + var text = Vn.Date.strftime(this.value, this._format); - var td = this.parent (tr); - td.appendChild (this.createTextNode (text)); + var td = Htk.Column.prototype.render.call(this, tr); + td.appendChild(this.createTextNode(text)); return td; } diff --git a/js/htk/column/image.js b/js/htk/columns/image/index.js similarity index 63% rename from js/htk/column/image.js rename to js/htk/columns/image/index.js index ddad8143..3542f238 100644 --- a/js/htk/column/image.js +++ b/js/htk/columns/image/index.js @@ -1,52 +1,45 @@ +require('./style.scss'); -module.exports = new Class -({ +module.exports = new Class({ Extends: Htk.Column ,Tag: 'htk-column-image' - ,Properties: - { + ,Properties: { /** * The directory where the images are allocated. - **/ - directory: - { + */ + directory:{ type: String ,value: null }, /** * The subdirectory where the images are allocated. - **/ - subdir: - { + */ + subdir:{ type: String ,value: null }, /** * Subdirectory where full images are allocated. - **/ - fullDir: - { + */ + fullDir:{ type: String ,value: null }, /** * The REST connection used to upload the image. - **/ - conn: - { + */ + conn:{ type: Vn.JsonConnection } } - ,initialize: function (props) - { + ,initialize: function(props) { this._cssClass = 'cell-image'; - this.parent (props); + Htk.Column.prototype.initialize.call(this, props); } - ,render: function (tr) - { - var image = new Htk.Image ({ + ,render: function(tr) { + var image = new Htk.Image({ directory: this.directory ,subdir: this.subdir ,fullDir: this.fullDir @@ -55,8 +48,8 @@ module.exports = new Class ,doc: this.doc }); - var td = this.parent (tr); - td.appendChild (image.node); + var td = Htk.Column.prototype.render.call(this, tr); + td.appendChild(image.node); return td; } }); diff --git a/js/htk/columns/image/style.scss b/js/htk/columns/image/style.scss new file mode 100644 index 00000000..9be8f215 --- /dev/null +++ b/js/htk/columns/image/style.scss @@ -0,0 +1,11 @@ + +td.cell-image { + text-align: center; + + .htk-image { + max-width: 2.5em; + max-height: 2.5em; + display: block; + margin: auto; + } +} diff --git a/js/htk/column/link.js b/js/htk/columns/link/index.js similarity index 52% rename from js/htk/column/link.js rename to js/htk/columns/link/index.js index d50437f2..23b44895 100644 --- a/js/htk/column/link.js +++ b/js/htk/columns/link/index.js @@ -1,39 +1,34 @@ -module.exports = new Class -({ +module.exports = new Class({ Extends: Htk.Column ,Tag: 'htk-column-link' - ,Properties: - { + ,Properties: { /** * The link url. - **/ - href: - { + */ + href:{ type: String ,value: null }, /** * the target where the link is opened. - **/ - target: - { + */ + target:{ type: String ,value: null } } - ,render: function (tr) - { - var link = this.createElement ('a'); + ,render: function(tr) { + var link = this.createElement('a'); link.href = this.href; - link.appendChild (this.createTextNode (this.value)); + link.appendChild(this.createTextNode(this.value)); if (this.target) link.target = this.target; - var td = this.parent (tr); - td.appendChild (link); + var td = Htk.Column.prototype.render.call(this, tr); + td.appendChild(link); return td; } }); diff --git a/js/htk/columns/radio/index.js b/js/htk/columns/radio/index.js new file mode 100644 index 00000000..29b753e4 --- /dev/null +++ b/js/htk/columns/radio/index.js @@ -0,0 +1,32 @@ + +module.exports = new Class({ + Extends: Htk.Column + ,Tag: 'htk-column-radio' + ,Properties: { + param:{ + type: Vn.Param + ,set: function(x) { + this.radioGroup.master = x; + } + } + } + + ,initialize: function(props) { + this._cssClass = 'cell-radio'; + this.radioGroup = new Htk.RadioGroup(this.doc); + Htk.Column.prototype.initialize.call(this, props); + } + + ,render: function(tr) { + var td = Htk.Column.prototype.render.call(this, tr); + + var radio = this.radioGroup.createButton(this.value); + td.appendChild(radio); + + return td; + } + + ,clear: function() { + this.radioGroup.clear(); + } +}); diff --git a/js/htk/columns/spin/index.js b/js/htk/columns/spin/index.js new file mode 100644 index 00000000..85022c4e --- /dev/null +++ b/js/htk/columns/spin/index.js @@ -0,0 +1,64 @@ +require('./style.scss'); + +module.exports = new Class({ + Extends: Htk.Column + ,Tag: 'htk-column-spin' + ,Properties: { + /** + * The text to append to the number. + */ + unit:{ + type: String + ,value: null + }, + /** + * The number of decimal places to display. + */ + digits: { + type: Number + ,value: 0 + } + } + + ,initialize: function(props) { + this._cssClass = 'cell-spin'; + Htk.Column.prototype.initialize.call(this, props); + } + + ,renderHeader: function() { + var th = Htk.Column.prototype.renderHeader.call(this, ); + th.className = 'cell-spin'; + return th; + } + + ,render: function(tr) { + var td = Htk.Column.prototype.render.call(this, tr); + + var valueString = null; + + if (this.value !== null && this.value !== undefined) + valueString = new Number(this.value).toFixed(this.digits); + + if (this.editable) { + var entry = this.createElement('input'); + entry.type = 'text'; + entry.addEventListener('change', this.inputChanged.bind(this, tr, entry)); + td.appendChild(entry); + + if (valueString) + entry.value = valueString; + } else if (valueString) { + if (this.unit) + valueString = valueString + this.unit; + + var text = this.createTextNode(valueString); + td.appendChild(text); + } + + return td; + } + + ,inputChanged: function(tr, entry) { + this.changed(tr, parseInt(entry.value)); + } +}); diff --git a/js/htk/columns/spin/style.scss b/js/htk/columns/spin/style.scss new file mode 100644 index 00000000..33603fb3 --- /dev/null +++ b/js/htk/columns/spin/style.scss @@ -0,0 +1,8 @@ + +th.cell-spin { + text-align: right; +} +td.cell-spin { + width: 2.5em; + text-align: right; +} diff --git a/js/htk/columns/text/index.js b/js/htk/columns/text/index.js new file mode 100644 index 00000000..749823c1 --- /dev/null +++ b/js/htk/columns/text/index.js @@ -0,0 +1,50 @@ + +module.exports = new Class({ + Extends: Htk.Column + ,Tag: 'htk-column-text' + ,Properties: { + /** + * Format that applies to the value. + */ + format:{ + type: String + ,set: function(x) { + this._format = _(x); + } + ,get: function() { + return this._format; + } + } + } + + ,_format: null + + ,initialize: function(props) { + this._cssClass = 'cell-text'; + Htk.Column.prototype.initialize.call(this, props); + } + + ,render: function(tr) { + var node; + + if (this.editable) { + var value = this.value ? this.value : ''; + + node = this.createElement('input'); + node.type = 'text'; + node.value = value; + node.addEventListener('changed', + this.inputChanged.bind(this, tr, node)); + } else + node = this.createTextNode( + Vn.Value.format(this.value, this._format)); + + var td = Htk.Column.prototype.render.call(this, tr); + td.appendChild(node); + return td; + } + + ,inputChanged: function(tr, node) { + this.changed(tr, node.value); + } +}); diff --git a/js/htk/component.js b/js/htk/component.js deleted file mode 100644 index 9f6465fb..00000000 --- a/js/htk/component.js +++ /dev/null @@ -1,49 +0,0 @@ - -var Widget = require ('./widget'); - -module.exports = new Class -({ - Extends: Widget - - ,builder: null - - ,builderInit: function (path) - { - var builder = new Vn.Builder (); - builder.signalData = this; - builder.loadXml (path, this.doc); - this.builderResultInit (builder); - } - - ,builderInitString: function (xmlString) - { - var builder = new Vn.Builder (); - builder.signalData = this; - builder.loadFromString (xmlString, this.doc); - this.builderResultInit (builder); - } - - ,builderResultInit: function (builder) - { - var res = this.builder = builder.load (); - this._node = res.$('main'); - res.link (); - } - - ,$: function (id) - { - if (this.builder) - return this.builder.getById (id); - - return null; - } - - ,_destroy: function () - { - if (this.builder) - this.builder.unref (); - - this.parent (); - } -}); - diff --git a/js/htk/date-chooser/index.js b/js/htk/date-chooser/index.js new file mode 100644 index 00000000..6c323504 --- /dev/null +++ b/js/htk/date-chooser/index.js @@ -0,0 +1,73 @@ +require('./style.scss'); +var Calendar = require('../calendar'); + +module.exports = new Class({ + Extends: Htk.Field + ,Tag: 'htk-date-chooser' + + ,format: _('%a, %e %b %Y') + ,calendar: null + ,ignoreCalendarChange: false + + ,render: function() { + const node = this.createRoot('button'); + node.classList.add('input'); + node.addEventListener('click', this._onClick.bind(this)); + + this.label = this.createElement('span'); + node.appendChild(this.label); + + const dropDown = new Htk.Icon({ + name: 'expand_more' + }); + node.appendChild(dropDown.node); + + this.setEditable(this._editable); + } + + ,putValue: function(value) { + var dateString; + + if (value instanceof Date) + dateString = Vn.Date.strftime(value, this.format); + else + dateString = ''; + + Vn.Node.setText(this.label, dateString); + } + + ,setEditable: function(editable) { + if (this.calendar) { + this.calendar.disconnectByInstance(this); + this.calendar = null; + } + if (editable) { + this.calendar = new Calendar(); + this.calendar.on('changed', this._onCalendarChange.bind(this)); + + this.popup = new Htk.Popup(); + this.popup.child = this.calendar; + } + } + + ,_onCalendarChange: function(calendar) { + if (this.ignoreCalendarChange) + return; + + this.popup.hide(); + + var newDate = calendar.value; + this.putValue(newDate); + this.valueChanged(newDate); + } + + ,_onClick: function() { + this.ignoreCalendarChange = true; + this.calendar.value = this._value; + this.calendar.goToSelectedMonth(); + this.ignoreCalendarChange = false; + + this.popup.show(this.node); + } +}); + diff --git a/js/htk/date-chooser/style.scss b/js/htk/date-chooser/style.scss new file mode 100644 index 00000000..5a464056 --- /dev/null +++ b/js/htk/date-chooser/style.scss @@ -0,0 +1,17 @@ + +.htk-date-chooser { + display: flex; + align-items: center; + font-weight: normal; + + & > span { + flex: 1; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + & > .htk-icon { + flex: none; + color: #666; + } +} \ No newline at end of file diff --git a/js/htk/dialog.js b/js/htk/dialog/index.js similarity index 93% rename from js/htk/dialog.js rename to js/htk/dialog/index.js index 5b74cdc7..5ac11fd2 100644 --- a/js/htk/dialog.js +++ b/js/htk/dialog/index.js @@ -1,9 +1,9 @@ - -var Popup = require('./popup'); +require('./style.scss'); +var Popup = require('../popup'); /** * Class to show message dialogs with buttons. - **/ + */ var Dialog = new Class(); module.exports = Dialog; @@ -53,7 +53,7 @@ Dialog.implement({ { /** * The message displayed to the user. - **/ + */ message: { type: String @@ -66,7 +66,7 @@ Dialog.implement({ } /** * The dialog icon. - **/ + */ ,icon: { type: String @@ -79,7 +79,7 @@ Dialog.implement({ } /** * The dialog buttons. - **/ + */ ,buttons: { enumType: Button @@ -97,7 +97,7 @@ Dialog.implement({ ,_buttons: Button.ACCEPT ,open: function() { - this.parent(); + Popup.prototype.open.call(this); // Dialog body @@ -146,8 +146,8 @@ Dialog.implement({ ,hide(response) { if (!this._isOpen) return; - this.parent(); - this.signalEmit('response', response); + Popup.prototype.hide.call(this); + this.emit('response', response); } ,createButton: function(label, response) { diff --git a/js/htk/dialog/style.scss b/js/htk/dialog/style.scss new file mode 100644 index 00000000..e2073089 --- /dev/null +++ b/js/htk/dialog/style.scss @@ -0,0 +1,25 @@ + +.htk-dialog { + padding: 1.5em; + max-width: 20em; + font-weight: normal; + color: #555; + + p { + margin: 0; + } + img { + float: left; + height: 3em; + margin-top: 0; + margin-right: 1em; + } + p { + padding: 0; + } + .button-bar > button { + float: right; + margin-left: 1em; + margin-top: .5em; + } +} \ No newline at end of file diff --git a/js/htk/entry/index.js b/js/htk/entry/index.js new file mode 100644 index 00000000..fed77876 --- /dev/null +++ b/js/htk/entry/index.js @@ -0,0 +1,74 @@ + +module.exports = new Class({ + Extends: Htk.Field + ,Tag: 'htk-entry' + ,Properties: { + /** + * Displayed text when there is no content. + */ + placeholder: + { + type: String + ,set: function(x) { + this.node.placeholder = x; + } + ,get: function() { + return this.node.placeholder; + } + }, + /** + * Whether is disabled. + */ + disabled: + { + type: Boolean + ,set: function(x) { + this.node.disabled = x; + } + ,get: function() { + return this.node.disabled; + } + }, + /** + * Whether is readonly data. + */ + readonly: + { + type: Boolean + ,set: function(x) { + this.node.readonly = x; + } + ,get: function() { + return this.node.readonly; + } + } + } + + ,render: function() { + var node = this.createRoot('input'); + node.type = 'text'; + node.addEventListener('change', this._onChange.bind(this)); + } + + ,_onChange: function() { + var newValue; + + if (this.node.value == '') + newValue = null; + else + newValue = this.node.value; + + this.valueChanged(newValue); + } + + ,putValue: function(value) { + if (!value) + this.node.value = ''; + else + this.node.value = value; + } + + ,setEditable: function(editable) { + this.node.readOnly = !editable; + } +}); diff --git a/js/htk/field/bar-button.js b/js/htk/field/bar-button.js deleted file mode 100644 index e3554136..00000000 --- a/js/htk/field/bar-button.js +++ /dev/null @@ -1,22 +0,0 @@ - -var Button = require ('./button'); - -module.exports = new Class -({ - Extends: Button - ,Tag: 'htk-bar-button' - ,Properties: - { - icon: - { - type: String - ,set: function (x) - { - this.img.src = 'image/icon/dark/'+ x +'.svg'; - } - - } - } - - ,_showText: true -}); diff --git a/js/htk/field/button.js b/js/htk/field/button.js deleted file mode 100644 index 5eb89c3d..00000000 --- a/js/htk/field/button.js +++ /dev/null @@ -1,86 +0,0 @@ - -module.exports = new Class -({ - Extends: Htk.Field - ,Tag: 'htk-button' - ,Properties: - { - image: - { - type: String - ,set: function (x) - { - this.img.src = x; - } - }, - icon: - { - type: String - ,set: function (x) - { - this.img.src = 'image/icon/light/'+ x +'.svg'; - } - }, - tip: - { - type: String - ,set: function (x) - { - if (x) - { - this.node.title = _(x); - this.img.title = _(x); - } - - this.renderContent (); - } - ,get: function () - { - return this.node.title; - } - }, - showText: - { - type: Boolean - ,set: function (x) - { - this._showText = x; - this.renderContent (); - } - ,get: function () - { - return this._showText; - } - } - } - - ,_showText: false - - ,render: function () - { - var node = this.createRoot ('button'); - node.className = 'htk-button'; - node.addEventListener ('click', this.onClick.bind (this)); - - this.img = this.createElement ('img'); - node.appendChild (this.img); - } - - ,renderContent: function () - { - if (this._textNode) - Vn.Node.remove (this._textNode); - - if (this._showText && this.node.title) - { - this._textNode = this.createElement ('span'); - this._textNode.appendChild (this.createTextNode (this.node.title)); - this.node.appendChild (this._textNode); - } - } - - ,onClick: function () - { - this.signalEmit ('click', this._form); - } -}); diff --git a/js/htk/field/check.js b/js/htk/field/check.js deleted file mode 100644 index 2cfc9b5e..00000000 --- a/js/htk/field/check.js +++ /dev/null @@ -1,31 +0,0 @@ - -module.exports = new Class -({ - Extends: Htk.Field - ,Tag: 'htk-check' - - ,render: function () - { - var node = this.createRoot ('input'); - node.type = 'checkbox'; - node.addEventListener ('change', this.changed.bind (this)); - } - - ,changed: function () - { - this.valueChanged (this.node.checked); - } - - ,putValue: function (value) - { - if (value) - this.node.checked = true; - else - this.node.checked = false; - } - - ,setEditable: function (editable) - { - this.node.disabled = !editable; - } -}); diff --git a/js/htk/field/date-chooser.js b/js/htk/field/date-chooser.js deleted file mode 100644 index 275bb793..00000000 --- a/js/htk/field/date-chooser.js +++ /dev/null @@ -1,89 +0,0 @@ - -var Calendar = require ('./calendar'); - -module.exports = new Class -({ - Extends: Htk.Field - ,Tag: 'htk-date-chooser' - - ,format: _('%a, %e %b %Y') - ,calendar: null - ,ignoreCalendarChange: false - - ,render: function () - { - var node = this.createRoot ('div'); - node.className = 'htk-date-chooser'; - - this.label = this.createElement ('span'); - this.node.appendChild (this.label); - - this.setEditable (this._editable); - } - - ,putValue: function (value) - { - var dateString; - - if (value instanceof Date) - dateString = Vn.Date.strftime (value, this.format); - else - dateString = ''; - - Vn.Node.setText (this.label, dateString); - } - - ,setEditable: function (editable) - { - Vn.Node.remove (this.label); - - if (this.calendar) - { - this.node.removeChild (this.button); - - this.calendar.disconnectByInstance (this); - this.calendar = null; - } - - if (editable && !this.calendar) - { - this.button = this.createElement ('button'); - this.button.className = 'input'; - this.button.title = _('ChangeDate'); - this.button.addEventListener ('click', this._onClick.bind (this)); - this.button.appendChild (this.label); - this.node.appendChild (this.button); - - this.calendar = new Calendar (); - this.calendar.on ('changed', this._onCalendarChange.bind (this)); - - this.popup = new Htk.Popup (); - this.popup.child = this.calendar; - } - else if (!editable) - this.node.appendChild (this.label); - } - - ,_onCalendarChange: function (calendar) - { - if (this.ignoreCalendarChange) - return; - - this.popup.hide (); - - var newDate = calendar.value; - this.putValue (newDate); - this.valueChanged (newDate); - } - - ,_onClick: function (event) - { - this.ignoreCalendarChange = true; - this.calendar.value = this._value; - this.calendar.goToSelectedMonth (); - this.ignoreCalendarChange = false; - - this.popup.show (this.button); - } -}); - diff --git a/js/htk/field/entry.js b/js/htk/field/entry.js deleted file mode 100644 index a6970f3a..00000000 --- a/js/htk/field/entry.js +++ /dev/null @@ -1,38 +0,0 @@ - -module.exports = new Class -({ - Extends: Htk.Field - ,Tag: 'htk-entry' - - ,render: function () - { - var node = this.createRoot ('input'); - node.type = 'text'; - node.addEventListener ('change', this._onChange.bind (this)); - } - - ,_onChange: function (event) - { - var newValue; - - if (this.node.value == '') - newValue = null; - else - newValue = this.node.value; - - this.valueChanged (newValue); - } - - ,putValue: function (value) - { - if (!value) - this.node.value = ''; - else - this.node.value = value; - } - - ,setEditable: function (editable) - { - this.node.readOnly = !editable; - } -}); diff --git a/js/htk/field.js b/js/htk/field/index.js similarity index 52% rename from js/htk/field.js rename to js/htk/field/index.js index c022f4cb..aae49706 100644 --- a/js/htk/field.js +++ b/js/htk/field/index.js @@ -1,12 +1,12 @@ -var Widget = require('./widget'); +var Component = require('vn/component'); module.exports = new Class({ - Extends: Widget + Extends: Component + ,Implements: Vn.ParamIface ,Tag: 'htk-field' ,Child: 'param' - ,Properties: - { + ,Properties: { value: { type: String ,set: function(x) { @@ -18,21 +18,57 @@ module.exports = new Class({ this.valueChanged(x); this.putValue(x); + this._notifyChanges(); } - ,get: function(x) { + ,get: function() { return this._value; } }, param: { - type: Vn.Param + type: Vn.ParamIface ,set: function(x) { - this.link({_param: x}, {'changed': this.onParamChange}); - this.onParamChange(); + this._setParam(x); } ,get: function() { return this._param; } }, + lot: { + type: Vn.LotIface + ,set: function(x) { + this._setLot(x); + } + ,get: function() { + return this._lot; + } + }, + name: { + type: String + ,set: function(x) { + this._setName(x); + } + ,get: function() { + return this._name; + } + }, + oneWay: { + type: Boolean + ,set: function(x) { + this._oneWay = x; + } + ,get: function() { + return this._oneWay; + } + }, + oneTime: { + type: Boolean + ,set: function(x) { + this._oneTime = x; + } + ,get: function() { + return this._oneTime; + } + }, editable: { type: Boolean ,set: function(x) { @@ -48,21 +84,19 @@ module.exports = new Class({ form: { type: Db.Iterator ,set: function(x) { - this._form = x; - this.bindToForm(); + this.lot = x; } ,get: function() { - return this._form; + return this._lot; } }, column: { type: String ,set: function(x) { - this._paramName = x; - this.bindToForm(); + this.name = x; } ,get: function() { - return this._paramName; + return this._name; } }, conditionalFunc: { @@ -71,27 +105,24 @@ module.exports = new Class({ } } - ,_value: undefined - ,_param: null ,_editable: true - ,_blockParamChange: false - ,_blockValueChange: false + ,_lockField: false - ,onParamChange: function() { - if (!this._blockValueChange) { - this._blockParamChange = true; - this.value = this._param.value; - this._blockParamChange = false; - } - } - - ,bindToForm: function() { - if (this._form && this._paramName) - this.param = new Db.Param - ({ - form: this._form - ,column: this._paramName - }); + ,_setValue: function(newValue) { + if (!this._putValue(newValue)) + return; + + if (!this._lockField) + this.putValue(newValue); + + if (this.conditionalFunc) + this.conditionalFunc(this, newValue); + + const node = this.node; + if (node && node.nodeType === Node.ELEMENT_NODE) + node.classList.toggle('filled', newValue !== undefined); + + this._notifyChanges(); } /** @@ -99,36 +130,27 @@ module.exports = new Class({ * editable. * * @param {Boolean} editable Whether the user is allowed to edit the entry - **/ - ,setEditable: function(editable) {} + */ + ,setEditable: function() {} /** * Virtual method that must be implemented by class childs to put the value * on the associated entry. * * @param {Object} value The new value for the entry - **/ - ,putValue: function(value) {} + */ + ,putValue: function() {} /** * Protected method that should be called from class childs when the value * on the associated entry changes. * * @param {Object} value The new entry value - **/ + */ ,valueChanged: function(value) { - this._value = value; - - if (this.conditionalFunc) - this.conditionalFunc(this, value); - - if (this._param && !this._blockParamChange) { - this._blockValueChange = true; - this._param.value = value; - this._blockValueChange = false; - } - - this.signalEmit('changed'); + this._lockField = true; + this._setValue(value); + this._lockField = false; } }); diff --git a/js/htk/field/radio.js b/js/htk/field/radio.js deleted file mode 100644 index 103aec58..00000000 --- a/js/htk/field/radio.js +++ /dev/null @@ -1,75 +0,0 @@ - -var RadioGroup = require ('./radio-group'); - -module.exports = new Class -({ - Extends: Htk.Field - ,Tag: 'htk-radio' - ,Properties: - { - tip: - { - type: String - ,set: function (x) - { - if (x) - this.node.title = _(x); - } - }, - radioGroup: - { - type: RadioGroup - ,set: function (x) - { - if (this._radioGroup) - this._radioGroup.removeButton (this); - - this.link ({_radioGroup: x}, {'changed': this._onRadioGroupChange}); - this.node.name = x.name; - x.buttons.push(this); - this._onRadioGroupChange (); - } - ,get: function () - { - return this._radioGroup; - } - } - } - - ,_radioGroup: null - - ,render: function () - { - var radio = Vn.Browser.createRadio ('', this.doc); - radio.checked = false; - radio.addEventListener ('change', this._onChange.bind (this)); - this._node = radio; - } - - ,_onChange: function () - { - if (this.node.checked && this._radioGroup) - this._radioGroup.value = this.value; - } - - ,_onRadioGroupChange: function () - { - if (this._radioGroup.value && this._radioGroup.value == this.value) - this.node.checked = true; - else - this.node.checked = false; - } - - ,putValue: function (value) - { - if (!value) - this.node.value = ''; - else - this.node.value = value; - } - - ,setEditable: function (editable) - { - this.node.disabled = !editable; - } -}); diff --git a/js/htk/field/select.js b/js/htk/field/select.js deleted file mode 100644 index 2ffa6788..00000000 --- a/js/htk/field/select.js +++ /dev/null @@ -1,263 +0,0 @@ - -var ColumnText = require ('../column/text'); - -module.exports = new Class -({ - Extends: Htk.Field - ,Implements: Db.Iterator - ,Tag: 'htk-combo' - ,Properties: - { - /** - * The model associated to this form. - **/ - model: - { - type: Db.Model - ,set: function (x) - { - this.link ({_model: x}, {'status-changed-after': this._onModelChange}); - this._onModelChange (); - } - ,get: function () - { - return this._model; - } - }, - /** - * The row where the form positioned, has -1 if the row is unselected. - **/ - row: - { - type: Number - ,set: function (x) - { - if (!this._model || this._model.numRows <= x || x < -1) - x = -1; - if (x == this._row) - return; - - this._row = x; - this.iterChanged (); - } - ,get: function () - { - return this._row; - } - }, - /** - * The number of rows in the form. - **/ - numRows: - { - type: Number - ,get: function () - { - if (this._model) - return this._model.numRows; - - return 0; - } - }, - /** - * Checks if the form data is ready. - **/ - ready: - { - type: Boolean - ,get: function () - { - return this._model && this._model.ready; - } - }, - /** - * Checks if the form data is ready. - **/ - placeholder: - { - type: String - ,set: function (x) - { - this._placeholder = x; - this._refreshShowText (x); - } - ,get: function () - { - return this._placeholder; - } - }, - /** - * Wether to allow null values. - **/ - notNull: - { - type: Boolean - ,set: function (x) - { - this._notNull = x; - } - ,get: function () - { - return this._notNull; - } - } - } - - ,_row: -1 - ,_model: null - ,valueColumnIndex: 0 - ,valueColumnName: null - ,showColumnIndex: 1 - ,showColumnName: null - ,_notNull: true - ,_webkitRefresh: false - - ,render: function () - { - var button = this.createRoot ('button'); - button.type = 'button'; - button.className = 'htk-select input'; - button.addEventListener ('mousedown', this._onButtonMouseDown.bind (this)); - } - - ,on: function (id, callback, instance) - { - switch (id) - { - case 'click': - case 'mousedown': - case 'focusout': - this.node.addEventListener (id, - callback.bind (instance, this)); - break; - default: - this.parent (id, callback, instance); - } - } - - ,_setRow: function (row) - { - this._row = row; - this._refreshShowText (); - this.iterChanged (); - } - - ,_onButtonMouseDown: function (e) - { - if (this._popup) - { - this._popup.hide (); - return; - } - - var model = this._model; - - var menu = this.createElement ('div'); - menu.className = 'htk-select-menu'; - - var grid = new Htk.Grid ({showHeader: false}); - menu.appendChild (grid.node); - - var gridNode = grid.node; - gridNode.addEventListener ('click', this._onGridClicked.bind (this, grid)); - - var column = new ColumnText ({columnIndex: this.showColumnIndex}); - grid.appendColumn (column); - grid.model = model; - - var popup = this._popup = new Htk.Popup ({childNode: menu}); - popup.on ('closed', this._onPopupClose.bind (this)); - popup.show (this.node); - - this.signalEmit ('menu-show'); - - e.stopPropagation (); - } - - ,_onGridClicked: function (grid, e) - { - var target = e.target; - var parentNode = target.parentNode; - - while (parentNode !== grid.tbody) - { - target = parentNode; - parentNode = parentNode.parentNode; - } - - var value; - var row = target.rowIndex - 1; - - if (row >= 0) - value = this._model.getByIndex (row, this.valueColumnIndex); - else - value = null; - - this._setRow (row); - this.valueChanged (value); - this._popup.hide (); - - e.stopPropagation (); - } - - ,_onPopupClose: function () - { - this._popup = null; - this.signalEmit ('menu-hide'); - } - - ,_refreshShowText: function () - { - var model = this._model; - - if (this._row !== -1) - var showText = model.getByIndex (this._row, this.showColumnIndex); - else if (model && model.status === Db.Model.Status.LOADING) - var showText = _('Loading...'); - else if (this._placeholder) - var showText = this._placeholder; - else - var showText = ''; - - Vn.Node.setText (this.node, showText); - } - - ,_onModelChange: function () - { - var model = this._model; - this.signalEmit ('status-changed'); - - if (this._popup) - this._popup.reset (); - - if (model && model.ready) - { - this._selectOption (); - this.signalEmit ('ready'); - } - else - this._setRow (-1); - } - - ,setEditable: function (editable) - { - this.node.disabled = !editable; - } - - ,_selectOption: function () - { - var row; - - if (this._model && this._model.ready) - row = this._model.searchByIndex (this.valueColumnIndex, this._value); - else - row = -1; - - this._setRow (row); - } - - ,putValue: function (value) - { - this._selectOption (); - } -}); diff --git a/js/htk/field/spin.js b/js/htk/field/spin.js deleted file mode 100644 index 102aff33..00000000 --- a/js/htk/field/spin.js +++ /dev/null @@ -1,46 +0,0 @@ - -module.exports = new Class -({ - Extends: Htk.Field - ,Tag: 'htk-spin' - - ,render: function () - { - var input = this.createRoot ('input'); - //setInputTypeNumber (input); - this.node.type = 'number'; - input.addEventListener ('change', this._onChange.bind (this)); - - this.unit = null; - this.digits = 0; - } - - ,_onChange: function () - { - var newValue = (this.node.value == '') ? null : parseFloat (this.node.value); - this.node.value = newValue; - this.valueChanged (newValue); - } - - ,putValue: function (value) - { - var text; - - if (value != null) - { - text = (new Number (value)).toFixed (this.digits); - - if (this.unit != null) - text += ' ' + this.unit; - } - else - text = ''; - - this.node.value = text; - } - - ,setEditable: function (editable) - { - this.node.readOnly = !editable; - } -}); diff --git a/js/htk/field/table.js b/js/htk/field/table.js deleted file mode 100644 index b1b39464..00000000 --- a/js/htk/field/table.js +++ /dev/null @@ -1,58 +0,0 @@ - -var Entry = require ('./entry'); -var ColumnRadio = require ('../column/radio'); - -module.exports = new Class -({ - Extends: Entry - ,Tag: 'htk-table' - - ,render: function () - { - var tv = new Htk.TreeView (); - this.node.appendChild (tv.node); - - var renderer = new ColumnRadio (); - tv.appendColumn (0, renderer, ''); - - var rbGroup = renderer.rbGroup; - rbGroup.addSignal ('changed', this.changed, this); - - this.treeview = tv; - this.rbGroup = rbGroup; - } - - ,setModel: function (model) - { - this.treeview.setModel (model); - model.addSignal ('status-changed', this.modelRefresh, this); - this.selectValue (); - } - - ,changed: function (rbGroup) - { - this.realValue = this.rbGroup.getValue (); - this.signalEmit ('changed'); - } - - ,selectValue: function () - { - this.rbGroup.setValue (this.realValue); - } - - ,setRealValue: function () - { - this.selectValue (); - } - - ,modelRefresh: function (model, status) - { - if (status == Db.Model.Status.READY) - this.selectValue (); - } - - ,setEditable: function (editable) - { - this.rbGroup.setEditable (editable); - } -}); diff --git a/js/htk/field/text-area.js b/js/htk/field/text-area.js deleted file mode 100644 index f375d7c6..00000000 --- a/js/htk/field/text-area.js +++ /dev/null @@ -1,37 +0,0 @@ - -module.exports = new Class -({ - Extends: Htk.Field - ,Tag: 'htk-textarea' - - ,render: function () - { - var node = this.createRoot ('textarea'); - node.addEventListener ('change', this.changed.bind (this)); - } - - ,changed: function (event) - { - var value; - - if (this.node.value == '') - value = null; - else - value = this.node.value; - - this.valueChanged (value); - } - - ,setEditable: function (editable) - { - this.node.readOnly = !editable; - } - - ,putValue: function (value) - { - if (!value) - this.node.value = ''; - else - this.node.value = value; - } -}); diff --git a/js/htk/full-image.js b/js/htk/full-image.js deleted file mode 100644 index 3492f2c3..00000000 --- a/js/htk/full-image.js +++ /dev/null @@ -1,89 +0,0 @@ - -var Popup = require ('./popup'); -var Spinner = require ('./spinner'); - -module.exports = new Class -({ - Extends: Vn.Object - ,Properties: - { - /** - * Subdirectory where full images are allocated. - **/ - fullDir: - { - type: String - ,set: function (x) - { - this._fullDir = x; - } - ,get: function () - { - return this._fullDir; - } - } - } - - ,show: function (src) - { - var popup = new Popup ({class: 'htk-full-image', modal: true}); - - var img = document.createElement ('img'); - img.className = 'htk-full-image'; - img.addEventListener ('click', this._onImageClick.bind (this, popup)); - //img.addEventListener ('error', this._onImageError.bind (this, popup)); - img.src = src; - - if (!img.complete) - { - img.addEventListener ('load', this._onImageLoad.bind (this, popup, img)); - - var spinner = new Spinner (); - spinner.start (); - popup.child = spinner; - } - else - this._onImageLoad (popup, img); - - popup.open (); - } - - ,_onImageLoad: function (popup, img) - { - var scale = null; - var width = img.width; - var height = img.height; - var innerWidth = Vn.Browser.getInnerWidth () - 50; - var innerHeight = Vn.Browser.getInnerHeight () - 50; - - if (width > innerWidth) - { - scale = width / innerWidth; - height = parseInt (height / scale); - width = innerWidth; - } - if (height > innerHeight) - { - scale = height / innerHeight; - width = parseInt (width / scale); - height = innerHeight; - } - - if (scale !== null) - { - img.style.width = width +'px'; - img.style.height = height +'px'; - } - - popup.childNode = img; - popup.reset (); - } - - ,_onImageClick: function (popup) - { - popup.hide (); - } - - ,_onImageError: function (popup) {} -}); - diff --git a/js/htk/full-image/index.js b/js/htk/full-image/index.js new file mode 100644 index 00000000..cea3810e --- /dev/null +++ b/js/htk/full-image/index.js @@ -0,0 +1,79 @@ +require('./style.scss'); +var Popup = require('../popup'); +var Spinner = require('../spinner'); + +module.exports = new Class +({ + Extends: Vn.Object + ,Properties: + { + /** + * Subdirectory where full images are allocated. + */ + fullDir: + { + type: String + ,set: function(x) { + this._fullDir = x; + } + ,get: function() { + return this._fullDir; + } + } + } + + ,show: function(src) { + var popup = new Popup({class: 'htk-full-image', modal: true}); + + var img = document.createElement('img'); + img.className = 'htk-full-image'; + img.addEventListener('click', this._onImageClick.bind(this, popup)); + //img.addEventListener ('error', this._onImageError.bind (this, popup)); + img.src = src; + + if (!img.complete) { + img.addEventListener('load', this._onImageLoad.bind(this, popup, img)); + + var spinner = new Spinner(); + spinner.start(); + popup.child = spinner; + } else + this._onImageLoad(popup, img); + + popup.open(); + } + + ,_onImageLoad: function(popup, img) { + var scale = null; + var width = img.width; + var height = img.height; + var innerWidth = Vn.Browser.getInnerWidth() - 50; + var innerHeight = Vn.Browser.getInnerHeight() - 50; + + if (width > innerWidth) { + scale = width / innerWidth; + height = parseInt(height / scale); + width = innerWidth; + } + if (height > innerHeight) { + scale = height / innerHeight; + width = parseInt(width / scale); + height = innerHeight; + } + + if (scale !== null) { + img.style.width = width +'px'; + img.style.height = height +'px'; + } + + popup.childNode = img; + popup.reset(); + } + + ,_onImageClick: function(popup) { + popup.hide(); + } + + ,_onImageError: function(popup) {} +}); + diff --git a/js/htk/full-image/style.scss b/js/htk/full-image/style.scss new file mode 100644 index 00000000..8795818b --- /dev/null +++ b/js/htk/full-image/style.scss @@ -0,0 +1,12 @@ + +.htk-full-image { + img { + display: block; + cursor: pointer; + } + .htk-spinner { + background-color: #FFF; + margin: .6em; + display: block; + } +} diff --git a/js/htk/grid.js b/js/htk/grid.js deleted file mode 100644 index 9964ddf4..00000000 --- a/js/htk/grid.js +++ /dev/null @@ -1,402 +0,0 @@ - -var Widget = require ('./widget'); - -module.exports = new Class -({ - Extends: Widget - ,Tag: 'htk-grid' - ,Child: 'model' - ,Properties: - { - /** - * The source data model. - **/ - model: - { - type: Db.Model - ,set: function (x) - { - this.link ({_model: x}, - { - 'status-changed': this.onModelChange - ,'row-deleted': this.onRowDelete - ,'row-updated': this.onRowUpdate - ,'row-inserted': this.onRowInsert - ,'updatable-changed': this.onUpdatableChange - }); - - var set = new Db.SimpleIterator ({model: x}); - this.link ({_set: set}); - - this.onUpdatableChange (); - this.onModelChange (); - } - ,get: function () - { - return this._model; - } - }, - /** - * Message that should be displayed when source model is not ready. - **/ - emptyMessage: - { - type: String - ,value: null - }, - /** - * Wether to display the header with column titles. - **/ - showHeader: - { - type: Boolean - ,set: function (x) - { - this._showHeader = x; - this.thead.style.display = x ? 'table-header-group' : 'none'; - } - ,get: function () - { - return this._showHeader; - } - } - } - - ,_model: null - ,_set: null - ,columns: new Array () - ,internalColumn: null - ,internalColumns: 0 - ,sortColumn: -1 - ,sortWay: null - ,_showHeader: true - - ,render: function () - { - var table = this.createRoot ('table'); - table.className = 'htk-grid'; - - var thead = this.createElement ('thead'); - table.appendChild (thead); - - this.thead = this.createElement ('tr') - thead.appendChild (this.thead); - - this.tbody = this.createElement ('tbody'); - table.appendChild (this.tbody); - } - - ,appendChild: function (child) - { - this.appendColumn (child); - } - - ,removeClicked: function (column, value, row) - { - if (confirm (_('ReallyDelete'))) - this._model.deleteRow (row); - } - - ,onRowDelete: function (model, row) - { - var tableRows = this.tbody.childNodes; - this.tbody.removeChild (tableRows[row]); - - for (var i = row; i < tableRows.length; i++) - tableRows[i].className = (i % 2) ? 'pair-row' : ''; - - this.showNoRecordsFound (); - } - - ,onRowInsert: function (model) - { - this.buildRow (1); - } - - ,renderCell: function (row, column, tr) - { - if (column.columnIndex != -1) - column.value = this._model.data[row][column.columnIndex]; - - if (column.renderer) - { - this._set.row = row; - column.renderer (column, this._set); - } - - return column.render (tr); - } - - ,refreshRow: function (row, columns) - { - var x = this.columns; - var tr = this.tbody.childNodes[row]; - - for (var i = 0; i < x.length; i++) - if (x[i].renderer || columns.indexOf (x[i].columnIndex) != -1) - { - var cell = this.renderCell (row, x[i], tr); - tr.replaceChild (cell, tr.childNodes[i]); - } - } - - ,onRowUpdate: function (model, row, columns) - { - this.refreshRow (row, columns); - } - - ,buildRow: function (count) - { - for (var i = 0; i < count; i++) - { - var tr = this.createElement ('tr'); - - if (i % 2) - tr.className = 'pair-row'; - - for (var j = 0; j < this.columns.length; j++) - { - var cell = this.renderCell (i, this.columns[j], tr); - tr.appendChild (cell); - } - - this.tbody.appendChild (tr); - } - } - - ,onUpdatableChange: function () - { - if (this._model && this._model.updatable) - { - if (!this.internalColumn) - { - this.internalColumn = new Htk.ColumnButton - ({ - icon: 'delete' - ,tip: _('Remove') - }); - this.internalColumn.on ('clicked', this.removeClicked, this); - this.insertInternalColumn (0, this.internalColumn); - } - } - else if (this.internalColumn) - { - this.internalColumn = null; - this.removeInternalColumn (0); - } - } - - ,onModelChange: function () - { - var emptyMessage = this.emptyMessage ? - this.emptyMessage : _('NoData'); - - if (!this._model) - { - this.showMessage (emptyMessage, 'refresh.svg'); - return; - } - - this._node.removeChild (this.tbody); - this.tbody = this.createElement ('tbody'); - - switch (this._model.status) - { - case Db.Model.Status.READY: - { - for (var i = 0; i < this.columns.length; i++) - this.columns[i].updateColumnIndex (this._model); - - this.buildRow (this._model.numRows); - this.showNoRecordsFound (); - break; - } - case Db.Model.Status.LOADING: - this.showMessage (_('Loading'), null); - break; - case Db.Model.Status.CLEAN: - this.showMessage (emptyMessage, 'refresh'); - break; - case Db.Model.Status.ERROR: - this.showMessage (_('ErrorLoadingData'), 'error'); - break; - } - - this._node.appendChild (this.tbody); - } - - ,showNoRecordsFound: function () - { - if (this._model.numRows == 0) - this.showMessage (_('EmptyList'), 'clean'); - } - - ,showMessage: function (message, src) - { - if (this.columns.length == 0) - return; - - var tr = this.createElement ('tr'); - this.tbody.appendChild (tr); - - var td = this.createElement ('td'); - td.className = 'message'; - td.colSpan = this.columns.length; - tr.appendChild (td); - - if (src) - { - var img = this.createElement ('img'); - img.alt = ''; - img.src = 'image/icon/light/'+ src +'.svg'; - td.appendChild (img); - } - else - { - var spinner = new Htk.Spinner (); - spinner.start (); - td.appendChild (spinner.node); - } - - var message = this.createTextNode (message); - td.appendChild (message); - } - - ,scrollToRow: function (row) - { - if (row >= 0) - { - var height = parseInt (this.tr.style.height); - this.node.scrollTop = (row - 2) * height; - - if (this.selectedRow) - this.selectedRow.style.backgroundColor = null; - - this.selectedRow = this.tbody.childNodes[row] - this.selectedRow.style.backgroundColor = '#AAD'; - } - } - - ,sortModel: function (column) - { - var columnIndex = column.columnIndex; - - if (this._model && columnIndex != -1) - { - if (this.sortColumn === columnIndex - && this.sortWay === Db.Model.SortWay.ASC) - this.sortWay = Db.Model.SortWay.DESC; - else - this.sortWay = Db.Model.SortWay.ASC; - - this.sortColumn = columnIndex; - - this._model.sort (columnIndex, this.sortWay); - } - } - - ,columnChanged: function (column, row, newValue) - { - var columnIndex = column.columnIndex; - - if (columnIndex != -1) - this._model.setByIndex (row, columnIndex, newValue); - } - - ,addColumn: function (pos, column) - { - var header = column.renderHeader (); - - if (pos == -1 || pos >= this.columns.length) - { - pos = this.columns.push (column) - 1; - this.thead.appendChild (header); - } - else - { - this.columns.splice (pos, 0, column); - this.thead.insertBefore (header, this.thead.childNodes[pos]); - } - - header.addEventListener ('click', - this.sortModel.bind (this, column)); - header.title = _('Sort'); - - column.on ('changed', this.columnChanged, this); - - var rows = this.tbody.childNodes; - - if (this._model && this._model.numRows > 0) - for (var i = 0; i < rows.length; i++) - { - var cell = this.renderCell (i, column, rows[i]); - rows[i].insertBefore (cell, rows[i].childNodes[pos+1]); - } - - return pos; - } - - ,insertInternalColumn: function (pos, column) - { - if (pos < 0 || pos > this.internalColumns) - pos = this.internalColumns; - - this.internalColumns++; - return this.addColumn (pos, column); - } - - ,insertColumn: function (pos, column) - { - if (pos > 0) - pos += this.internalColumns; - - return this.addColumn (pos, column) - this.internalColumns; - } - - ,appendColumn: function (column) - { - return this.insertColumn (-1, column); - } - - ,deleteColumn: function (pos) - { - if (pos < 0 || pos >= this.columns.length) - return; - - this.columns.splice (pos, 1); - this.thead.removeChild (this.thead.childNodes[pos]); - - var rows = this.tbody.childNodes; - - if (this._model && this._model.numRows > 0) - for (var i = 0; i < rows.length; i++) - rows[i].removeChild (rows[i].childNodes[pos]); - } - - ,removeInternalColumn: function (pos) - { - if (this.internalColumns == 0) - return; - - if (pos < 0 || pos > this.internalColumns) - pos = this.internalColumns; - - this.deleteColumn (pos); - this.internalColumns--; - } - - ,removeColumn: function (pos) - { - if (pos > 0) - pos += this.internalColumns; - - this.deleteColumn (pos); - } - - ,reloadModel: function () - { - if (this._model != null) - this.onModelChange (); - } -}); - diff --git a/js/htk/grid/index.js b/js/htk/grid/index.js new file mode 100644 index 00000000..1d7e9c7b --- /dev/null +++ b/js/htk/grid/index.js @@ -0,0 +1,349 @@ +require('./style.scss'); +var Component = require('vn/component'); + +module.exports = new Class({ + Extends: Component + ,Tag: 'htk-grid' + ,Child: 'model' + ,Properties: + { + /** + * The source data model. + */ + model: { + type: Db.Model + ,set: function(x) { + this.link({_model: x}, + { + 'status-changed': this.onModelChange + ,'row-deleted': this.onRowDelete + ,'row-updated': this.onRowUpdate + ,'row-inserted': this.onRowInsert + ,'updatable-changed': this.onUpdatableChange + }); + + var set = new Db.SimpleIterator({model: x}); + this.link({_set: set}); + + this.onUpdatableChange(); + this.onModelChange(); + } + ,get: function() { + return this._model; + } + }, + /** + * Message that should be displayed when source model is not ready. + */ + emptyMessage: { + type: String + ,value: null + }, + /** + * Wether to display the header with column titles. + */ + showHeader: { + type: Boolean + ,set: function(x) { + this._showHeader = x; + this.thead.style.display = x ? 'table-header-group' : 'none'; + } + ,get: function() { + return this._showHeader; + } + } + } + + ,_model: null + ,_set: null + ,columns: new Array() + ,internalColumn: null + ,internalColumns: 0 + ,sortColumn: -1 + ,sortWay: null + ,_showHeader: true + + ,render: function() { + var table = this.createRoot('table'); + + var thead = this.createElement('thead'); + table.appendChild(thead); + + this.thead = this.createElement('tr') + thead.appendChild(this.thead); + + this.tbody = this.createElement('tbody'); + table.appendChild(this.tbody); + } + + ,appendChild: function(child) { + this.appendColumn(child); + } + + ,removeClicked: function(column, value, row) { + if (confirm(_('ReallyDelete'))) + this._model.deleteRow(row); + } + + ,onRowDelete: function(model, row) { + var tableRows = this.tbody.childNodes; + this.tbody.removeChild(tableRows[row]); + + for (var i = row; i < tableRows.length; i++) + tableRows[i].className = (i % 2) ? 'pair-row' : ''; + + this.showNoRecordsFound(); + } + + ,onRowInsert: function() { + this.buildRow(1); + } + + ,renderCell: function(row, column, tr) { + if (column.column) + column.value = this._model.data[row][column.column]; + + if (column.renderer) { + this._set.row = row; + column.renderer(column, this._set); + } + + return column.render(tr); + } + + ,refreshRow: function(row, columns) { + var x = this.columns; + var tr = this.tbody.childNodes[row]; + + for (var i = 0; i < x.length; i++) + if (x[i].renderer || columns.indexOf(x[i].columnIndex) != -1) { + var cell = this.renderCell(row, x[i], tr); + tr.replaceChild(cell, tr.childNodes[i]); + } + } + + ,onRowUpdate: function(model, row, columns) { + this.refreshRow(row, columns); + } + + ,buildRow: function(count) { + for (var i = 0; i < count; i++) { + var tr = this.createElement('tr'); + + if (i % 2) + tr.className = 'pair-row'; + + for (var j = 0; j < this.columns.length; j++) { + var cell = this.renderCell(i, this.columns[j], tr); + tr.appendChild(cell); + } + + this.tbody.appendChild(tr); + } + } + + ,onUpdatableChange: function() { + if (this._model && this._model.updatable) { + if (!this.internalColumn) { + this.internalColumn = new Htk.ColumnButton({ + icon: 'delete' + ,tip: _('Remove') + }); + this.internalColumn.on('clicked', this.removeClicked, this); + this.insertInternalColumn(0, this.internalColumn); + } + } else if (this.internalColumn) { + this.internalColumn = null; + this.removeInternalColumn(0); + } + } + + ,onModelChange: function() { + var emptyMessage = this.emptyMessage ? + this.emptyMessage : _('NoData'); + + if (!this._model) { + this.showMessage(emptyMessage, 'refresh'); + return; + } + + this._node.removeChild(this.tbody); + this.tbody = this.createElement('tbody'); + + switch (this._model.status) { + case Db.Model.Status.READY: + { + for (var i = 0; i < this.columns.length; i++) + this.columns[i].updateColumnName(this._model); + + this.buildRow(this._model.numRows); + this.showNoRecordsFound(); + break; + } + case Db.Model.Status.LOADING: + this.showMessage(_('Loading'), null); + break; + case Db.Model.Status.CLEAN: + this.showMessage(emptyMessage, 'refresh'); + break; + case Db.Model.Status.ERROR: + this.showMessage(_('ErrorLoadingData'), 'error'); + break; + } + + this._node.appendChild(this.tbody); + } + + ,showNoRecordsFound: function() { + if (this._model.numRows == 0) + this.showMessage(_('EmptyList'), 'block'); + } + + ,showMessage: function(message, src) { + if (this.columns.length == 0) + return; + + var tr = this.createElement('tr'); + this.tbody.appendChild(tr); + + var td = this.createElement('td'); + td.className = 'message'; + td.colSpan = this.columns.length; + tr.appendChild(td); + + if (src) { + const icon = new Htk.Icon({ + name: src + }); + td.appendChild(icon.node); + } else { + var spinner = new Htk.Spinner(); + spinner.start(); + td.appendChild(spinner.node); + } + + var message = this.createTextNode(message); + td.appendChild(message); + } + + ,scrollToRow: function(row) { + if (row >= 0) { + var height = parseInt(this.tr.style.height); + this.node.scrollTop = (row - 2) * height; + + if (this.selectedRow) + this.selectedRow.style.backgroundColor = null; + + this.selectedRow = this.tbody.childNodes[row] + this.selectedRow.style.backgroundColor = '#AAD'; + } + } + + ,sortModel: function(column) { + var columnName = column.column; + + if (this._model && columnName != -1) { + if (this.sortColumn === columnName + && this.sortWay === Db.Model.SortWay.ASC) + this.sortWay = Db.Model.SortWay.DESC; + else + this.sortWay = Db.Model.SortWay.ASC; + + this.sortColumn = columnName; + + this._model.sortByName(columnName, this.sortWay); + } + } + + ,columnChanged: function(column, row, newValue) { + var columnName = column.column; + + if (columnName != -1) + this._model.set(row, columnName, newValue); + } + + ,addColumn: function(pos, column) { + var header = column.renderHeader(); + + if (pos == -1 || pos >= this.columns.length) { + pos = this.columns.push(column) - 1; + this.thead.appendChild(header); + } else { + this.columns.splice(pos, 0, column); + this.thead.insertBefore(header, this.thead.childNodes[pos]); + } + + header.addEventListener('click', + this.sortModel.bind(this, column)); + header.title = _('Sort'); + + column.on('changed', this.columnChanged, this); + + var rows = this.tbody.childNodes; + + if (this._model && this._model.numRows > 0) + for (var i = 0; i < rows.length; i++) { + var cell = this.renderCell(i, column, rows[i]); + rows[i].insertBefore(cell, rows[i].childNodes[pos+1]); + } + + return pos; + } + + ,insertInternalColumn: function(pos, column) { + if (pos < 0 || pos > this.internalColumns) + pos = this.internalColumns; + + this.internalColumns++; + return this.addColumn(pos, column); + } + + ,insertColumn: function(pos, column) { + if (pos > 0) + pos += this.internalColumns; + + return this.addColumn(pos, column) - this.internalColumns; + } + + ,appendColumn: function(column) { + return this.insertColumn(-1, column); + } + + ,deleteColumn: function(pos) { + if (pos < 0 || pos >= this.columns.length) + return; + + this.columns.splice(pos, 1); + this.thead.removeChild(this.thead.childNodes[pos]); + + var rows = this.tbody.childNodes; + + if (this._model && this._model.numRows > 0) + for (var i = 0; i < rows.length; i++) + rows[i].removeChild(rows[i].childNodes[pos]); + } + + ,removeInternalColumn: function(pos) { + if (this.internalColumns == 0) + return; + + if (pos < 0 || pos > this.internalColumns) + pos = this.internalColumns; + + this.deleteColumn(pos); + this.internalColumns--; + } + + ,removeColumn: function(pos) { + if (pos > 0) + pos += this.internalColumns; + + this.deleteColumn(pos); + } + + ,reloadModel: function() { + if (this._model != null) + this.onModelChange(); + } +}); + diff --git a/js/htk/grid/style.scss b/js/htk/grid/style.scss new file mode 100644 index 00000000..a2a608db --- /dev/null +++ b/js/htk/grid/style.scss @@ -0,0 +1,63 @@ +@import "../style/variables"; + +.htk-grid { + margin: auto; + border-collapse: collapse; + + & > thead > tr, + & > tfoot > tr { + background-color: $color-primary; + vertical-align: middle; + height: 3em; + } + th { + color: white; + cursor: pointer; + font-weight: normal; + padding: 0 0.4em; + } + th:hover { + background-color: rgba(1, 1, 1, 0.2); + } + tr { + height: 3.5em; + } + & > tfoot a, + & > thead a { + color: black; + } + tr.pair-row { + background-color: transparent; + } + & > tbody tr { + border-top: 1px solid #DDD; + } + & > tbody tr:first-child { + border-top: none; + } + & > tbody td { + margin: 0; + padding: 0 0.5em; + } + th, + td { + text-align: left; + } + td:first-child, + th:first-child { + padding-left: 1em; + } + td:last-child, + th:last-child { + padding-right: 1em; + } + .message { + padding: 1.5em; + text-align: center; + } + .message > * { + display: inline-block; + vertical-align: middle; + padding-right: .8em; + } +} diff --git a/js/htk/htk.js b/js/htk/htk.js index 29e11c30..5cc21c26 100644 --- a/js/htk/htk.js +++ b/js/htk/htk.js @@ -1,54 +1,52 @@ -require ('db/db'); -require ('./style.css'); +require('db/db'); +require('./style/index.scss'); Htk = module.exports = { - NodeBuilder : require ('./node-builder') - ,Widget : require ('./widget') - ,Component : require ('./component') - ,Popup : require ('./popup') - ,Dialog : require ('./dialog') - ,Toast : require ('./toast') - ,Repeater : require ('./repeater') - ,Grid : require ('./grid') - ,Spinner : require ('./spinner') - ,Icon : require ('./icon') - ,FullImage : require ('./full-image') - ,ImageEditor : require ('./image-editor') - ,Assistant : require ('./assistant') - ,AssistantBar : require ('./assistant-bar') - ,Step : require ('./step') - ,Loader : require ('./loader') - ,Field : require ('./field') - ,Column : require ('./column') + Popup : require('./popup') + ,Dialog : require('./dialog') + ,Toast : require('./toast') + ,Repeater : require('./repeater') + ,Grid : require('./grid') + ,Spinner : require('./spinner') + ,Icon : require('./icon') + ,FullImage : require('./full-image') + ,ImageEditor : require('./image-editor') + ,Assistant : require('./assistant') + ,AssistantBar : require('./assistant-bar') + ,Step : require('./step') + ,Loader : require('./loader') + ,List : require('./list') + ,Field : require('./field') + ,Column : require('./column') }; var Fields = { - Text : require ('./field/text') - ,Html : require ('./field/html') - ,Entry : require ('./field/entry') - ,RadioGroup : require ('./field/radio-group') - ,Radio : require ('./field/radio') - ,Label : require ('./field/label') - ,TextArea : require ('./field/text-area') - ,Spin : require ('./field/spin') - ,Check : require ('./field/check') - ,Select : require ('./field/select') - ,Calendar : require ('./field/calendar') - ,DateChooser : require ('./field/date-chooser') - ,Image : require ('./field/image') - ,Button : require ('./field/button') - ,BarButton : require ('./field/bar-button') - ,Table : require ('./field/table') - ,SearchEntry : require ('./field/search-entry') - ,ColumnButton : require ('./column/button') - ,ColumnLink : require ('./column/link') - ,ColumnDate : require ('./column/date') - ,ColumnImage : require ('./column/image') - ,ColumnRadio : require ('./column/radio') - ,ColumnSpin : require ('./column/spin') - ,ColumnText : require ('./column/text') - ,ColumnCheck : require ('./column/check') + Text : require('./text') + ,Html : require('./html') + ,Entry : require('./entry') + ,RadioGroup : require('./radio/radio-group') + ,Radio : require('./radio') + ,Label : require('./label') + ,TextArea : require('./text-area') + ,Spin : require('./spin') + ,Check : require('./check') + ,Select : require('./select') + ,Calendar : require('./calendar') + ,DateChooser : require('./date-chooser') + ,Image : require('./image') + ,Button : require('./button') + ,BarButton : require('./bar-button') + ,Table : require('./table') + ,SearchEntry : require('./search-entry') + ,ColumnButton : require('./columns/button') + ,ColumnLink : require('./columns/link') + ,ColumnDate : require('./columns/date') + ,ColumnImage : require('./columns/image') + ,ColumnRadio : require('./columns/radio') + ,ColumnSpin : require('./columns/spin') + ,ColumnText : require('./columns/text') + ,ColumnCheck : require('./columns/check') }; for (var field in Fields) diff --git a/js/htk/field/html.js b/js/htk/html/index.js similarity index 57% rename from js/htk/field/html.js rename to js/htk/html/index.js index 166cab44..641d9a46 100644 --- a/js/htk/field/html.js +++ b/js/htk/html/index.js @@ -4,13 +4,11 @@ module.exports = new Class Extends: Htk.Field ,Tag: 'htk-html' - ,render: function () - { - this.createRoot ('div'); + ,render: function() { + this.createRoot('div'); } - ,putValue: function (value) - { + ,putValue: function(value) { this.node.innerHTML = value; } }); diff --git a/js/htk/icon.js b/js/htk/icon.js deleted file mode 100644 index d31613d5..00000000 --- a/js/htk/icon.js +++ /dev/null @@ -1,63 +0,0 @@ - -var Widget = require ('./widget'); - -module.exports = new Class -({ - Extends: Widget - ,Tag: 'htk-icon' - ,Properties: - { - icon: - { - type: String - ,set: function (x) - { - this._icon = x; - this._setIcon (); - } - ,get: function () - { - return this._icon; - } - - }, - theme: - { - type: String - ,set: function (x) - { - this._theme = x; - this._setIcon (); - } - ,get: function () - { - return this._theme; - } - }, - alt: - { - type: String - ,set: function (x) - { - this.node.alt = x; - } - ,get: function () - { - return this.node.alt; - } - } - } - - ,_icon: null - - ,render: function () - { - this.createRoot ('img'); - } - - ,_setIcon: function () - { - var theme = this._theme ? this._theme : 'light'; - this.node.src = 'image/icon/'+ theme +'/'+ this._icon +'.svg'; - } -}); diff --git a/js/htk/icon/index.js b/js/htk/icon/index.js new file mode 100644 index 00000000..66735155 --- /dev/null +++ b/js/htk/icon/index.js @@ -0,0 +1,51 @@ + +var Component = require('vn/component'); + +module.exports = new Class({ + Extends: Component + ,Tag: 'htk-icon' + ,Properties: + { + name: { + type: String + ,set: function(x) { + this._icon = x; + this._setIcon(); + } + ,get: function() { + return this._icon; + } + + }, + theme: { + type: String + ,set: function(x) { + this._theme = x; + this._setIcon(); + } + ,get: function() { + return this._theme; + } + }, + alt: { + type: String + ,set: function(x) { + this.node.alt = x; + } + ,get: function() { + return this.node.alt; + } + } + } + + ,_icon: null + + ,render: function() { + const node = this.createRoot('span'); + node.classList.add('material-symbols-rounded'); + } + + ,_setIcon: function() { + this.node.innerText = this._icon; + } +}); diff --git a/js/htk/image-editor.js b/js/htk/image-editor.js deleted file mode 100644 index cb31e02b..00000000 --- a/js/htk/image-editor.js +++ /dev/null @@ -1,65 +0,0 @@ - -var Component = require('./component'); -var Toast = require('./toast'); -var Tpl = require('./image-editor.xml'); - -/** - * A form to handle the image database, it allows to add new images or - * replace it. - **/ -module.exports = new Class({ - Extends: Component, - Properties: { - /** - * The REST connection used to upload the image. - **/ - conn: { - type: Vn.JsonConnection - } - }, - - initialize: function(props) { - this.builderInitString(Tpl); - - var self = this; - this.$('form').onsubmit = function() - { self._onSubmit(); return false; }; - - this.parent(props); - }, - - onNameChange: function() { - var newValue = this.$('name').value; - - if (!newValue) - newValue = null - - this.signalEmit('name-changed', newValue); - }, - - _onSubmit: function() { - this.$('hidden-name').value = this.$('name').value; - this.$('submit').disabled = true; - this.$('spinner').start(); - - this.conn.sendFormMultipart(this.$('form'), - this._onResponse.bind(this)); - }, - - _onResponse: function(json, error) { - this.$('submit').disabled = false; - this.$('spinner').stop(); - - if (error) - throw error; - - Toast.showMessage(_('ImageAdded')); - this.signalEmit('file-uploaded', this.$('name').value); - }, - - setData: function(image, directory) { - this.$('name').value = image; - this.$('schema').value = directory; - } -}); - diff --git a/js/htk/image-editor/index.js b/js/htk/image-editor/index.js new file mode 100644 index 00000000..3ba053ae --- /dev/null +++ b/js/htk/image-editor/index.js @@ -0,0 +1,66 @@ +require('./style.scss'); +var Component = require('vn/component'); +var Toast = require('../toast'); +var Tpl = require('./ui.xml').default; + +/** + * A form to handle the image database, it allows to add new images or + * replace it. + */ +module.exports = new Class({ + Extends: Component, + Properties: { + /** + * The REST connection used to upload the image. + */ + conn: { + type: Vn.JsonConnection + } + }, + + initialize: function(props) { + this.loadTemplateFromString(Tpl); + + var self = this; + this.$.form.onsubmit = function() { + self._onSubmit(); return false; + }; + + Component.prototype.initialize.call(this, props); + }, + + onNameChange: function() { + var newValue = this.$.name.value; + + if (!newValue) + newValue = null + + this.emit('name-changed', newValue); + }, + + _onSubmit: function() { + this.$.hiddenName.value = this.$.name.value; + this.$.submit.disabled = true; + this.$.spinner.start(); + + this.conn.sendFormMultipart(this.$.form, + this._onResponse.bind(this)); + }, + + _onResponse: function(json, error) { + this.$.submit.disabled = false; + this.$.spinner.stop(); + + if (error) + throw error; + + Toast.showMessage(_('ImageAdded')); + this.emit('file-uploaded', this.$.name.value); + }, + + setData: function(image, directory) { + this.$.name.value = image; + this.$.schema.value = directory; + } +}); + diff --git a/js/htk/image-editor/style.scss b/js/htk/image-editor/style.scss new file mode 100644 index 00000000..22921146 --- /dev/null +++ b/js/htk/image-editor/style.scss @@ -0,0 +1,33 @@ + +.htk-image-editor { + width: 18em; + margin: 0 auto; + padding: 1.5em; + + h2 { + color: white; + background-color: #009688; + text-align: left; + font-size: 1.3em; + line-height: 1.7em; + font-weight: normal; + padding: 0.6em 0.8em; + margin: 0; + } + iframe { + display: none; + } + .footer { + margin-top: 2em; + + & > .htk-spinner { + padding-right: 1.2em; + height: 1.3em; + width: 1.3em; + } + & > .htk-spinner, + & > input { + float: right; + } + } +} diff --git a/js/htk/image-editor.xml b/js/htk/image-editor/ui.xml similarity index 100% rename from js/htk/image-editor.xml rename to js/htk/image-editor/ui.xml diff --git a/js/htk/field/image.js b/js/htk/image/index.js similarity index 92% rename from js/htk/field/image.js rename to js/htk/image/index.js index f3109bee..92d3f30c 100644 --- a/js/htk/field/image.js +++ b/js/htk/image/index.js @@ -1,6 +1,8 @@ +require('./style.scss'); + /** * Class to display or edit an image. Also it allows to show it's full version. - **/ + */ module.exports = new Class({ Extends: Htk.Field ,Tag: 'htk-image' @@ -8,7 +10,7 @@ module.exports = new Class({ { /** * The directory where the images are allocated. - **/ + */ directory: { type: String ,set: function(x) { @@ -21,7 +23,7 @@ module.exports = new Class({ }, /** * The subdirectory where the images are allocated. - **/ + */ subdir: { type: String ,set: function(x) { @@ -34,7 +36,7 @@ module.exports = new Class({ }, /** * The timestamp field of the last update, used for caching purposes. - **/ + */ stampColumn: { type: String ,set: function(x) { @@ -47,7 +49,7 @@ module.exports = new Class({ }, /** * Whether to show the full image when mouse hover. - **/ + */ fullDir: { type: String ,set: function(x) { @@ -60,7 +62,7 @@ module.exports = new Class({ }, /** * The REST connection used to upload the image. - **/ + */ conn: { type: Vn.JsonConnection } @@ -74,7 +76,6 @@ module.exports = new Class({ ,render: function() { var node = this.createRoot('div'); - node.className = 'htk-image'; var img = this.img = this.createElement('img'); img.addEventListener('error', this._onImageError.bind(this)); @@ -110,14 +111,13 @@ module.exports = new Class({ this.node.removeChild(this.editButton); this.editButton = null; } - if (this._editable) { var button = this.createElement('button'); button.addEventListener('click', this._onEditClick.bind(this)); button.title = _('UpdateImage'); this.node.appendChild(button); - var icon = new Htk.Icon({icon: 'add-photo'}); + var icon = new Htk.Icon({name: 'add_a_photo'}); button.appendChild(icon.node); this.editButton = button; @@ -137,7 +137,7 @@ module.exports = new Class({ if (this._stamp) src += '?'+ this._stamp; else if (this._stampColumn && this.form) - src += '?'+ this.form.get(this._stampColumn); + src += '?'+ this.form.$[this._stampColumn]; return src; } @@ -162,7 +162,8 @@ module.exports = new Class({ } ,_onClick: function(event) { - if (!this._fullDir || !this._value || this._error) + if (!this._fullDir || !this._value || this._error + || event.defaultPrevented) return; event.preventDefault(); @@ -170,7 +171,8 @@ module.exports = new Class({ } ,_onEditClick: function(event) { - event.stopPropagation(); + if (event.defaultPrevented) return + event.preventDefault(); var editor = new Htk.ImageEditor({conn: this.conn}); editor.setData(this.value, this._directory); diff --git a/js/htk/image/style.scss b/js/htk/image/style.scss new file mode 100644 index 00000000..fdfceb41 --- /dev/null +++ b/js/htk/image/style.scss @@ -0,0 +1,35 @@ + +.htk-image { + position: relative; + overflow: hidden; + transition: opacity 250ms ease-out; + + &.clickable:hover { + cursor: pointer; + opacity: 0.85; + } + & > img { + display: block; + height: 100%; + width: 100%; + } + & > button { + position: absolute; + top: 0; + left: 0; + padding: 8px; + margin: 4px; + display: none; + background-color: rgba(255, 255, 255, .6); + + &:hover { + background-color: rgba(255, 255, 255, .8); + } + } + &:hover > button { + display: block; + } + & > button > .htk-icon { + display: block; + } +} diff --git a/js/htk/field/label.js b/js/htk/label/index.js similarity index 50% rename from js/htk/field/label.js rename to js/htk/label/index.js index d3006802..94f09b68 100644 --- a/js/htk/field/label.js +++ b/js/htk/label/index.js @@ -7,17 +7,15 @@ module.exports = new Class { /** * Format that applies to the value. - **/ + */ format: { type: String - ,set: function (x) - { + ,set: function(x) { this._format = _(x); - this.putValue (this._value); + this.putValue(this._value); } - ,get: function () - { + ,get: function() { return this._format; } } @@ -25,14 +23,12 @@ module.exports = new Class ,_format: null - ,render: function () - { - this.createRoot ('label'); + ,render: function() { + this.createRoot('label'); } - ,putValue: function (value) - { - Vn.Node.setText (this.node, - Vn.Value.format (value, this._format)); + ,putValue: function(value) { + Vn.Node.setText(this.node, + Vn.Value.format(value, this._format)); } }); diff --git a/js/htk/list/index.js b/js/htk/list/index.js new file mode 100644 index 00000000..1fe6bd72 --- /dev/null +++ b/js/htk/list/index.js @@ -0,0 +1 @@ +require('./style.scss'); diff --git a/js/htk/list/style.scss b/js/htk/list/style.scss new file mode 100644 index 00000000..66f4290f --- /dev/null +++ b/js/htk/list/style.scss @@ -0,0 +1,64 @@ +@import "../style/classes"; + +.htk-list { + a.item, + .item.clickable { + @extend %clickable; + } + .item { + padding: 20px; + border-bottom: 1px solid #DDD; + display: flex; + align-items: center; + + & > .side { + flex: none; + } + & > .content { + flex: 1; + overflow: hidden; + + & > .important { + font-weight: bold; + font-size: 1rem; + margin-bottom: .5em; + } + & > p { + margin: .1em 0; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + & > .actions { + flex: none; + display: none; + align-items: center; + + & > .htk-button { + margin: 0; + } + & > * { + display: inline-block; + vertical-align: middle; + } + & > input { + margin: .6em; + } + } + &:hover > .actions { + display: flex; + } + &:last-child { + border-bottom: none; + } + } + + /* Mobile */ + + @media (max-width: 960px) { + .item > .actions { + display: initial; + } + } +} diff --git a/js/htk/loader.js b/js/htk/loader.js deleted file mode 100644 index 8ca67313..00000000 --- a/js/htk/loader.js +++ /dev/null @@ -1,79 +0,0 @@ - -var Widget = require ('./widget'); - -module.exports = new Class -({ - Tag: 'htk-loader' - ,Extends: Widget - ,Properties: { - form: - { - type: Db.Form - ,set: function (x) - { - this.link ({_form: x}, {'status-changed': this.onFormChange}); - this.onFormChange (); - } - ,get: function () - { - return this._form; - } - } - } - - ,initialize: function () - { - var node = this.createRoot ('div'); - node.className = 'htk-loader'; - - var div = this.createElement ('div'); - div.className = 'spinner'; - - var spinner = new Htk.Spinner (); - div.appendChild (spinner.node); - - var childs = this.createElement ('div'); - - this.spinner = spinner; - this.div = div; - this.childs = childs; - this.isLoading = true; - this.stop (); - } - - ,appendChild: function (child) - { - this.childs.appendChild (child); - } - - ,stop: function () - { - if (!this.isLoading) - return; - - this.isLoading = false; - this.spinner.stop (); - Vn.Node.removeChilds (this.node); - this.node.appendChild (this.childs); - } - - ,start: function () - { - if (this.isLoading) - return; - - this.isLoading = true; - this.spinner.start (); - Vn.Node.removeChilds (this.node); - this.node.appendChild (this.div); - } - - ,onFormChange: function () - { - if (this._form.ready) - this.stop (); - else - this.start (); - } -}); - diff --git a/js/htk/loader/index.js b/js/htk/loader/index.js new file mode 100644 index 00000000..dd6d8b19 --- /dev/null +++ b/js/htk/loader/index.js @@ -0,0 +1,70 @@ +require('./style.scss'); +var Component = require('vn/component'); + +module.exports = new Class({ + Extends: Component + ,Tag: 'htk-loader' + ,Properties: { + form: { + type: Db.Form + ,set: function(x) { + this.link({_form: x}, {'status-changed': this.onFormChange}); + this.onFormChange(); + } + ,get: function() { + return this._form; + } + } + } + + ,initialize: function(props) { + Component.prototype.initialize.call(this, props); + this.createRoot('div'); + + var div = this.createElement('div'); + div.className = 'spinner'; + + var spinner = new Htk.Spinner(); + div.appendChild(spinner.node); + + var childs = this.createElement('div'); + + this.spinner = spinner; + this.div = div; + this.childs = childs; + this.isLoading = true; + this.stop(); + } + + ,appendChild: function(child) { + this.childs.appendChild(child); + } + + ,stop: function() { + if (!this.isLoading) + return; + + this.isLoading = false; + this.spinner.stop(); + Vn.Node.removeChilds(this.node); + this.node.appendChild(this.childs); + } + + ,start: function() { + if (this.isLoading) + return; + + this.isLoading = true; + this.spinner.start(); + Vn.Node.removeChilds(this.node); + this.node.appendChild(this.div); + } + + ,onFormChange: function() { + if (this._form.ready) + this.stop(); + else + this.start(); + } +}); + diff --git a/js/htk/loader/style.scss b/js/htk/loader/style.scss new file mode 100644 index 00000000..5c42e10b --- /dev/null +++ b/js/htk/loader/style.scss @@ -0,0 +1,4 @@ + +.htk-loader > .spinner { + text-align: center; +} diff --git a/js/htk/locale/ca.yml b/js/htk/locale/ca.yml index ea06ed41..3bb55c1d 100644 --- a/js/htk/locale/ca.yml +++ b/js/htk/locale/ca.yml @@ -27,3 +27,4 @@ Next: Següent Confirm: Confirmar Search: Cercar Search...: Cercar... +Erase: Esborrar diff --git a/js/htk/locale/en.yml b/js/htk/locale/en.yml index e1f455d6..58547015 100644 --- a/js/htk/locale/en.yml +++ b/js/htk/locale/en.yml @@ -27,3 +27,4 @@ Next: Next Confirm: Confirm Search: Search Search...: Search... +Erase: Erase diff --git a/js/htk/locale/es.yml b/js/htk/locale/es.yml index 76a005ee..4210301e 100644 --- a/js/htk/locale/es.yml +++ b/js/htk/locale/es.yml @@ -27,3 +27,4 @@ Next: Siguiente Confirm: Confirmar Search: Buscar Search...: Buscar... +Erase: Borrar diff --git a/js/htk/locale/fr.yml b/js/htk/locale/fr.yml index 1d10627b..4bd0b2ca 100644 --- a/js/htk/locale/fr.yml +++ b/js/htk/locale/fr.yml @@ -27,3 +27,4 @@ Next: Suivant Confirm: Confirmer Search: Recherche Search...: Recherche... +Erase: Effacer diff --git a/js/htk/locale/pt.yml b/js/htk/locale/pt.yml index 67775386..17167706 100644 --- a/js/htk/locale/pt.yml +++ b/js/htk/locale/pt.yml @@ -27,3 +27,4 @@ Next: Seguinte Confirm: Confirmar Search: Procurar Search...: Procurar... +Erase: Apagar diff --git a/js/htk/node-builder.js b/js/htk/node-builder.js deleted file mode 100644 index fa28a1c0..00000000 --- a/js/htk/node-builder.js +++ /dev/null @@ -1,26 +0,0 @@ - -module.exports = new Class -({ - Extends: Vn.Object - - ,doc: null - - ,initialize: function (props) - { - this.doc = document; - this.parent (props); - } - - ,createElement: function (tagName) - { - return document.createElement (tagName); - } - - ,createTextNode: function (text) - { - return document.createTextNode (text); - } - - ,render: function () {} -}); - diff --git a/js/htk/popup.js b/js/htk/popup.js deleted file mode 100644 index a81ea1e0..00000000 --- a/js/htk/popup.js +++ /dev/null @@ -1,231 +0,0 @@ - -var Widget = require ('./widget'); - -/** - * Class to handle popups. - **/ -module.exports = new Class -({ - Extends: Widget - ,Tag: 'htk-popup' - ,Properties: - { - /** - * The popup child. - **/ - child: - { - type: Widget - ,set: function (x) - { - this._child = x; - this._setChildNode (x.node); - } - ,get: function () - { - return this._child; - } - } - /** - * The popup child Node. - **/ - ,childNode: - { - type: Object - ,set: function (x) - { - this._child = null; - this._setChildNode (x); - } - ,get: function () - { - return this.node.firstChild; - } - } - /** - * Indicates how the dialog must be displayed. - **/ - ,modal: - { - type: Boolean - ,set: function (x) - { - this._modal = x; - } - ,get: function () - { - return this._modal; - } - } - } - - ,_parent: null - ,_modal: false - ,_isOpen: false - ,_child: null - - ,initialize: function (props) - { - this._bgMouseDownHandler = this._bgMouseDown.bind (this); - this.parent (props); - } - - ,render: function () - { - var div = this.createRoot ('div'); - div.className = 'htk-popup'; - } - - ,_setChildNode: function (childNode) - { - Vn.Node.removeChilds (this.node); - this.node.appendChild (childNode); - } - - ,show: function (parent) - { - this._parent = parent; - this.open (); - } - - ,isModal: function () - { - return this._modal || Vn.isMobile (); - } - - ,open: function () - { - if (this._isOpen) - { - this.reset (); - return; - } - - this.node.addEventListener ('mousedown', this._onMouseDown.bind (this)); - - if (this.isModal ()) - { - var bg = this._bg = this.createElement ('div'); - bg.className = 'htk-background'; - bg.addEventListener ('mousedown', this._bgMouseDownHandler); - Htk.Toast.pushTop (bg); - - Vn.Node.addClass (this.node, 'modal'); - bg.appendChild (this.node); - - this.doc.body.appendChild (bg); - setTimeout (this._onOpacityTimeout.bind (this), 0); - } - else - { - this.doc.addEventListener ('mousedown', this._bgMouseDownHandler); - this.doc.body.appendChild (this.node); - } - - this._isOpen = true; - this.reset (); - setTimeout (this._onResetTimeout.bind (this), 0); - } - - ,_onOpacityTimeout: function () - { - if (this._bg) - this._bg.style.opacity = 1; - } - - ,_onResetTimeout: function () - { - this.reset (); - } - - ,reset: function () - { - if (!this._isOpen) - return; - - var node = this._node; - - var style = node.style; - style.height = ''; - style.width = ''; - - var margin = 20; - var dblMargin = margin * 2; - var width = node.offsetWidth; - var height = node.offsetHeight; - var innerWidth = window.innerWidth; - var innerHeight = window.innerHeight; - - if (width + dblMargin > innerWidth) - { - width = innerWidth - dblMargin; - style.width = width +'px'; - } - if (height + dblMargin > innerHeight) - { - height = innerHeight - dblMargin; - style.height = height +'px'; - } - - if (this.isModal ()) - { - style.marginLeft = (-node.offsetWidth / 2) +'px'; - style.marginTop = (-node.offsetHeight / 2) +'px'; - } - else - { - var spacing = 4; - var rect = this._parent.getBoundingClientRect (); - var left = rect.left; - var top = rect.top + spacing + this._parent.offsetHeight; - - if (left + width > innerWidth) - left -= (left + width) - window.innerWidth + margin; - if (top + height > innerHeight) - top -= height + this._parent.offsetHeight + spacing * 2; - - if (left < 0) - left = margin; - if (top < 0) - top = margin; - - style.top = (top) +'px'; - style.left = (left) +'px'; - } - } - - ,hide: function () - { - if (!this._isOpen) - return; - - if (this._bg) - { - Htk.Toast.popTop (); - Vn.Node.remove (this._bg); - Vn.Node.removeClass (this._node, 'modal'); - this._bg = null; - } - else - this.doc.removeEventListener ('mousedown', this._bgMouseDownHandler); - - Vn.Node.remove (this._node); - this._parent = null; - this._isOpen = false; - this.signalEmit ('closed'); - } - - ,_bgMouseDown: function (e) - { - if (e !== this._lastEvent) - this.hide (); - - this._lastEvent = null; - } - - ,_onMouseDown: function (e) - { - this._lastEvent = e; - } -}); - diff --git a/js/htk/popup/index.js b/js/htk/popup/index.js new file mode 100644 index 00000000..fa461ad3 --- /dev/null +++ b/js/htk/popup/index.js @@ -0,0 +1,194 @@ +require('./style.scss'); +var Component = require('vn/component'); + +/** + * Class to handle popups. + */ +module.exports = new Class({ + Extends: Component + ,Tag: 'htk-popup' + ,Properties: { + /** + * The popup child. + */ + child: { + type: Component + ,set: function(x) { + this._child = x; + this._setChildNode(x.node); + } + ,get: function() { + return this._child; + } + } + /** + * The popup child Node. + */ + ,childNode: { + type: Object + ,set: function(x) { + this._child = null; + this._setChildNode(x); + } + ,get: function() { + return this.node.firstChild; + } + } + /** + * Indicates how the dialog must be displayed. + */ + ,modal: { + type: Boolean + ,set: function(x) { + this._modal = x; + } + ,get: function() { + return this._modal; + } + } + } + + ,_parent: null + ,_modal: false + ,_isOpen: false + ,_child: null + + ,initialize: function(props) { + this._bgMouseDownHandler = this._bgMouseDown.bind(this); + Component.prototype.initialize.call(this, props); + } + + ,render: function() { + this.createRoot('div'); + } + + ,_setChildNode: function(childNode) { + Vn.Node.removeChilds(this.node); + this.node.appendChild(childNode); + } + + ,show: function(parent, event) { + this._parent = parent; + this._lastEvent = event; + this.open(); + } + + ,isModal: function() { + return this._modal || Vn.isMobile(); + } + + ,open: function() { + if (this._isOpen) { + this.reset(); + return; + } + + this.node.addEventListener('mousedown', this._onMouseDown.bind(this)); + + if (this.isModal()) { + var bg = this._bg = this.createElement('div'); + bg.className = 'htk-background'; + bg.addEventListener('mousedown', this._bgMouseDownHandler); + Htk.Toast.pushTop(bg); + + this.node.classList.add('modal'); + bg.appendChild(this.node); + + this.doc.body.appendChild(bg); + setTimeout(this._onOpacityTimeout.bind(this), 0); + } else { + this.doc.addEventListener('mousedown', this._bgMouseDownHandler); + this.doc.body.appendChild(this.node); + } + + this._isOpen = true; + this.reset(); + setTimeout(this._onResetTimeout.bind(this), 0); + } + + ,_onOpacityTimeout: function() { + if (this._bg) + this._bg.style.opacity = 1; + } + + ,_onResetTimeout: function() { + this.reset(); + } + + ,reset: function() { + if (!this._isOpen) + return; + + var node = this._node; + + var style = node.style; + style.height = ''; + style.width = ''; + + if (!this.isModal()) { + var margin = 20; + var dblMargin = margin * 2; + var width = node.offsetWidth; + var height = node.offsetHeight; + var innerWidth = window.innerWidth; + var innerHeight = window.innerHeight; + + if (width + dblMargin > innerWidth) { + width = innerWidth - dblMargin; + style.width = width +'px'; + } + if (height + dblMargin > innerHeight) { + height = innerHeight - dblMargin; + style.height = height +'px'; + } + + var spacing = 4; + var rect = this._parent.getBoundingClientRect(); + var left = rect.left; + var top = rect.top + spacing + this._parent.offsetHeight; + + if (left + width > innerWidth) + left -= (left + width) - window.innerWidth + margin; + if (top + height > innerHeight) + top -= height + this._parent.offsetHeight + spacing * 2; + + if (left < 0) + left = margin; + if (top < 0) + top = margin; + + style.top = (top) +'px'; + style.left = (left) +'px'; + } + } + + ,hide: function() { + if (!this._isOpen) + return; + + if (this._bg) { + Htk.Toast.popTop(); + Vn.Node.remove(this._bg); + Vn.Node.removeClass(this._node, 'modal'); + this._bg = null; + } else + this.doc.removeEventListener('mousedown', this._bgMouseDownHandler); + + Vn.Node.remove(this._node); + this._parent = null; + this._isOpen = false; + this.emit('closed'); + } + + ,_bgMouseDown: function(e) { + if (e !== this._lastEvent) + this.hide(); + + this._lastEvent = null; + } + + ,_onMouseDown: function(e) { + this._lastEvent = e; + } +}); + diff --git a/js/htk/popup/style.scss b/js/htk/popup/style.scss new file mode 100644 index 00000000..89a15908 --- /dev/null +++ b/js/htk/popup/style.scss @@ -0,0 +1,36 @@ + +.htk-popup { + z-index: 200; + display: block; + position: fixed; + overflow: hidden; + background-color: white; + border-radius: 10px; + box-shadow: 0 0 0.4em rgba(1, 1, 1, 0.6); + box-sizing: content-box; + + &.modal { + position: relative; + font-size: 1.2em; + max-width: 100%; + max-height: 100%; + } + & > * { + border-radius: 0.1em; + } +} +.htk-background { + position: fixed; + display: flex; + align-items: center; + justify-content: center; + left: 0; + right: 0; + top: 0; + bottom: 0; + z-index: 190; + padding: 20px; + background-color: rgba(1, 1, 1, 0.7); + opacity: 0; + transition: opacity 200ms ease-in-out; +} diff --git a/js/htk/radio/index.js b/js/htk/radio/index.js new file mode 100644 index 00000000..4c771a03 --- /dev/null +++ b/js/htk/radio/index.js @@ -0,0 +1,82 @@ + +var RadioGroup = require('./radio-group'); + +module.exports = new Class({ + Extends: Htk.Field + ,Tag: 'htk-radio' + ,Properties: { + tip: { + type: String + ,set: function(x) { + if (x) + this.node.title = _(x); + } + }, + val: { + type: String + ,get: function() { + return this._val; + } + ,set: function(x) { + this._val = x; + this.node.value = !x ? '' : x; + this._onRadioGroupChange(); + } + }, + name: { + type: String + ,get: function() { + return this.node.name; + } + ,set: function(x) { + this.node.name = x; + } + }, + radioGroup: { + type: RadioGroup + ,get: function() { + return this._radioGroup; + } + ,set: function(x) { + if (this._radioGroup) + this._radioGroup.removeButton(this); + + this.link({_radioGroup: x}, {'changed': this._onRadioGroupChange}); + this.node.name = x.name; + x.buttons.push(this); + this._onRadioGroupChange(); + } + } + } + + ,_radioGroup: null + + ,render: function() { + var radio = Vn.Browser.createRadio('', this.doc); + radio.checked = false; + radio.addEventListener('change', this._onChange.bind(this)); + this._node = radio; + } + + ,_onChange: function() { + if (this.node.checked && this._radioGroup) + this._radioGroup.value = this._val || this.value; + } + + ,_onRadioGroupChange: function() { + const value = this._radioGroup.value; + this.node.checked = + value && (value == this._val || value == this.value); + } + + ,putValue: function(value) { + if (!value) + this.node.value = ''; + else + this.node.value = value; + } + + ,setEditable: function(editable) { + this.node.disabled = !editable; + } +}); diff --git a/js/htk/field/radio-group.js b/js/htk/radio/radio-group.js similarity index 65% rename from js/htk/field/radio-group.js rename to js/htk/radio/radio-group.js index 9ed79344..59673b4f 100644 --- a/js/htk/field/radio-group.js +++ b/js/htk/radio/radio-group.js @@ -1,35 +1,30 @@ var htkRadioGroupUid = 0; -module.exports = new Class -({ +module.exports = new Class({ Extends: Htk.Field ,Tag: 'htk-radio-group' ,radioLock: false - ,initialize: function (props) - { - this.clear (); - this.parent (props); + ,initialize: function(props) { + this.clear(); + Htk.Field.prototype.initialize.call(this, props); } - ,clear: function () - { + ,clear: function() { this.name = htkRadioGroupUid++; this.buttons = []; } - ,createButton: function (value) - { - var button = Vn.Browser.createRadio (this.name, this.doc); + ,createButton: function(value) { + var button = Vn.Browser.createRadio(this.name, this.doc); button.value = value; button.radioGroup = this; return button; } - ,removeButton: function (button) - { + ,removeButton: function(button) { for (var i = 0; i < this.buttons.length; i++) if (this.buttons === button) { this.buttons.splice(i, 1); @@ -40,7 +35,7 @@ module.exports = new Class /** * @return %true if there is an option selected, otherwise it returns %false */ - ,isSelected: function () { + ,isSelected: function() { for (var i = 0; i < this.buttons.length; i++) if (this.buttons[i].value == this.value) return true; diff --git a/js/htk/repeater.js b/js/htk/repeater.js deleted file mode 100644 index 5b3f89f8..00000000 --- a/js/htk/repeater.js +++ /dev/null @@ -1,267 +0,0 @@ - -var Widget = require ('./widget'); - -module.exports = new Class -({ - Extends: Widget - ,Tag: 'htk-repeater' - ,Child: 'model' - ,Properties: - { - /** - * The source data model. - **/ - model: - { - type: Db.Model - ,set: function (x) - { - this.link ({_model: x}, - { - 'status-changed': this._onModelChange - ,'row-deleted': this._onRowDelete - ,'row-updated': this._onRowUpdate - ,'row-inserted': this._onRowInsert - }); - - this._onModelChange (); - } - ,get: function () - { - this._model; - } - } - /** - * The identifier for internal iterator. - **/ - ,formId: - { - type: String - ,set: function (x) - { - this._formId = x; - } - ,get: function () - { - this._formId; - } - } - /** - * {Function (Vn.BuilderResult, Db.Form)} Function to call after every - * box rendering. - **/ - ,renderer: - { - type: Function - ,set: function (x) - { - this._renderer = x; - } - ,get: function () - { - this._renderer; - } - } - /** - * Wether to show the model status. - **/ - ,showStatus: - { - type: Boolean - ,set: function (x) - { - this._showStatus = x; - this._onModelChange(); - } - ,get: function () - { - this._showStatus; - } - } - /** - * Message that should be displayed when source model is not ready. - **/ - ,emptyMessage: - { - type: String - ,value: null - } - } - - ,_builder: null - ,_formId: 'form' - ,_showStatus: true - - ,render: function () - { - var div = this.createRoot ('div'); - - this._container = this.createElement ('div'); - this._container.className = 'htk-repeater'; - div.appendChild (this._container); - } - - ,loadXml: function (builderResult, node) - { - this.parent (builderResult, node); - - var builder = this._builder = new Vn.Builder (); - builder.setParent (builderResult); - builder.loadXmlFromNode (node.firstElementChild); - - this._onModelChange (); - } - - ,getChild: function (index) - { - return this._container.childNodes[index]; - } - - ,getBuilder: function (index) - { - return this._childsData[index].builder; - } - - ,getForm: function (index) - { - return this._childsData[index].set; - } - - ,_buildBox: function (index) - { - var set = new Db.SimpleIterator ({ - model: this._model, - row: index - }); - - this._builder.add (this._formId, set); - var res = this._builder.load (); - res.link (); - - this._childsData.push ({ - builder: res, - set: set - }); - - if (this._renderer) - this._renderer (res, set); - - return res.getMain (); - } - - ,_onModelChange: function () - { - if (!this._model || !this._builder) - return; - - this.node.removeChild (this._container); - Vn.Node.removeChilds (this._container); - - this._freeChildsData (); - this._childsData = []; - - switch (this._model.status) - { - case Db.Model.Status.READY: - { - for (var i = 0; i < this._model.numRows; i++) - this._container.appendChild (this._buildBox (i)); - - this._showNoRecordsFound (); - break; - } - case Db.Model.Status.LOADING: - this._showMessage (_('Loading'), null); - break; - case Db.Model.Status.CLEAN: - { - var emptyMessage = this.emptyMessage ? - this.emptyMessage : _('NoData'); - this._showMessage (emptyMessage, 'refresh'); - break; - } - case Db.Model.Status.ERROR: - this._showMessage (_('ErrorLoadingData'), 'error'); - break; - } - - this.node.appendChild (this._container); - this.signalEmit ('change'); - } - - ,_showNoRecordsFound: function () - { - if (this._model.numRows === 0) - this._showMessage (_('EmptyList'), 'clean'); - } - - ,_showMessage: function (message, src) - { - if (!this._showStatus) - return; - - var div = this.createElement ('div'); - div.className = 'message'; - this._container.appendChild (div); - - if (src) - { - var img = this.createElement ('img'); - img.alt = ''; - img.src = 'image/icon/light/'+ src +'.svg'; - div.appendChild (img); - } - else - { - var spinner = new Htk.Spinner (); - spinner.start (); - div.appendChild (spinner.node); - } - - div.appendChild (this.createTextNode (message)); - } - - ,_onRowDelete: function (model, row) - { - Vn.Node.remove (this._container.childNodes[row]); - this._unrefChildData (row); - this._childsData.splice (row, 1); - - for (var i = row; i < this._model.numRows; i++) - this._childsData[i].set.row = i; - - this._showNoRecordsFound (); - } - - ,_onRowUpdate: function (model, row) - { - this._childsData[row].set.iterChanged (); - } - - ,_onRowInsert: function (model, row) - { - var box = this._buildBox (row); - this._container.appendChild (box); - } - - ,_freeChildsData: function () - { - if (this._childsData) - for (var i = 0; i < this._childsData.length; i++) - this._unrefChildData (i); - } - - ,_unrefChildData: function (index) - { - var childData = this._childsData[index]; - childData.set.unref (); - childData.builder.unref (); - } - - ,destroy: function () - { - this._freeChildsData (); - this.parent (); - } -}); - diff --git a/js/htk/repeater/index.js b/js/htk/repeater/index.js new file mode 100644 index 00000000..b7ce3f23 --- /dev/null +++ b/js/htk/repeater/index.js @@ -0,0 +1,231 @@ +require('./style.scss'); +var Component = require('vn/component'); + +module.exports = new Class({ + Extends: Component + ,Tag: 'htk-repeater' + ,Child: 'model' + ,Properties: { + /** + * The source data model. + */ + model: { + type: Db.Model + ,set: function(x) { + this.link({_model: x}, { + 'status-changed': this._onModelChange + ,'row-deleted': this._onRowDelete + ,'row-updated': this._onRowUpdate + ,'row-inserted': this._onRowInsert + }); + + this._onModelChange(); + } + ,get: function() { + this._model; + } + } + /** + * The identifier for internal iterator. + */ + ,formId: { + type: String + ,set: function(x) { + this._formId = x; + } + ,get: function() { + this._formId; + } + } + /** + * {Function (Vn.BuilderResult, Db.Form)} Function to call after every + * box rendering. + */ + ,renderer: { + type: Function + ,set: function(x) { + this._renderer = x; + } + ,get: function() { + this._renderer; + } + } + /** + * Wether to show the model status. + */ + ,showStatus: { + type: Boolean + ,set: function(x) { + this._showStatus = x; + this._onModelChange(); + } + ,get: function() { + this._showStatus; + } + } + /** + * Message that should be displayed when source model is not ready. + */ + ,emptyMessage: { + type: String + ,value: null + } + } + + ,_builder: null + ,_formId: 'form' + ,_showStatus: true + + ,render: function() { + var div = this.createRoot('div'); + + this._container = this.createElement('div'); + this._container.className = 'htk-repeater'; + div.appendChild(this._container); + } + + ,loadXml: function(scope, node) { + Component.prototype.loadXml.call(this, scope, node); + this._parentScope = scope; + + var builder = this._builder = new Vn.Builder(); + builder.compileNode(node.firstElementChild, [this._formId]); + + this._onModelChange(); + } + + ,getChild: function(index) { + return this._container.childNodes[index]; + } + + ,getBuilder: function(index) { + return this._childsData[index].scope; + } + + ,getForm: function(index) { + return this._childsData[index].set; + } + + ,_buildBox: function(index) { + var set = new Db.SimpleIterator({ + model: this._model, + row: index + }); + + var scope = this._builder.load(this.doc, null, this._parentScope); + scope.link({ + $iter: set, + [this._formId]: set.getObject() + }); + + this._childsData.push({scope, set}); + + if (this._renderer) + this._renderer(scope, set); + + return scope.getMain(); + } + + ,_onModelChange: function() { + if (!this._model || !this._builder) + return; + + this.node.removeChild(this._container); + Vn.Node.removeChilds(this._container); + + this._freeChildsData(); + this._childsData = []; + + switch (this._model.status) { + case Db.Model.Status.READY: + { + for (var i = 0; i < this._model.numRows; i++) + this._container.appendChild(this._buildBox(i)); + + this._showNoRecordsFound(); + break; + } + case Db.Model.Status.LOADING: + this._showMessage(_('Loading'), null); + break; + case Db.Model.Status.CLEAN: + { + var emptyMessage = this.emptyMessage ? + this.emptyMessage : _('NoData'); + this._showMessage(emptyMessage, 'refresh'); + break; + } + case Db.Model.Status.ERROR: + this._showMessage(_('ErrorLoadingData'), 'error'); + break; + } + + this.node.appendChild(this._container); + this.emit('change'); + } + + ,_showNoRecordsFound: function() { + if (this._model.numRows === 0) + this._showMessage(_('EmptyList'), 'block'); + } + + ,_showMessage: function(message, src) { + if (!this._showStatus) + return; + + var div = this.createElement('div'); + div.className = 'message'; + this._container.appendChild(div); + + if (src) { + const icon = new Htk.Icon({ + name: src + }); + div.appendChild(icon.node); + } else { + var spinner = new Htk.Spinner(); + spinner.start(); + div.appendChild(spinner.node); + } + + div.appendChild(this.createTextNode(message)); + } + + ,_onRowDelete: function(model, row) { + Vn.Node.remove(this._container.childNodes[row]); + this._unrefChildData(row); + this._childsData.splice(row, 1); + + for (var i = row; i < this._model.numRows; i++) + this._childsData[i].set.row = i; + + this._showNoRecordsFound(); + } + + ,_onRowUpdate: function(model, row) { + this._childsData[row].set.iterChanged(); + } + + ,_onRowInsert: function(model, row) { + var box = this._buildBox(row); + this._container.appendChild(box); + } + + ,_freeChildsData: function() { + if (this._childsData) + for (var i = 0; i < this._childsData.length; i++) + this._unrefChildData(i); + } + + ,_unrefChildData: function(index) { + var childData = this._childsData[index]; + childData.set.unref(); + childData.scope.unref(); + } + + ,destroy: function() { + this._freeChildsData(); + Component.prototype.destroy.call(this); + } +}); + diff --git a/js/htk/repeater/style.scss b/js/htk/repeater/style.scss new file mode 100644 index 00000000..fc353a74 --- /dev/null +++ b/js/htk/repeater/style.scss @@ -0,0 +1,16 @@ + +.htk-repeater { + & > .message { + padding: 1.5em; + text-align: center; + + & > * { + vertical-align: middle; + } + & > span, + & > .htk-spinner { + display: inline-block; + padding-right: 10px; + } + } +} diff --git a/js/htk/field/search-entry.js b/js/htk/search-entry/index.js similarity index 51% rename from js/htk/field/search-entry.js rename to js/htk/search-entry/index.js index 62ac2268..c2b91fa0 100644 --- a/js/htk/field/search-entry.js +++ b/js/htk/search-entry/index.js @@ -1,32 +1,30 @@ +require('./style.scss'); -module.exports = new Class -({ +module.exports = new Class({ Extends: Htk.Field ,Tag: 'htk-search-entry' - ,render: function () - { - var div = this.createRoot ('div'); + ,render: function() { + var div = this.createRoot('div'); div.className = 'htk-search-entry'; - var icon = new Htk.Icon ({ - icon: 'search', + var icon = new Htk.Icon({ + name: 'search', alt: _('Search') }); - div.appendChild (icon.node); + div.appendChild(icon.node); - var input = this.createElement ('input'); + var input = this.createElement('input'); input.className = 'entry'; input.type = 'text'; input.placeholder = _('Search'); - input.addEventListener ('change', this._onChange.bind (this)); - div.appendChild (input); + input.addEventListener('change', this._onChange.bind(this)); + div.appendChild(input); this._input = input; } - ,_onChange: function (event) - { + ,_onChange: function() { var newValue; if (this._input.value === '') @@ -34,19 +32,17 @@ module.exports = new Class else newValue = this._input.value; - this.valueChanged (newValue); + this.valueChanged(newValue); } - ,putValue: function (value) - { + ,putValue: function(value) { if (!value) this._input.value = ''; else this._input.value = value; } - ,setEditable: function (editable) - { + ,setEditable: function(editable) { this.node.readOnly = !editable; } }); diff --git a/js/htk/search-entry/style.scss b/js/htk/search-entry/style.scss new file mode 100644 index 00000000..071f7d32 --- /dev/null +++ b/js/htk/search-entry/style.scss @@ -0,0 +1,33 @@ + +.htk-search-entry { + display: flex; + align-items: center; + gap: 6px; + background-color: white; + height: 40px; + border-radius: 20px; + padding: 0 12px; + overflow: hidden; + + & > * { + display: inline-block; + vertical-align: middle; + } + & > .htk-icon { + display: block; + margin: 0; + color: gray; + } + & > .entry { + margin: 0; + border: none; + width: 80px; + box-shadow: none; + padding-right: 0; + padding-left: 0; + height: inherit; + } + & > .entry:focus { + background-color: initial; + } +} \ No newline at end of file diff --git a/js/htk/select/index.js b/js/htk/select/index.js new file mode 100644 index 00000000..341c3b3b --- /dev/null +++ b/js/htk/select/index.js @@ -0,0 +1,259 @@ +require('./style.scss'); +var ColumnText = require('../columns/text'); + +module.exports = new Class({ + Extends: Htk.Field + ,Implements: Db.Iterator + ,Tag: 'htk-combo' + ,Properties: { + /** + * The model associated to this form. + */ + model: { + type: Db.Model + ,set: function(x) { + this.link({_model: x}, {'status-changed-after': this._onModelChange}); + this._onModelChange(); + } + ,get: function() { + return this._model; + } + }, + /** + * The row where the form positioned, has -1 if the row is unselected. + */ + row: { + type: Number + ,set: function(x) { + if (!this._model || this._model.numRows <= x || x < -1) + x = -1; + if (x == this._row) + return; + + this._row = x; + this.iterChanged(); + } + ,get: function() { + return this._row; + } + }, + /** + * The number of rows in the form. + */ + numRows:{ + type: Number + ,get: function() { + if (this._model) + return this._model.numRows; + + return 0; + } + }, + /** + * Checks if the form data is ready. + */ + ready:{ + type: Boolean + ,get: function() { + return this._model && this._model.ready; + } + }, + /** + * Checks if the form data is ready. + */ + placeholder:{ + type: String + ,set: function(x) { + this._placeholder = x; + this._refreshShowText(x); + } + ,get: function() { + return this._placeholder; + } + }, + /** + * Wether to allow null values. + */ + notNull:{ + type: Boolean + ,set: function(x) { + this._notNull = x; + } + ,get: function() { + return this._notNull; + } + }, + /** + * The row object. + */ + $: { + type: Object + ,get: function() { + return this._model.getObject(this._row) || {}; + } + }, + params: { + type: Object + ,get: function() { + return this.$; + } + } + } + + ,_row: -1 + ,_model: null + ,valueColumnIndex: 0 + ,valueColumnName: null + ,showColumnIndex: 1 + ,showColumnName: null + ,_notNull: true + ,_webkitRefresh: false + + ,render: function() { + const button = this.createRoot('button'); + button.type = 'button'; + button.classList.add('input'); + button.addEventListener('mousedown', + e => this._onButtonMouseDown(e)); + + this.label = this.createElement('span'); + button.appendChild(this.label); + + const erase = new Htk.Icon({ + name: 'close', + title: _('Erase') + }); + erase.classList.add('erase'); + erase.addEventListener('mousedown', + e => this._onEraseMouseDown(e)); + button.appendChild(erase.node); + + const dropDown = new Htk.Icon({ + name: 'expand_more' + }); + button.appendChild(dropDown.node); + } + + ,_setRow: function(row) { + this._row = row; + this._refreshShowText(); + this.iterChanged(); + } + + ,_onEraseMouseDown(event) { + if (event.defaultPrevented) return; + event.preventDefault(); + this._setRow(-1); + this.valueChanged(undefined); + } + + ,_onButtonMouseDown: function(event) { + if (this._popup) { + this._popup.hide(); + return; + } + + if (event.defaultPrevented) return; + event.preventDefault(); + + var model = this._model; + + var menu = this.createElement('div'); + menu.className = 'htk-select-menu'; + + var grid = new Htk.Grid({showHeader: false}); + menu.appendChild(grid.node); + + var gridNode = grid.node; + gridNode.addEventListener('click', this._onGridClicked.bind(this, grid)); + + var column = new ColumnText({columnIndex: this.showColumnIndex}); + grid.appendColumn(column); + grid.model = model; + + var popup = this._popup = new Htk.Popup({childNode: menu}); + popup.on('closed', this._onPopupClose.bind(this)); + popup.show(this.node, event); + + this.emit('menu-show'); + } + + ,_onGridClicked: function(grid, e) { + let cell; + let target = e.target; + + while (target !== grid.tbody) { + cell = target; + target = target.parentNode; + } + + if (!cell) return; + + let value; + const row = cell.rowIndex - 1; + + if (row >= 0) + value = this._model.getByIndex(row, this.valueColumnIndex); + else + value = null; + + this._setRow(row); + this.valueChanged(value); + this._popup.hide(); + + e.stopPropagation(); + } + + ,_onPopupClose: function() { + this._popup = null; + this.emit('menu-hide'); + } + + ,_refreshShowText: function() { + var model = this._model; + + if (this._row !== -1) + var showText = model.getByIndex(this._row, this.showColumnIndex); + else if (model && model.status === Db.Model.Status.LOADING) + var showText = _('Loading...'); + else if (this._placeholder) + var showText = this._placeholder; + else + var showText = ''; + + Vn.Node.setText(this.label, showText); + } + + ,_onModelChange: function() { + var model = this._model; + this.emit('status-changed'); + + if (this._popup) + this._popup.reset(); + + if (model && model.ready) { + this._selectOption(); + this.emit('ready'); + } else + this._setRow(-1); + } + + ,setEditable: function(editable) { + this.node.disabled = !editable; + } + + ,_selectOption: function() { + var row; + + if (this._model && this._model.ready) + row = this._model.searchByIndex(this.valueColumnIndex, this._value); + else + row = -1; + + this._setRow(row); + } + + ,putValue: function() { + this._selectOption(); + } +}); diff --git a/js/htk/select/style.scss b/js/htk/select/style.scss new file mode 100644 index 00000000..050534b0 --- /dev/null +++ b/js/htk/select/style.scss @@ -0,0 +1,53 @@ +@import "../style/variables"; + +.htk-combo { + display: flex; + align-items: center; + font-weight: normal; + width: 100%; + + & > span { + flex: 1; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + & > .htk-icon { + flex: none; + color: #666; + + &.erase { + display: none + } + } + &:not(.filled) > span { + color: #666; + } + &.filled:hover > .htk-icon.erase { + display: block; + } +} +.htk-select-menu { + height: 100%; + max-height: 80em; + overflow: auto; + min-width: 14em; + + tbody > tr { + border-top: none; + height: 2.5em; + } + td.message { + padding: 1em; + } + tr:hover { + background-color: rgba(1, 1, 1, 0.1); + cursor: pointer; + } + td { + max-width: 11em; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} \ No newline at end of file diff --git a/js/htk/spin/index.js b/js/htk/spin/index.js new file mode 100644 index 00000000..6032bacf --- /dev/null +++ b/js/htk/spin/index.js @@ -0,0 +1,38 @@ + +module.exports = new Class({ + Extends: Htk.Field + ,Tag: 'htk-spin' + + ,render: function() { + var input = this.createRoot('input'); + this.node.type = 'number'; + input.addEventListener('change', this._onChange.bind(this)); + + this.unit = null; + this.digits = 0; + } + + ,_onChange: function() { + var newValue = (this.node.value == '') ? null : parseFloat(this.node.value); + this.node.value = newValue; + this.valueChanged(newValue); + } + + ,putValue: function(value) { + var text; + + if (value != null) { + text = (new Number(value)).toFixed(this.digits); + + if (this.unit != null) + text += ' ' + this.unit; + } else + text = ''; + + this.node.value = text; + } + + ,setEditable: function(editable) { + this.node.readOnly = !editable; + } +}); diff --git a/js/htk/spinner.js b/js/htk/spinner.js deleted file mode 100644 index f7edcd39..00000000 --- a/js/htk/spinner.js +++ /dev/null @@ -1,38 +0,0 @@ - -var Widget = require ('./widget'); - -module.exports = new Class -({ - Extends: Widget - ,Tag: 'htk-spinner' - - ,_started: false - - ,render: function () - { - var loader = this.createRoot ('div'); - loader.className = 'htk-spinner'; - - var spin = this.spin = this.createElement ('div'); - loader.appendChild (spin); - } - - ,start: function () - { - if (this._started) - return; - - Vn.Node.addClass (this.spin, 'spinner'); - this._started = true; - } - - ,stop: function () - { - if (!this._started) - return; - - Vn.Node.removeClass (this.spin, 'spinner'); - this._started = false; - } -}); - diff --git a/js/htk/spinner/index.js b/js/htk/spinner/index.js new file mode 100644 index 00000000..b95fadc3 --- /dev/null +++ b/js/htk/spinner/index.js @@ -0,0 +1,33 @@ +require('./style.scss'); +var Component = require('vn/component'); + +module.exports = new Class({ + Extends: Component + ,Tag: 'htk-spinner' + + ,_started: false + + ,render: function() { + var loader = this.createRoot('div'); + + var spin = this.spin = this.createElement('div'); + loader.appendChild(spin); + } + + ,start: function() { + if (this._started) + return; + + Vn.Node.addClass(this.spin, 'spinner'); + this._started = true; + } + + ,stop: function() { + if (!this._started) + return; + + Vn.Node.removeClass(this.spin, 'spinner'); + this._started = false; + } +}); + diff --git a/js/htk/spinner/style.scss b/js/htk/spinner/style.scss new file mode 100644 index 00000000..df630787 --- /dev/null +++ b/js/htk/spinner/style.scss @@ -0,0 +1,31 @@ + +.htk-spinner { + width: 1.8em; + height: 1.8em; + position: relative; + display: inline-block; + + & > .spinner { + left: 0; + position: absolute; + width: inherit; + height: inherit; + box-sizing: border-box; + border-radius: 50%; + border: 2px solid transparent; + border-top-color: #666; + border-left-color: #666; + animation: spinner 1s linear infinite; + -webkit-animation: spinner 1s linear infinite; + } + &.dark > .spinner { + border-top-color: white; + border-left-color: white; + } +} +@keyframes spinner { + to {transform: rotate(360deg);} +} +@-webkit-keyframes spinner { + to {-webkit-transform: rotate(360deg);} +} diff --git a/js/htk/step.js b/js/htk/step/index.js similarity index 78% rename from js/htk/step.js rename to js/htk/step/index.js index 724266a4..3da1bfd4 100644 --- a/js/htk/step.js +++ b/js/htk/step/index.js @@ -1,8 +1,8 @@ -var Widget = require('./widget'); +var Component = require('vn/component'); module.exports = new Class({ - Extends: Widget, + Extends: Component, Tag: 'htk-step', Properties: { name: { @@ -20,9 +20,8 @@ module.exports = new Class({ }, initialize: function(props) { - var node = this.createRoot('div'); - node.className = 'htk-step'; - this.parent(props); + Component.prototype.initialize.call(this, props); + this.createRoot('div'); }, show: function() { @@ -42,7 +41,7 @@ module.exports = new Class({ }, appendChild: function(child) { - if (child instanceof Widget) + if (child instanceof Component) child = child.node; this.node.appendChild(child); } diff --git a/js/htk/style.css b/js/htk/style.css deleted file mode 100644 index cc3676f4..00000000 --- a/js/htk/style.css +++ /dev/null @@ -1,661 +0,0 @@ - -/* Grid */ - -.htk-grid -{ - margin: auto; - border-collapse: collapse; -} -.htk-grid > thead > tr, -.htk-grid > tfoot > tr -{ - background-color: #009688; - vertical-align: middle; - height: 3em; -} -.htk-grid th -{ - color: white; - cursor: pointer; - font-weight: normal; - padding: 0 0.4em; -} -.htk-grid th:hover -{ - background-color: rgba(1, 1, 1, 0.2); -} -.htk-grid tr -{ - height: 3.5em; -} -.htk-grid > tfoot a, -.htk-grid > thead a -{ - color: black; -} -.htk-grid tr.pair-row -{ - background-color: transparent; -} -.htk-grid > tbody tr -{ - border-top: 1px solid #DDD; -} -.htk-grid > tbody tr:first-child -{ - border-top: none; -} -.htk-grid > tbody td -{ - margin: 0; - padding: 0 0.5em; -} -.htk-grid th, -.htk-grid td -{ - text-align: left; -} -.htk-grid td:first-child, -.htk-grid th:first-child -{ - padding-left: 1em; -} -.htk-grid td:last-child, -.htk-grid th:last-child -{ - padding-right: 1em; -} -.htk-grid .message -{ - padding: 1.5em; - text-align: center; -} -.htk-grid .message > * -{ - display: inline-block; - vertical-align: middle; - padding-right: 0.8em; -} -.htk-grid .message > img -{ - height: 1.8em; -} - -/* Grid cells */ - -th.cell-spin -{ - text-align: right; -} -td.cell-spin -{ - width: 2.5em; - text-align: right; -} -th.cell-check, -th.cell-radio -{ - text-align: center; -} -td.cell-button -{ - max-width: 1em; - text-align: center; -} -td.cell-button > button, -td.cell-button > a -{ - display: inline-block; - margin: 0 auto; - padding: .5em; - border: none; - background-color: transparent; - border-radius: .1em; - box-sizing: border-box; -} -td.cell-button > button:hover, -td.cell-button > a:hover -{ - background-color: rgba(1, 1, 1, 0.1); -} -td.cell-button img -{ - height: 1.5em; - width: 1.5em; - display: block; - margin: auto; - padding: 0; -} -td.cell-image -{ - text-align: center; -} -td.cell-image .htk-image -{ - max-width: 2.5em; - max-height: 2.5em; - display: block; - margin: auto; -} - -/* Select */ - -.htk-select -{ - width: 100%; - height: 2em; - text-align: left; -} -.htk-select-menu -{ - height: 100%; - max-height: 80em; - overflow: auto; - min-width: 14em; -} -.htk-select-menu tbody > tr -{ - border-top: none; - height: 2.5em; -} -.htk-select-menu td.message -{ - padding: 1em; -} -.htk-select-menu tr:hover -{ - background-color: rgba(1, 1, 1, 0.1); - cursor: pointer; -} -.htk-select-menu td -{ - max-width: 11em; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -/* Button */ - -.htk-button > span -{ - margin-left: .5em; -} - -/* Repater */ - -.htk-repeater > .message -{ - padding: 1.5em; - text-align: center; -} -.htk-repeater > .message > * -{ - vertical-align: middle; -} -.htk-repeater > .message > img, -.htk-repeater > .message > .htk-spinner -{ - display: inline-block; - padding-right: .8em; - height: 1.8em; -} - -/* Calendar */ - -.htk-calendar -{ - width: 20em; - background-color: white; - border: none; -} -.htk-calendar table -{ - border-collapse: collapse; -} -.htk-calendar thead tr, -.htk-calendar tfoot tr -{ - background-color: #009688; - color: white; - font-weight: normal; - vertical-align: middle; - text-align: center; - height: 3em; -} -.htk-calendar thead span -{ - color: white; -} -.htk-calendar thead tr -{ - border-bottom: none; -} -.htk-calendar tfoot tr -{ - border-top: none; -} -.htk-calendar th.button -{ - display: table-cell; -} -.htk-calendar th.button:hover -{ - cursor: pointer; - background-color: rgba(1, 1, 1, 0.2); -} -.htk-calendar col -{ - width: 14.2%; -} -.htk-calendar tr -{ - height: 2em; -} -.htk-calendar tbody td -{ - text-align: right; -} -.htk-calendar tbody td > div -{ - height: 2em; - width: 2em; - line-height: 2em; - text-align: center; - border-radius: 2em; - padding: 0.3em; - margin: 0 auto; - color: #555; -} -.htk-calendar div.disabled -{ - color: #999; -} -.htk-calendar div.today -{ - font-weight: bold; - color: black; -} -.htk-calendar div.selected -{ - color: white; - background-color: #009688; -} -.htk-calendar div.enabled:hover -{ - cursor: pointer; - background-color: #008678; - color: white; -} - -/* Image */ - -.htk-image -{ - position: relative; - overflow: hidden; -} -.htk-image.clickable:hover -{ - cursor: pointer; - opacity: 0.85; -} -.htk-image > img -{ - display: block; - height: 100%; - width: 100%; -} -.htk-image > button -{ - position: absolute; - top: 0; - left: 0; - margin: 0; - padding: .15em; - display: none; -} -.htk-image:hover > button -{ - display: block; -} -.htk-image > button > img -{ - display: block; - height: 1.2em; - height: 1.2em; -} - -/* Full image */ - -.htk-full-image img -{ - display: block; - cursor: pointer; -} -.htk-full-image .htk-spinner -{ - background-color: #FFF; - margin: .6em; - display: block; -} - -/* Image editor */ - -.htk-image-editor -{ - width: 18em; - margin: 0 auto; - padding: 1.5em; -} -.htk-image-editor h2 -{ - color: white; - background-color: #009688; - text-align: left; - font-size: 1.3em; - line-height: 1.7em; - font-weight: normal; - padding: 0.6em 0.8em; - margin: 0; -} -.htk-image-editor iframe -{ - display: none; -} -.htk-image-editor .footer -{ - margin-top: 2em; -} -.htk-image-editor .footer > .htk-spinner -{ - padding-right: 1.2em; - height: 1.3em; - width: 1.3em; -} -.htk-image-editor .footer > .htk-spinner, -.htk-image-editor .footer > input -{ - float: right; -} - -/* Toast */ - -.htk-toast -{ - z-index: 210; - display: block; - position: fixed; - left: 50%; - top: 4em; - width: 21em; - margin-left: -10.5em; - text-align: center; - overflow: auto; - max-height: 40em; - overflow: visible; -} -.htk-toast > div -{ - margin: .5em 0; - padding: .5em 2%; - border-radius: 0.1em; - box-shadow: 0 0 0.4em rgba(1, 1, 1, 0.6); - width: 96%; - - opacity: 0; - transform: translateZ(0) translateY(-1em); - -webkit-transform: translateZ(0) translateY(-1em); - - transition-property: opacity, transform; - transition-duration: 200ms; - transition-timing-function: ease-out; -} -.htk-toast > div.show -{ - opacity: 1; - transform: translateZ(0) translateY(0em); - -webkit-transform: translateZ(0) translateY(0em); -} -.htk-toast > .message -{ - background-color: #BBFFBB; - color: #363; -} -.htk-toast > .warning -{ - background-color: #FFE0B2; - color: #C30; -} -.htk-toast > .error -{ - background-color: #FFCDD2; - color: #A00; -} - -/* Popup */ - -.htk-background -{ - position: fixed; - left: 0; - right: 0; - top: 0; - bottom: 0; - z-index: 190; - background-color: rgba(1, 1, 1, 0.7); - opacity: 0; - transition: opacity 200ms ease-in-out; -} -.htk-popup -{ - z-index: 200; - display: block; - position: fixed; - overflow: hidden; - background-color: white; - border-radius: 0.15em; - box-shadow: 0 0 0.4em rgba(1, 1, 1, 0.6); - box-sizing: content-box; -} -.htk-popup.modal -{ - position: absolute; - font-size: 1.2em; - top: 50%; - left: 50%; -} -.htk-popup > * -{ - border-radius: 0.1em; -} - -/* Dialog */ - -.htk-dialog -{ - padding: 1.5em; - max-width: 20em; - font-weight: normal; - color: #555; -} -.htk-dialog p -{ - margin: 0; -} -.htk-dialog img -{ - float: left; - height: 3em; - margin-top: 0; - margin-right: 1em; -} -.htk-dialog p -{ - padding: 0; -} -.htk-dialog .button-bar > button -{ - float: right; - margin-left: 1em; - margin-top: .5em; -} - -/* Assistant */ - -.htk-assistant > div -{ - display: none; -} -.htk-assistant > div > h2 -{ - text-align: center; - font-style: italic; - font-weight: normal; - font-size: 1.5em; - margin: 0; - padding: 0; - margin-bottom: 1em; -} -.htk-assistant * -{ - color: #555; -} - -/* Assistant bar */ - -.htk-assistant-bar -{ - position: relative; - padding: .8em; - display: flex; - align-items: center; - justify-content: space-between; - box-sizing: border-box; - width: 100%; -} -.htk-assistant-bar > button -{ - border-radius: 50%; - padding: 0; - margin: 0; -} -.htk-assistant-bar > .end -{ - display: none; -} -.htk-assistant-bar > button > img -{ - display: block; - width: 1.8em; - padding: .5em; -} -.htk-assistant-bar > .steps -{ - display: flex; - align-items: center; -} -.htk-assistant-bar > .steps > div { - background-color: #AAA; - width: .5em; - height: .5em; - cursor: pointer; - border-radius: 50%; - margin: .5em; - - transition-property: width, height; - transition-duration: 100ms; - transition-timing-function: ease-in-out; -} -.htk-assistant-bar > .steps > div.selected { - background-color: #666; - width: 1em; - height: 1em; -} -.htk-assistant-bar > .steps > div:hover { - opacity: .7; -} -.htk-assistant-bar > .steps > img -{ - width: 1.3em; - margin: 0 .2em; - cursor: pointer; -} -.htk-assistant-bar > .steps > img:hover -{ - opacity: .7; -} - -/* Search entry */ - -.htk-search-entry -{ - background-color: white; - height: 2.2em; -} -.htk-search-entry > * -{ - display: inline-block; - vertical-align: middle; -} -.htk-search-entry > img -{ - margin: 0; - height: 1.5em; - margin: 0 .4em; -} -.htk-search-entry > .entry -{ - margin: 0; - border: none; - width: 8em; - box-shadow: none; -} -.htk-search-entry > .entry:focus -{ - background-color: initial; -} - -/* Spinner */ - -.htk-spinner -{ - width: 1.8em; - height: 1.8em; - position: relative; - display: inline-block; -} -.htk-spinner > .spinner -{ - left: 0; - position: absolute; - width: inherit; - height: inherit; - box-sizing: border-box; - border-radius: 50%; - border: .3em solid transparent; - border-top-color: #666; - border-left-color: #666; - animation: spinner 1s linear infinite; - -webkit-animation: spinner 1s linear infinite; -} -.htk-spinner.dark > .spinner -{ - border-top-color: white; - border-left-color: white; -} -@keyframes spinner -{ - to {transform: rotate(360deg);} -} -@-webkit-keyframes spinner -{ - to {-webkit-transform: rotate(360deg);} -} - -/* Loader */ - -.htk-loader > .spinner -{ - text-align: center; -} diff --git a/js/htk/style/classes.scss b/js/htk/style/classes.scss new file mode 100644 index 00000000..c29384c7 --- /dev/null +++ b/js/htk/style/classes.scss @@ -0,0 +1,20 @@ + +@import "variables"; + +%box { + border-radius: .6em; + box-shadow: .05em .05em .2em rgba(0, 0, 0, .1); + overflow: hidden; + border: none; + background-color: white; +} +%clickable { + cursor: pointer; + transition: background-color 250ms ease-out; + + &:hover, + &:focus { + background-color: $color-hover-cd; + outline: none; + } +} diff --git a/js/htk/style/index.scss b/js/htk/style/index.scss new file mode 100644 index 00000000..6bd86f10 --- /dev/null +++ b/js/htk/style/index.scss @@ -0,0 +1,9 @@ + +@import "./variables"; +@import "./classes"; +@import "./spacing"; +@import "./text"; +@import "./width"; +@import "./responsive"; +@import "./material-symbols"; +@import "./style"; diff --git a/js/htk/style/material-symbols.scss b/js/htk/style/material-symbols.scss new file mode 100644 index 00000000..6c59713d --- /dev/null +++ b/js/htk/style/material-symbols.scss @@ -0,0 +1,22 @@ +/* fallback */ +@font-face { + font-family: 'Material Symbols Rounded'; + font-style: normal; + font-weight: 400; + src: url(./material-symbols.woff2) format('woff2'); +} +.material-symbols-rounded { + font-family: 'Material Symbols Rounded'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -moz-font-feature-settings: 'liga'; + -moz-osx-font-smoothing: grayscale; +} diff --git a/js/htk/style/material-symbols.woff2 b/js/htk/style/material-symbols.woff2 new file mode 100644 index 00000000..e4c3b75c Binary files /dev/null and b/js/htk/style/material-symbols.woff2 differ diff --git a/js/htk/style/opensans.ttf b/js/htk/style/opensans.ttf new file mode 100644 index 00000000..e21ff5f1 Binary files /dev/null and b/js/htk/style/opensans.ttf differ diff --git a/js/htk/style/poppins.ttf b/js/htk/style/poppins.ttf new file mode 100644 index 00000000..9f0c71b7 Binary files /dev/null and b/js/htk/style/poppins.ttf differ diff --git a/js/htk/style/responsive.scss b/js/htk/style/responsive.scss new file mode 100644 index 00000000..2454e214 --- /dev/null +++ b/js/htk/style/responsive.scss @@ -0,0 +1,54 @@ + + +/* Responsive */ + +/* Standard */ +@media screen { + body { font-size: 14px; } +} + +/* Desktop - Laptop 1360x768 */ +@media (max-resolution: 119dpi) and (min-device-width: 1340px) and (max-device-width: 1899px) { + body { font-size: 14px; } +} + +/* Desktop - FHD 1920x1080 */ +@media (max-resolution: 119dpi) and (min-device-width: 1900px) { + body { font-size: 14px; } +} + +/* Mobile - Low DPI */ +@media + (min-resolution: 120dpi), + (-webkit-min-device-pixel-ratio: 1.5) { + body { font-size: 14px; } +} +@media + (min-resolution: 144dpi), + (-webkit-min-device-pixel-ratio: 1.5) { + body { font-size: 14px; } +} + +/* Mobile - Normal DPI */ +@media + (max-device-width: 383px) and (min-resolution: 192dpi), + (max-device-width: 383px) and (-webkit-min-device-pixel-ratio: 2) { + body { font-size: 14px; } +} +@media + (min-device-width: 384px) and (min-resolution: 192dpi), + (min-device-width: 384px) and (-webkit-min-device-pixel-ratio: 2) { + body { font-size: 14px; } +} + +/* Mobile - High DPI */ +@media + (max-device-width: 411px) and (min-resolution: 249dpi), + (max-device-width: 411px) and (-webkit-min-device-pixel-ratio: 3) { + body { font-size: 14px; } +} +@media + (min-device-width: 414px) and (min-resolution: 249dpi), + (min-device-width: 414px) and (-webkit-min-device-pixel-ratio: 3) { + body { font-size: 14px; } +} diff --git a/js/hedera/roboto.ttf b/js/htk/style/roboto.ttf similarity index 100% rename from js/hedera/roboto.ttf rename to js/htk/style/roboto.ttf diff --git a/js/htk/style/spacing.scss b/js/htk/style/spacing.scss new file mode 100644 index 00000000..35e3fa10 --- /dev/null +++ b/js/htk/style/spacing.scss @@ -0,0 +1,355 @@ +/** + * CSS spacing classes + * + * vn-[p|m][t|r|b|l|a|x|y]-[none|auto|xs|sm|md|lg|xl] + * T D S + * + * T - type + * - values: p (padding), m (margin) + * + * D - direction + * - values: + * t (top), r (right), b (bottom), l (left), + * a (all), x (both left & right), y (both top & bottom) + * + * S - size + * - values: + * none, + * auto (ONLY for specific margins: vn-ml-*, vn-mr-*, vn-mx-*), + * xs (extra small), + * sm (small), + * md (medium), + * lg (large), + * xl (extra large) + */ + + @import "./variables"; + +//++++++++++++++++++++++++++++++++++++++++++++++++ Padding + +// None + +.vn-pa-none { + padding: 0; +} +.vn-pl-none { + padding-left: 0; +} +.vn-pr-none { + padding-right: 0; +} +.vn-pt-none { + padding-top: 0; +} +.vn-pb-none { + padding-bottom: 0; +} +.vn-py-none { + padding-top: 0; + padding-bottom: 0; +} +.vn-px-none { + padding-left: 0; + padding-right: 0; +} + +// Extra small + +.vn-pa-xs { + padding: $spacing-xs; +} +.vn-pl-xs { + padding-left: $spacing-xs; +} +.vn-pr-xs { + padding-right: $spacing-xs; +} +.vn-pt-xs { + padding-top: $spacing-xs; +} +.vn-pb-xs { + padding-bottom: $spacing-xs; +} +.vn-py-xs { + padding-top: $spacing-xs; + padding-bottom: $spacing-xs; +} +.vn-px-xs { + padding-left: $spacing-xs; + padding-right: $spacing-xs; +} + +// Small + +.vn-pa-sm { + padding: $spacing-sm; +} +.vn-pl-sm { + padding-left: $spacing-sm; +} +.vn-pr-sm { + padding-right: $spacing-sm; +} +.vn-pt-sm { + padding-top: $spacing-sm; +} +.vn-pb-sm { + padding-bottom: $spacing-sm; +} +.vn-py-sm { + padding-top: $spacing-sm; + padding-bottom: $spacing-sm; +} +.vn-px-sm { + padding-left: $spacing-sm; + padding-right: $spacing-sm; +} + +// Medium + +.vn-pa-md { + padding: $spacing-md; +} +.vn-pl-md { + padding-left: $spacing-md; +} +.vn-pr-md { + padding-right: $spacing-md; +} +.vn-pt-md { + padding-top: $spacing-md; +} +.vn-pb-md { + padding-bottom: $spacing-md; +} +.vn-py-md { + padding-top: $spacing-md; + padding-bottom: $spacing-md; +} +.vn-px-md { + padding-left: $spacing-md; + padding-right: $spacing-md; +} + +// Large + +.vn-pa-lg { + padding: $spacing-lg; +} +.vn-pl-lg { + padding-left: $spacing-lg; +} +.vn-pr-lg { + padding-right: $spacing-lg; +} +.vn-pt-lg { + padding-top: $spacing-lg; +} +.vn-pb-lg { + padding-bottom: $spacing-lg; +} +.vn-py-lg { + padding-top: $spacing-lg; + padding-bottom: $spacing-lg; +} +.vn-px-lg { + padding-left: $spacing-lg; + padding-right: $spacing-lg; +} + +// Extra large + +.vn-pa-xl { + padding: $spacing-xl; +} +.vn-pl-xl { + padding-left: $spacing-xl; +} +.vn-pr-xl { + padding-right: $spacing-xl; +} +.vn-pt-xl { + padding-top: $spacing-xl; +} +.vn-pb-xl { + padding-bottom: $spacing-xl; +} +.vn-py-xl { + padding-top: $spacing-xl; + padding-bottom: $spacing-xl; +} +.vn-px-xl { + padding-left: $spacing-xl; + padding-right: $spacing-xl; +} + +//++++++++++++++++++++++++++++++++++++++++++++++++ Margin + +// None + +.vn-ma-none { + padding: 0; +} +.vn-ml-none { + padding-left: 0; +} +.vn-mr-none { + padding-right: 0; +} +.vn-mt-none { + padding-top: 0; +} +.vn-mb-none { + padding-bottom: 0; +} +.vn-my-none { + padding-top: 0; + padding-bottom: 0; +} +.vn-mx-none { + padding-left: 0; + padding-right: 0; +} + +// Auto + +.vn-ml-none { + padding-left: auto; +} +.vn-mr-none { + padding-right: auto; +} +.vn-mx-none { + padding-left: auto; + padding-right: auto; +} + +// Extra small + +.vn-ma-xs { + margin: $spacing-xs; +} +.vn-mt-xs { + margin-top: $spacing-xs; +} +.vn-ml-xs { + margin-left: $spacing-xs; +} +.vn-mr-xs { + margin-right: $spacing-xs; +} +.vn-mb-xs { + margin-bottom: $spacing-xs; +} +.vn-my-xs { + margin-top: $spacing-xs; + margin-bottom: $spacing-xs; +} +.vn-mx-xs { + margin-left: $spacing-xs; + margin-right: $spacing-xs; +} + +// Small + +.vn-ma-sm { + margin: $spacing-sm; +} +.vn-mt-sm { + margin-top: $spacing-sm; +} +.vn-ml-sm { + margin-left: $spacing-sm; +} +.vn-mr-sm { + margin-right: $spacing-sm; +} +.vn-mb-sm { + margin-bottom: $spacing-sm; +} +.vn-my-sm { + margin-top: $spacing-sm; + margin-bottom: $spacing-sm; +} +.vn-mx-sm { + margin-left: $spacing-sm; + margin-right: $spacing-sm; +} + +// Medium + +.vn-ma-md { + margin: $spacing-md; +} +.vn-mt-md { + margin-top: $spacing-md; +} +.vn-ml-md { + margin-left: $spacing-md; +} +.vn-mr-md { + margin-right: $spacing-md; +} +.vn-mb-md { + margin-bottom: $spacing-md; +} +.vn-my-md { + margin-top: $spacing-md; + margin-bottom: $spacing-md; +} +.vn-mx-md { + margin-left: $spacing-md; + margin-right: $spacing-md; +} + +// Large + +.vn-ma-lg { + margin: $spacing-lg; +} +.vn-mt-lg { + margin-top: $spacing-lg; +} +.vn-ml-lg { + margin-left: $spacing-lg; +} +.vn-mr-lg { + margin-right: $spacing-lg; +} +.vn-mb-lg { + margin-bottom: $spacing-lg; +} +.vn-my-lg { + margin-top: $spacing-lg; + margin-bottom: $spacing-lg; +} +.vn-mx-lg { + margin-left: $spacing-lg; + margin-right: $spacing-lg; +} + +/* Extra large */ + +.vn-ma-xl { + margin: $spacing-xl; +} +.vn-mt-xl { + margin-top: $spacing-xl; +} +.vn-ml-xl { + margin-left: $spacing-xl; +} +.vn-mr-xl { + margin-right: $spacing-xl; +} +.vn-mb-xl { + margin-bottom: $spacing-xl; +} +.vn-my-xl { + margin-top: $spacing-xl; + margin-bottom: $spacing-xl; +} +.vn-mx-xl { + margin-left: $spacing-xl; + margin-right: $spacing-xl; +} diff --git a/js/htk/style/style.scss b/js/htk/style/style.scss new file mode 100644 index 00000000..801b8cc6 --- /dev/null +++ b/js/htk/style/style.scss @@ -0,0 +1,314 @@ + +@import "./classes"; + +@font-face { + font-family: 'Poppins'; + src: url('poppins.ttf') format('truetype'); +} +@font-face { + font-family: 'Open Sans'; + src: url('opensans.ttf') format('truetype'); +} + +/* Global */ + +body { + font-family: 'Poppins', 'Verdana', 'Sans'; + background-color: #FAFAFA; + color: #333; + position: absolute; + height: 100%; + width: 100%; + margin: 0; + overflow: auto; + z-index: -2; +} +label, +button, +input, +select, +textarea, +option { + font-size: inherit; + font-family: inherit; + color: inherit; +} +iframe { + border: none; +} +fieldset { + margin: 0; +} +form { + padding: 0; + margin: 0; +} +table { + width: 100%; +} +a:link, +a:visited, +a:active { + color: inherit; + text-decoration: none; +} +a:hover { + text-decoration: none; + cursor: pointer; +} +a img { + padding: 1px; +} +a img:hover { + opacity: 0.9; +} +p { + margin: 0.8em 0; +} + +/* Focus outline */ + +a:focus { + outline: 1px solid rgba(1, 1, 1, 0.15); + -moz-outline-radius: .1em; +} +input:focus, +button:focus { + outline: 0; +} +button::-moz-focus-inner, +input[type=submit]::-moz-focus-inner, +input[type=button]::-moz-focus-inner, +input[type=reset]::-moz-focus-inner { + border: none; +} +select:-moz-focusring { +/* color: transparent; + text-shadow: 0 0 0 #333;*/ +} +input:-webkit-autofill { + -webkit-box-shadow: inset 0 0 0px 9999px white; +} + +/* Inputs */ + +input[type=text], +input[type=password], +input[type=file], +input[type=number], +textarea, +select, +.input { + border: 1px solid #ddd; + transition: border-color 100ms ease-in; + margin: .2em 0; + box-sizing: border-box; + color: #333; + border-radius: 0; + text-align: left; + width: 100%; + + &:focus { + border-color: #333; + } +} +input[type=text], +input[type=password], +input[type=file], +input[type=number], +textarea, +.input, +select { + padding: .8em; +} +input[type=text], +input[type=password], +input[type=file], +input[type=number], +select, +.input { + height: 2.8em; +} +textarea { + height: 3.5em; + width: 20em; +} +input[type=text]:disabled { + background-color: #f3f3f3; +} +input[type=checkbox], +input[type=radio] { + cursor: pointer; + margin: 0; + margin-right: 10px; +} +select { + @extend %clickable; + background-color: transparent; + -moz-appearance: none; + appearance: none; + line-height: 1em; +} +option { + padding: .4em; + border-width: 0; + font-weight: normal; + font-size: 1em; +} +select, +option { + cursor: pointer; +} + +/* Buttons */ + +input[type=submit], +input[type=button], +input[type=reset], +button, +.button { + @extend %clickable; + border: none; + background-color: transparent; + padding: 8px; + border-radius: 22px; + font-weight: normal; + + &:disabled { + background-color: rgba(0, 0, 0, .1); + } +} +.button { + display: inline-block; + text-align: center; + box-sizing: border-box; +} + +/* Image */ + +img.editable { + cursor: pointer; +} + +/* Float */ + +.clear { + clear: both !important; +} + +/* Clickable */ + +.clickable { + @extend %clickable; +} + +/* Box */ + +.box { + @extend %box; + margin: 0 auto; + box-sizing: border-box; + + .header { + padding: 0.6em 0.8em; + margin: 0; + background-color: #009688; + color: white; + + & > h1 { + color: white; + text-align: left; + font-size: 1.6em; + line-height: 2em; + font-weight: normal; + display: inline; + } + } + .body { + padding: 2em; + } +} + +/* Form */ + +.form { + margin: 0 auto; +} +.form > h2 { + margin-bottom: .8em; +} +.form-group { + margin-bottom: 1.2em; + + &:last-child { + margin-bottom: 0; + } + & > label { + display: block; + margin: 0; + margin-bottom: .2em; + color: #222; + } + & > input[type=text], + & > input[type=password], + & > input[type=file], + & > input[type=number], + & > select, + & > textarea { + margin: 0; + width: 100%; + } +} + +/* Form */ + +table.form { + padding: 1em; + border-collapse: separate; + border-spacing: 0.3em; +} +table.form td.label { + width: 45%; + text-align: right; +} +table.form tr { + height: 2.8em; +} + +/* Icon */ + +img.icon { + height: 1.5em; +} + +/* Masonry */ + +.masonry { + margin: 0 auto; + text-align: left; +} +.masonry-box { + width: 100%; + display: inline-block; + vertical-align: top; +} +@media screen and (min-width: 1000px) and (max-width: 1399px) { + .masonry-box + { + width: 50%; + display: block; + float: left; + clear: left; + } + .masonry-box:nth-child(2n+0) + { + float: right; + clear: right; + } +} +@media screen and (min-width: 1400px) { + .masonry-box { width: 33.3%; } +} +@media screen and (min-width: 2000px) { + .masonry-box { width: 25%; } +} diff --git a/js/htk/style/text.scss b/js/htk/style/text.scss new file mode 100644 index 00000000..701a84d0 --- /dev/null +++ b/js/htk/style/text.scss @@ -0,0 +1,70 @@ +@import "./variables"; + +/* Headings */ + +.text-h1, h1 { + font-size: 2.3rem; +} +.text-h2, h2 { + font-size: 2.25rem; +} +.text-h3, h3 { + font-size: 2rem; +} +.text-h4, h4 { + font-size: 1.6rem; +} +.text-h5, h5 { + font-size: 1.3rem; +} +.text-h6, h6 { + font-size: 1.125rem; +} +.text-subtitle1 { + font-size: 1.06rem; +} +.text-subtitle2 { + font-size: 1rem; +} +.text-body1 { + font-size: .875rem; +} +.text-body2 { + font-size: .875rem; +} +.text-caption { + font-size: .875rem; +} +.text-overline { + font-size: .8rem; +} + +h1, h2, h3, h4, h5, h6 { + padding: 0; + margin-top: 0; + margin-bottom: 4px; +} + +/* Colors */ + +.text-primary { + color: $color-main; +} +.text-secondary { + color: $color-font-light; +} + +/* Helpers */ + +.text-uppercase { + text-transform: uppercase; +} +.text-center { + text-align: center; +} +.text-right { + text-align: right; +} +.text-left { + text-align: left; +} diff --git a/js/htk/style/variables.scss b/js/htk/style/variables.scss new file mode 100644 index 00000000..b516079f --- /dev/null +++ b/js/htk/style/variables.scss @@ -0,0 +1,23 @@ + +// Width + +$width-xs: 400px; +$width-sm: 544px; +$width-md: 800px; +$width-lg: 1280px; +$width-xl: 1600px; + +// Spacing + +$spacing-xs: 4px; +$spacing-sm: 8px; +$spacing-md: 16px; +$spacing-lg: 32px; +$spacing-xl: 70px; + +// Light theme + +$color-primary: #8cc63f; +$color-hover-cd: rgba(0, 0, 0, .05); +$color-main: #333; +$color-font-light: #666; diff --git a/js/htk/style/width.scss b/js/htk/style/width.scss new file mode 100644 index 00000000..e017de3e --- /dev/null +++ b/js/htk/style/width.scss @@ -0,0 +1,26 @@ +@import "./variables"; + +%margin-auto { + margin-left: auto; + margin-right: auto; +} +.vn-w-xs { + @extend %margin-auto; + max-width: $width-xs; +} +.vn-w-sm { + @extend %margin-auto; + max-width: $width-sm; +} +.vn-w-md { + @extend %margin-auto; + max-width: $width-md; +} +.vn-w-lg { + @extend %margin-auto; + max-width: $width-lg; +} +.vn-w-xl { + @extend %margin-auto; + max-width: $width-xl; +} diff --git a/js/htk/table/index.js b/js/htk/table/index.js new file mode 100644 index 00000000..26ed5fad --- /dev/null +++ b/js/htk/table/index.js @@ -0,0 +1,50 @@ + +var Entry = require('../entry'); +var ColumnRadio = require('../columns/radio'); + +module.exports = new Class({ + Extends: Entry + ,Tag: 'htk-table' + + ,render: function() { + var tv = new Htk.TreeView(); + this.node.appendChild(tv.node); + + var renderer = new ColumnRadio(); + tv.appendColumn(0, renderer, ''); + + var rbGroup = renderer.rbGroup; + rbGroup.addSignal('changed', this.changed, this); + + this.treeview = tv; + this.rbGroup = rbGroup; + } + + ,setModel: function(model) { + this.treeview.setModel(model); + model.addSignal('status-changed', this.modelRefresh, this); + this.selectValue(); + } + + ,changed: function() { + this.realValue = this.rbGroup.getValue(); + this.emit('changed'); + } + + ,selectValue: function() { + this.rbGroup.setValue(this.realValue); + } + + ,setRealValue: function() { + this.selectValue(); + } + + ,modelRefresh: function(model, status) { + if (status == Db.Model.Status.READY) + this.selectValue(); + } + + ,setEditable: function(editable) { + this.rbGroup.setEditable(editable); + } +}); diff --git a/js/htk/text-area/index.js b/js/htk/text-area/index.js new file mode 100644 index 00000000..10625025 --- /dev/null +++ b/js/htk/text-area/index.js @@ -0,0 +1,32 @@ + +module.exports = new Class({ + Extends: Htk.Field + ,Tag: 'htk-textarea' + + ,render: function() { + var node = this.createRoot('textarea'); + node.addEventListener('change', this.changed.bind(this)); + } + + ,changed: function() { + var value; + + if (this.node.value == '') + value = null; + else + value = this.node.value; + + this.valueChanged(value); + } + + ,setEditable: function(editable) { + this.node.readOnly = !editable; + } + + ,putValue: function(value) { + if (!value) + this.node.value = ''; + else + this.node.value = value; + } +}); diff --git a/js/htk/field/text.js b/js/htk/text/index.js similarity index 50% rename from js/htk/field/text.js rename to js/htk/text/index.js index e0483c89..14fe88b2 100644 --- a/js/htk/field/text.js +++ b/js/htk/text/index.js @@ -7,17 +7,15 @@ module.exports = new Class { /** * Format that applies to the value. - **/ + */ format: { type: String - ,set: function (x) - { + ,set: function(x) { this._format = _(x); - this.putValue (this._value); + this.putValue(this._value); } - ,get: function () - { + ,get: function() { return this._format; } } @@ -25,13 +23,11 @@ module.exports = new Class ,_format: null - ,render: function () - { - this._node = this.createTextNode (''); + ,render: function() { + this._node = this.createTextNode(''); } - ,putValue: function (value) - { - this._node.nodeValue = Vn.Value.format (value, this._format); + ,putValue: function(value) { + this._node.nodeValue = Vn.Value.format(value, this._format); } }); diff --git a/js/htk/toast.js b/js/htk/toast.js deleted file mode 100644 index ac3f46f9..00000000 --- a/js/htk/toast.js +++ /dev/null @@ -1,160 +0,0 @@ -/** - * Class to show toast messages. - **/ -module.exports = -{ - maxMessages: 6 - ,timeout: 10 /* Seconds */ - ,_container: null - ,_timeouts: null - ,_topHeap: [] - - /** - * Shows a normal toast message. - * - * @param {String} message The message text - **/ - ,showMessage: function (message) - { - this._showText (message, 'message'); - } - - /** - * Shows a warning toast message. - * - * @param {String} message The message text - **/ - ,showWarning: function (message) - { - this._showText (message, 'warning'); - } - - /** - * Shows an error toast message. - * - * @param {String} message The message text - **/ - ,showError: function (message) - { - this._showText (message, 'error'); - } - - ,pushTop: function (top) - { - this._topHeap.push (top); - this._refreshPosition (); - } - - ,popTop: function () - { - var top = this._topHeap.pop (); - this._refreshPosition (); - return top; - } - - ,_refreshPosition: function () - { - if (!this._container) - return; - - var left; - var heapLen = this._topHeap.length; - - if (heapLen > 0) - { - var top = this._topHeap[heapLen - 1]; - var rect = top.getBoundingClientRect (); - left = (rect.left + parseInt (rect.width / 2) - window.pageXOffset) +'px'; - } - else - left = ''; - - this._container.style.left = left; - } - - /** - * Hides all currently displayed toast messages. - **/ - ,hide: function () - { - if (!this._container) - return; - - if (this._timeouts) - for (var i = 0; i < this._timeouts.length; i++) - clearTimeout (this._timeouts[i]); - - this._timeouts = null; - - document.removeEventListener ('mousedown', this.hideHandler); - Vn.Node.remove (this._container); - this._container = null; - this.nodes = []; - } - - ,_createContainer: function () - { - if (!this._container) - { - var container = document.createElement ('div'); - container.className = 'htk-toast'; - document.body.appendChild (container); - - this.hideHandler = this.hide.bind (this); - document.addEventListener ('mousedown', this.hideHandler); - - this._timeouts = []; - this._container = container; - } - - this._refreshPosition (); - } - - ,_showText: function (message, className) - { - this._createContainer (); - - if (this._timeouts.length >= this.maxMessages) - this._onMessageTimeout (); - - var toast = document.createElement ('div'); - toast.className = className; - toast.addEventListener ('mousedown', this._onMessageMouseDown); - - var textNode = document.createTextNode (message); - toast.appendChild (textNode); - - this._container.appendChild (toast); - - var timeoutId = setTimeout (this._onMessageTimeout.bind (this), this.timeout * 1000); - this._timeouts.push (timeoutId); - - setTimeout (this._onShowToastTimeout.bind (this, toast), 50); - } - - ,_onShowToastTimeout: function (toast) - { - Vn.Node.addClass (toast, 'show'); - } - - ,_onMessageTimeout: function () - { - if (!this._container) - return; - - var nodes = this._container.childNodes; - - if (nodes.length > 0) - { - clearTimeout (this._timeouts.shift ()); - Vn.Node.remove (nodes[0]); - } - if (nodes.length == 0) - this.hide (); - } - - ,_onMessageMouseDown: function (event) - { - event.stopPropagation (); - } -}; diff --git a/js/htk/toast/index.js b/js/htk/toast/index.js new file mode 100644 index 00000000..6a19ccd0 --- /dev/null +++ b/js/htk/toast/index.js @@ -0,0 +1,146 @@ +require('./style.scss'); + +/** + * Class to show toast messages. + */ +module.exports = +{ + maxMessages: 6 + ,timeout: 10 /* Seconds */ + ,_container: null + ,_timeouts: null + ,_topHeap: [] + + /** + * Shows a normal toast message. + * + * @param {String} message The message text + */ + ,showMessage: function(message) { + this._showText(message, 'message'); + } + + /** + * Shows a warning toast message. + * + * @param {String} message The message text + */ + ,showWarning: function(message) { + this._showText(message, 'warning'); + } + + /** + * Shows an error toast message. + * + * @param {String} message The message text + */ + ,showError: function(message) { + this._showText(message, 'error'); + } + + ,pushTop: function(top) { + this._topHeap.push(top); + this._refreshPosition(); + } + + ,popTop: function() { + var top = this._topHeap.pop(); + this._refreshPosition(); + return top; + } + + ,_refreshPosition: function() { + if (!this._container) + return; + + var left; + var heapLen = this._topHeap.length; + + if (heapLen > 0) { + var top = this._topHeap[heapLen - 1]; + var rect = top.getBoundingClientRect(); + left = (rect.left + parseInt(rect.width / 2) - window.pageXOffset) +'px'; + } else + left = ''; + + this._container.style.left = left; + } + + /** + * Hides all currently displayed toast messages. + */ + ,hide: function() { + if (!this._container) + return; + + if (this._timeouts) + for (var i = 0; i < this._timeouts.length; i++) + clearTimeout(this._timeouts[i]); + + this._timeouts = null; + + document.removeEventListener('mousedown', this.hideHandler); + Vn.Node.remove(this._container); + this._container = null; + this.nodes = []; + } + + ,_createContainer: function() { + if (!this._container) { + var container = document.createElement('div'); + container.className = 'htk-toast'; + document.body.appendChild(container); + + this.hideHandler = this.hide.bind(this); + document.addEventListener('mousedown', this.hideHandler); + + this._timeouts = []; + this._container = container; + } + + this._refreshPosition(); + } + + ,_showText: function(message, className) { + this._createContainer(); + + if (this._timeouts.length >= this.maxMessages) + this._onMessageTimeout(); + + var toast = document.createElement('div'); + toast.className = className; + toast.addEventListener('mousedown', this._onMessageMouseDown); + + var textNode = document.createTextNode(message); + toast.appendChild(textNode); + + this._container.appendChild(toast); + + var timeoutId = setTimeout(this._onMessageTimeout.bind(this), this.timeout * 1000); + this._timeouts.push(timeoutId); + + setTimeout(this._onShowToastTimeout.bind(this, toast), 50); + } + + ,_onShowToastTimeout: function(toast) { + Vn.Node.addClass(toast, 'show'); + } + + ,_onMessageTimeout: function() { + if (!this._container) + return; + + var nodes = this._container.childNodes; + + if (nodes.length > 0) { + clearTimeout(this._timeouts.shift()); + Vn.Node.remove(nodes[0]); + } + if (nodes.length == 0) + this.hide(); + } + + ,_onMessageMouseDown: function(event) { + event.stopPropagation(); + } +}; diff --git a/js/htk/toast/style.scss b/js/htk/toast/style.scss new file mode 100644 index 00000000..4334fa08 --- /dev/null +++ b/js/htk/toast/style.scss @@ -0,0 +1,47 @@ +.htk-toast { + z-index: 210; + display: block; + position: fixed; + left: 50%; + top: 4em; + width: 21em; + margin-left: -10.5em; + text-align: center; + overflow: auto; + max-height: 40em; + overflow: visible; + + & > div { + margin: .5em 0; + padding: .5em 2%; + border-radius: 0.1em; + box-shadow: 0 0 0.4em rgba(1, 1, 1, 0.6); + width: 96%; + + opacity: 0; + transform: translateZ(0) translateY(-1em); + -webkit-transform: translateZ(0) translateY(-1em); + + transition-property: opacity, transform; + transition-duration: 200ms; + transition-timing-function: ease-out; + + &.show { + opacity: 1; + transform: translateZ(0) translateY(0em); + -webkit-transform: translateZ(0) translateY(0em); + } + } + & > .message { + background-color: #BBFFBB; + color: #363; + } + & > .warning { + background-color: #FFE0B2; + color: #C30; + } + & > .error { + background-color: #FFCDD2; + color: #A00; + } +} \ No newline at end of file diff --git a/js/htk/widget.js b/js/htk/widget.js deleted file mode 100644 index 612283e7..00000000 --- a/js/htk/widget.js +++ /dev/null @@ -1,73 +0,0 @@ - -var NodeBuilder = require ('./node-builder'); - -module.exports = new Class -({ - Extends: NodeBuilder - ,Properties: - { - /** - * Main HTML node that represents the widget - **/ - node: - { - type: Object - ,get: function () - { - this.renderBase (); - return this._node; - } - }, - /** - * CSS classes to be appendend to the node classes. - **/ - class: - { - type: String - ,set: function (x) - { - this._cssClass = x; - this._refreshClass (); - } - ,get: function () - { - return this._node.className; - } - } - } - - ,_node: null - - ,initialize: function (props) - { - this.doc = document; - this.renderBase (); - this.parent (props); - } - - ,createRoot: function (tagName) - { - return this._node = this.createElement (tagName); - } - - ,renderBase: function () - { - if (this._node) - return; - - this.render (); - this._refreshClass (); - } - - ,_refreshClass: function () - { - if (this._node && this._cssClass) - this._node.className = this._cssClass +' '+ this._node.className; - } - - ,remove: function () - { - Vn.Node.remove (this._node); - } -}); - diff --git a/js/sql/batch.js b/js/sql/batch.js deleted file mode 100644 index 409423cb..00000000 --- a/js/sql/batch.js +++ /dev/null @@ -1,169 +0,0 @@ - -var Object = require ('./object'); -var Value = require ('./value'); - -/** - * A map container for many Sql.Object - **/ -module.exports = new Class -({ - Extends: Object - ,Tag: 'sql-batch' - ,Properties: - { - blocked: - { - type: Boolean - ,set: function (x) - { - this._blocked = x; - } - ,get: function () - { - return this._blocked; - } - } - } - - ,objects: {} - ,_blocked: false - - ,loadXml: function (builder, node) - { - this.parent (builder, node); - - var childs = node.childNodes; - - for (var i = 0; i < childs.length; i++) - if (childs[i].tagName && childs[i].tagName.toLowerCase () == 'item') - { - var object; - var id = childs[i].getAttribute ('name'); - - if (id) - { - if (object = builder.getById (childs[i].getAttribute ('param'))) - this.addParam (id, object); - else if (object = builder.getById (childs[i].getAttribute ('object'))) - this.addObject (id, object); - } - } - } - - ,get: function (id) - { - if (this.objects[id]) - return this.objects[id]; - - return null; - } - - ,add: function (id) - { - if (!this.objects[id]) - this.objects[id] = null; - } - - ,_addObject: function (id, object) - { - this.remove (id); - this.objects[id] = object; - object.on ('changed', this.emitChanged, this); - this.emitChanged (); - } - - ,addObject: function (id, object) - { - this._addObject (id, object.ref ()); - } - - ,addValue: function (id, value) - { - this._addObject (id, - new Value ({value: value})); - } - - ,addValues: function (values) - { - for (var id in values) - this.addValue (id, values[id]); - } - - ,addParam: function (id, param) - { - this._addObject (id, - new Value ({param: param})); - } - - ,getValue: function (id) - { - var object = this.objects[id]; - - if (object instanceof Value) - return object.value; - - return null; - } - - ,addParams: function (params) - { - for (var id in params) - this.addParam (id, params[id]); - } - - ,remove: function (id) - { - if (this.objects[id]) - { - this._unrefObject (this.objects[id]); - delete this.objects[id]; - } - } - - ,block: function () - { - this._blocked = true; - } - - ,unblock: function () - { - this._blocked = false; - } - - ,emitChanged: function () - { - if (!this._blocked) - this.signalEmit ('changed'); - } - - ,changed: function () - { - this.signalEmit ('changed'); - } - - ,isReady: function () - { - for (var id in this.objects) - if (!(this.objects[id] && this.objects[id].isReady ())) - return false; - - return true; - } - - ,_unrefObject: function (object) - { - if (object) - { - object.disconnect ('changed', this.emitChanged, this); - object.unref (); - } - } - - ,_destroy: function () - { - for (var id in this.objects) - this._unrefObject (this.objects[id]); - - this.parent (); - } -}); diff --git a/js/sql/delete.js b/js/sql/delete.js index eed14b9b..53447391 100644 --- a/js/sql/delete.js +++ b/js/sql/delete.js @@ -1,23 +1,17 @@ -var Stmt = require ('./stmt'); +var Stmt = require('./stmt'); /** * The equivalent of a SQL delete. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Stmt + ,Tag: 'sql-delete' - ,render: function (batch) - { - var sql = 'DELETE FROM ' + this.renderTarget (batch); - - if (this.where) - sql += ' WHERE ' + this.where.render (batch); - - sql += ' LIMIT 1'; // Only for security. - - return sql; + ,render: function(params) { + return 'DELETE FROM' + + this.renderTarget(params) + + this.renderIfSet(this.where, 'WHERE', params) + + this.renderLimit(params); } }); - diff --git a/js/sql/dml.js b/js/sql/dml.js index a17fde24..00ad03f5 100644 --- a/js/sql/dml.js +++ b/js/sql/dml.js @@ -1,33 +1,29 @@ -var Stmt = require ('./stmt'); -var Value = require ('./value'); -var Field = require ('./field'); +var Stmt = require('./stmt'); +var Value = require('./value'); +var Field = require('./field'); /** * The equivalent of a SQL DML. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Stmt ,field: [] ,expr: [] - ,addSet: function (fieldName, value) - { - this.expr.push (new Value ({value: value})); - this.field.push (new Field ({name: fieldName})); + ,addSet: function(fieldName, value) { + this.field.push(new Field({name: fieldName})); + this.expr.push(new Value({value: value})); } - ,addExpr: function (fieldName, expr) - { - this.expr.push (expr); - this.field.push (new Field ({name: fieldName})); + ,addExpr: function(fieldName, expr) { + this.field.push(new Field({name: fieldName})); + this.expr.push(expr); } - ,delSet: function () - { - this.field.splice (0, this.field.length); - this.expr.splice (0, this.expr.length); + ,delSet: function() { + this.field.splice(0, this.field.length); + this.expr.splice(0, this.expr.length); } }); diff --git a/js/sql/expr.js b/js/sql/expr.js index 140fcbbb..35ac50cf 100644 --- a/js/sql/expr.js +++ b/js/sql/expr.js @@ -1,11 +1,10 @@ -var Object = require ('./object'); +var Object = require('./object'); /** * The equivalent of a SQL expression. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Object ,Tag: 'sql-expr' }); diff --git a/js/sql/field.js b/js/sql/field.js index a0d4b9ee..79839d48 100644 --- a/js/sql/field.js +++ b/js/sql/field.js @@ -1,32 +1,33 @@ -var Expr = require ('./expr'); +var Expr = require('./expr'); /** * The equivalent of a SQL field. * * @param {string} taget The name of the owner table - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Expr ,Tag: 'sql-field' - ,Properties: - { - name: - { + ,Properties: { + /** + * The column name. + */ + name: { type: String ,value: null }, - target: - { + /** + * The source table name or its alias if it has been specified. + */ + target: { type: String ,value: null } } - ,render: function (batch) - { - var sql = (this.target) ? '`' + this.target + '`.' : ''; - return sql + '`' + this.name + '`'; + ,render: function() { + return this.renderPreIdent(this.target) + + this.renderIdent(this.name); } }); diff --git a/js/sql/filter-item.js b/js/sql/filter-item.js index dccf5a63..343eebb3 100644 --- a/js/sql/filter-item.js +++ b/js/sql/filter-item.js @@ -1,20 +1,62 @@ -var Operation = require ('./operation'); +var Operation = require('./operation'); +var Value = require('./value'); +var Field = require('./field'); /** - * The equivalent of a SQL operation. - **/ -module.exports = new Class -({ + * Objects to be used as an operands of @Sql.Filter. It represents a two + * expressions basic operation composed by a table column, the operator and the + * value extracted from the rendering paramerers. + */ +module.exports = new Class({ Extends: Operation ,Tag: 'sql-filter-item' - ,Properties: - { - primary: - { - type: Boolean + ,Properties: { + /** + * The column name. + */ + field: { + type: String, + value: null + }, + /** + * The source table name or its alias if it has been specified. + */ + target: { + type: String, + value: null + }, + /** + * The parameter name. + */ + param: { + type: String, + value: null } } - - ,primary: true + + /** + * Checks if parameter name has been defined and if it has a value. + */ + ,isReady: function(params) { + return this.param != null && params != null && params[this.param] != null; + } + + ,render: function(params) { + var newOp = new Operation({type: this.type}); + + newOp.push(new Field({ + name: this.field, + target: this.target + })); + + var value = params[this.param]; + newOp.push(new Value({value: value})); + + return newOp.render(params); + } + + ,findHolders: function() { + return this.param ? [this.param] : null; + } }); diff --git a/js/sql/filter.js b/js/sql/filter.js index 54512ce7..111a6914 100644 --- a/js/sql/filter.js +++ b/js/sql/filter.js @@ -1,50 +1,49 @@ -var Operation = require ('./operation'); +var Operation = require('./operation'); +var Value = require('./value'); /** - * The equivalent of a SQL operation. - **/ -module.exports = new Class -({ + * The equivalent of a SQL filter expression. It allows to automatically build + * SQL filters based on lot parameters. + */ +module.exports = new Class({ Extends: Operation ,Tag: 'sql-filter' - ,Properties: - { - alwaysReady: - { - type: Boolean - } - } - ,isReady: function () - { - if (this.alwaysReady) + /** + * Checks if any of filters childs are ready. + */ + ,isReady: function(params) { + var exprs = this.exprs; + for (var i = exprs.length; i--;) + if (exprs[i].isReady(params)) return true; - - var e = this.exprs.getArray (); - for (var i = 0; i < e.length; i++) - if (e[i].isReady () && e[i].primary) - return true; - + return false; } - ,render: function (batch) - { - var isReady = false; - var newOp = new Operation ({type: this.type}); + /** + * Renders the filter as an SQL expression. If any of its childs isn't + * ready is ommitted from the expression. If all of its childs aren't ready + * renders the TRUE expression. + */ + ,render: function(params) { + var newOp; + var newExprs = []; + + this.exprs.forEach(function(expr) { + if (expr.isReady(params)) + newExprs.push(expr); + }) - var e = this.exprs.getArray (); - for (var i = 0; i < e.length; i++) - if (e[i].isReady ()) - { - newOp.exprs.add (e[i]); - isReady = true; - } + if (newExprs.length > 0) + newOp = new Operation({ + type: this.type, + exprs: newExprs + }); + else + newOp = new Value({value: true}); - if (!isReady) - return 'TRUE'; - - return newOp.render (batch); + return newOp.render(params); } }); diff --git a/js/sql/function.js b/js/sql/function.js index 6d868a3a..50fc7c0a 100644 --- a/js/sql/function.js +++ b/js/sql/function.js @@ -1,38 +1,48 @@ -var Expr = require ('./expr'); -var List = require ('./list'); +var Expr = require('./expr'); +var ListHolder = require('./list-holder'); /** * The equivalent of a SQL function. - * - * @param {string} funcName The name of the function - * @param {Array#Sql.Expr} param Array with function parameters - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Expr - ,Properties: - { - name: - { + ,Tag: 'sql-function' + ,Implements: ListHolder + ,Properties: { + /** + * The function name. + */ + name: { type: String ,value: null }, - schema: - { + /** + * The function schema. + */ + schema: { type: String ,value: null }, - params: - { - type: List - ,value: null + /** + * The function parameters. + */ + params: { + type: Array + ,set: function(x) { + this.list = x; + } + ,get: function() { + return this.list; + } } } - ,render: function (batch) - { - var sql = (this.schema) ? '`' + this.schema + '`.' : ''; - return sql + '`' + this.name + '`()'; + ,render: function(params) { + return this.renderPreIdent(this.schema) + + this.renderIdent(this.name) + + '(' + + this.renderListWs(this.list, params, ', ') + + ')'; } }); diff --git a/js/sql/holder.js b/js/sql/holder.js index 2d1a3f2d..67083cfa 100644 --- a/js/sql/holder.js +++ b/js/sql/holder.js @@ -1,27 +1,32 @@ -var Object = require ('./object'); +var SqlObject = require('./object'); +var Value = require('./value'); /** * A holder for another object. - **/ -module.exports = new Class -({ - Extends: Object - ,Properties: - { - id: - { + */ +module.exports = new Class({ + Extends: SqlObject + ,Properties: { + id: { type: String ,value: null } } - ,render: function (batch) - { - var object; + ,render: function(params) { + if (params) { + var object = params[this.id]; - if (batch && (object = batch.get (this.id))) - return object.render (batch); + if (object !== undefined) { + if (!(object instanceof SqlObject)) { + var sqlValue = new Value(); + sqlValue.value = object; + return sqlValue.render(); + } else + return object.render(params); + } + } return '#'+ this.id; } diff --git a/js/sql/insert.js b/js/sql/insert.js index 51df787d..6e6dd4c7 100644 --- a/js/sql/insert.js +++ b/js/sql/insert.js @@ -1,38 +1,19 @@ -var Dml = require ('./dml'); +var Dml = require('./dml'); /** * The equivalent of a SQL insert. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Dml - ,render: function (batch) - { - var sql; - var n; - - sql = 'INSERT INTO ' + this.renderTarget (batch) + ' ('; - - for (n = 0; n < this.field.length; n++) - { - if (n > 0) - sql += ', '; - sql += this.field[n].render (batch); - } - - sql += ') VALUES ('; - - for (n = 0; n < this.field.length; n++) - { - if (n > 0) - sql += ', '; - sql += this.expr[n].render(batch); - } - - sql += ')'; - - return sql; + ,render: function(params) { + return 'INSERT INTO' + + this.renderTarget(params) + + ' (' + + this.renderListWs(this.field, params, ', ') + + ') VALUES (' + + this.renderListWs(this.expr, params, ', ') + + ')'; } }) diff --git a/js/sql/join-item.js b/js/sql/join-item.js new file mode 100644 index 00000000..3e63cc9a --- /dev/null +++ b/js/sql/join-item.js @@ -0,0 +1,48 @@ + +var Target = require('./target'); +var Expr = require('./expr'); +var SqlObject = require('./object'); +var Type = require('./join').Type; + +var TypeSql = [ + 'INNER', + 'LEFT', + 'RIGHT' +]; + +/** + * The equivalent of a SQL join. + */ +module.exports = new Class({ + Extends: SqlObject + ,Tag: 'sql-join-table' + ,Properties: { + /** + * The join type. + */ + type: { + enumType: Type + ,value: 0 + }, + /** + * The right target. + */ + target: { + type: Target + ,value: null + }, + /** + * The join on condition. + */ + condition: { + type: Expr + ,value: null + } + } + + ,render: function(params) { + return TypeSql[this.type] +' JOIN ' + + this.target.render(params) + + this.renderIfSet(this.condition, 'ON', params); + } +}); diff --git a/js/sql/join.js b/js/sql/join.js new file mode 100644 index 00000000..37fcb8c8 --- /dev/null +++ b/js/sql/join.js @@ -0,0 +1,47 @@ + +var Target = require('./target'); +var ListHolder = require('./list-holder'); + +/** + * The equivalent of a SQL join. + */ +var Klass = new Class(); +module.exports = Klass; + +var Type = { + INNER : 0, + LEFT : 1, + RIGHT : 2 +}; + +Klass.extend({ + Type: Type +}); + +Klass.implement({ + Extends: Target + ,Implements: ListHolder + ,Tag: 'sql-join' + ,Properties: { + /** + * The right targets. + */ + targets: { + type: Array + ,set: function(x) { + this.list = x; + } + ,get: function() { + return this.list; + } + } + } + + ,render: function(params) { + return '(' + + this.target.render(params) + + ' ' + + this.renderList(this.list, params) + + ')'; + } +}); diff --git a/js/sql/list-holder.js b/js/sql/list-holder.js new file mode 100644 index 00000000..470ee8bb --- /dev/null +++ b/js/sql/list-holder.js @@ -0,0 +1,61 @@ +/** + * Interface for array holders. + */ +module.exports = new Class({ + Properties: { +/* list: { + type: Array + ,set: function (x) { + this._list = x; + } + ,get: function () { + return this._list; + } + } +*/ + } + + ,list: [] + + ,appendChild: function(child) { + this.list.push(child); + } + + /** + * Adds an element to the list. + * + * @param {SqlObject} element The element to add + */ + ,push: function(element) { + this.list.push(element); + } + + /** + * Removes an element from the list. + * + * @param {Number} i The element index + */ + ,splice: function(i) { + this.list.splice(i); + } + + /** + * Adds an element to the list. + * + * @param {Number} i The element index + */ + ,get: function(i) { + return this.list[i]; + } + + ,findHolders() { + let ids = []; + + for (const object of this.list){ + holders = object.findHolders(); + if (holders) ids = ids.concat(holders); + } + + return ids; + } +}); diff --git a/js/sql/list.js b/js/sql/list.js index 7dd109e1..b9c7e697 100644 --- a/js/sql/list.js +++ b/js/sql/list.js @@ -1,69 +1,71 @@ -var Object = require ('./object'); +var SqlObject = require('./object'); /** * List of Sql.Object - **/ -module.exports = new Class -({ - Extends: Object + */ +module.exports = new Class({ + Extends: SqlObject ,objects: [] - ,add: function (object) - { - this.objects.push (object.ref ()); - object.on ('changed', this._onObjectChange, this); - this._onObjectChange (); + ,add: function(object) { + this.objects.push(object.ref()); + object.on('changed', this._onObjectChange, this); + this._onObjectChange(); } - ,get: function (i) - { + ,get: function(i) { return objects[i]; } - ,getArray: function () - { + ,getArray: function() { return this.objects; } - ,remove: function (i) - { - this._unrefObject (this.objects.splice (i, 1)); - this._onObjectChange (); + ,remove: function(i) { + this._unrefObject(this.objects.splice(i, 1)); + this._onObjectChange(); } - ,_onObjectChange: function () - { - this.signalEmit ('changed'); + ,_onObjectChange: function() { + this.emit('changed'); } - ,isReady: function () - { + ,isReady: function() { var o = this.objects; if (o.length == 0) return false; for (var i = 0; i < o.length; i++) - if (!o[i].isReady ()) + if (!o[i].isReady()) return false; return true; } - - ,_unrefObject: function (object) - { - object.disconnect ('changed', this._onObjectChange, this); - object.unref (); + + ,findHolders() { + let ids = []; + + for (const object of this.objects){ + holders = object.findHolders(); + if (holders) ids = ids.concat(holders); + } + + return ids; } - ,_destroy: function () - { + ,_unrefObject: function(object) { + object.disconnect('changed', this._onObjectChange, this); + object.unref(); + } + + ,_destroy: function() { for (var i = 0; i < this.objects.length; i++) - this._unrefObject (this.objects[i]); + this._unrefObject(this.objects[i]); - this.parent (); + SqlObject.prototype._destroy.call(this); } }); diff --git a/js/sql/multi-stmt.js b/js/sql/multi-stmt.js index 60ae789e..60504a28 100644 --- a/js/sql/multi-stmt.js +++ b/js/sql/multi-stmt.js @@ -1,49 +1,30 @@ -var Stmt = require ('./stmt'); +var Stmt = require('./stmt'); +var ListHolder = require('./list-holder'); /** * The equivalent of a SQL multi statement. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Stmt - - ,stmts: [] - - ,addStmt: function (stmt) - { - return this.stmts.push (stmt); - } - - ,getStmt: function (stmtIndex) - { - return this.stmts[index]; - } - - ,isReady: function () - { - if (this.stmts.length == 0) - return false; - - for (var i = 0; i < this.stmts.length; i++) - if (!this.stmts[i].isReady ()) - return false; - - return true; - } - - ,render: function (batch) - { - var sql = ''; - - for (var i = 0; i < this.stmts.length; i++) - { - if (i > 0) - sql += ";\n"; - - sql += this.stmts[i].render (batch); + ,Implements: ListHolder + ,Tag: 'sql-multi-stmt' + ,Properties: { + /** + * The statements list. + */ + stmts: { + type: Array + ,set: function(x) { + this.list = x; + } + ,get: function() { + return this.list; + } } + } - return sql; + ,render: function(params) { + return this.renderListWs(this.list, params, ";\n"); } }); diff --git a/js/sql/object.js b/js/sql/object.js index 21db49dd..848ac8ce 100644 --- a/js/sql/object.js +++ b/js/sql/object.js @@ -1,32 +1,104 @@ /** * Base class for all objects on this library. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Vn.Object - - /** - * Renders the object as an SQL string. - * - * @param {Sql.Batch} batch The batch used to render the object - * @return {String} The SQL string - **/ - ,render: function (batch) {} /** * Gets if the object is ready to be rendered. * + * @param {Object} params The query parameters * @return {boolean} %true if the object is ready, %false otherwise - **/ - ,isReady: function () - { + */ + ,isReady: function() { return true; } /** - * Through the query looking for containers and adds it to the batch. + * Through the query looking for containers. * - * @return {Sql.Batch} batch The batch - **/ - ,findHolders: function (batch) {} + * @return {Array} An array with the names of the found parameters + */ + ,findHolders: function() {} + + /** + * Renders the object as an SQL string. + * + * @param {Object} params The params used to render the object + * @return {string} The SQL string + */ + ,render: function() {} + + /** + * Renders an objects array. + * + * @param {Array} list The objects array + * @param {Object} params The parameters + * @return {string} The rendered SQL string + */ + ,renderList: function(list, params) { + var sql = ''; + + list.forEach(function(item) { + sql += item.render(params); + }) + + return sql; + } + + /** + * Renders an objects array using a separator. + * + * @param {Array} list The objects array + * @param {Object} params The parameters + * @param {String} separator The separator between items + * @return {string} The rendered SQL string + */ + ,renderListWs: function(list, params, separator) { + var sql = ''; + + list.forEach(function(item, i) { + if (i > 0) + sql += separator; + sql += item.render(params); + }) + + return sql; + } + + /** + * Renders a quoted SQL identifier. + * + * @param {String} identifier The identifier + * @return {string} The quoted identifier + */ + ,renderIdent: function(identifier) { + return '`'+ identifier +'`'; + } + + /** + * Renders a quoted SQL identifier. + * + * @param {String} identifier The identifier + * @return {string} The quoted identifier + */ + ,renderPreIdent: function(identifier) { + if (identifier) + return this.renderIdent(identifier) +'.'; + else + return ''; + } + + /** + * Renders the object if it's defined. + * + * @param {String} prefix The rendered string prefix + * @return {string} The rendered object with its prefix + */ + ,renderIfSet: function(object, prefix, params) { + if (object) + return ' '+ prefix +' '+ object.render(params); + else + return ''; + } }); diff --git a/js/sql/operation.js b/js/sql/operation.js index 229cd2b1..9f491f4a 100644 --- a/js/sql/operation.js +++ b/js/sql/operation.js @@ -1,90 +1,85 @@ -var Expr = require ('./expr'); +var Expr = require('./expr'); +var ListHolder = require('./list-holder'); /** * The equivalent of a SQL operation between exprs. * - * @param {Array#Sql.Expr} expr Array with the exprs - * @param {Sql..Operation.Type} type The type of the operation - **/ -var Operation = new Class (); -module.exports = Operation; + * @param {Array#Expr} exprs Array with the exprs + * @param {Type} type The type of the operation + */ +var Klass = new Class(); +module.exports = Klass; -var Type = -{ +var Type = { EQUAL : 0 ,LIKE : 1 ,AND : 2 ,OR : 3 ,REGEXP : 4 + ,LOWER : 5 + ,UPPER : 6 + ,LE : 7 + ,UE : 8 + ,PLUS : 9 + ,MINUS : 10 + ,MULT : 11 + ,DIV : 12 + ,NE : 13 + ,MOD : 14 }; -var Operators = -[ +var Operators = [ '=' ,'LIKE' ,'AND' ,'OR' ,'REGEXP' + ,'<' + ,'>' + ,'<=' + ,'>=' + ,'+' + ,'-' + ,'*' + ,'/' + ,'<>' + ,'MOD' ]; -Operation.extend -({ +Klass.extend({ Type: Type ,Operators: Operators }); -Operation.implement -({ +Klass.implement({ Extends: Expr + ,Implements: ListHolder ,Tag: 'sql-operation' - ,Properties: - { - type: - { + ,Properties: { + type: { enumType: Type ,value: -1 + }, + target: { + type: String + ,value: null + }, + exprs: { + type: Array + ,set: function(x) { + this.list = x; + } + ,get: function() { + return this.list; + } } } - ,initialize: function (props) - { - this.parent (props); - this.link ({exprs: new Sql.List ()}, {'changed': this.onListChange}); - } - - ,appendChild: function (child) - { - this.exprs.add (child); - } - - ,onListChange: function () - { - this.signalEmit ('changed'); - } - - ,isReady: function () - { - return this.exprs.isReady (); - } - - ,render: function (batch) - { - var sql = '('; + ,render: function(params) { var operator = ' '+ Operators[this.type] +' '; - var e = this.exprs.getArray (); - - for (var i = 0; i < e.length; i++) - { - if (i > 0) - sql += operator; - - sql += e[i].render (batch); - } - - sql += ')'; - - return sql; + return '(' + + this.renderListWs(this.list, params, operator) + + ')'; } }); - diff --git a/js/sql/search-tags.js b/js/sql/search-tags.js deleted file mode 100644 index 5fe37250..00000000 --- a/js/sql/search-tags.js +++ /dev/null @@ -1,22 +0,0 @@ - -var Value = require ('./value'); - -/** - * The equivalent of a SQL value. - **/ -module.exports = new Class -({ - Extends: Value - ,Tag: 'sql-search-tags' - - ,render: function (batch) - { - if (typeof this._value == 'string') - { - var value = this._value.replace (/^|\s+|$/g, '%'); - return "'" + value.replace (this.regexp, this.replaceFunc) + "'"; - } - else - return this.parent (); - } -}); diff --git a/js/sql/select.js b/js/sql/select.js index 96558a6a..12840246 100644 --- a/js/sql/select.js +++ b/js/sql/select.js @@ -1,37 +1,25 @@ -var Stmt = require ('./stmt'); -var Field = require ('./field'); +var Stmt = require('./stmt'); +var Field = require('./field'); /** * The equivalent of a SQL select. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Stmt ,expr: [] - ,addField: function (fieldName) - { - this.expr.push (new Field ({name: fieldName})); + ,addField: function(fieldName) { + this.expr.push(new Field({name: fieldName})); } - ,render: function (batch) - { - var sql = 'SELECT ' - - for (var i = 0; i < this.expr.length; i++) - { - if (i > 0) - sql += ', '; - sql += this.expr[i].render(batch); - } - - sql += ' FROM ' + this.renderTarget (batch); - - if (this.where) - sql += ' WHERE ' + this.where.render (batch); - - return sql; + ,render: function(params) { + return 'SELECT ' + + this.renderListWs(this.expr, params, ', ') + + ' FROM' + + this.renderTarget(params) + + this.renderIfSet(this.where, 'WHERE', params) + + this.renderLimit(params); } }); diff --git a/js/sql/sql.js b/js/sql/sql.js index 7de038f9..068b8231 100644 --- a/js/sql/sql.js +++ b/js/sql/sql.js @@ -1,28 +1,29 @@ -require ('vn/vn'); +require('vn/vn'); Sql = module.exports = { - Object : require ('./object') - ,Holder : require ('./holder') - ,Batch : require ('./batch') - ,List : require ('./list') - ,Expr : require ('./expr') - ,Value : require ('./value') - ,Field : require ('./field') - ,Function : require ('./function') - ,Operation : require ('./operation') - ,Target : require ('./target') - ,Table : require ('./table') - ,Stmt : require ('./stmt') - ,Dml : require ('./dml') - ,String : require ('./string') - ,Delete : require ('./delete') - ,Insert : require ('./insert') - ,Select : require ('./select') - ,Update : require ('./update') - ,MultiStmt : require ('./multi-stmt') - ,Filter : require ('./filter') - ,FilterItem : require ('./filter-item') - ,SearchTags : require ('./search-tags') + Object : require('./object') + ,Holder : require('./holder') + ,List : require('./list') + ,ListHolder : require('./list-holder') + ,Expr : require('./expr') + ,Value : require('./value') + ,Field : require('./field') + ,Function : require('./function') + ,Operation : require('./operation') + ,Target : require('./target') + ,Table : require('./table') + ,Join : require('./join') + ,JoinItem : require('./join-item') + ,Stmt : require('./stmt') + ,Dml : require('./dml') + ,String : require('./string') + ,Delete : require('./delete') + ,Insert : require('./insert') + ,Select : require('./select') + ,Update : require('./update') + ,MultiStmt : require('./multi-stmt') + ,Filter : require('./filter') + ,FilterItem : require('./filter-item') }; diff --git a/js/sql/stmt.js b/js/sql/stmt.js index ba7e86c3..a6d3e564 100644 --- a/js/sql/stmt.js +++ b/js/sql/stmt.js @@ -1,47 +1,40 @@ -var Object = require ('./object'); -var Expr = require ('./expr'); +var Object = require('./object'); +var Expr = require('./expr'); /** * The equivalent of a SQL statement. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Object - ,Properties: - { - where: - { + ,Properties: { + where: { type: Expr ,value: null + }, + limit: { + type: Number + ,value: null } } ,target: [] - ,addTarget: function (target) - { - this.target.push (target); + ,addTarget: function(target) { + this.target.push(target); } - ,renderTarget: function (batch) - { - var sql; - var len = this.target.length; - - if (len > 0) - { - sql = ' '; - - for (var n = 0; n < len; n++) - { - if (n > 0) sql += ', '; - sql += this.target[n].render (batch); - } - } + ,renderTarget: function(params) { + if (this.target.length > 0) + return ' '+ this.renderListWs(this.target, params, ', '); else - sql += 'DUAL'; - - return sql; - } + return ' DUAL'; + } + + ,renderLimit: function() { + if (this.limit != null) + return ' LIMIT '+ parseInt(this.limit); + else + return ''; + } }); diff --git a/js/sql/string.js b/js/sql/string.js index b58341f4..ed8989b4 100644 --- a/js/sql/string.js +++ b/js/sql/string.js @@ -1,45 +1,45 @@ -var Stmt = require ('./stmt'); -var Holder = require ('./holder'); +var Stmt = require('./stmt'); +var Holder = require('./holder'); /** * Literal SQL string. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Stmt - ,Properties: - { - query: - { + ,Tag: 'sql-string' + ,Properties: { + query: { type: String ,value: null } } ,regexp: /#\w+/g - - ,replaceFunc: function (batch, token) - { - var holder = new Holder ({id: token.substr (1)}); - return holder.render (batch); + + ,appendChild: function(child) { + if (child.nodeType === Node.TEXT_NODE) + this.query = child.textContent; } - ,render: function (batch) - { + ,render: function(params) { if (!this.query) return null; + + function replaceFunc(token) { + var holder = new Holder({id: token.substr(1)}); + return holder.render(params); + } - return this.query.replace (this.regexp, this.replaceFunc.bind (this, batch)); + return this.query.replace(this.regexp, replaceFunc); } - ,findHolders: function () - { - var ids = this.query.match (this.regexp); + ,findHolders: function() { + var ids = this.query.match(this.regexp); if (ids) for (var i = 0; i < ids.length; i++) - ids[i] = ids[i].substr (1); + ids[i] = ids[i].substr(1); return ids; } diff --git a/js/sql/table.js b/js/sql/table.js index 7e5bcf9c..e97c8eec 100644 --- a/js/sql/table.js +++ b/js/sql/table.js @@ -1,30 +1,33 @@ -var Target = require ('./target'); +var Target = require('./target'); /** * Represents a database table. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Target - ,Properties: - { - name: - { + ,Properties: { + name: { type: String ,value: null }, - schema: - { + alias: { + type: String + ,value: null + }, + schema: { type: String ,value: null } } - ,render: function (batch) - { - var sql = this.schema ? '`' + this.schema + '`.' : ''; - sql += '`' + this.name + '`'; + ,render: function() { + var sql = this.renderPreIdent(this.schema) + + this.renderIdent(this.name); + + if (this.alias) + sql += ' AS '+ this.renderIdent(this.alias); + return sql; } }); diff --git a/js/sql/target.js b/js/sql/target.js index 1065f09a..bb19092c 100644 --- a/js/sql/target.js +++ b/js/sql/target.js @@ -1,10 +1,9 @@ -var Object = require ('./object'); +var Object = require('./object'); /** * The equivalent of a SQL target. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Object }); diff --git a/js/sql/update.js b/js/sql/update.js index 456a3aec..8c91eab8 100644 --- a/js/sql/update.js +++ b/js/sql/update.js @@ -1,32 +1,28 @@ -var Dml = require ('./dml'); +var Dml = require('./dml'); /** * The equivalent of a SQL update. - **/ -module.exports = new Class -({ + */ +module.exports = new Class({ Extends: Dml - ,render: function (batch) - { - var sql; - var n; + ,render: function(params) { + var sql = 'UPDATE' + + this.renderTarget(params) + + ' SET '; - sql = 'UPDATE ' + this.renderTarget (batch) + ' SET '; - - for (n = 0; n < this.field.length; n++) - { - if (n > 0) + this.field.forEach(function(field, i) { + if (i > 0) sql += ', '; - sql += this.field[n].render () + ' = ' + this.expr[n].render(batch); - } + + sql += field.render(params) + + ' = ' + + this.expr[i].render(params); + }, this); - if (this.where) - sql += ' WHERE ' + this.where.render (batch); - - sql += ' LIMIT 1'; // Only for security. - + sql += this.renderIfSet(this.where, 'WHERE', params) + + this.renderLimit(params); return sql; } }); diff --git a/js/sql/value.js b/js/sql/value.js index f0c6a061..6e069472 100644 --- a/js/sql/value.js +++ b/js/sql/value.js @@ -3,69 +3,80 @@ var Expr = require('./expr'); /** * The equivalent of a SQL value. - **/ + */ module.exports = new Class({ - Extends: Expr - ,Tag: 'sql-value' - ,Properties: - { - /** - * The master param. - **/ - param: - { - type: Vn.Param + Extends: Expr + ,Implements: Vn.ParamIface + ,Tag: 'sql-value' + ,Properties: { + value: { + type: null ,set: function(x) { - this.link({_param: x}, {'changed': this.onParamChange}); - this.onParamChange(); + this._setValue(x); + } + ,get: function() { + return this._value; + } + }, + type: { + type: Type + ,set: function(x) { + this._setType(x); + } + ,get: function() { + return this._type; + } + }, + param: { + type: Vn.ParamIface + ,set: function(x) { + this._setParam(x); } ,get: function() { return this._param; } }, - /** - * The value. - **/ - value: - { - type: String + lot: { + type: Vn.LotIface ,set: function(x) { - if (Vn.Value.compare(x, this._value)) - return; - - if (x instanceof Date) - x = x.clone(); - - this._value = x; - - if (this._param && !this.paramLock) { - this.paramLock = true; - this._param.value = x; - this.paramLock = false; - } - - this.signalEmit('changed'); + this._setLot(x); } ,get: function() { - return this._value; + return this._lot; + } + }, + name: { + type: String + ,set: function(x) { + this._name = x; + this._onLotChange(); + } + ,get: function() { + return this._name; + } + }, + oneWay: { + type: Boolean + ,set: function(x) { + this._oneWay = x; + } + ,get: function() { + return this._oneWay; + } + }, + oneTime: { + type: Boolean + ,set: function(x) { + this._oneTime = x; + } + ,get: function() { + return this._oneTime; } } } - ,_value: undefined - ,_param: null ,regexp: new RegExp('(\\\\)|\'', 'g') - ,paramLock: false - - ,onParamChange: function() { - if (this.paramLock || !this._param) - return; - - this.paramLock = true; - this.value = this._param.value; - this.paramLock = false; - } ,isReady: function() { return this._value !== undefined; diff --git a/js/vn/browser.js b/js/vn/browser.js index fde58c69..92986ab0 100644 --- a/js/vn/browser.js +++ b/js/vn/browser.js @@ -1,36 +1,29 @@ -module.exports = -{ - getPageYOffset: function () - { +module.exports = { + getPageYOffset: function() { return window.pageYOffset; }, - getPageXOffset: function () - { + getPageXOffset: function() { return window.pageXOffset; }, - getInnerHeight: function () - { + getInnerHeight: function() { return window.innerHeight; }, - getInnerWidth: function () - { + getInnerWidth: function() { return window.innerWidth; }, - createRadio: function (uid, doc) - { - var radio = doc.createElement ('input'); + createRadio: function(uid, doc) { + var radio = doc.createElement('input'); radio.type = 'radio'; radio.name = uid; return radio; }, - setInputTypeNumber: function (input) - { + setInputTypeNumber: function(input) { input.type = 'number'; } }; diff --git a/js/vn/builder.js b/js/vn/builder.js index fd741cce..ee6182b6 100644 --- a/js/vn/builder.js +++ b/js/vn/builder.js @@ -1,111 +1,71 @@ +const VnObject = require('./object'); +const Scope = require('./scope'); +const kebabToCamel = require('./string-util').kebabToCamel; -var Object = require ('./object'); +const CompilerObject = require('./compiler-object'); +const CompilerElement = require('./compiler-element'); +const CompilerText = require('./compiler-text'); + +const regCompilers = [ + CompilerText, + CompilerObject, + CompilerElement +]; /** * Creates a object from a XML specification. - **/ -module.exports = new Class -({ - Extends: Object - ,_addedMap: {} - ,_contexts: null - - ,add: function (id, object) - { - this._addedMap[id] = object; - } - - ,setParent: function (parentResult) - { - this._parentResult = parentResult; - - if (parentResult && !this.signalData) - this.signalData = parentResult.builder.signalData; - } - - ,getMain: function (result) - { - return result.objects[this._mainContext]; - } - - ,getById: function (result, objectId) - { - var index = this._contextMap[objectId]; - - if (index !== undefined) - return result.objects[index]; - - var object = this._addedMap[objectId]; - - if (object !== undefined) - return object; - - if (this._parentResult) - return this._parentResult.getById (objectId); - - return null; - } - - ,getByTagName: function (result, tagName) - { - var tags = this._tags[tagName]; - - if (tags) - { - var arr = new Array (tags.length); - - for (var i = 0; i < tags.length; i++) - arr[i] = result.objects[tags[i]]; - - return arr; - } - - return []; - } + */ +module.exports = new Class({ + Extends: VnObject /** * Compiles an XML file. * - * @path String The XML path - * @dstDocument Document The document used to create the nodes - * @return %true on success, %false othersise - **/ - ,loadXml: function (path, dstDocument) - { + * @param {String} path The XML path + * @return {Boolean} %true on success, %false othersise + */ + ,compileFile: function(path) { this._path = path; - return this.loadFromXmlDoc (Vn.getXml (path), dstDocument); - } - - ,loadFromString: function (xmlString, dstDocument) - { - var parser = new DOMParser (); - var xmlDoc = parser.parseFromString (xmlString, 'text/xml'); - return this.loadFromXmlDoc (xmlDoc, dstDocument); - } - - ,loadFromXmlDoc: function (xmlDoc, dstDocument) - { - if (!xmlDoc) - return false; + return this.compileDocument(Vn.getXml(path)); + } - this._compileInit (dstDocument); + /** + * Compiles an XML string. + * + * @param {String} xmlString The XML string + * @return {Boolean} %true on success, %false othersise + */ + ,compileString: function(xmlString) { + const parser = new DOMParser(); + const doc = parser.parseFromString(xmlString, 'text/xml'); + return this.compileDocument(doc); + } - var docElement = xmlDoc.documentElement; + /** + * Compiles a XML document. + * + * @param {Document} doc The DOM document + * @return {Boolean} %true on success, %false othersise + */ + ,compileDocument: function(doc) { + if (!doc) + return false; + + this._preCompile(); + const docElement = doc.documentElement; - if (docElement.tagName !== 'vn') - { - this._showError ('Malformed XML'); + if (docElement.tagName !== 'vn') { + this.showError('The toplevel tag should be named \'vn\''); this._contexts = null; return false; } - var childs = docElement.childNodes; - + const childs = docElement.childNodes; if (childs) - for (var i = 0; i < childs.length; i++) - this._compileNode (childs[i]); + for (let i = 0; i < childs.length; i++) + this._compile(childs[i]); - this._compileEnd (); + this._postCompile(); return true; } @@ -113,503 +73,96 @@ module.exports = new Class * Compiles a single DOM node. * * @path Node The DOM node - * @dstDocument Document The document used to create the nodes * @return %true on success, %false othersise - **/ - ,loadXmlFromNode: function (node, dstDocument) - { - this._compileInit (dstDocument); - this._mainContext = this._compileNode (node).id; - this._compileEnd (); + */ + ,compileNode: function(node) { + this._preCompile(); + this._mainContext = this._compile(node).id; + this._postCompile(); return true; } - - ,load: function () - { - if (this._contexts === null) - return null; - - var contexts = this._contexts; - var len = contexts.length; - var objects = new Array (len); - - for (var i = 0; i < len; i++) - { - var context = contexts[i]; - - if (context.tagName) - objects[i] = this.elementInstantiate (context); - else if (context.klass) - objects[i] = this.objectInstantiate (context); - else - objects[i] = this.textInstantiate (context); - } - - return new BuilderResult (this, objects); - } - - ,link: function (result) - { - var objects = result.objects; - - for (var i = this._links.length - 1; i >= 0; i--) - { - var l = this._links[i]; - var addedObject = this._addedMap[l.objectId]; - if (addedObject) - { - if (l.prop) - objects[l.context.id][l.prop] = addedObject; - else - objects[l.context.id].appendChild (addedObject); - } - else - this._showError ('Referenced unexistent object with id \'%s\'', - l.objectId); - } - - var contexts = this._contexts; - for (var i = 0; i < contexts.length; i++) - { - var context = contexts[i]; - var object = objects[i]; - - if (context.tagName) - this.elementLink (context, object, objects, result); - else if (context.klass) - this.objectLink (context, object, objects, result); - } - } - - ,_compileInit: function (dstDocument) - { + /** + * Called before starting to compile nodes. + */ + ,_preCompile: function() { this._path = null; this._tags = {}; this._contexts = []; + this._exprContexts = []; this._contextMap = {}; this._links = []; this._mainContext = null; - this._doc = dstDocument ? dstDocument : document; + + this._compilers = []; + for (regCompiler of regCompilers) + this._compilers.push(new regCompiler(this)); } - ,_compileEnd: function () - { - for (var i = this._links.length - 1; i >= 0; i--) - { - var l = this._links[i]; - var contextId = this._contextMap[l.objectId]; - - if (contextId != undefined) - { - if (l.prop) - l.context.objectProps[l.prop] = contextId; - else - l.context.childs.push (contextId); - - this._links.splice (i, 1); - } - else - { - var object = this._addedMap[l.objectId]; - - if (!object && this._parentResult) - object = this._parentResult.getById (l.objectId); - - if (object) - { - l.context.props[l.prop] = object; - this._links.splice (i, 1); - } - } - } + /** + * Called after all nodes have been compiled. + */ + ,_postCompile: function() { + for (const compiler of this._compilers) + compiler.postCompile(this._contextMap); } - ,_compileNode: function (node) - { - var context = null; - var tagName = null; + /** + * Compiles a node. + */ + ,_compile: function(node) { + let context = null; + let tagName = null; + const isElement = node.nodeType === Node.ELEMENT_NODE; - if (node.nodeType === Node.ELEMENT_NODE) - tagName = node.tagName.toLowerCase (); + if (isElement) + tagName = node.tagName.toLowerCase(); else if (node.nodeType !== Node.TEXT_NODE - || /^[\n\r\t]*$/.test (node.textContent)) + || /^[\n\r\t]*$/.test(node.textContent)) return null; - - var context = - this.textCompile (node, tagName) - || this.objectCompile (node, tagName) - || this.elementCompile (node, tagName); + + let i; + const compilers = this._compilers; + for (i = 0; i < compilers.length && context === null; i++) + context = compilers[i].compile(this, node, tagName); context.id = this._contexts.length; + context.compiler = compilers[i - 1]; - if (tagName) - { - var nodeId = node.getAttribute ('id'); + if (isElement) { + const nodeId = node.getAttribute('id'); - if (nodeId) - this._contextMap[nodeId] = context.id; + if (nodeId) { + this._contextMap[kebabToCamel(nodeId)] = context.id; + context.nodeId = nodeId; + } - var tags = this._tags[tagName]; - + let tags = this._tags[tagName]; if (!tags) this._tags[tagName] = tags = []; - tags.push (context.id); + tags.push(context.id); } - this._contexts.push (context); + this._contexts.push(context); return context; } - - /** - * Creates a text node context. - **/ - ,textCompile: function (node, tagName) - { - if (!tagName) - var text = node.textContent; - else if (tagName === 't') - var text = _(node.firstChild.textContent); - else - return null; - - return {text: text}; - } - ,textInstantiate: function (context) - { - return this._doc.createTextNode (context.text); - } - - /** - * Creates a object context. - **/ - ,objectCompile: function (node, tagName) - { - var klass = vnCustomTags[tagName]; - - if (!klass) - return null; - - var props = {}; - var objectProps = {}; - var childs = []; - var events = {}; - - var context = { - klass: klass, - props: props, - objectProps: objectProps, - childs: childs, - events: events, - custom: null - }; - - var a = node.attributes; - - for (var i = 0; i < a.length; i++) - { - var attribute = a[i].nodeName; - var value = a[i].nodeValue; - - if (this._isEvent (attribute)) - { - var handler = this._getMethod (value) - - if (handler) - events[attribute.substr (3)] = handler; - } - else if (!/^(id|property)$/.test (attribute)) - { - this.propCompile (context, klass, props, - node, attribute, value); - } - } - - var childNodes = node.childNodes; - - if (childNodes) - for (var i = 0; i < childNodes.length; i++) - { - var child = childNodes[i]; - var isElement = child.nodeType === Node.ELEMENT_NODE; - var childTagName = isElement ? child.tagName.toLowerCase () : null; - var childContext; - - if (childTagName === 'pointer') - { - this._addLink (context, null, child.getAttribute ('object')); - } - else if (childTagName === 'custom') - { - context.custom = child; - } - else if (childContext = this._compileNode (child)) - { - var prop = isElement ? child.getAttribute ('property') : null; - - if (prop) - { - prop = prop.replace (/-./g, this._replaceFunc); - objectProps[prop] = childContext.id; - } - else - childs.push (childContext.id); - } - } - - return context; + ,load: function(dstDocument, thisArg, parentScope) { + if (!this._contexts) return null; + const doc = dstDocument ? dstDocument : document; + const objects = new Array(this._contexts.length); + const exprValues = new Array(this._exprContexts.length); + return new Scope(this, doc, objects, exprValues, thisArg, parentScope); } - ,propCompile: function (context, klass, props, node, attribute, value) - { - var isLink = false; - var newValue = null; - var propName = attribute.replace (/-./g, this._replaceFunc); - var propInfo = klass.Properties[propName]; + ,showError: function(error) { + const path = this._path ? this._path : 'Node'; + const logArgs = ['Vn.Builder: %s: '+ error, path]; - if (!propInfo) - { - this._showError ('Attribute \'%s\' not valid for tag \'%s\'', - attribute, node.tagName); - return; - } - if (!value) - { - this._showError ('Attribute \'%s\' empty on tag \'%s\'', - attribute, node.tagName); - return; - } - - switch (propInfo.type) - { - case Boolean: - newValue = (/^(true|1)$/i).test (value); - break; - case Number: - newValue = 0 + new Number (value); - break; - case String: - newValue = this._translateValue (value); - break; - case Function: - var method = this._getMethod (value); - newValue = method ? method.bind (this.signalData) : null; - break; - default: - if (propInfo.enumType) - newValue = propInfo.enumType[value]; - else if (propInfo.type instanceof Function) - isLink = true; - } - - if (isLink) - this._addLink (context, propName, value); - else if (newValue !== null && newValue !== undefined) - props[propName] = newValue; - else - this._showError ('Attribute \'%s\' invalid for tag \'%s\'', - attribute, node.tagName); - } + for (let i = 1; i < arguments.length; i++) + logArgs.push(arguments[i]); - ,objectInstantiate: function (context) - { - return new context.klass (); - } - - ,objectLink: function (context, object, objects, res) - { - object.setProperties (context.props); - - var objectProps = context.objectProps; - for (var prop in objectProps) - object[prop] = objects[objectProps[prop]]; - - var childs = context.childs; - for (var i = 0; i < childs.length; i++) - object.appendChild (objects[childs[i]]); - - var events = context.events; - for (var event in events) - object.on (event, events[event], this.signalData); - - if (context.custom) - object.loadXml (res, context.custom); - } - - /** - * Creates a HTML node context. - **/ - ,elementCompile: function (node, tagName) - { - var attributes = {}; - var childs = []; - var events = {}; - var handler; - - var a = node.attributes; - - for (var i = 0; i < a.length; i++) - { - var attribute = a[i].nodeName; - var value = a[i].nodeValue; - - if (this._isEvent (attribute)) - { - var handler = this._getMethod (value); - - if (handler) - events[attribute.substr (3)] = handler; - } - else if (attribute !== 'id') - attributes[attribute] = this._translateValue (value); - } - - var childContext; - var childNodes = node.childNodes; - - if (childNodes) - for (var i = 0; i < childNodes.length; i++) - if (childContext = this._compileNode (childNodes[i])) - childs.push (childContext.id); - - return { - tagName: tagName, - attributes: attributes, - childs: childs, - events: events - }; - } - - ,elementInstantiate: function (context) - { - return this._doc.createElement (context.tagName); - } - - ,elementLink: function (context, object, objects) - { - var attributes = context.attributes; - for (var attribute in attributes) - object.setAttribute (attribute, attributes[attribute]); - - var childs = context.childs; - for (var i = 0; i < childs.length; i++) - { - var child = objects[childs[i]]; - - if (child instanceof Htk.Widget) - child = child.node; - if (child instanceof Node) - object.appendChild (child); - } - - var events = context.events; - for (var event in events) - object.addEventListener (event, - events[event].bind (this.signalData)); - } - - ,_showError: function (error) - { - var path = this._path ? this._path : 'Node'; - var logArgs = ['Vn.Builder: %s: '+ error, path]; - - for (var i = 1; i < arguments.length; i++) - logArgs.push (arguments[i]); - - console.warn.apply (null, logArgs); - } - - ,_addLink: function (context, prop, objectId) - { - this._links.push ({ - context: context - ,prop: prop - ,objectId: objectId - }); - } - - ,_translateValue: function (value) - { - var chr = value.charAt (0); - - if (chr === '_') - return _(value.substr (1)); - else if (chr === '\\' && value.charAt (1) === '_') - return value.substr (1); - - return value; - } - - ,_getMethod: function (value) - { - if (this.signalData) - var method = this.signalData[value]; - else - var method = window[value]; - - if (method === undefined) - this._showError ('Function \'%s\' not found', value); - - return method; - } - - ,_isEvent: function (attribute) - { - return /^on-\w+/.test (attribute); - } - - ,_replaceFunc: function (token) - { - return token.charAt(1).toUpperCase (); + console.warn.apply(null, logArgs); } }); - -var BuilderResult = new Class -({ - Extends: Object - - ,initialize: function (builder, objects) - { - this.builder = builder; - this.objects = objects; - } - - ,getMain: function () - { - return this.builder.getMain (this); - } - - ,$: function (objectId) - { - return this.builder.getById (this, objectId); - } - - ,getById: function (objectId) - { - return this.builder.getById (this, objectId); - } - - ,getByTagName: function (tagName) - { - return this.builder.getByTagName (this, tagName); - } - - ,link: function () - { - this.builder.link (this); - } - - ,_destroy: function () - { - var objects = this.objects; - - for (var i = 0; i < objects.length; i++) - if (objects[i] instanceof Object) - objects[i].unref (); - - this.parent (); - } -}); - diff --git a/js/vn/compiler-element.js b/js/vn/compiler-element.js new file mode 100644 index 00000000..61441f9c --- /dev/null +++ b/js/vn/compiler-element.js @@ -0,0 +1,85 @@ +const Compiler = require('./compiler'); +const Component = require('./component'); +const VnNode = require('./node'); + +/** + * Compiles a @HTMLElement from element tag. + */ + module.exports = new Class({ + Extends: Compiler + + ,compile: function(builder, node, tagName) { + const context = { + tagName, + attributes: {}, + childs: [], + events: {} + }; + const {attributes} = context; + + const a = node.attributes; + for (let i = 0; i < a.length; i++) { + const attribute = a[i].nodeName; + const value = a[i].nodeValue; + + if (this.isEvent(attribute)) { + const handler = this._getMethod(value); + if (handler) context.events[attribute.substr(3)] = handler; + } else if (!/^(id|property)$/.test(attribute)) { + if (this.isExpr(value)) + this.compileExpr(context, attribute, value); + else + attributes[attribute] = this._translateValue(value); + } + } + + let childContext; + const childNodes = node.childNodes; + + if (childNodes) + for (let i = 0; i < childNodes.length; i++) + if (childContext = builder._compile(childNodes[i])) + context.childs.push(childContext.id); + + return context; + } + + ,instantiate: function(doc, context, scope) { + const object = doc.createElement(context.tagName); + + const attributes = context.attributes; + for (const attribute in attributes) + object.setAttribute(attribute, attributes[attribute]); + + if (context.nodeId) { + const id = context.nodeId; + object.setAttribute('id', scope.getHtmlId(id)); + VnNode.addClass(object, '_'+ id); + } + + return object; + } + + ,setProperty(object, property, value) { + object.setAttribute(property, value); + } + + ,link: function(context, object, objects, scope) { + const childs = context.childs; + for (let i = 0; i < childs.length; i++) { + let child = objects[childs[i]]; + + if (child instanceof Component) + child = child.node; + if (child instanceof Node) + object.appendChild(child); + } + + const events = context.events; + for (const event in events) { + const listener = this.bindMethod(events[event], scope, true); + if (listener) + object.addEventListener(event, listener); + } + } +}); diff --git a/js/vn/compiler-object.js b/js/vn/compiler-object.js new file mode 100644 index 00000000..e623f838 --- /dev/null +++ b/js/vn/compiler-object.js @@ -0,0 +1,216 @@ +const Compiler = require('./compiler'); +const Component = require('./component'); +const Type = require('./type'); +const kebabToCamel = require('./string-util').kebabToCamel; + +/** + * Compiles a @Vn.Object from element tag. + */ +module.exports = new Class({ + Extends: Compiler + + ,_links: [] + + /** + * Creates a object context. + */ + ,compile: function(builder, node, tagName) { + const klass = vnCustomTags[tagName]; + if (!klass) return null; + + const context = { + klass, + props: {}, + funcProps: {}, + objectProps: {}, + childs: [], + events: {}, + custom: null + }; + + const a = node.attributes; + for (let i = 0; i < a.length; i++) { + const attribute = a[i].nodeName; + const value = a[i].nodeValue; + + if (this.isEvent(attribute)) { + const handler = this._getMethod(value) + if (handler) context.events[attribute.substr(3)] = handler; + } else if (!/^(id|property)$/.test(attribute)) { + this.propCompile(context, node, attribute, value); + } + } + + const childNodes = node.childNodes; + + if (childNodes) + for (let i = 0; i < childNodes.length; i++) { + const child = childNodes[i]; + const isElement = child.nodeType === Node.ELEMENT_NODE; + const childTagName = isElement ? child.tagName.toLowerCase() : null; + let childContext; + + if (childTagName === 'pointer') { + this._addLink(context, null, child.getAttribute('object')); + } else if (childTagName === 'custom') { + context.custom = child; + } else if (childContext = builder._compile(child)) { + let prop = isElement ? child.getAttribute('property') : null; + + if (prop) { + prop = kebabToCamel(prop); + context.objectProps[prop] = childContext.id; + } else + context.childs.push(childContext.id); + } + } + + return context; + } + + ,propCompile: function(context, node, attribute, value) { + const tagName = node.tagName; + const propName = kebabToCamel(attribute); + const propInfo = context.klass.Properties[propName]; + + if (!value) { + this.showError('Attribute \'%s\' empty on tag \'%s\'', + attribute, tagName); + return; + } + + if (propName == 'vModel') { + context.vModel = this.modelExpr(value); + return; + } + + if (!propInfo) { + this.showError('Attribute \'%s\' not valid for tag \'%s\'', + attribute, tagName); + return; + } + + if (this.isExpr(value)) { + this.compileExpr(context, propName, value); + } else { + let isLink = false; + let propError = false; + let newValue = null; + + switch (propInfo.type) { + case Boolean: + newValue = (/^(true|1)$/i).test(value); + break; + case Number: + newValue = 0 + new Number(value); + break; + case String: + newValue = this._translateValue(value); + break; + case Function: + context.funcProps[propName] = this._getMethod(value); + break; + case Type: + newValue = window[value]; + break; + default: + if (propInfo.enumType) + newValue = propInfo.enumType[value]; + else if (propInfo.type instanceof Function) + isLink = true; + else + propError = true; + } + + if (isLink) + this._addLink(context, propName, value); + else if (newValue !== null && newValue !== undefined) + context.props[propName] = newValue; + else if (propError) + this.showError('Attribute \'%s\' invalid for tag \'%s\'', + attribute, tagName); + } + } + + ,instantiate: function(doc, context, scope) { + const object = new context.klass(); + object.setProperties(context.props); + + if (context.nodeId && object instanceof Component) { + const id = context.nodeId; + object.htmlId = scope.getHtmlId(id); + object.className = '_'+ id +' '+ (object.className || ''); + } + + return object; + } + + ,setProperty(object, property, value) { + object[property] = value; + } + + ,preLink(scope) { + const objects = scope.objects; + const links = this._links; + + for (let i = links.length - 1; i >= 0; i--) { + const link = links[i]; + const object = objects[link.context.id]; + const objectRef = scope.$[link.objectId]; + + if (objectRef === undefined) { + this.showError('Referenced unexistent object with id \'%s\'', + link.objectId); + continue; + } + + if (link.prop) + object[link.prop] = objectRef; + else + object.appendChild(objectRef); + } + } + + ,link: function(context, object, objects, scope) { + const objectProps = context.objectProps; + for (const prop in objectProps) + object[prop] = objects[objectProps[prop]]; + + const childs = context.childs; + for (let i = 0; i < childs.length; i++) + object.appendChild(objects[childs[i]]); + + const funcProps = context.funcProps; + for (const prop in funcProps) + object[prop] = this.bindMethod(funcProps[prop], scope); + + const events = context.events; + for (const event in events) { + const listener = this.bindMethod(events[event], scope); + if (listener) + object.on(event, listener, scope.thisArg); + } + + if (context.vModel) { + object.on('change', function(lot) { + context.vModel.call(scope.thisArg, scope.$, lot.$); + scope.digest(); + }, scope); + } + + if (context.custom) + object.loadXml(scope, context.custom); + } + + ,_addLink: function(context, prop, objectId) { + this._links.push({ + context + ,prop + ,objectId: kebabToCamel(objectId) + }); + } + + ,_replaceFunc: function(token) { + return token.charAt(1).toUpperCase(); + } +}); \ No newline at end of file diff --git a/js/vn/compiler-text.js b/js/vn/compiler-text.js new file mode 100644 index 00000000..6b21a697 --- /dev/null +++ b/js/vn/compiler-text.js @@ -0,0 +1,33 @@ +const Compiler = require('./compiler'); + +/** + * Compiles a @Text from text node. + */ +module.exports = new Class({ + Extends: Compiler + + ,compile: function(builder, node, tagName) { + if (tagName && tagName != 't') + return null; + + const text = node.textContent; + const context = {text}; + + if (tagName === 't') { + context.text = _(node.firstChild.textContent); + } else if (this.isExpr(text, true)) { + context.text = ''; + this.compileExpr(context, null, text, true); + } + + return context; + } + + ,instantiate: function(doc, context) { + return doc.createTextNode(context.text); + } + + ,setProperty(object, property, value) { + object.textContent = value; + } +}); diff --git a/js/vn/compiler.js b/js/vn/compiler.js new file mode 100644 index 00000000..b505d3b0 --- /dev/null +++ b/js/vn/compiler.js @@ -0,0 +1,150 @@ + +var VnObject = require('./object'); + +/** + * Base class for compilers. + */ +module.exports = new Class({ + Extends: VnObject + + ,compile: function() {} + ,postCompile: function() {} + ,instantiate: function() {} + ,preLink: function() {} + ,link: function() {} + ,connect: function() {} + ,postLink: function() {} + ,setProperty: function() {} + ,free: function() {} + + ,initialize: function(builder) { + this._builder = builder; + this._interpoler = builder._interpoler; + this.parent(); + } + + /** + * Checks if the passed attribute name it's an event. + * + * @param {String} attribute The attribute name + * @return {Boolean} %true if it's an event, otherwise %false + */ + ,isEvent: function(attribute) { + return /^on-\w+/.test(attribute); + } + + ,isIdentifier: function(value) { + return /^[a-zA-Z_$][\w$]*$/.test(value); + } + + /** + * Logs an error parsing the node. + * + * @param {String} error The error message template + * @param {...} varArgs The message template arguments + */ + ,showError: function() { + this._builder.showError.apply(this._builder, arguments); + } + + ,_getMethod: function(value) { + // XXX: Compatibility with old methods + return this.isIdentifier(value) + ? value + : this.fnExpr(value); + } + + ,bindMethod(handler, scope, isEvent) { + // XXX: Compatibility with old methods + if (typeof handler === 'string') { + const method = scope.thisArg[handler]; + if (!method) { + this.showError(`Function '${handler}' not found`); + return undefined; + } + + return method.bind(scope.thisArg); + } + + return function($event) { + let handlerScope; + if (isEvent) { + handlerScope = Object.create(scope.$); + Object.assign(handlerScope, {$event}); + } else + handlerScope = scope.$; + + handler.call(this, handlerScope); + }.bind(scope.thisArg); + } + + ,matchExpr(value) { + const match = /^{{(.*)}}$/.exec(value); + if (!match) return null; + return this.fnExpr(match[1]); + } + + ,modelExpr(expr) { + try { + return new Function('$scope', '$value', + `"use strict"; $scope.${expr} = $value;` + ); + } catch (err) { + this.showError(`${err.message}:`, expr); + } + } + + ,exprRegex: /^{{((?:(?!}}).)*)}}$/ + ,exprRegexMulti: /{{((?:(?!}}).)*)}}/g + + ,isExpr(expr, isMulti) { + return isMulti + ? this.exprRegexMulti.test(expr) + : this.exprRegex.test(expr); + } + + ,compileExpr(context, property, value, isMulti) { + const exprContext = { + context, + property, + value + }; + + if (isMulti) { + let i = 0; + const self = this; + exprContext.exprs = []; + exprContext.template = value.replace(this.exprRegexMulti, + function(match, capture) { + exprContext.exprs.push(self.fnExpr(capture)); + return `{{${i++}}}`; + }); + } else { + const match = this.exprRegex.exec(value); + exprContext.expr = this.fnExpr(match[1]); + } + + this._builder._exprContexts.push(exprContext); + } + + ,fnExpr(expr) { + try { + return new Function('$scope', + `with($scope) { return ${expr}; }` + ); + } catch (err) { + this.showError(`${err.message}:`, expr); + } + } + + ,_translateValue: function(value) { + var chr = value.charAt(0); + + if (chr === '_') + return _(value.substr(1)); + else if (chr === '\\' && value.charAt(1) === '_') + return value.substr(1); + + return value; + } +}); diff --git a/js/vn/component.js b/js/vn/component.js new file mode 100644 index 00000000..73974b62 --- /dev/null +++ b/js/vn/component.js @@ -0,0 +1,207 @@ + +const NodeBuilder = require('./node-builder'); + +const Klass = new Class(); +module.exports = Klass; + +Klass.extend({Classes: ''}); + +const ComponentClass = { + Extends: NodeBuilder, + Tag: 'vn-component', + Properties: { + /** + * Main HTML node that represents the component + */ + node: { + type: Object + ,get: function() { + this.renderBase(); + return this._node; + } + }, + /** + * CSS syle. + */ + style: { + type: String + ,set: function(x) { + this.node.style = x; + } + ,get: function() { + return this._node.style; + } + }, + /** + * CSS classes to be appendend to the node classes. + */ + class: { + type: String + ,set: function(x) { + this._className = x; + this._refreshClass(); + } + ,get: function() { + return this._className; + } + }, + /** + * CSS classes to be appendend to the node classes. + */ + className: { + type: String + ,set: function(x) { + this._className = x; + this._refreshClass(); + } + ,get: function() { + return this._className; + } + }, + /** + * CSS class list. + */ + classList: { + type: Object + ,get: function() { + return this._node.classList; + } + }, + /** + * Title of the element. + */ + title: { + type: String + ,set: function(x) { + this._node.title = x; + } + ,get: function() { + return this._node.title; + } + }, + /** + * The HTML id of the element. + */ + htmlId: + { + type: String + ,set: function(x) { + this._htmlId = x; + if (this._node) + this._node.id = x; + } + ,get: function() { + return this._htmlId; + } + }, + } + + ,_node: null + ,scope: null + + ,initialize: function(props) { + this.doc = document; + this.renderBase(); + NodeBuilder.prototype.initialize.call(this, props); + } + + ,createRoot: function(tagName) { + const node = this._node = this.createElement(tagName); + node.$ctrl = this; + if (this._htmlId) + node.id = this._htmlId; + if (this.$constructor.Classes) + node.className = this.$constructor.Classes; + return node; + } + + ,appendChild: function(child) { + if (child instanceof Klass) + this._node.appendChild(child.node); + else if (child instanceof Element) + this._node.appendChild(child); + } + + ,renderBase: function() { + if (this._node) + return; + + this.render(); + this._refreshClass(); + } + + ,_refreshClass: function() { + if (this._node && this._className) + this._node.className = this._className +' '+ (this._node.className || ''); + } + + ,remove: function() { + Vn.Node.remove(this._node); + } + + ,on: function(id, callback, instance) { + if (htmlEventMap[id]) { + this.addEventListener(id, + callback.bind(instance, this)); + } else + NodeBuilder.prototype.on.call(this, id, callback, instance); + } + + ,loadTemplateFromFile: function(path) { + const builder = new Vn.Builder(); + builder.compileFile(path); + this.loadScope(builder); + } + + ,loadTemplateFromString: function(xmlString) { + const builder = new Vn.Builder(); + builder.compileString(xmlString); + this.loadScope(builder); + } + + ,loadScope: function(builder) { + const scope = this.scope = builder.load(this.doc, this); + scope.link(); + + this.$ = scope.$; + this._node = scope.$.main; + } + + ,_destroy: function() { + if (this.scope) + this.scope.unref(); + + NodeBuilder.prototype._destroy.call(this, ); + } +}; + +htmlEventMap = {}; +htmlEvents = [ + 'click', + 'dblclick', + 'keydown', + 'keypress', + 'keyup', + 'mousedown', + 'mousemove', + 'mouseout', + 'mouseover', + 'mouseup', + 'mousewheel', + 'wheel', + 'focus', + 'focusout', + 'focusin' +]; +htmlEvents.forEach(x => htmlEventMap[x] = true); + +htmlMethods = [ + 'addEventListener' +]; +htmlMethods.forEach(method => { + ComponentClass[method] = function() { + this.node[method].apply(this.node, arguments); + }; +}); + +Klass.implement(ComponentClass); diff --git a/js/vn/cookie.js b/js/vn/cookie.js index 045edbda..7ab233e1 100644 --- a/js/vn/cookie.js +++ b/js/vn/cookie.js @@ -1,6 +1,6 @@ /** * Brownser cookie handler. - **/ + */ module.exports = { set: function (key, value, days) diff --git a/js/vn/date.js b/js/vn/date.js index 96b5a8e0..24fb6598 100644 --- a/js/vn/date.js +++ b/js/vn/date.js @@ -1,6 +1,6 @@ /** * Date handling utilities. - **/ + */ Date.prototype.clone = function() { return new Date(this.getTime()); @@ -8,8 +8,7 @@ Date.prototype.clone = function() { module.exports = { - WDays: - [ + WDays: [ 'Sunday' ,'Monday' ,'Tuesday' @@ -18,8 +17,7 @@ module.exports = ,'Friday' ,'Saturday' ] - ,AbrWDays: - [ + ,AbrWDays: [ 'Su' ,'Mo' ,'Tu' @@ -28,8 +26,7 @@ module.exports = ,'Fr' ,'Sa' ] - ,Months: - [ + ,Months: [ 'January' ,'February' ,'March' @@ -43,13 +40,12 @@ module.exports = ,'November' ,'December' ] - ,AbrMonths: - [ + ,AbrMonths: [ 'Jan' ,'Feb' ,'Mar' ,'Apr' - ,'May' + ,'AbrMay' ,'Jun' ,'Jul' ,'Ago' diff --git a/js/vn/enum.js b/js/vn/enum.js new file mode 100644 index 00000000..3c48b4aa --- /dev/null +++ b/js/vn/enum.js @@ -0,0 +1,4 @@ +/** + * Base type for ennumerations. + */ + module.exports = function() {}; diff --git a/js/vn/form.js b/js/vn/form.js new file mode 100644 index 00000000..208bc25b --- /dev/null +++ b/js/vn/form.js @@ -0,0 +1,72 @@ + +var Iterator = require('./iterator'); +var ModelIface = require('./model-iface'); + +module.exports = new Class({ + Extends: Iterator + ,Tag: 'db-form' + ,Properties: { + model: { + type: ModelIface + ,set: function(x) { + this.link({_model: x}, + { + 'status-changed': this.onModelChange + ,'row-updated': this.onModelRowUpdate + }); + } + ,get: function() { + return this._model; + } + }, + /** + * The row where the form positioned, has -1 if the row is unselected. + */ + row: { + type: Number + ,set: function(x) { + if (!this._model || this._model.numRows <= x || x < -1) + x = -1; + if (x == this._row) + return; + + this._row = x; + this.rowChanged(); + } + ,get: function() { + return this._row; + } + } + } + + ,initialize: function(props) { + Object.assign(this, { + _lastRow: 0 + ,_lastReady: false + }); + Iterator.prototype.initialize.call(this, props); + } + + ,onModelChange: function() { + var ready = this._model && this._model.ready; + + if (ready != this._lastReady) { + if (this._row != -1) + this._lastRow = this._row; + + this._lastReady = ready; + this.emit('status-changed'); + + if (this._row == -1) + this.row = this._lastRow; + + if (ready) + this.emit('ready'); + } + } + + ,onModelRowUpdate: function(model, row) { + if (row == this._row) + this.rowChanged(); + } +}); diff --git a/js/vn/hash-listener.js b/js/vn/hash-listener.js deleted file mode 100644 index e9f90f4f..00000000 --- a/js/vn/hash-listener.js +++ /dev/null @@ -1,15 +0,0 @@ - -var Object = require ('./object'); - -/** - * Class to handle the URL. - **/ -module.exports = new Class -({ - Extends: Object - - ,changed: function () - { - this.signalEmit ('changed'); - } -}); diff --git a/js/vn/hash-param.js b/js/vn/hash-param.js deleted file mode 100644 index 7af54c9b..00000000 --- a/js/vn/hash-param.js +++ /dev/null @@ -1,150 +0,0 @@ - -var Object = require ('./object'); -var Param = require ('./param'); -var Hash = require ('./hash'); - -module.exports = new Class -({ - Extends: Object - ,Tag: 'vn-hash-param' - ,Child: 'param' - ,Properties: - { - param: - { - type: Param - ,set: function (x) - { - this.link ({_param: x}, {'changed': this._onParamChange}); - this._refreshParam (); - } - ,get: function () - { - return this._param; - } - }, - key: - { - type: String - ,set: function (x) - { - this._key = x; - this._onHashChange (); - } - ,get: function () - { - return this._key; - } - }, - value: - { - type: Object - ,set: function (x) - { - this._setValue (x, true); - } - ,get: function () - { - return this._value; - } - }, - type: - { - type: Object - ,set: function (x) - { - this._type = x; - this._onHashChange (); - } - ,get: function () - { - return this._type; - } - } - } - - ,_hashLock: false - ,_paramLock: false - ,_value: undefined - ,_key: null - ,_type: null - - ,initialize: function (props) - { - this.parent (props); - var listener = Hash.getListener (); - this.link ({_listener: listener}, {'changed': this._onHashChange}); - this._onHashChange (); - } - - ,_onHashChange: function () - { - if (this._hashLock || !this._key || !this._listener) - return; - - var newValue = Hash.get (this._key); - - if (newValue === '') - newValue = null; - - if (this._type && newValue !== undefined && newValue !== null) - switch (this._type) - { - case Boolean: - newValue = (/^(true|1)$/i).test (newValue); - break; - case Number: - newValue = 0 + new Number (newValue); - break; - } - - this._hashLock = true; - this._setValue (newValue, true); - this._hashLock = false; - } - - ,_setValue: function (newValue, signal) - { - if (newValue == this._value) - return; - - this._value = newValue; - - if (this._key && !this._hashLock) - { - this._hashLock = true; - - var map = {}; - map[this._key] = newValue; - Hash.add (map); - - this._hashLock = false; - } - - this._refreshParam (); - - if (signal) - this.signalEmit ('changed', newValue); - } - - ,_refreshParam: function () - { - if (this._param && !this._paramLock) - { - this._paramLock = true; - this._param.value = this._value; - this._paramLock = false; - } - } - - ,_onParamChange: function () - { - if (this._paramLock) - return; - - this._paramLock = true; - this._setValue (this._param.value); - this._paramLock = false; - } -}); - diff --git a/js/vn/hash.js b/js/vn/hash.js index c96ff5de..d7f67ac6 100644 --- a/js/vn/hash.js +++ b/js/vn/hash.js @@ -1,134 +1,164 @@ -var HashListener = require('./hash-listener'); +var VnDate = require('./date'); +var Lot = require('./lot'); /** - * Class to handle the URL. - **/ -module.exports = -{ - _hash: null - ,_hashMap: {} - ,_listener: null - - ,initialize: function() { - this._listener = new HashListener(); - - this._hashChangedHandler = this._hashChanged.bind(this); - window.addEventListener('hashchange', this._hashChangedHandler); - this._hashChanged(); - } - - ,destroy: function() { - window.removeEventListener('hashchange', this._hashChangedHandler); - } - - ,getListener: function() { - return this._listener; - } - - /** - * Gets the hash part of the URL. - * - * @param {string} key The variable name - **/ - ,get: function(key) { - return this._hashMap[key]; - } - - /** - * Unsets a hash key. - * - * @param {string} key The variable name - **/ - ,unset: function(key) { - this.add({[key]: undefined}); - } - - /** - * Sets the hash part of the URL, respecting the current hash variables. - * - * @param {Object} map A key-value map - **/ - ,add: function(map) { - var newMap = this._hashMap; - - for (var key in map) - newMap[key] = map[key]; - - this.set(newMap); - } - - /** - * Sets the hash part of the URL. - * - * @param {Object} map A key-value map - **/ - ,set: function(map) { - if (map) - for (var key in map) - if (map[key] === null || map[key] === undefined) - delete map[key]; - - var newHash = this.make(map); - - if (!map) - map = {}; - - if (newHash !== this._hash) { - this._hashMap = map; - this._hash = newHash; - - this._blockChanged = true; - location.hash = newHash; - this._blockChanged = false; - - this._listener.changed(); + * Class to handle the hash part of the URL as a key-value javascript object. + * It also handles dates and objects as a value. + */ +module.exports = new Class({ + Extends: Lot + ,Properties: { + /** + * The main window object. + */ + window: + { + type: Window + ,set: function(x) { + this._window = x; + x.addEventListener('hashchange', this._hashChangedHandler); + this._hashChanged(); + } + ,get: function() { + return this._window; + } } } + ,initialize: function(props) { + Object.assign(this, { + _hash: null + ,_hashLock: false + ,_window: null + ,_hashChangedHandler: this._hashChanged.bind(this) + }); + Lot.prototype.initialize.call(this, props); + } + + ,_paramsChanged: function() { + this.updateHash(); + } + /** * Creates a URL with the given hash data. * - * @param {Object} map A key-value map - * @param {boolean} add %true to combine with the current map, %false otherwise - * @return {String} The URL - **/ - ,make: function(map, add) { - var hash = '#!'; - - if (add && map) - for (var key in this._hashMap) - if (!map[key]) - map[key] = this._hashMap[key]; + * @param {Object} params A key-value object + * @param {boolean} add %true to combine with the current params, %false otherwise + * @return {string} The URL + */ + ,make: function(params, add) { + if (add) { + params = Object.assign({}, params); - for (var key in map) { + for (var key in this._params) + if (!params[key]) + params[key] = this._params[key]; + } + + return this.renderHash(params); + } + + /** + * Updates the window hash with current params. + */ + ,updateHash: function() { + if (this._hashLock) + return; + + this._hash = this.renderHash(this._params); + + this._hashLock = true; + location.hash = this._hash; + this._hashLock = false; + } + + /* + * Called when window hash changes. + */ + ,_hashChanged: function() { + var newHash = location.hash; + + if (this._hashLock || this._hash === newHash) + return; + + this._hash = newHash; + + this._hashLock = true; + this.params = this.parseHash(newHash); + this._hashLock = false; + } + + /** + * Creates a URL with the given hash data. + * + * @param {Object} params The key-value object + * @return {string} The URL + */ + ,renderHash: function(params) { + var hash = '#!'; + + for (var key in params) + if (params[key] !== undefined) { if (hash.length > 2) hash += '&'; - hash += encodeURIComponent(key) +'='+ encodeURIComponent(map[key]); + hash += encodeURIComponent(key) +'='+ this.renderValue(params[key]); } return hash; } - ,_hashChanged: function() { - var newHash = location.hash; - - if (this._blockChanged || newHash === this._hash) - return; - + /** + * Parses a hash string to a key-value object. + * + * @param {string} hashString The hash string + * @return {Object} The key-value object + */ + ,parseHash: function(hashString) { var newMap = hashMap = {}; - var kvPairs = newHash.substr(2).split('&'); + var kvPairs = hashString.substr(2).split('&'); for (var i = 0; i < kvPairs.length; i++) { var kvPair = kvPairs[i].split('=', 2); if (kvPair[0]) - newMap[decodeURIComponent(kvPair[0])] = decodeURIComponent(kvPair[1]); + newMap[decodeURIComponent(kvPair[0])] = this.parseValue(kvPair[1]); } - this._hashMap = newMap; - this._hash = newHash; - this._listener.changed(); + return newMap; } -}; + + ,renderValue: function(v) { + if (v == null) + return ''; + + switch (typeof v) { + case 'object': + if (v instanceof Date) + return VnDate.strftime(v, '%Y-%m-%d'); + else + return JSON.stringify(v) + } + + return v; + } + + ,parseValue: function(v) { + if (v == null) + return v; + + v = decodeURIComponent(v); + + if (v === '') + return null; + + return v; + } + + ,_destroy: function() { + this._window.removeEventListener('hashchange', this._hashChangedHandler); + this._window = null; + Lot.prototype._destroy.call(this); + } +}); diff --git a/js/vn/ie.js b/js/vn/ie.js index cb8e7add..29b451f9 100644 --- a/js/vn/ie.js +++ b/js/vn/ie.js @@ -1,48 +1,40 @@ -module.exports = -{ - getPageYOffset: function () - { +module.exports = { + getPageYOffset: function() { if (document.documentElement.scrollTop) return document.documentElement.scrollTop; else return document.body.scrollTop; }, - getPageXOffset: function () - { + getPageXOffset: function() { if (document.documentElement.scrollLeft) return document.documentElement.scrollLeft; else return document.body.scrollLeft; }, - getInnerHeight: function () - { + getInnerHeight: function() { if (document.documentElement.clientHeight) return document.documentElement.clientHeight; else return document.body.clientHeight; }, - getInnerWidth: function () - { + getInnerWidth: function() { if (document.documentElement.clientWidth) return document.documentElement.clientWidth; else return document.body.clientWidth; }, - createRadio: function (radioName) - { + createRadio: function(radioName) { var radio; try { - radio = document.createElement ('<input type="radio" name="' + radioName + '">'); - } - catch (e) - { - radio = document.createElement ('input'); + radio = document.createElement('<input type="radio" name="' + radioName + '">'); + } catch (e) { + radio = document.createElement('input'); radio.type = 'radio'; radio.name = radioName; } @@ -50,30 +42,26 @@ module.exports = return radio; }, - setInputTypeNumber: function (input) - { + setInputTypeNumber: function(input) { input.type = 'text'; } }; -if (!Function.bind) -{ - Function.prototype.bind = function () - { +if (!Function.bind) { + Function.prototype.bind = function() { var bindFunc = this; var bindThis = arguments[0]; var bindArgs = arguments; - var IE_bind = function () - { - var args = new Array (); + var IE_bind = function() { + var args = new Array(); for (var i = 1; i < bindArgs.length; i++) - args.push (bindArgs[i]); + args.push(bindArgs[i]); for (var i = 0; i < arguments.length; i++) - args.push (arguments[i]); + args.push(arguments[i]); - bindFunc.apply (bindThis, args); + bindFunc.apply(bindThis, args); } return IE_bind; @@ -82,33 +70,28 @@ if (!Function.bind) // attachEvent -> addEventListener -if (window.attachEvent && !window.addEventListener) -{ - function IE_addEventListener (signal, func, capture) - { +if (window.attachEvent && !window.addEventListener) { + function IE_addEventListener(signal, func, capture) { var obj = this; - func.IE_eventHandler = function (event) - { + func.IE_eventHandler = function(event) { event.target = event.srcElement; event.layerY = event.clientY; event.layerX = event.clientX; event.pageX = event.offsetX; event.pageY = event.offsetY; - event.stopPropagation = function () - { + event.stopPropagation = function() { this.cancelBubble = true; } - func.call (obj, event); + func.call(obj, event); } - this.attachEvent ('on' + signal, func.IE_eventHandler); + this.attachEvent('on' + signal, func.IE_eventHandler); } - function IE_removeEventListener (signal, func, capture) - { - this.detachEvent ('on' + signal, func.IE_eventHandler); + function IE_removeEventListener(signal, func, capture) { + this.detachEvent('on' + signal, func.IE_eventHandler); } window.addEventListener = IE_addEventListener; @@ -118,9 +101,8 @@ if (window.attachEvent && !window.addEventListener) var IE_createElement = document.createElement; - document.createElement = function (tagName) - { - var node = IE_createElement (tagName); + document.createElement = function(tagName) { + var node = IE_createElement(tagName); node.addEventListener = IE_addEventListener; node.removeEventListener = IE_removeEventListener; return node; @@ -129,11 +111,9 @@ if (window.attachEvent && !window.addEventListener) // ActiveXObject ('Microsoft.XMLHTTP') -> XMLHttpRequest -if (!window.XMLHttpRequest && window.ActiveXObject) -{ - function XMLHttpRequest () - { - return new ActiveXObject ('Microsoft.XMLHTTP'); +if (!window.XMLHttpRequest && window.ActiveXObject) { + function XMLHttpRequest() { + return new ActiveXObject('Microsoft.XMLHTTP'); } } diff --git a/js/vn/iterator-iface.js b/js/vn/iterator-iface.js new file mode 100644 index 00000000..c01e0e8e --- /dev/null +++ b/js/vn/iterator-iface.js @@ -0,0 +1,67 @@ + +var LotIface = require('./lot-iface'); +var ModelIface = require('./model-iface'); + +module.exports = new Class({ + Implements: LotIface + ,Properties: { + /** + * The model associated to this form. + */ + model: { + type: ModelIface + }, + /** + * The row where the form positioned, has -1 if the row is unselected. + */ + row: { + type: Number + }, + /** + * The number of rows in the form. + */ + numRows: { + type: Number + }, + /** + * Checks if the form data is ready. + */ + ready: { + type: Boolean + } + } + + ,insertRow: function() { + if (this._model) + this.row = this._model.insertRow(); + } + + /** + * Removes the current row. + */ + ,deleteRow: function() { + if (this._row >= 0) + this._model.deleteRow(this._row); + } + + /** + * Gets a value from the form. + * + * @param {string} columnName The column name + * @return {Object} The value + */ + ,get: function(columnName) { + return this._model ? + this._model.get(this._row, columnName) : undefined; + } + + /** + * Sets a value on the form. + * + * @param {string} columnName The column name + * @param {Object} value The new value + */ + ,set: function(columnName, value) { + this._model.set(this._row, columnName, value); + } +}); diff --git a/js/vn/iterator.js b/js/vn/iterator.js new file mode 100644 index 00000000..01888c7a --- /dev/null +++ b/js/vn/iterator.js @@ -0,0 +1,75 @@ + +var Lot = require('./lot'); +var IteratorIface = require('./iterator-iface'); +var ModelIface = require('./model-iface'); + +/** + * A light iterator for models. It assumes that its row and model properties + * are always valid. + */ +module.exports = new Class({ + Extends: Lot + ,Implements: IteratorIface + ,Properties: { + model: { + type: ModelIface + ,set: function(x) { + this._model = x; + } + ,get: function() { + return this._model; + } + }, + row: { + type: Number + ,set: function(x) { + this._row = x; + this.rowChanged(); + } + ,get: function() { + return this._row; + } + }, + numRows: { + type: Number + ,get: function() { + return this._model ? + this._model.numRows : 0; + } + }, + ready: { + type: Boolean + ,get: function() { + return this._model ? + this._model.ready : false; + } + } + } + + ,_model: null + + ,initialize: function(props) { + Object.assign(this, { + _row: -1 + ,_rowLock: false + }); + Lot.prototype.initialize.call(this, props); + } + + ,_paramsChanged: function(diff) { + if (!this._rowLock) + for (var key in diff) + this._model.set(this._row, key, diff[key]); + } + + ,rowChanged: function() { + var row; + + if (this._model) + row = this._model.getObject(this._row); + + this._rowLock = true; + this.params = row != null ? row : {}; + this._rowLock = false; + } +}); diff --git a/js/vn/json-connection.js b/js/vn/json-connection.js index 7e981ad7..23bc2e3f 100644 --- a/js/vn/json-connection.js +++ b/js/vn/json-connection.js @@ -1,12 +1,12 @@ -var Object = require('./object'); +var VnObject = require('./object'); var JsonException = require('./json-exception'); /** * Handler for JSON rest connections. - **/ + */ module.exports = new Class({ - Extends: Object + Extends: VnObject ,_connected: false ,_requestsCount: 0 @@ -14,9 +14,9 @@ module.exports = new Class({ /** * Initilizes the connection object. - **/ + */ ,initialize: function() { - this.parent(); + VnObject.prototype.initialize.call(this); this.fetchToken(); } @@ -44,7 +44,7 @@ module.exports = new Class({ * @param {String} password The user password * @param {Boolean} remember Specifies if the user should be remembered * @param {Function} openCallback The function to call when operation is done - **/ + */ ,open: function(user, pass, remember, callback) { if (user !== null && user !== undefined) { var params = { @@ -70,7 +70,7 @@ module.exports = new Class({ var storage = remember ? localStorage : sessionStorage; storage.setItem('vnToken', this.token); - this.signalEmit('openned'); + this.emit('openned'); } else this._closeClient(); @@ -82,7 +82,7 @@ module.exports = new Class({ * Closes the connection to the REST service. * * @param {Function} callback The function to call when operation is done - **/ + */ ,close: function(callback) { this.lbSend('POST', 'Accounts/logout', null, this._onClose.bind(this, callback)); @@ -93,7 +93,7 @@ module.exports = new Class({ * Called when close operation is done. */ ,_onClose: function(callback, json, error) { - this.signalEmit('closed'); + this.emit('closed'); if (callback) callback(this, null, error); @@ -109,24 +109,24 @@ module.exports = new Class({ * * @param {String} user The user name * @param {Function} callback The callback function - **/ + */ ,supplantUser: function(user, callback) { var params = {supplantUser: user}; this.send('client/supplant', params, this._onUserSupplant.bind(this, callback)); } - - ,_onUserSupplant: function(callback, json) { + + ,_onUserSupplant: function(callback, json, err) { if (json) this.token = json; if (callback) - callback(json != null); + callback(err == null, err); } /** * Ends the user supplanting and restores the last login. - **/ + */ ,supplantEnd: function() { this.lbSend('POST', 'Accounts/logout'); this.fetchToken(); @@ -139,7 +139,7 @@ module.exports = new Class({ * @param {String} restService The service path * @param {Map} params The params to pass to the service * @param {Function} callback The response callback - **/ + */ ,send: function(restService, params, callback) { if (!params) params = {}; @@ -221,7 +221,7 @@ module.exports = new Class({ this._requestsCount++; if (this._requestsCount === 1) - this.signalEmit('loading-changed', true); + this.emit('loading-changed', true); } ,_onStateChange: function(request, callback) { @@ -231,7 +231,7 @@ module.exports = new Class({ this._requestsCount--; if (this._requestsCount === 0) - this.signalEmit('loading-changed', false); + this.emit('loading-changed', false); var data = null; var error = null; @@ -302,7 +302,6 @@ module.exports = new Class({ data = null; error = e; } - if (callback) try { callback(data, error); @@ -314,8 +313,8 @@ module.exports = new Class({ if (error) { if (error.exception == 'SessionExpired') this.clearToken(); - - this.signalEmit('error', error); + + this.emit('error', error); } } }); diff --git a/js/vn/json-exception.js b/js/vn/json-exception.js index cd7ebc13..e60c416b 100644 --- a/js/vn/json-exception.js +++ b/js/vn/json-exception.js @@ -1,6 +1,6 @@ /** * This class stores the database errors. - **/ + */ module.exports = new Class ({ exception: null @@ -10,8 +10,7 @@ module.exports = new Class ,line: null ,trace: null - ,initialize: function (exception, message, code, file, line, trace) - { + ,initialize: function(exception, message, code, file, line, trace) { this.exception = exception; this.message = message; this.code = code; diff --git a/js/vn/locale.js b/js/vn/locale.js index 1a786050..2ee50062 100644 --- a/js/vn/locale.js +++ b/js/vn/locale.js @@ -3,7 +3,7 @@ vnLocaleStrings = {}; /** * Class to manage the internationalization. - **/ + */ module.exports = { language: null diff --git a/js/vn/locale/ca.yml b/js/vn/locale/ca.yml index cba6b455..8af6588c 100644 --- a/js/vn/locale/ca.yml +++ b/js/vn/locale/ca.yml @@ -27,6 +27,7 @@ December: Decembre Jan: Gen Feb: Febr Mar: Març +AbrMay: Mai Apr: Abr Jun: Juny Jul: Jul diff --git a/js/vn/locale/en.yml b/js/vn/locale/en.yml index ea9ffe58..4ca5bcfa 100644 --- a/js/vn/locale/en.yml +++ b/js/vn/locale/en.yml @@ -28,6 +28,7 @@ Jan: Jan Feb: Feb Mar: Mar Apr: Apr +AbrMay: May Jun: Jun Jul: Jul Ago: Ago diff --git a/js/vn/locale/es.yml b/js/vn/locale/es.yml index 254dffc9..d9663c12 100644 --- a/js/vn/locale/es.yml +++ b/js/vn/locale/es.yml @@ -16,7 +16,7 @@ January: Enero February: Febrero March: Marzo April: Abril -May: May +May: Mayo June: Junio July: Julio August: Agosto @@ -28,6 +28,7 @@ Jan: Ene Feb: Feb Mar: Mar Apr: Abr +AbrMay: May Jun: Jun Jul: Jul Ago: Ago diff --git a/js/vn/locale/fr.yml b/js/vn/locale/fr.yml index bf6b5ba6..a2789597 100644 --- a/js/vn/locale/fr.yml +++ b/js/vn/locale/fr.yml @@ -28,6 +28,7 @@ Jan: Jan Feb: Fév Mar: Mars Apr: Avr +AbrMay: Mai Jun: Juin Jul: Juil Ago: Août diff --git a/js/vn/locale/mn.yml b/js/vn/locale/mn.yml index 9719aec5..97eb4d32 100644 --- a/js/vn/locale/mn.yml +++ b/js/vn/locale/mn.yml @@ -28,6 +28,7 @@ Jan: оны Feb: хоё Mar: Гур Apr: Дөр +AbrMay: May Jun: Jun Jul: Jul Ago: Най diff --git a/js/vn/locale/pt.yml b/js/vn/locale/pt.yml index 05ca2b73..db6c2892 100644 --- a/js/vn/locale/pt.yml +++ b/js/vn/locale/pt.yml @@ -28,6 +28,7 @@ Jan: Jan Feb: Fev Mar: Mar Apr: Abr +AbrMay: Mai Jun: Jun Jul: Jul Ago: Ago diff --git a/js/vn/lot-iface.js b/js/vn/lot-iface.js new file mode 100644 index 00000000..7639a16e --- /dev/null +++ b/js/vn/lot-iface.js @@ -0,0 +1,83 @@ + +/** + * Holds a plain key-value javascript object and monitorizes changes over it. + */ +module.exports = new Class({ + Properties: { + /** + * The internal object with the params, this is the lot internal object + * and should be used for read-only purposes. + */ + params: { + type: Object + } + /** + * Shortcut for params property. + */ + ,$: { + type: Object + } + } + + /** + * Gets a value from the lot. + * + * @param {string} field The field name + * @return {*} The field value + */ + ,get: function(field) { + return this.params[field]; + } + + /** + * Sets a value on the lot. + * + * @param {string} field The field name + * @param {*} value The new field value + */ + ,set: function(field, value) { + var params = {}; + params[field] = value; + this.assign(params); + } + + /** + * Returns an array with the lot keys. + * + * @return {Array} The lot keys + */ + ,keys: function() {} + + /** + * Emits the 'change' signal on the lot. + * + * @param {Object} changes The changed params and its values + */ + ,changed: function(changes) { + this.emit('change', changes); + } + + /** + * Copies all values from another lot. + * + * @param {Object} object The source object + */ + ,assign: function() {} + + /** + * Copies all values from another lot. + * + * @param {LotIface} lot The source lot + */ + ,assignLot: function(lot) { + this.assign(lot.$); + } + + /** + * Resets all values. + */ + ,reset: function() { + this.params = {}; + } + }); + \ No newline at end of file diff --git a/js/vn/lot-query.js b/js/vn/lot-query.js new file mode 100644 index 00000000..63981d7d --- /dev/null +++ b/js/vn/lot-query.js @@ -0,0 +1,122 @@ + +var Lot = require('./lot'); +var LotIface = require('./lot-iface'); +var Spec = require('./spec'); +var Value = require('./value'); + +module.exports = new Class({ + Extends: Lot + ,Tag: 'vn-lot-query' + ,Properties: { + fields: { + type: Array + ,set: function(x) { + this._fields = x; + this._onSourceChange(); + } + ,get: function() { + return this._fields; + } + }, + source: { + type: LotIface + ,set: function(x) { + this.link({_source: x}, {change: this._onSourceChange}); + this._onSourceChange(); + } + ,get: function() { + return this._source; + } + } + } + + ,initialize: function(props) { + Object.assign(this, { + _fields: null, + _source: null, + _lockSource: false, + _specs: {} + }); + Lot.prototype.initialize.call(this, props); + } + + ,appendChild: function(child) { + if (!(child instanceof Spec)) + throw new Error('VnLotQuery: Child must be a Vn.Spec instance'); + + this._specs[child.name] = child; + this._onSourceChange(); + } + + ,_onSourceChange: function() { + if (this._lockSource) + return; + + var params = this._source ? this._source.params : {}; + var myParams = {}; + + for (var key in this._specs) + myParams[key] = Value.simpleClone(params[key]); + + this.assign(myParams); + } + + ,assign: function(params) { + params = this.transformParams(params); + var diff = Value.partialDiff(this._params, params); + this._assign(diff); + } + + ,setAll: function(params) { + params = this.transformParams(params); + var diff = Value.diff(this._params, params); + this._assign(diff); + } + + ,_assign: function(diff) { + if (diff) { + Object.assign(this._params, diff); + + if (this.source) { + this._lockSource = true; + this.source.assign(diff); + this._lockSource = false; + } + + this._paramsChanged(diff); + this.changed(diff); + } + } + + ,transformParams: function(params) { + var newParams = {}; + + for (var key in this._specs) { + var spec = this._specs[key]; + if (params[key]) + newParams[key] = cast(params[key], spec.type); + } + + return Object.assign(params, newParams); + } +}); + +function cast(value, type) { + switch (type) { + case Boolean: + return (/^(true|1)$/i).test(value); + case Number: + return 0 + new Number(value); + case Date: + var date = new Date(value); + date.setHours(0, 0, 0, 0); + return date; + case String: + return value; + default: + if (type instanceof Object) + return JSON.parse(value); + else + return value; + } +} diff --git a/js/vn/lot.js b/js/vn/lot.js new file mode 100644 index 00000000..490b22fd --- /dev/null +++ b/js/vn/lot.js @@ -0,0 +1,69 @@ + +var VnObject = require('./object'); +var LotIface = require('./lot-iface'); +var Value = require('./value'); + +module.exports = new Class({ + Extends: VnObject + ,Implements: LotIface + ,Tag: 'vn-lot' + ,Properties: { + $: { + type: Object + ,set: function(x) { + this.setAll(x); + } + ,get: function() { + return this._params; + } + } + ,params: { + type: Object + ,set: function(x) { + this.$ = x; + } + ,get: function() { + return this.$; + } + } + } + + ,initialize: function(props) { + this._params = new Proxy({}, { + set(obj, prop, value) { + return Reflect.set(obj, prop, value); + } + }); + VnObject.prototype.initialize.call(this, props); + } + + ,keys: function() { + return Object.keys(this._params); + } + + ,assign: function(params) { + var diff = Value.partialDiff(this._params, params); + this._assign(diff); + } + + ,setAll: function(params) { + var diff = Value.diff(this._params, params); + this._assign(diff); + } + + ,_assign: function(diff) { + if (diff) { + Object.assign(this._params, diff); + this._paramsChanged(diff); + this.changed(diff); + } + } + + /** + * Called when lot params changes, can be implemented by child classes to be + * notified about changes. + * + * @param {Object} diff Changed parameters and its new values + */ + ,_paramsChanged: function() {} +}); diff --git a/js/vn/model-iface.js b/js/vn/model-iface.js new file mode 100644 index 00000000..7b4abdb9 --- /dev/null +++ b/js/vn/model-iface.js @@ -0,0 +1,127 @@ + +/** + * Readable data model. + */ + module.exports = new Class({ + Properties: { + /** + * The number of rows in the model. + */ + numRows: { + type: Number + }, + /** + * The current status of the model. + */ + status: { + type: Number + }, + /** + * Checks if the model data is ready. + */ + ready: { + type: Boolean + } + } + + /** + * Checks if the column exists. + * + * @param {integer} column The column index + * @return {boolean} %true if column exists, %false otherwise + */ + ,checkColExists: function() {} + + /** + * Checks if the row exists. + * + * @param {integer} rowIndex The row index + * @return {boolean} %true if row exists, %false otherwise + */ + ,checkRowExists: function() {} + + /** + * Get the index of the column from its name. + * + * @param {string} columnName The column name + * @return {number} The column index or -1 if column not exists + */ + ,getColumnIndex: function() {} + + /** + * Gets a value from the model. + * + * @param {number} rowIndex The row index + * @param {string} columnName The column name + * @return {*} The value, or %undefined + */ + ,get: function() {} + + /** + * Gets a value using the column index. + * + * @param {number} rowIndex The row index + * @param {number} column The column index + * @return {*} The value + */ + ,getByIndex: function() {} + + /** + * Gets a row as an object using the column index. + * + * @param {number} rowIndex The row index + * @return {Object} The row as an object + */ + ,getObject: function() {} + + /** + * Orders the model by the specified column name. + * + * @param {number} column The column name + * @param {SortWay} way The sort way + */ + ,sortByName: function() {} + + /** + * Orders the model by the specified column. + * + * @param {number} column The column index + * @param {SortWay} way The sort way + */ + ,sort: function() {} + + /** + * Searchs a value on the model and returns the row index of the first + * ocurrence. + * If an index have been built on that column, it will be used, for more + * information see the indexColumn() method. + * + * @param {string} column The column name + * @param {Object} value The value to search + * @return {number} The column index + */ + ,search: function() {} + + /** + * Searchs a value on the model and returns the row index of the first + * ocurrence. + * + * @param {number} col The column index + * @param {Object} value The value to search + * @return {number} The column index + */ + ,searchByIndex: function() {} + + /** + * Builds an internal hash index for the specified column, this speeds + * significantly searches on that column, specially when model has a lot of + * rows. + * + * FIXME: Not fully implemented. + * + * @param {string} column The column name + */ + ,indexColumn: function() {} + }); + + \ No newline at end of file diff --git a/js/vn/model-proxy.js b/js/vn/model-proxy.js new file mode 100644 index 00000000..04fabcd0 --- /dev/null +++ b/js/vn/model-proxy.js @@ -0,0 +1,80 @@ + +var ModelIface = require('./object'); + +/** + * Monitorizes all changes made to a model. + */ +var Klass = new Class(); +module.exports = Klass; + +var Mode = { + ON_CHANGE : 1 + ,ON_DEMAND : 2 +}; + +var Operation = { + INSERT : 1 << 1 + ,UPDATE : 1 << 2 + ,DELETE : 1 << 3 +}; + +Klass.extend({ + Mode: Mode + ,Operation: Operation +}); + +Klass.implement({ + Implements: ModelIface + ,Properties: { + /** + * Update mode. + */ + mode: { + enumType: Mode + ,value: Mode.ON_CHANGE + } + } + + /** + * Updates a value on the model. + * + * @param {number} rowIndex The row index + * @param {string} columnName The column name + * @param {*} value The new value + */ + ,set: function() {} + + /** + * Updates a value on the model using the column index. + * + * @param {number} rowIndex The row index + * @param {number} col The column index + * @param {*} value The new value + */ + ,setByIndex: function() {} + + /** + * Deletes a row from the model. + * + * @param {number} rowIndex The row index + */ + ,deleteRow: function() {} + + /** + * Inserts a new row on the model. + * + * @return The index of the inserted row + */ + ,insertRow: function() {} + + /** + * Cleans the model data. + */ + ,clean: function() {} + + /** + * Performs all model changes on the database. + */ + ,performOperations: function() {} +}); + diff --git a/js/vn/model.js b/js/vn/model.js new file mode 100644 index 00000000..d33ead43 --- /dev/null +++ b/js/vn/model.js @@ -0,0 +1,350 @@ + +var VnObject = require('./object'); +var simpleEquals = require('./value').simpleEquals; + +var Klass = new Class(); +module.exports = Klass; + +var Status = { + CLEAN : 1 + ,LOADING : 2 + ,READY : 3 + ,ERROR : 4 +}; + +var SortWay = { + ASC : 1 + ,DESC : 2 +}; + +Klass.extend({ + Status + ,SortWay +}); + +Klass.implement({ + Extends: VnObject + ,Tag: 'vn-model' + ,Properties: { + /** + * The model internal data. + */ + data: { + type: Array + ,get: function() { + return this._data; + } + ,set: function(x) { + this._setData(x); + } + }, + /** + * The number of rows in the model. + */ + numRows: { + type: Number + ,get: function() { + if (this._data) + return this._data.length; + + return 0; + } + }, + /** + * The current status of the model. + */ + status: { + type: Number + ,get: function() { + return this._status; + } + }, + /** + * Checks if the model data is ready. + */ + ready: { + type: Boolean + ,get: function() { + return this._status === Status.READY; + } + } + } + + ,_data: null + ,_status: Status.CLEAN + + ,_requestedSortName: null + ,_sortColumn: null + ,_sortWay: null + + ,_requestedIndexes: {} + ,_indexes: [] + + //+++++++++++++++++++++++++++++ Data hadling + + ,_setData: function(data) { + this._data = data; + this._refreshRowIndexes(0); + + if (this._requestedSortName != null) + this._realSort(this._requestedSortName, this._sortWay); + for (column in this._requestedIndexes) + this._buildIndex(column); + + this._setStatus(Status.READY); + } + + /** + * Checks if the row exists. + * + * @param {Integer} rowIndex The row index + * @return {Boolean} %true if row exists, %false otherwise + */ + ,checkRowExists: function(rowIndex) { + return this._data != null + && rowIndex >= 0 + && rowIndex < this._data.length; + } + + /** + * Gets a value from the model. + * + * @param {Number} rowIndex The row index + * @param {Number} columnName The column name + * @return {*} The value + */ + ,get: function(rowIndex, columnName) { + if (!this.checkRowExists(rowIndex)) + return undefined; + + return this._data[rowIndex][columnName]; + } + + /** + * Updates a value on the model. + * + * @param {Number} rowIndex The row index + * @param {Number} columnName The column name + * @param {*} value The new value + */ + ,set: function(rowIndex, columnName, value) { + if (!this.checkRowExists(rowIndex)) + return; + + this.emit('row-updated-before', rowIndex); + this._data[rowIndex][columnName] = value; + this.emit('row-updated', rowIndex, [columnName]); + } + + /** + * Gets a row as an object using the column index. + * + * @param {Number} rowIndex The row index + * @return {Object} The row as an object + */ + ,getObject: function(rowIndex) { + return this.checkRowExists(rowIndex) ? + this._data[rowIndex] : null; + } + + ,_setStatus: function(status) { + this._status = status; + this.emit('status-changed', status); + this.emit('status-changed-after', status); + } + + /** + * Inserts a new row on the model. + * + * @return The index of the inserted row + */ + ,insertRow: function(newRow) { + var rowIndex = this._data.push(newRow) - 1; + newRow.index = rowIndex; + this.emit('row-inserted', rowIndex); + return rowIndex; + } + + /** + * Deletes a row from the model. + * + * @param {Number} rowIndex The row index + */ + ,deleteRow: function(rowIndex) { + if (!this.checkRowExists(rowIndex)) + return; + + this.emit('row-deleted-before', rowIndex); + this._data.splice(rowIndex, 1); + this.emit('row-deleted', rowIndex); + this._refreshRowIndexes(rowIndex); + } + + //+++++++++++++++++++++++++++++ Sorting + + /** + * Orders the model by the specified column name. + * + * @param {String} columnName The column name + * @param {SortWay} way The sort way + */ + ,sort: function(columnName, way) { + this._requestedSortName = columnName; + this._sort(columnName, way); + } + + ,_sort: function(columnName, way) { + var status = this._status; + this._setStatus(Status.LOADING); + this._realSort(columnName, way); + this._setStatus(status); + } + + ,_realSort: function(columnName, way) { + if (!this._data) + return; + + if (columnName !== this._sortColumn) { + if (way === SortWay.DESC) + var sortFunction = this.sortFunctionDesc; + else + var sortFunction = this.sortFunctionAsc; + + this._data.sort(sortFunction.bind(this, columnName)); + } else if (way !== this._sortWay) + this._data.reverse(); + + this._sortColumn = columnName; + this._sortWay = way; + + this._refreshRowIndexes(0); + } + + ,_refreshRowIndexes: function(start) { + var data = this._data; + + for (var i = start; i < data.length; i++) + data[i].index = i; + } + + /* + * Function used to sort the model ascending. + */ + ,sortFunctionAsc: function(column, a, b) { + if (a[column] < b[column]) + return -1; + else if (a[column] > b[column]) + return 1; + + return 0; + } + + /* + * Function used to sort the model descending. + */ + ,sortFunctionDesc: function(column, a, b) { + if (a[column] > b[column]) + return -1; + else if (a[column] < b[column]) + return 1; + + return 0; + } + + //+++++++++++++++++++++++++++++ Searching + + /** + * Builds an internal hash index for the specified column, this speeds + * significantly searches on that column, specially when model has a lot of + * rows. + * + * FIXME: Not fully implemented. + * + * @param {String} column The column name + */ + ,indexColumn: function(column) { + this._requestedIndexes[column] = true; + + if (this._status === Status.READY) + this._buildIndex(column); + } + + ,getHashValue: function(value) { + if (value instanceof Date) + return value.getTime(); + else + return value; + } + + ,_buildIndex: function(columnName) { + if (this.columnMap[columnName] === undefined) + return; + + var data = this._data; + var values = {}; + var nulls = []; + + for (var i = 0; i < data.length; i++) { + var value = data[i][columnName]; + + if (value == null) { + nulls.push(data[i]); + continue; + } + + index[this.getHashValue(value)] = data[i]; + } + + this._indexes[columnName] = { + values: values, + index: index + }; + } + + /** + * Searchs a value on the model and returns the row index of the first + * ocurrence. + * + * @param {Number} columnName The column name + * @param {Object} value The value to search + * @return {Number} The column index + */ + ,search: function(columnName, value) { + var data = this._data; + + if (data == null) + return -1; + + // Searchs the value using an internal index. + + var index = this._indexes[columnName]; + + if (index) { + if (value == null) { + if (index.nulls[0] !== undefined) + return index.nulls[0].index; + } else { + var row = index.values[this.getHashValue(value)]; + + if (rowIndex !== undefined) + return row.index; + } + + return -1; + } + + // Searchs the value using a loop. + + for (var i = 0; i < data.length; i++) + if (simpleEquals(data[i][columnName], value)) + return i; + + return -1; + } + + //+++++++++++++++++++++++++++++ Virtual + + ,refresh: function() { + this._setStatus(Status.READY); + } +}); diff --git a/js/vn/mutators.js b/js/vn/mutators.js index 6ee6576e..a30a14ef 100644 --- a/js/vn/mutators.js +++ b/js/vn/mutators.js @@ -1,29 +1,33 @@ vnCustomTags = {}; -var Mutators = Class.Mutators; +const Mutators = Class.Mutators; +const _Extends = Mutators.Extends; -var _Extends = Mutators.Extends; - -Mutators.Extends = function () -{ - _Extends.apply (this, arguments); - this.implement ({Properties: {}}); +Mutators.Extends = function() { + _Extends.apply(this, arguments); + this.implement({Properties: {}}); } -Mutators.Tag = function (tagName) -{ +Mutators.Tag = function(tagName) { vnCustomTags[tagName] = this; - this.extend ({Tag: tagName}); + this.extend({Tag: tagName}); + + const parent = this.parent; + if (parent && parent.Classes !== undefined) { + let Classes = tagName + + if (parent.Classes !== '') + Classes += ' '+ parent.Classes; + this.extend({Classes}); + } }; -Mutators.Properties = function (props) -{ - var parentProps; +Mutators.Properties = function(props) { + let parentProps; - for (var propName in props) - { - var prop = props[propName]; + for (const propName in props) { + const prop = props[propName]; prop.configurable = true; if (!prop.get && !prop.set && prop.writable === undefined) @@ -31,21 +35,10 @@ Mutators.Properties = function (props) } if (this.parent && (parentProps = this.parent.Properties)) - for (var propName in parentProps) + for (const propName in parentProps) if (!props[propName]) props[propName] = parentProps[propName]; - this.extend ({Properties: props}); - Object.defineProperties (this.prototype, props); + this.extend({Properties: props}); + Object.defineProperties(this.prototype, props); }; - -Mutators.Parent = function (propName) -{ - this.extend ({Parent: propName}); -}; - -Mutators.Child = function (propName) -{ - this.extend ({Child: propName}); -}; - diff --git a/js/vn/node-builder.js b/js/vn/node-builder.js new file mode 100644 index 00000000..30b8c004 --- /dev/null +++ b/js/vn/node-builder.js @@ -0,0 +1,23 @@ +const VnObject = require('./object'); + +module.exports = new Class({ + Extends: VnObject + + ,doc: null + + ,initialize: function(props) { + this.doc = document; + this.parent(props); + } + + ,createElement: function(tagName) { + return this.doc.createElement(tagName); + } + + ,createTextNode: function(text) { + return this.doc.createTextNode(text); + } + + ,render: function() {} +}); + diff --git a/js/vn/object.js b/js/vn/object.js index a8818c80..2b2c3668 100644 --- a/js/vn/object.js +++ b/js/vn/object.js @@ -1,78 +1,110 @@ /** - * The main base class. Manages the signal system. - * - * @param signals Map with all connected signal handlers - **/ -module.exports = new Class -({ - Tag: 'vn-object' - ,Properties: {} + * The main base class. Manages the signal system. Objects based on this class + * can be instantiated declaratively using XML. + */ +module.exports = class VnObject { + /** + * Tag to be used when the class instance is defined via XML. All classes + * must define this attribute, even if it is not used. + */ + static Tag = 'vn-object'; - ,_refCount: 1 - ,_signalData: null + /** + * Class public properties. + */ + static Properties = {}; - ,initialize: function (props) - { - this.setProperties (props); + /* + * Reference count. + */ + _refCount = 1; + + /* + * Signal handlers data. + */ + _thisArg = null; + + /** + * Initializes the object and sets all properties passed to the class + * constructor. + * + * @param {Object} props The properties passed to the contructor + */ + constructor(props) { + this.setProperties(props); + } + + initialize(props) { + this.setProperties(props); } - ,setProperties: function (props) - { + /** + * Sets a group of object properties. + * + * @param {Object} props Properties + */ + setProperties(props) { for (var prop in props) this[prop] = props[prop]; } - ,ref: function () - { + /** + * Increases the object reference count. + */ + ref() { this._refCount++; return this; } - ,unref: function () - { + /** + * Decreases the object reference count. + */ + unref() { this._refCount--; if (this._refCount === 0) - this._destroy (); - } - - ,loadXml: function (builder, node) {} - ,appendChild: function (child) {} - - ,_signalInit: function () - { - if (!this._signalData) - this._signalData = { - signals: {}, - links: {} - }; + this._destroy(); } + /** + * Called from @Vn.Builder when it finds a custom tag as a child of the + * element. + * + * @param {Vn.Scope} scope The scope instance + * @param {Node} node The custom tag child nodes + */ + loadXml() {} + + /** + * Called from @Vn.Builder when it finds a a child tag that isn't + * associated to any property. + * + * @param {Object} child The child object instance + */ + appendChild() {} + /** * Conects a signal with a function. * - * @param {String} id The signal identifier - * @param {Function} callback The callback + * @param {string} id The signal identifier + * @param {function} callback The callback * @param {Object} instance The instance - **/ - ,on: function (id, callback, instance) - { - if (!(callback instanceof Function)) - { - console.warn ('Vn.Object: Invalid callback for signal \'%s\'', id); + */ + on(id, callback, instance) { + if (!(callback instanceof Function)) { + console.warn('Vn.Object: Invalid callback for signal \'%s\'', id); return; } - this._signalInit (); - var callbacks = this._signalData.signals[id]; + this._signalInit(); + var callbacks = this._thisArg.signals[id]; if (!callbacks) - callbacks = this._signalData.signals[id] = []; + callbacks = this._thisArg.signals[id] = []; - callbacks.push - ({ - blocked: false + callbacks.push({ + blocked: false ,callback: callback ,instance: instance }); @@ -81,16 +113,15 @@ module.exports = new Class /** * Locks/Unlocks a signal emission to the specified object. * - * @param {String} id The signal identifier - * @param {Function} callback The callback - * @param {Boolean} block %true for lock the signal, %false for unlock - **/ - ,blockSignal: function (id, callback, block, instance) - { - if (!this._signalData) + * @param {string} id The signal identifier + * @param {function} callback The callback + * @param {boolean} block %true for lock the signal, %false for unlock + */ + blockSignal(id, callback, block, instance) { + if (!this._thisArg) return; - var callbacks = this._signalData.signals[id]; + var callbacks = this._thisArg.signals[id]; if (!callbacks) return; @@ -102,121 +133,127 @@ module.exports = new Class } /** - * Emits a signal in the current object. + * Emits a signal in the object. * - * @param {String} id The signal identifier - **/ - ,signalEmit: function (id) - { - if (!this._signalData) + * @param {string} id The signal identifier + */ + emit(id) { + if (!this._thisArg) return; - var callbacks = this._signalData.signals[id]; + var callbacks = this._thisArg.signals[id]; if (!callbacks) return; var callbackArgs = []; - callbackArgs.push (this); + callbackArgs.push(this); for (var i = 1; i < arguments.length; i++) - callbackArgs.push (arguments[i]); + callbackArgs.push(arguments[i]); for (var i = 0; i < callbacks.length; i++) if (!callbacks[i].blocked) - callbacks[i].callback.apply (callbacks[i].instance, callbackArgs); + callbacks[i].callback.apply(callbacks[i].instance, callbackArgs); } /** * Disconnects a signal from current object. * - * @param {String} id The signal identifier - * @param {Function} callback The connected callback + * @param {string} id The signal identifier + * @param {function} callback The connected callback * @param {Object} instance The instance - **/ - ,disconnect: function (id, callback, instance) - { - if (!this._signalData) + */ + disconnect(id, callback, instance) { + if (!this._thisArg) return; - var callbacks = this._signalData.signals[id]; + var callbacks = this._thisArg.signals[id]; - if (!callbacks) - return; - - for (var i = 0; i < callbacks.length; i++) - if (callbacks[i].callback == callback - && callbacks[i].instance == instance) - callbacks.splice (i--, 1); + if (callbacks) + for (var i = callbacks.length; i--;) + if (callbacks[i].callback === callback + && callbacks[i].instance === instance) + callbacks.splice(i, 1); } /** * Disconnects all signals for the given instance. * * @param {Object} instance The instance - **/ - ,disconnectByInstance: function (instance) - { - if (!this._signalData) + */ + disconnectByInstance(instance) { + if (!this._thisArg) return; - var signals = this._signalData.signals; + var signals = this._thisArg.signals; - for (var signalId in signals) - { + for (var signalId in signals) { var callbacks = signals[signalId]; - for (var i = 0; i < callbacks.length; i++) - if (callbacks[i].instance == instance) - callbacks.splice (i--, 1); + if (callbacks) + for (var i = callbacks.length; i--;) + if (callbacks[i].instance === instance) + callbacks.splice(i, 1); } } /** * Destroys the object, this method should only be called before losing - * the last reference to the object. - **/ - ,_destroy: function () - { - if (!this._signalData) + * the last reference to the object. It can be overwritten by child classes + * but should always call the parent method. + */ + _destroy() { + if (!this._thisArg) return; - var links = this._signalData.links; + var links = this._thisArg.links; for (var key in links) - links[key].disconnectByInstance (this); + this._unlink(links[key]); - this._signalData = null; + this._thisArg = null; } - ,link: function (prop, handlers) - { - this._signalInit (); - var links = this._signalData.links; + /** + * Links the object with another object. + * + * @param {Object} prop The linked property + * @param {Object} handlers The object events to listen with + */ + link(prop, handlers) { + this._signalInit(); + var links = this._thisArg.links; - for (var key in prop) - { + for (var key in prop) { var newObject = prop[key]; var oldObject = this[key]; if (oldObject) - { - oldObject.disconnectByInstance (this); - oldObject.unref (); - } + this._unlink(oldObject); this[key] = newObject; - if (newObject) - { - links[key] = newObject.ref (); + if (newObject) { + links[key] = newObject.ref(); for (var signal in handlers) - newObject.on (signal, handlers[signal], this); - } - else if (oldObject) - delete links[key]; + newObject.on(signal, handlers[signal], this); + } else if (oldObject) + links[key] = undefined; } } -}); + _unlink(object) { + object.disconnectByInstance(this); + object.unref(); + } + + _signalInit() { + if (!this._thisArg) + this._thisArg = { + signals: {}, + links: {} + }; + } +} diff --git a/js/vn/param-iface.js b/js/vn/param-iface.js new file mode 100644 index 00000000..4800c4d6 --- /dev/null +++ b/js/vn/param-iface.js @@ -0,0 +1,139 @@ + +var LotIface = require('./lot-iface'); +var Type = require('./type'); +var Value = require('./value'); + +/** + * A value holder, it emits the changed signal when value is changed. + * Also it can be linked with a lot value or another parameter. + */ +module.exports = new Class({ + Properties: { + /** + * The parameter value. + */ + value: { + type: null + }, + /** + * The parameter type. + */ + type: { + type: Type + }, + /** + * Another parameter to bind with. + */ + param: { + type: Object + }, + /** + * A lot to bind with. + */ + lot: { + type: LotIface + }, + /** + * The field name in the lot. + */ + name: { + type: String + }, + /** + * Determines whether the link to the lot is unidirectional, ie, a + * change in the lot updates the parameter but not viceversa. + */ + oneWay: { + type: Boolean + } + } + + ,_value: undefined + ,_type: null + ,_param: null + ,_lot: null + ,_sourceLock: false + ,_name: null + ,_oneWay: false + + ,_setValue: function(newValue) { + if (this._putValue(newValue)) + this._notifyChanges(); + } + + ,_putValue: function(newValue) { + if (Value.simpleEquals(newValue, this._value)) + return false; + + this._value = Value.simpleClone(newValue); + return true; + } + + ,_notifyChanges: function() { + this._refreshLot(); + this._refreshParam(); + this.emit('changed', this._value); + } + + ,_setType: function(type) { + this._type = type; + this._onLotChange(); + } + + ,_onSourceChange(newValue) { + if (this._oneTime && this._value !== undefined) + return; + + this._sourceLock = true; + this._setValue(newValue); + this._sourceLock = false; + } + + ,_setParam: function(param) { + this.link({_lot: null}); + this.link({_param: param}, {changed: this._onParamChange}); + this._refreshParam(); + } + + ,_onParamChange: function() { + if (this._sourceLock || !this._param) return; + this._onSourceChange(this._param.value); + } + + ,_refreshParam: function() { + if (this._sourceLock || !this._param || this._oneWay) + return; + + this._sourceLock = true; + this._param.value = this._value; + this._sourceLock = false; + } + + ,_setLot: function(lot) { + this.link({_param: null}); + this.link({_lot: lot}, {change: this._onLotChange}); + this._onLotChange(); + } + + ,_onLotChange: function() { + if (this._sourceLock || !this._lot || !this._name) + return; + + var newValue = this._lot.get(this._name, this._type); + this._onSourceChange(newValue); + } + + ,_refreshLot: function() { + if (this._sourceLock || !this._name || !this._lot || this._oneWay) + return; + + this._sourceLock = true; + this._lot.set(this._name, this._value); + this._sourceLock = false; + } + + ,_setName: function(name) { + this._name = name; + this._onLotChange(); + } +}); diff --git a/js/vn/param.js b/js/vn/param.js index 6b26855c..61da0210 100644 --- a/js/vn/param.js +++ b/js/vn/param.js @@ -1,71 +1,88 @@ -var Object = require ('./object'); -var Param = require ('./param'); -var Value = require ('./value'); +var VnObject = require('./object'); +var Type = require('./type'); +var ParamIface = require('./param-iface'); +var LotIface = require('./lot-iface'); /** - * Simply a linkable value holder. - **/ -module.exports = new Class -({ - Extends: Object + * A simple implementation of @ParamIface. + */ +module.exports = new Class({ + Extends: VnObject + ,Implements: ParamIface ,Tag: 'vn-param' - ,Properties: - { - value: - { - type: String - ,set: function (x) - { - if (Value.compare (x, this._value)) - return; - - if (x instanceof Date) - x = x.clone (); - - this._value = x; - - if (this._master && !this.masterLock) - { - this.masterLock = true; - this._master.value = x; - this.masterLock = false; - } - - this.signalEmit ('changed', this._value); + ,Properties: { + value: { + type: null + ,set: function(x) { + this._setValue(x); } - ,get: function () - { + ,get: function() { return this._value; } }, - master: - { - type: Param - ,set: function (x) - { - this.link ({_master: x}, {'changed': this._onMasterChange}); - this._onMasterChange (); + type: { + type: Type + ,set: function(x) { + this._setType(x); } - ,get: function () - { - return this._master; + ,get: function() { + return this._type; + } + }, + param: { + type: ParamIface + ,set: function(x) { + this._setParam(x); + } + ,get: function() { + return this._param; + } + }, + master: { + type: ParamIface + ,set: function(x) { + this._setParam(x); + } + ,get: function() { + return this._param; + } + }, + lot: { + type: LotIface + ,set: function(x) { + this._setLot(x); + } + ,get: function() { + return this._lot; + } + }, + name: { + type: String + ,set: function(x) { + this._setName(x); + } + ,get: function() { + return this._name; + } + }, + oneWay: { + type: Boolean + ,set: function(x) { + this._oneWay = x; + } + ,get: function() { + return this._oneWay; + } + }, + oneTime: { + type: Boolean + ,set: function(x) { + this._oneTime = x; + } + ,get: function() { + return this._oneTime; } } } - - ,_value: undefined - ,_master: null - ,masterLock: false - - ,_onMasterChange: function () - { - if (this.masterLock) - return; - - this.masterLock = true; - this.value = this._master.value; - this.masterLock = false; - } }); - diff --git a/js/vn/scope.js b/js/vn/scope.js new file mode 100644 index 00000000..f4043180 --- /dev/null +++ b/js/vn/scope.js @@ -0,0 +1,161 @@ +const VnObject = require('./object'); +const kebabToCamel = require('./string-util').kebabToCamel; + +let scopeUid = 0; + +module.exports = new Class({ + Extends: VnObject + + ,initialize: function(builder, doc, objects, exprValues, thisArg, parent) { + this.builder = builder; + this.objects = objects; + this.exprValues = exprValues; + this.thisArg = thisArg; + this.parent = parent; + this.uid = ++scopeUid; + this.$ = parent ? Object.create(parent.$) : {}; + + if (parent) { + parent.ref(); + // XXX: Keep commented until optimized + //parent.on('change', this.onChange, this); + if (!thisArg) this.thisArg = parent.thisArg; + } + + const contexts = builder._contexts; + for (let i = 0; i < contexts.length; i++) { + const context = contexts[i]; + objects[i] = context.compiler.instantiate(doc, context, this); + } + } + + ,link: function(extraObjects) { + var contextMap = this.builder._contextMap; + + for (var id in extraObjects) + this.$[id] = extraObjects[id]; + for (var id in contextMap) + this.$[id] = this.objects[contextMap[id]]; + + const builder = this.builder; + const contexts = builder._contexts; + const objects = this.objects; + + for (const compiler of builder._compilers) + compiler.preLink(this); + + for (let i = 0; i < contexts.length; i++) { + const context = contexts[i]; + context.compiler.link(context, objects[i], objects, this); + } + + for (let i = 0; i < contexts.length; i++) { + const context = contexts[i]; + context.compiler.connect(context, objects[i], objects, this); + } + + for (const compiler of builder._compilers) + compiler.postLink(this); + + this.digest(); + + for (const object of this.objects) + if (object.assignLot) + object.on('change', this.onChange, this); + } + + ,digest() { + const exprContexts = this.builder._exprContexts; + const exprValues = this.exprValues; + const objects = this.objects; + + for (let i = 0; i < exprContexts.length; i++) { + const exprContext = exprContexts[i]; + let newValue; + + if (exprContext.template) { + const values = []; + let isEmpty = false; + + for (expr of exprContext.exprs) { + const value = this.execExpr(expr); + if (value == null) { + isEmpty = true; + break; + } + values.push(value); + } + + if (!isEmpty) { + let k = 0; + newValue = exprContext.template.replace(/{{\d+}}/g, function() { + return values[k++]; + }); + } else + newValue = ''; + } else + newValue = this.execExpr(exprContext.expr); + + if (newValue !== exprValues[i]) { + const context = exprContext.context; + context.compiler.setProperty(objects[context.id], + exprContext.property, newValue); + exprValues[i] = newValue; + } + } + } + + ,execExpr(expr) { + try { + return expr.call(this.thisArg, this.$); + // eslint-disable-next-line no-empty + } catch (e) {} + } + + ,onChange() { + this.emit('change'); + this.digest(); + } + + ,getMain: function() { + return this.objects[this.builder._mainContext]; + } + + ,getById: function(objectId) { + if (!objectId) return null; + return this.$[kebabToCamel(objectId)]; + } + + ,getByTagName: function(tagName) { + const tags = this.builder._tags[tagName]; + + if (tags) { + const arr = new Array(tags.length); + + for (let i = 0; i < tags.length; i++) + arr[i] = this.objects[tags[i]]; + + return arr; + } + + return []; + } + + ,getHtmlId: function(nodeId) { + return 'vn-'+ this.uid +'-'+ nodeId; + } + + ,_destroy: function() { + for (const object of this.objects) + if (object instanceof VnObject) { + object.disconnectByInstance(this); + object.unref(); + } + if (this.parent) { + this.parent.disconnectByInstance(this); + this.parent.unref(); + } + + VnObject.prototype._destroy.call(this); + } +}); diff --git a/js/vn/spec.js b/js/vn/spec.js new file mode 100644 index 00000000..f24bc6da --- /dev/null +++ b/js/vn/spec.js @@ -0,0 +1,37 @@ + +var VnObject = require('./object'); +var Type = require('./type'); + +/** + * Paramter specification. + */ +module.exports = new Class({ + Extends: VnObject + ,Tag: 'vn-spec' + ,Properties: { + /** + * The parameter name. + */ + name: { + type: String + ,set: function(x) { + this._name = x; + } + ,get: function() { + return this._name; + } + }, + /** + * The parameter type. + */ + type: { + type: Type + ,set: function(x) { + this._type = x; + } + ,get: function() { + return this._type; + } + } + } +}); diff --git a/js/vn/string-util.js b/js/vn/string-util.js new file mode 100644 index 00000000..ccd01c7b --- /dev/null +++ b/js/vn/string-util.js @@ -0,0 +1,27 @@ +module.exports = { + kebabToCamel: kebabToCamel, + kebabToPascal: kebabToPascal +}; + +/** + * Converts a kebab-case (hyphenized) string to camelCase (lowerCamelCase). + * + * @param {String} string The kebab-case string + * @return {String} The string parsed to camelCase + */ +function kebabToCamel(string) { + function replaceFunc(token) { + return token.charAt(1).toUpperCase(); + } + return string.replace(/-./g, replaceFunc); +} +/** + * Converts a kebab-case (hyphenized) string to PascalCase (UpperCamelCase). + * + * @param {String} string The kebab-case string + * @return {String} The string parsed to PascalCase + */ +function kebabToPascal(string) { + string = string.charAt(0).toUpperCase() + string.substr(1); + return kebabToCamel(string); +} diff --git a/js/vn/type.js b/js/vn/type.js new file mode 100644 index 00000000..b380e90a --- /dev/null +++ b/js/vn/type.js @@ -0,0 +1,4 @@ +/** + * Type that references another type. + */ + module.exports = function() {}; \ No newline at end of file diff --git a/js/vn/url.js b/js/vn/url.js index f5f9bba0..582733d8 100644 --- a/js/vn/url.js +++ b/js/vn/url.js @@ -1,13 +1,13 @@ /** * Class to handle the URL. - **/ + */ module.exports = { /** * Gets the value of a URL variable. * * @param {string} key The variable name - **/ + */ getQuery: function(key) { var regExp = new RegExp('[\?\&]'+ key +'=([^\&]*)(\&?)', 'i'); var value = location.search.match(regExp); @@ -20,7 +20,7 @@ module.exports = * * @param {string} key The variable name * @param {string} value The new value - **/ + */ ,setQuery: function(key, value) { var changed = true; var found = false; diff --git a/js/vn/value.js b/js/vn/value.js index 50dcb287..b45bf17f 100644 --- a/js/vn/value.js +++ b/js/vn/value.js @@ -1,65 +1,191 @@ -var VnDate = require ('./date'); +var VnDate = require('./date'); -module.exports = -{ - regexpNumber: /%\.([0-9]+)d/g - ,regexpString: /%s/g +/** + * Clones a simple value. A simple value is any value that is not an array, + * object or function. If non-simple value is passed, the same object reference + * is returned. + * + * @param {*} value The value to be copied + * @return {*} The value copy + */ +function simpleClone(value) { + if (value instanceof Date) + return value.clone(); - ,compare: function (a, b) - { - if (a === b) - return true; - if (typeof a === typeof b && a instanceof Date) - return a.getTime () === b.getTime (); - - return false; - } - - ,format: function (value, format) - { - if (value === null || value === undefined) - return ''; - - if (format) - switch (typeof value) - { - case 'number': - return format.replace (this.regexpNumber, - this.replaceNumber.bind (null, value)); - case 'string': - return format.replace (this.regexpString, - this.replaceString.bind (null, value)); - case 'object': - if (value instanceof Date) - return VnDate.strftime (value, format); - } - - return value; - } - - ,replaceNumber: function (value, token, digits) - { - return new Number (value).toFixed (parseInt (digits)); - } - - ,replaceString: function (value) - { - return value; - } -}; + return value; +} -window.sprintf = function (formatString) -{ +/** + * Checks if two simple values are equal using the strict equality operator. For + * information about simple values see simpleClone() function. + * + * @param {*} a Value to compare to + * @param {*} b Value to compare with + * @return {boolean} %true if they are equal, %false otherwise + */ +function simpleEquals(a, b) { + if (a === b) + return true; + if (a instanceof Date && b instanceof Date) + return a.getTime() === b.getTime(); + + return false; +} + +/** + * Calculates differences between two simple key-value objects. + * + * @param {Object} orgObject Value to compare to + * @param {Object} newObject Value to compare with + * @return {Object} The differences or %null if there are no differences + */ +function diff(orgObject, newObject) { + var diff = {}; + + for (var key in orgObject) + if (!simpleEquals(orgObject[key], newObject[key])) + diff[key] = simpleClone(newObject[key]); + + for (var key in newObject) + if (orgObject[key] === undefined && newObject[key] !== undefined) + diff[key] = simpleClone(newObject[key]); + + if (Object.keys(diff).length > 0) + return diff; + + return null; +} + +/** + * Calculates new differences between two simple key-value objects. + * + * @param {Object} orgObject Value to compare to + * @param {Object} newObject Value to compare with + * @return {Object} The differences or %null if there are no differences + */ +function partialDiff(orgObject, newObject) { + var diff = {}; + + for (var key in newObject) + if (!simpleEquals(orgObject[key], newObject[key])) + diff[key] = simpleClone(newObject[key]); + + if (Object.keys(diff).length > 0) + return diff; + + return null; +} + +/** + * Clones a simple key-value object in wich properties are simple values. For + * information about simple values see simpleClone() function. + * + * @param {*} object The object to be cloned + * @return The cloned object + */ +function kvClone(object) { + var copy = {}; + + for (var key in object) + copy[key] = simpleClone(object[key]); + + return copy; +} + +/** + * Checks if two values are equal, it also checks objects. Basic values are + * compared using the strict equality operator. + * + * @param {*} a Value to compare to + * @param {*} b Value to compare with + * @return {boolean} %true if they are equal, %false otherwise + */ +function equals(a, b) { + if (a === b) + return true; + if (a instanceof Date && b instanceof Date) + return a.getTime() === b.getTime(); + if (a && b && (typeof a === 'object') && (typeof b === 'object')) { + for (var key in a) + if (!equals(a[key], b[key])) + return false; + + for (var key in b) + if (a[key] === undefined && b[key] !== undefined) + return false; + + return true; + } + + return false; +} + +/** + * Returns a formated string. + * + * @param {Object} formatString The base string template + * @param {...} arguments Format parameters + * @return {string} The formated string + */ +function sprintf(formatString) { var args = arguments; if (args.length <= 1) return formatString; var i = 1; - return formatString.replace (/%[s|d]/g, function () - { + return formatString.replace(/%[s|d]/g, function() { return args[i++]; }); } +module.exports = { + regexpNumber: /%\.([0-9]+)d/g + ,regexpString: /%s/g + + ,equals + ,diff + ,partialDiff + ,kvClone + ,simpleClone + ,simpleEquals + ,sprintf + + ,compare: function(a, b) { + if (a === b) + return true; + if (a instanceof Date && b instanceof Date) + return a.getTime() === b.getTime(); + + return false; + } + + ,format: function(value, format) { + if (value === null || value === undefined) + return ''; + + if (format) + switch (typeof value) { + case 'number': + return format.replace(this.regexpNumber, + this.replaceNumber.bind(null, value)); + case 'string': + return format.replace(this.regexpString, + this.replaceString.bind(null, value)); + case 'object': + if (value instanceof Date) + return VnDate.strftime(value, format); + } + + return value; + } + + ,replaceNumber: function(value, token, digits) { + return new Number(value).toFixed(parseInt(digits)); + } + + ,replaceString: function(value) { + return value; + } +}; diff --git a/js/vn/vn.js b/js/vn/vn.js index 6a0ebe5a..5e272e9d 100644 --- a/js/vn/vn.js +++ b/js/vn/vn.js @@ -1,40 +1,50 @@ -require ('mootools'); +require('mootools'); Vn = module.exports = { - Locale : require ('./locale') - ,Enum : function () {} - ,Object : require ('./object') - ,Browser : require ('./browser') - ,Cookie : require ('./cookie') - ,Date : require ('./date') - ,Value : require ('./value') - ,Url : require ('./url') - ,Mutators : require ('./mutators') - ,Param : require ('./param') - ,HashListener : require ('./hash-listener') - ,Hash : require ('./hash') - ,HashParam : require ('./hash-param') - ,Node : require ('./node') - ,Builder : require ('./builder') - ,JsonException : require ('./json-exception') - ,JsonConnection : require ('./json-connection') + Locale : require('./locale') + ,Enum : require('./enum') + ,Type : require('./type') + ,Object : require('./object') + ,Mutators : require('./mutators') + ,Browser : require('./browser') + ,Cookie : require('./cookie') + ,Date : require('./date') + ,Value : require('./value') + ,Url : require('./url') + ,LotIface : require('./lot-iface') + ,Lot : require('./lot') + ,LotQuery : require('./lot-query') + ,Hash : require('./hash') + ,ParamIface : require('./param-iface') + ,Param : require('./param') + ,Spec : require('./spec') + ,Model : require('./model') + ,ModelIface : require('./model-iface') + ,ModelProxy : require('./model-proxy') + ,IteratorIface : require('./iterator-iface') + ,Iterator : require('./iterator') + ,Form : require('./form') + ,Node : require('./node') + ,NodeBuilder : require('./node-builder') + ,Component : require('./component') + ,Builder : require('./builder') + ,JsonException : require('./json-exception') + ,JsonConnection : require('./json-connection') ,Config: {} ,includes: {} ,cssIncludes: {} ,currentDeps: [] ,currentCallback: null - ,head: document.getElementsByTagName ('head')[0] + ,head: document.getElementsByTagName('head')[0] ,isMobileCached: null - ,getVersion: function () - { - if (this._version === undefined) - { + ,getVersion: function() { + if (this._version === undefined) { var re = /[; ]vnVersion=([^\\s;]*)/; - var sMatch = (' '+ document.cookie).match (re); - this._version = (sMatch) ? '?'+ unescape (sMatch[1]) : ''; + var sMatch = (' '+ document.cookie).match(re); + this._version = (sMatch) ? '?'+ unescape(sMatch[1]) : ''; } return this._version; @@ -45,27 +55,23 @@ Vn = module.exports = { * is already included, does nothing. * * @param {string} fileName The stylesheet file name - **/ - ,includeCss: function (fileName) - { + */ + ,includeCss: function(fileName) { var cssData = this.cssIncludes[fileName]; - if (!cssData) - { - var link = document.createElement ('link'); + if (!cssData) { + var link = document.createElement('link'); link.rel = 'stylesheet'; link.type = 'text/css'; - link.href = fileName + this.getVersion (); - this.head.appendChild (link); + link.href = fileName + this.getVersion(); + this.head.appendChild(link); this.cssIncludes[fileName] = { included: true ,link: link }; - } - else if (!cssData.included) - { + } else if (!cssData.included) { cssData.link.disabled = false; cssData.included = true; } @@ -75,20 +81,17 @@ Vn = module.exports = { * Excludes a CSS stylesheet from the current document. * * @param {string} fileName The stylesheet file name - **/ - ,excludeCss: function (fileName) - { + */ + ,excludeCss: function(fileName) { var cssData = this.cssIncludes[fileName]; - if (cssData && cssData.included) - { + if (cssData && cssData.included) { cssData.link.disabled = true; cssData.included = false; } } - ,_createIncludeData: function (path) - { + ,_createIncludeData: function(path) { var includeData = { depCount: 0 ,success: false @@ -101,37 +104,34 @@ Vn = module.exports = { return includeData; } - ,_handleCallback: function (includeData, callback) - { + ,_handleCallback: function(includeData, callback) { if (!callback) return; if (includeData.success) - callback (includeData.loaded); + callback(includeData.loaded); else - includeData.callbacks.push (callback); + includeData.callbacks.push(callback); } - ,_resolveDeps: function (includeData) - { + ,_resolveDeps: function(includeData) { includeData.success = true; var callbacks = includeData.callbacks; if (callbacks) for (var i = 0; i < callbacks.length; i++) - callbacks[i] (includeData.loaded); + callbacks[i](includeData.loaded); var dependants = includeData.dependants; if (dependants) - for (var i = 0; i < dependants.length; i++) - { + for (var i = 0; i < dependants.length; i++) { var dependant = dependants[i]; dependant.depCount--; if (dependant.depCount == 0) - this._resolveDeps (dependant); + this._resolveDeps(dependant); } delete includeData.callbacks; @@ -145,12 +145,10 @@ Vn = module.exports = { * Should be called on the last statically incuded script. * * @param {Function} callback The main function - **/ - ,main: function (callback) - { - if (this.mainCalled) - { - Vn.warning ("Vn: main method should be called only once"); + */ + ,main: function(callback) { + if (this.mainCalled) { + Vn.warning("Vn: main method should be called only once"); return; } @@ -161,44 +159,39 @@ Vn = module.exports = { basePath += location.port ? ':'+ location.port : ''; basePath += location.pathname; - var scripts = this.head.getElementsByTagName ('script'); + var scripts = this.head.getElementsByTagName('script'); var includes = this.currentDeps; - for (var i = 0; i < scripts.length; i++) - { - var path = scripts[i].src.substr (basePath.length); - path = path.substr (0, path.indexOf ('.js')) +'.js'; + for (var i = 0; i < scripts.length; i++) { + var path = scripts[i].src.substr(basePath.length); + path = path.substr(0, path.indexOf('.js')) +'.js'; var includeData = this.includes[path]; - if (includeData === undefined) - { + if (includeData === undefined) { this.currentDeps = includes; - var includeData = this._createIncludeData (path); - this._onScriptLoad (includeData, true); + var includeData = this._createIncludeData(path); + this._onScriptLoad(includeData, true); } } - includeData.callbacks.push (this._onMainDepsLoad.bind (this)); - window.addEventListener ('load', this._onWindowLoad.bind (this)); + includeData.callbacks.push(this._onMainDepsLoad.bind(this)); + window.addEventListener('load', this._onWindowLoad.bind(this)); } - ,_onMainDepsLoad: function () - { + ,_onMainDepsLoad: function() { this.mainDepsLoaded = true; - this._callMain (); + this._callMain(); } - ,_onWindowLoad: function () - { + ,_onWindowLoad: function() { this.windowReady = true; - this._callMain (); + this._callMain(); } - ,_callMain: function () - { + ,_callMain: function() { if (this.mainCallback && this.windowReady && this.mainDepsLoaded) - this.mainCallback (); + this.mainCallback(); } /** @@ -206,15 +199,13 @@ Vn = module.exports = { * current script. * * @param {...} The list of files as function arguments - **/ - ,include: function () - { - for (var i = 0; i < arguments.length; i++) - { - var includeData = this._realIncludeJs (arguments[i] +'.js'); + */ + ,include: function() { + for (var i = 0; i < arguments.length; i++) { + var includeData = this._realIncludeJs(arguments[i] +'.js'); if (!includeData.success) - this.currentDeps.push (includeData); + this.currentDeps.push(includeData); } } @@ -223,15 +214,13 @@ Vn = module.exports = { * current script. * * @param {...} The list of files as function arguments - **/ - ,resource: function () - { - for (var i = 0; i < arguments.length; i++) - { - var includeData = this._realLoadXml (arguments[i]); + */ + ,resource: function() { + for (var i = 0; i < arguments.length; i++) { + var includeData = this._realLoadXml(arguments[i]); if (!includeData.success) - this.currentDeps.push (includeData); + this.currentDeps.push(includeData); } } @@ -240,9 +229,8 @@ Vn = module.exports = { * are resolved. * * @param {Function} callback The callback function - **/ - ,define: function (callback) - { + */ + ,define: function(callback) { this.currentCallback = callback; } @@ -251,13 +239,12 @@ Vn = module.exports = { * * @param {string} libName The folder of the library * @param {Array<string>} files Array with every library file name - **/ - ,includeLib: function (libName, files) - { - Vn.Locale.loadScript ('js/'+ libName +'.js'); + */ + ,includeLib: function(libName, files) { + Vn.Locale.loadScript('js/'+ libName +'.js'); for (var i = 0; i < files.length; i++) - this.include ('js/'+ libName +'/'+ files[i]); + this.include('js/'+ libName +'/'+ files[i]); } /** @@ -267,73 +254,64 @@ Vn = module.exports = { * @param {string} fileName The script file name * @param {Function} callback The function to call when script is * downloaded and included - **/ - ,includeJs: function (fileName, callback, skipVersion) - { - var includeData = this._realIncludeJs (fileName, skipVersion); - this._handleCallback (includeData, callback); + */ + ,includeJs: function(fileName, callback, skipVersion) { + var includeData = this._realIncludeJs(fileName, skipVersion); + this._handleCallback(includeData, callback); } - ,_realIncludeJs: function (fileName, skipVersion) - { + ,_realIncludeJs: function(fileName, skipVersion) { var includeData = this.includes[fileName]; - if (includeData === undefined) - { - includeData = this._createIncludeData (fileName); + if (includeData === undefined) { + includeData = this._createIncludeData(fileName); var src = fileName; if (!skipVersion) - src = src + this.getVersion (); + src = src + this.getVersion(); - var script = document.createElement ('script'); + var script = document.createElement('script'); script.type = 'text/javascript'; script.async = false; script.src = src; script.onload = - this._onScriptLoad.bind (this, includeData, true); + this._onScriptLoad.bind(this, includeData, true); script.onerror = - this._onScriptLoad.bind (this, includeData, false); + this._onScriptLoad.bind(this, includeData, false); script.onreadystatechange = - this._onScriptStateChange.bind (this, includeData, script); + this._onScriptStateChange.bind(this, includeData, script); - this.head.appendChild (script); + this.head.appendChild(script); } return includeData; } - ,_onScriptStateChange: function (includeData, script) - { + ,_onScriptStateChange: function(includeData, script) { if (script.readyState == 'complete') - this._onScriptLoad (includeData, true); + this._onScriptLoad(includeData, true); } - ,_onScriptLoad: function (includeData, loaded) - { + ,_onScriptLoad: function(includeData, loaded) { includeData.loaded = loaded; - if (loaded) - { + if (loaded) { if (this.currentCallback) - includeData.callbacks.unshift (this.currentCallback); + includeData.callbacks.unshift(this.currentCallback); var includes = this.currentDeps; - if (includes && includes.length > 0) - { + if (includes && includes.length > 0) { includeData.depCount = includes.length; for (var i = 0; i < includes.length; i++) - includes[i].dependants.push (includeData); - } - else - this._resolveDeps (includeData); - } - else - this._resolveDeps (includeData); + includes[i].dependants.push(includeData); + } else + this._resolveDeps(includeData); + } else + this._resolveDeps(includeData); this.currentDeps = []; this.currentCallback = null; @@ -344,33 +322,29 @@ Vn = module.exports = { * * @param {string} path The file path * @param {Function} callback The function to call when file is downloaded - **/ - ,loadXml: function (path, callback) - { - var includeData = this._realLoadXml (path); - this._handleCallback (includeData, callback); + */ + ,loadXml: function(path, callback) { + var includeData = this._realLoadXml(path); + this._handleCallback(includeData, callback); } - ,_realLoadXml: function (path) - { + ,_realLoadXml: function(path) { var includeData = this.includes[path]; - if (includeData === undefined) - { - includeData = this._createIncludeData (path); + if (includeData === undefined) { + includeData = this._createIncludeData(path); - var request = new XMLHttpRequest (); + var request = new XMLHttpRequest(); request.onreadystatechange = - this._onXmlReady.bind (this, includeData, request); - request.open ('get', path + this.getVersion (), true); - request.send (); + this._onXmlReady.bind(this, includeData, request); + request.open('get', path + this.getVersion(), true); + request.send(); } return includeData; } - ,_onXmlReady: function (includeData, request) - { + ,_onXmlReady: function(includeData, request) { if (request.readyState != 4) return; @@ -379,7 +353,7 @@ Vn = module.exports = { if (includeData.loaded) includeData.xml = request.responseXML; - this._resolveDeps (includeData); + this._resolveDeps(includeData); } /** @@ -387,9 +361,8 @@ Vn = module.exports = { * * @param {string} path The file path * @return {Object} The DOM object - **/ - ,getXml: function (path) - { + */ + ,getXml: function(path) { var includeData = this.includes[path]; if (!(includeData && includeData.success)) @@ -402,16 +375,13 @@ Vn = module.exports = { * Checks if user is using a mobile browser. * * return {boolean} %true if is mobile, %false otherwise. - **/ - ,isMobile: function () - { - if (this.isMobileCached === null) - { + */ + ,isMobile: function() { + if (this.isMobileCached === null) { var regExp = /(Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone)/i; - this.isMobileCached = navigator.userAgent.match (regExp); + this.isMobileCached = navigator.userAgent.match(regExp); } return this.isMobileCached; } }; - diff --git a/package-lock.json b/package-lock.json index bc3d4873..e69de29b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15079 +0,0 @@ -{ - "name": "hedera-web", - "version": "1.408.18", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "hedera-web", - "version": "1.408.18", - "license": "GPL-3.0", - "dependencies": { - "js-yaml": "^3.12.1", - "mootools": "^1.5.2", - "require-yaml": "0.0.1", - "tinymce": "^5.0.0" - }, - "devDependencies": { - "archiver": "^3.0.0", - "assets-webpack-plugin": "^3.9.7", - "bundle-loader": "^0.5.6", - "css-loader": "^2.1.0", - "eslint": "^5.13.0", - "file-loader": "^3.0.1", - "fs-extra": "^5.0.0", - "glob": "^7.1.3", - "json-loader": "^0.5.7", - "raw-loader": "^1.0.0", - "style-loader": "^0.23.1", - "url-loader": "^1.1.2", - "webpack": "^4.29.1", - "webpack-cli": "^3.2.3", - "webpack-dev-server": "^3.1.14", - "webpack-merge": "^4.2.1", - "yaml-loader": "^0.5.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.0.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "dependencies": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.8.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.3.tgz", - "integrity": "sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==", - "dev": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", - "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", - "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", - "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", - "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", - "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", - "dev": true, - "dependencies": { - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", - "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", - "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", - "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", - "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", - "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", - "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.1" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", - "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", - "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/helper-wasm-section": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-opt": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", - "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", - "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", - "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", - "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/floating-point-hex-parser": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-code-frame": "1.7.11", - "@webassemblyjs/helper-fsm": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", - "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "peerDependencies": { - "ajv": ">=5.0.0" - } - }, - "node_modules/ajv-keywords": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz", - "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==", - "dev": true, - "peerDependencies": { - "ajv": "^6.0.0" - } - }, - "node_modules/ajv/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/anymatch/node_modules/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, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "node_modules/archiver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.0.0.tgz", - "integrity": "sha512-5QeR6Xc5hSA9X1rbQfcuQ6VZuUXOaEdB65Dhmk9duuRJHYif/ZyJfuyJqsQrj34PFjU5emv5/MmfgA8un06onw==", - "dev": true, - "dependencies": { - "archiver-utils": "^2.0.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "zip-stream": "^2.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.0.0.tgz", - "integrity": "sha512-JRBgcVvDX4Mwu2RBF8bBaHcQCSxab7afsxAPYDQ5W+19quIPP5CfKE7Ql+UHs9wYvwsaNR8oDuhtf5iqrKmzww==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash.assign": "^4.2.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.toarray": "^4.4.0", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "dependencies": { - "util": "0.10.3" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assets-webpack-plugin": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/assets-webpack-plugin/-/assets-webpack-plugin-3.9.7.tgz", - "integrity": "sha512-yxo4MlSb++B88qQFE27Wf56ykGaDHZeKcSbrstSFOOwOxv33gWXtM49+yfYPSErlXPAMT5lVy3YPIhWlIFjYQw==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "escape-string-regexp": "^1.0.3", - "lodash.assign": "^4.2.0", - "lodash.merge": "^4.6.1", - "mkdirp": "^0.5.1" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", - "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/body-parser/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/body-parser/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/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, - "dependencies": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/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, - "dependencies": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "node_modules/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 - }, - "node_modules/bundle-loader": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/bundle-loader/-/bundle-loader-0.5.6.tgz", - "integrity": "sha512-SUgX+u/LJzlJiuoIghuubZ66eflehnjmqSfh/ib9DTe08sxRJ5F/MhHSjp7GfSJivSp8NWgez4PVNAUuMg7vSg==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", - "dev": true - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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 - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "node_modules/compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "dev": true, - "dependencies": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/compress-commons/node_modules/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, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "dependencies": { - "date-now": "^0.1.4" - } - }, - "node_modules/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 - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "dev": true, - "dependencies": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/css-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.0.tgz", - "integrity": "sha512-MoOu+CStsGrSt5K2OeZ89q3Snf+IkxRfAIt9aAKg4piioTrhtP1iEFPu+OVn3Ohz24FO6L+rw9UJxBILiSBw5Q==", - "dev": true, - "dependencies": { - "icss-utils": "^4.0.0", - "loader-utils": "^1.2.1", - "lodash": "^4.17.11", - "postcss": "^7.0.6", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.3", - "postcss-modules-scope": "^2.0.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "dev": true, - "dependencies": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - } - }, - "node_modules/cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - } - }, - "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "node_modules/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 - }, - "node_modules/default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "dependencies": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "dependencies": { - "buffer-indexof": "^1.0.0" - } - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.13.0.tgz", - "integrity": "sha512-nqD5WQMisciZC5EHZowejLKQjWGuFS5c70fxqSKlnDME+oz9zmE8KTlX+lHSg+/5wsC/kf9Q9eMkC8qS3oM2fg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.5.3", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.0", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.1.0", - "js-yaml": "^3.12.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.0.2", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" - } - }, - "node_modules/eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/espree": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", - "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", - "dev": true, - "dependencies": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "dependencies": { - "estraverse": "^4.0.0" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "dependencies": { - "estraverse": "^4.1.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/express/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/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 - }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "dependencies": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/file-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", - "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", - "dev": true, - "dependencies": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/finalhandler/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "dependencies": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", - "bundleDependencies": [ - "node-pre-gyp" - ], - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/fsevents/node_modules/abbrev": { - "version": "1.1.1", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/ansi-regex": { - "version": "2.1.1", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/aproba": { - "version": "1.2.0", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/are-we-there-yet": { - "version": "1.1.5", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/fsevents/node_modules/balanced-match": { - "version": "1.0.0", - "integrity": "sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/brace-expansion": { - "version": "1.1.11", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/fsevents/node_modules/chownr": { - "version": "1.1.1", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/code-point-at": { - "version": "1.1.0", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/concat-map": { - "version": "0.0.1", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/console-control-strings": { - "version": "1.1.0", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/core-util-is": { - "version": "1.0.2", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/debug": { - "version": "2.6.9", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/fsevents/node_modules/deep-extend": { - "version": "0.6.0", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/fsevents/node_modules/delegates": { - "version": "1.0.0", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/detect-libc": { - "version": "1.0.3", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "inBundle": true, - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/fsevents/node_modules/fs-minipass": { - "version": "1.2.5", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "minipass": "^2.2.1" - } - }, - "node_modules/fsevents/node_modules/fs.realpath": { - "version": "1.0.0", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/gauge": { - "version": "2.7.4", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/fsevents/node_modules/glob": { - "version": "7.1.3", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/fsevents/node_modules/has-unicode": { - "version": "2.0.1", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/iconv-lite": { - "version": "0.4.24", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/ignore-walk": { - "version": "3.0.1", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/fsevents/node_modules/inflight": { - "version": "1.0.6", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/fsevents/node_modules/inherits": { - "version": "2.0.3", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/ini": { - "version": "1.3.5", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/fsevents/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/isarray": { - "version": "1.0.0", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/minimatch": { - "version": "3.0.4", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/fsevents/node_modules/minimist": { - "version": "0.0.8", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/minipass": { - "version": "2.3.5", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/fsevents/node_modules/minizlib": { - "version": "1.2.1", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "minipass": "^2.2.1" - } - }, - "node_modules/fsevents/node_modules/mkdirp": { - "version": "0.5.1", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/fsevents/node_modules/ms": { - "version": "2.0.0", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/needle": { - "version": "2.2.4", - "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 0.10.x" - } - }, - "node_modules/fsevents/node_modules/node-pre-gyp": { - "version": "0.10.3", - "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", - "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/fsevents/node_modules/nopt": { - "version": "4.0.1", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/fsevents/node_modules/npm-bundled": { - "version": "1.0.5", - "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/npm-packlist": { - "version": "1.2.0", - "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "node_modules/fsevents/node_modules/npmlog": { - "version": "4.1.2", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/fsevents/node_modules/number-is-nan": { - "version": "1.0.1", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/object-assign": { - "version": "4.1.1", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/once": { - "version": "1.4.0", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/fsevents/node_modules/os-homedir": { - "version": "1.0.2", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/os-tmpdir": { - "version": "1.0.2", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/osenv": { - "version": "0.1.5", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/fsevents/node_modules/path-is-absolute": { - "version": "1.0.1", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/process-nextick-args": { - "version": "2.0.0", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/rc": { - "version": "1.2.8", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/fsevents/node_modules/rc/node_modules/minimist": { - "version": "1.2.0", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/readable-stream": { - "version": "2.3.6", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/fsevents/node_modules/rimraf": { - "version": "2.6.3", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/fsevents/node_modules/safe-buffer": { - "version": "5.1.2", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/safer-buffer": { - "version": "2.1.2", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/sax": { - "version": "1.2.4", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/semver": { - "version": "5.6.0", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true, - "inBundle": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/fsevents/node_modules/set-blocking": { - "version": "2.0.0", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/signal-exit": { - "version": "3.0.2", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/string_decoder": { - "version": "1.1.1", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/fsevents/node_modules/string-width": { - "version": "1.0.2", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/strip-ansi": { - "version": "3.0.1", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/strip-json-comments": { - "version": "2.0.1", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/tar": { - "version": "4.4.8", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - }, - "engines": { - "node": ">=4.5" - } - }, - "node_modules/fsevents/node_modules/util-deprecate": { - "version": "1.0.2", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/wide-align": { - "version": "1.1.3", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "inBundle": true, - "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/fsevents/node_modules/wrappy": { - "version": "1.0.2", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/fsevents/node_modules/yallist": { - "version": "3.0.3", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "inBundle": true, - "optional": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/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, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "dependencies": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/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 - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "node_modules/icss-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.0.0.tgz", - "integrity": "sha512-bA/xGiwWM17qjllIs9X/y0EjsB7e0AV08F3OL8UPsoNkNRibIuu8f1eKTnQ8QO1DteKKTxTUAn+IEWUToIwGOA==", - "dev": true, - "dependencies": { - "postcss": "^7.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", - "dev": true - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "dependencies": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/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 - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "dev": true - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", - "dev": true - }, - "node_modules/loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/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, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mootools": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/mootools/-/mootools-1.5.2.tgz", - "integrity": "sha512-S1cOCsakr8GJ3P1j66pXGgQfLtcRpFLcBkRcq0xXQ15T6IYtFWIQhqqqH8RR7eAa7/vFmKz90IIrzTnfrCHPFw==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "dependencies": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "node_modules/nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", - "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", - "dev": true, - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "0.0.4" - } - }, - "node_modules/node-libs-browser/node_modules/buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "deprecated": "This version of 'buffer' is out-of-date. You must update to v4.9.2 or newer", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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 - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "dependencies": { - "retry": "^0.12.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pako": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", - "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", - "dev": true - }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "node_modules/parent-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", - "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", - "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", - "dev": true, - "dependencies": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "dev": true, - "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "dependencies": { - "postcss": "^7.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.4.tgz", - "integrity": "sha512-WvuSaTKXUqYJbnT7R3YrsNrHv/C5vRfr5VglS4bFOk0MYT4CLBfc/xgExA+x2RftlYgiBDvWmVs191Xv8S8gZQ==", - "dev": true, - "dependencies": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^7.0.6", - "postcss-value-parser": "^3.3.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-scope": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.0.1.tgz", - "integrity": "sha512-7+6k9c3/AuZ5c596LJx9n923A/j3nF3ormewYBF1RrIQvjvjXe1xE8V8A1KFyFwXbvnshT6FBZFX0k/F1igneg==", - "dev": true, - "dependencies": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^7.0.6" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-values": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", - "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", - "dev": true, - "dependencies": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^7.0.6" - } - }, - "node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss/node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/raw-body/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/raw-body/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0.tgz", - "integrity": "sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.3.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "dependencies": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "node_modules/regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/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 - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/require-yaml": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/require-yaml/-/require-yaml-0.0.1.tgz", - "integrity": "sha1-LhsY2RPDuqcqWk03O28Tjd0sMr0=", - "dependencies": { - "js-yaml": "" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-dir/node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-dir/node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/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, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/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, - "dependencies": { - "is-promise": "^2.1.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1" - } - }, - "node_modules/rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", - "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", - "dev": true, - "dependencies": { - "node-forge": "^0.10.0" - } - }, - "node_modules/semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/send/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/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, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sockjs-client": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", - "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "eventsource": "^2.0.2", - "faye-websocket": "^0.11.4", - "inherits": "^2.0.4", - "url-parse": "^1.5.10" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://tidelift.com/funding/github/npm/sockjs-client" - } - }, - "node_modules/sockjs-client/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/sockjs-client/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/table": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.2.tgz", - "integrity": "sha512-f8mJmuu9beQEDkKHLzOv4VxVYlU68NpdzjbGPl69i4Hx0sTopJuNxuzJd17iV2h24dAfa93u794OnDA5jqXvfQ==", - "dev": true, - "dependencies": { - "ajv": "^6.6.1", - "lodash": "^4.17.11", - "slice-ansi": "^2.0.0", - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/terser/node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", - "dev": true - }, - "node_modules/timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tinymce": { - "version": "5.10.5", - "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-5.10.5.tgz", - "integrity": "sha512-nFKtLhmoRtExBxUfv06JlkbQWux5D+d115vxSRAqUmccZdrtpFvOIYwZmikvulLdM9pfEpvO0B+RQ2qFV/+R7w==" - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/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 - }, - "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/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, - "dependencies": { - "indexof": "0.0.1" - } - }, - "node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" - } - }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" - } - }, - "node_modules/watchpack/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "optional": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/watchpack/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "optional": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/watchpack/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/watchpack/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/watchpack/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/watchpack/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "optional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/watchpack/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webpack": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.1.tgz", - "integrity": "sha512-dY3KyQIVeg6cDPj9G5Bnjy9Pt9SoCpbNWl0RDKHstbd3MWe0dG9ri4RQRpCm43iToy3zoA1IMOpFkJ8Clnc7FQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "peerDependencies": { - "webpack": "4.x.x" - } - }, - "node_modules/webpack-cli/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", - "dev": true, - "dependencies": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-server": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", - "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", - "dev": true, - "dependencies": { - "ansi-html-community": "0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 6.11.5" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/webpack-dev-server/node_modules/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, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-log/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/webpack-merge": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", - "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.5" - } - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack-sources/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "dependencies": { - "errno": "~0.1.7" - } - }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml-loader": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.5.0.tgz", - "integrity": "sha512-p9QIzcFSNm4mCw/m5NdyMfN4RE4aFZJWRRb01ERVNGCym8VNbKtw3OYZXnvUIkim6U/EjqE/2yIh9F/msShH9A==", - "dev": true, - "dependencies": { - "js-yaml": "^3.5.2" - } - }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/zip-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.0.1.tgz", - "integrity": "sha512-c+eUhhkDpaK87G/py74wvWLtz2kzMPNCCkUApkun50ssE0oQliIQzWpTnwjB+MTKVIf2tGzIgHyqW/Y+W77ecQ==", - "dev": true, - "dependencies": { - "archiver-utils": "^2.0.0", - "compress-commons": "^1.2.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "@types/node": { - "version": "18.8.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.3.tgz", - "integrity": "sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", - "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", - "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", - "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", - "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", - "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", - "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", - "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", - "dev": true - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", - "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", - "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", - "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", - "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/utf8": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", - "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", - "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/helper-wasm-section": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-opt": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", - "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", - "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", - "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", - "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/floating-point-hex-parser": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-code-frame": "1.7.11", - "@webassemblyjs/helper-fsm": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", - "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "dependencies": { - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "requires": {} - }, - "ajv-keywords": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz", - "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==", - "dev": true, - "requires": {} - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "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.0.1" - } - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "archiver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.0.0.tgz", - "integrity": "sha512-5QeR6Xc5hSA9X1rbQfcuQ6VZuUXOaEdB65Dhmk9duuRJHYif/ZyJfuyJqsQrj34PFjU5emv5/MmfgA8un06onw==", - "dev": true, - "requires": { - "archiver-utils": "^2.0.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "zip-stream": "^2.0.1" - } - }, - "archiver-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.0.0.tgz", - "integrity": "sha512-JRBgcVvDX4Mwu2RBF8bBaHcQCSxab7afsxAPYDQ5W+19quIPP5CfKE7Ql+UHs9wYvwsaNR8oDuhtf5iqrKmzww==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash.assign": "^4.2.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.toarray": "^4.4.0", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - } - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "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 - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "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" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "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" - } - } - } - }, - "assets-webpack-plugin": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/assets-webpack-plugin/-/assets-webpack-plugin-3.9.7.tgz", - "integrity": "sha512-yxo4MlSb++B88qQFE27Wf56ykGaDHZeKcSbrstSFOOwOxv33gWXtM49+yfYPSErlXPAMT5lVy3YPIhWlIFjYQw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "escape-string-regexp": "^1.0.3", - "lodash.assign": "^4.2.0", - "lodash.merge": "^4.6.1", - "mkdirp": "^0.5.1" - } - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "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 - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", - "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", - "dev": true - }, - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "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.1.0", - "randombytes": "^2.0.1" - } - }, - "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.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "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-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 - }, - "bundle-loader": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/bundle-loader/-/bundle-loader-0.5.6.tgz", - "integrity": "sha512-SUgX+u/LJzlJiuoIghuubZ66eflehnjmqSfh/ib9DTe08sxRJ5F/MhHSjp7GfSJivSp8NWgez4PVNAUuMg7vSg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - } - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.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 - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "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": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "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.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "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.0.1" - } - } - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "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==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "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.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "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 - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "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==", - "dev": true - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "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 - }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "requires": { - "buffer": "^5.1.0" - } - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "dev": true, - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.0.tgz", - "integrity": "sha512-MoOu+CStsGrSt5K2OeZ89q3Snf+IkxRfAIt9aAKg4piioTrhtP1iEFPu+OVn3Ohz24FO6L+rw9UJxBILiSBw5Q==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "loader-utils": "^1.2.1", - "lodash": "^4.17.11", - "postcss": "^7.0.6", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.3", - "postcss-modules-scope": "^2.0.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" - } - }, - "css-selector-tokenizer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", - "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", - "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - } - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", - "dev": true - }, - "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": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "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 - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "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.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "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 - }, - "eslint": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.13.0.tgz", - "integrity": "sha512-nqD5WQMisciZC5EHZowejLKQjWGuFS5c70fxqSKlnDME+oz9zmE8KTlX+lHSg+/5wsC/kf9Q9eMkC8qS3oM2fg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.5.3", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.0", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^6.1.0", - "js-yaml": "^3.12.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.0.2", - "text-table": "^0.2.0" - } - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", - "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", - "dev": true, - "requires": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "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 - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - }, - "eventsource": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", - "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "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 - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "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.2.1", - "object-assign": "^4.0.1" - } - }, - "file-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", - "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.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==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "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.2.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "integrity": "sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.4", - "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.3", - "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.5", - "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.2.0", - "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.6.0", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "bundled": true, - "dev": true, - "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "1.0.2", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "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": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "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.5" - } - } - } - }, - "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.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "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.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "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.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.0.0.tgz", - "integrity": "sha512-bA/xGiwWM17qjllIs9X/y0EjsB7e0AV08F3OL8UPsoNkNRibIuu8f1eKTnQ8QO1DteKKTxTUAn+IEWUToIwGOA==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "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 - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "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.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "dev": true, - "requires": { - "ansi-regex": "^4.0.0" - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.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.5" - } - } - } - }, - "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.0.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-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.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.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "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": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "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": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "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.0.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.5" - } - } - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "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-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "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": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, - "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-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "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": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "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" - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", - "dev": true - }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", - "dev": true - }, - "loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "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.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "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.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mootools": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/mootools/-/mootools-1.5.2.tgz", - "integrity": "sha512-S1cOCsakr8GJ3P1j66pXGgQfLtcRpFLcBkRcq0xXQ15T6IYtFWIQhqqqH8RR7eAa7/vFmKz90IIrzTnfrCHPFw==" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "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==", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "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.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "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 - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true - }, - "node-libs-browser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", - "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "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.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "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-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "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.5" - } - } - } - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "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.0.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^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.4", - "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-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": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "pako": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", - "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parent-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", - "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", - "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "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-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "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-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "optional": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "dev": true, - "requires": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "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 - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.4.tgz", - "integrity": "sha512-WvuSaTKXUqYJbnT7R3YrsNrHv/C5vRfr5VglS4bFOk0MYT4CLBfc/xgExA+x2RftlYgiBDvWmVs191Xv8S8gZQ==", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^7.0.6", - "postcss-value-parser": "^3.3.1" - } - }, - "postcss-modules-scope": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.0.1.tgz", - "integrity": "sha512-7+6k9c3/AuZ5c596LJx9n923A/j3nF3ormewYBF1RrIQvjvjXe1xE8V8A1KFyFwXbvnshT6FBZFX0k/F1igneg==", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^7.0.6" - } - }, - "postcss-modules-values": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", - "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^7.0.6" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "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 - }, - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "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 - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "raw-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0.tgz", - "integrity": "sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - }, - "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.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "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": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "require-yaml": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/require-yaml/-/require-yaml-0.0.1.tgz", - "integrity": "sha1-LhsY2RPDuqcqWk03O28Tjd0sMr0=", - "requires": { - "js-yaml": "" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "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.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "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" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selfsigned": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", - "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", - "dev": true, - "requires": { - "node-forge": "^0.10.0" - } - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "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": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "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==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.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 - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "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": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "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.5" - } - } - } - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "sockjs-client": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", - "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "eventsource": "^2.0.2", - "faye-websocket": "^0.11.4", - "inherits": "^2.0.4", - "url-parse": "^1.5.10" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "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 - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "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 - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "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" - } - }, - "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" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "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 - }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.2.tgz", - "integrity": "sha512-f8mJmuu9beQEDkKHLzOv4VxVYlU68NpdzjbGPl69i4Hx0sTopJuNxuzJd17iV2h24dAfa93u794OnDA5jqXvfQ==", - "dev": true, - "requires": { - "ajv": "^6.6.1", - "lodash": "^4.17.11", - "slice-ansi": "^2.0.0", - "string-width": "^2.1.1" - } - }, - "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", - "dev": true - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "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 - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "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 - } - } - }, - "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 - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tinymce": { - "version": "5.10.5", - "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-5.10.5.tgz", - "integrity": "sha512-nFKtLhmoRtExBxUfv06JlkbQWux5D+d115vxSRAqUmccZdrtpFvOIYwZmikvulLdM9pfEpvO0B+RQ2qFV/+R7w==" - }, - "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-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.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.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "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" - } - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "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 - } - } - }, - "url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", - "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - } - }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "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" - } - }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webpack": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.1.tgz", - "integrity": "sha512-dY3KyQIVeg6cDPj9G5Bnjy9Pt9SoCpbNWl0RDKHstbd3MWe0dG9ri4RQRpCm43iToy3zoA1IMOpFkJ8Clnc7FQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", - "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", - "dev": true, - "requires": { - "ansi-html-community": "0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "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.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", - "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", - "dev": true, - "requires": { - "lodash": "^4.17.5" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "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": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "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": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "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" - } - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml-loader": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.5.0.tgz", - "integrity": "sha512-p9QIzcFSNm4mCw/m5NdyMfN4RE4aFZJWRRb01ERVNGCym8VNbKtw3OYZXnvUIkim6U/EjqE/2yIh9F/msShH9A==", - "dev": true, - "requires": { - "js-yaml": "^3.5.2" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "zip-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.0.1.tgz", - "integrity": "sha512-c+eUhhkDpaK87G/py74wvWLtz2kzMPNCCkUApkun50ssE0oQliIQzWpTnwjB+MTKVIf2tGzIgHyqW/Y+W77ecQ==", - "dev": true, - "requires": { - "archiver-utils": "^2.0.0", - "compress-commons": "^1.2.0", - "readable-stream": "^2.0.0" - } - } - } -} diff --git a/package.json b/package.json index 74a5618a..5a03e039 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hedera-web", - "version": "1.408.24", + "version": "22.44.0", "description": "Verdnatura web page", "license": "GPL-3.0", "repository": { @@ -8,22 +8,25 @@ "url": "https://git.verdnatura.es/hedera-web" }, "devDependencies": { - "archiver": "^3.0.0", - "assets-webpack-plugin": "^3.9.7", + "archiver": "^5.3.1", + "assets-webpack-plugin": "^7.1.1", "bundle-loader": "^0.5.6", - "css-loader": "^2.1.0", - "eslint": "^5.13.0", - "file-loader": "^3.0.1", - "fs-extra": "^5.0.0", - "glob": "^7.1.3", + "css-loader": "^6.7.1", + "eslint": "^8.15.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "glob": "^8.0.3", + "html-webpack-plugin": "^5.5.0", "json-loader": "^0.5.7", - "raw-loader": "^1.0.0", - "style-loader": "^0.23.1", - "url-loader": "^1.1.2", - "webpack": "^4.29.1", - "webpack-cli": "^3.2.3", - "webpack-dev-server": "^3.1.14", - "webpack-merge": "^4.2.1", + "node-sass": "^7.0.1", + "raw-loader": "^4.0.2", + "sass-loader": "^12.6.0", + "style-loader": "^3.3.1", + "url-loader": "^4.1.1", + "webpack": "^5.72.1", + "webpack-cli": "^4.9.2", + "webpack-dev-server": "^4.9.0", + "webpack-merge": "^5.8.0", "yaml-loader": "^0.5.0" }, "dependencies": { @@ -33,7 +36,8 @@ "tinymce": "^5.0.0" }, "scripts": { - "dev": "webpack-dev-server --progress --colors --hot", + "front": "webpack serve --open", + "back": "cd ../salix && gulp backOnly", "build": "rm -rf build/ ; webpack", "clean": "rm -rf build/" } diff --git a/pages/production/main.js b/pages/production/main.js index ab388a4d..d3a076e2 100644 --- a/pages/production/main.js +++ b/pages/production/main.js @@ -126,18 +126,18 @@ function display (text, status, error) if (error) { text = text ? text : 'Er'; - $('error').textContent = error; - $('error').style.display = 'block'; + $.error.textContent = error; + $.error.style.display = 'block'; bgColor = 'red'; } else { - $('error').textContent = ''; - $('error').style.display = 'none'; + $.error.textContent = ''; + $.error.style.display = 'none'; bgColor = 'green'; } - $('text').textContent = text; + $.text.textContent = text; body.className = status ? status : ''; body.addEventListener ('transitionend', onTransitionEnd); diff --git a/reports/delivery-note/delivery-note.js b/reports/delivery-note/delivery-note.js deleted file mode 100644 index bfe0332b..00000000 --- a/reports/delivery-note/delivery-note.js +++ /dev/null @@ -1,39 +0,0 @@ - -Hedera.DeliveryNote = new Class({ - Extends: Hedera.Report, - - onTicketReady: function(form) { - if (form.get('method') != 'PICKUP') - Vn.Node.setText(this.$('method'), _('Agency')); - else - Vn.Node.setText(this.$('method'), _('Warehouse')); - }, - - discountRenderer: function(column, form) { - column.value = form.get('discount') ? form.get('discount') : null; - }, - - subtotalRenderer: function(column, form) { - column.value = this.subtotal(form); - }, - - subtotal: function(form) { - var price = form.get('price'); - var discount = form.get('discount'); - return form.get('quantity') * price *((100 - discount) / 100); - }, - - serviceSubtotal: function(column, form) { - column.value = form.get('quantity') * form.get('price'); - }, - - onServicesChanged: function(model) { - this.$('services').node.style.display = - model.numRows > 0 ? 'block' : 'none'; - }, - - onPackagesChanged: function(model) { - this.$('packages').node.style.display = - model.numRows > 0 ? 'block' : 'none'; - } -}); diff --git a/reports/delivery-note/style.css b/reports/delivery-note/style.css deleted file mode 100644 index fe39e671..00000000 --- a/reports/delivery-note/style.css +++ /dev/null @@ -1,45 +0,0 @@ -* -{ - font-size: 4mm; -} -.sheet -{ - height: auto; -} -h2 -{ - font-size: 1.2em; - font-weight: bold; -} -.header -{ - margin-bottom: 2em; -} -.header > div > p -{ - margin: .1em 0; -} -.important -{ - font-size: 1.2em; - font-weight: bold; -} -.address, -.total -{ - margin-top: .8em; -} -.total -{ - text-align: right; -} -.htk-grid -{ - margin-top: 1em; -} -.packages -{ - width: 50%; - margin-left: 0; - display: none; -} diff --git a/reports/delivery-note/ui.xml b/reports/delivery-note/ui.xml deleted file mode 100644 index 23f95654..00000000 --- a/reports/delivery-note/ui.xml +++ /dev/null @@ -1,89 +0,0 @@ -<vn> -<vn-group> - <db-form id="ticket" on-ready="onTicketReady"> - <db-model property="model" id="ticket-data" conn="conn" batch="batch"> - CALL myTicket_get(#ticket) - </db-model> - </db-form> -</vn-group> -<div id="report" class="sheet"> - <h2> - #<htk-text column="id" form="ticket"/> - </h2> - <div class="header"> - <div> - <p> - <t>Preparation</t> <htk-text form="ticket" column="shipped" format="%D"/> - </p> - <p> - <t>Delivery</t> <htk-text form="ticket" column="landed" format="%D"/> - </p> - <p> - <span id="method"></span> <htk-text form="ticket" column="agency"/> - </p> - </div> - <div class="address"> - <p> - <htk-text form="ticket" column="nickname"/> - </p> - <p> - <htk-text form="ticket" column="street"/> - </p> - <p> - <htk-text form="ticket" column="postalCode"/> - <htk-text form="ticket" column="city"/> - (<htk-text form="ticket" column="province"/>) - </p> - </div> - <div class="total"> - <p class="important"> - <t>Total</t> - <htk-text format="%.2d€" form="ticket" column="taxBase"/> - </p> - <p class="important"> - <t>Total + tax</t> - <htk-text format="%.2d€" form="ticket" column="total"/> - </p> - </div> - </div> - <htk-grid> - <db-model property="model" id="movements" conn="conn" batch="batch"> - CALL myTicket_getRows(#ticket) - </db-model> - <htk-column-spin title="_Ref" column="itemFk"/> - <htk-column-spin title="_Amount" column="quantity"/> - <htk-column-text title="_Item" column="concept"/> - <htk-column-text title="_S1" column="size"/> - <htk-column-text title="_Cat" column="category"/> - <htk-column-spin title="_Price" column="price" unit="€" digits="2"/> - <htk-column-spin title="_Disc" column="discount" unit="%" renderer="discountRenderer"/> - <htk-column-spin title="_Subtotal" unit="€" digits="2" renderer="subtotalRenderer"/> - </htk-grid> - <htk-grid id="services"> - <db-model - property="model" - id="services" - conn="conn" - batch="batch" - on-status-changed="onServicesChanged"> - CALL myTicket_getServices(#ticket) - </db-model> - <htk-column-text title="_Service" column="description"/> - <htk-column-spin title="_Amount" column="quantity"/> - <htk-column-spin title="_Price" column="price" unit="€" digits="2"/> - <htk-column-spin title="_Subtotal" unit="€" digits="2" renderer="serviceSubtotal"/> - </htk-grid> - <htk-grid id="packages" class="packages"> - <db-model - property="model" - conn="conn" - batch="batch" - on-status-changed="onPackagesChanged"> - CALL myTicket_getPackages(#ticket) - </db-model> - <htk-column-spin title="_Ref" column="id"/> - <htk-column-spin title="_Amount" column="quantity"/> - <htk-column-text title="_Packaging" column="name"/> - </htk-grid> -</div> -</vn> diff --git a/reports/items-report/items-report.js b/reports/items-report/items-report.js deleted file mode 100644 index 76963065..00000000 --- a/reports/items-report/items-report.js +++ /dev/null @@ -1,5 +0,0 @@ - -Hedera.ItemsReport = new Class -({ - Extends: Hedera.Report -}); diff --git a/reports/items-report/style.css b/reports/items-report/style.css deleted file mode 100644 index 453ef8ba..00000000 --- a/reports/items-report/style.css +++ /dev/null @@ -1,45 +0,0 @@ -* -{ - font-size: 4mm; -} -.sheet -{ - height: auto; -} -h1 -{ - font-weight: normal; - font-size: 200%; - text-align: center; - margin: 0 auto; - margin-bottom: 8mm; -} -.htk-grid -{ - border-collapse: collapse; - width: 100%; - margin: 0 auto; - padding: 0; -} -thead > tr -{ - border-bottom: 1px solid #333; - height: 10mm; -} -th -{ - font-weight: normal; -} -td -{ - padding-left: 2mm; -} -tbody > tr -{ - height: 18mm; -} -.cell-image img -{ - width: 15mm; -} - diff --git a/reports/items-report/ui.xml b/reports/items-report/ui.xml deleted file mode 100644 index 5eb2f1a9..00000000 --- a/reports/items-report/ui.xml +++ /dev/null @@ -1,53 +0,0 @@ -<vn> -<div id="report" class="items sheet"> - <h1> - <t>Item list</t> - </h1> - <htk-grid> - <db-model - property="model" - batch="batch" - conn="conn"> - <custom> - CALL item_getList(#warehouse, CURDATE(), #realm, #rate) - </custom> - </db-model> - <htk-column-image - column="image" - directory="catalog" - subdir="200x200"/> - <htk-column-spin - title="_Id" - column="id"/> - <htk-column-text - title="_Item" - column="name"/> - <htk-column-text - title="_Cat" - column="category"/> - <htk-column-text - title="_Siz" - column="size"/> - <htk-column-text - title="_Ste" - column="stems"/> - <htk-column-spin - title="_Pack" - column="grouping"/> - <htk-column-spin - title="_Aval" - column="available"/> - <htk-column-text - title="_Col" - column="inkFk"/> - <htk-column-text - title="_Ori" - column="origin"/> - <htk-column-text - title="_Price" - column="price" - format="%.2d€" - class="price"/> - </htk-grid> -</div> -</vn> diff --git a/reports/shelves-report/shelves-report.js b/reports/shelves-report/shelves-report.js index a4a8bab8..e681ef81 100644 --- a/reports/shelves-report/shelves-report.js +++ b/reports/shelves-report/shelves-report.js @@ -7,35 +7,29 @@ Hedera.ShelvesReport = new Class({ ,trayThickness: 2 ,trayMargin: 5 - ,open: function(batch) { - this.batch = batch; - this.title = batch.getValue('reportTitle'); - this.maxAmount = batch.getValue('maxAmount'); - this.showPacking = batch.getValue('showPacking'); - this.stack = batch.getValue('stack'); - this.useIds = batch.getValue('useIds'); + ,open: function(lot) { + this.lot = lot; var query = 'SELECT id, name, nTrays, topTrayHeight, trayHeight, width, depth '+ 'FROM shelf WHERE id = #shelf; '+ 'CALL item_listAllocation(#warehouse, #date, #family, #namePrefix, #useIds)'; - this.conn.execQuery(query, this.onQueryExec.bind(this), this.batch); + this.conn.execQuery(query, this.onQueryExec.bind(this), lot.$); } ,onQueryExec: function(resultSet) { // Fetch query data - var res = resultSet.fetchResult(); - res.next(); + const row = resultSet.fetchObject(); // Calculates the scale var maxWidth = 160; var maxHeight = 160; - var shelfWidth = res.get('width'); - var shelfHeight = res.get('trayHeight') * (res.get('nTrays') - 1) + res.get('topTrayHeight'); + var shelfWidth = row.width; + var shelfHeight = row.trayHeight * (row.nTrays - 1) + row.topTrayHeight; var scale = maxWidth / shelfWidth; @@ -44,46 +38,46 @@ Hedera.ShelvesReport = new Class({ // Calculates the shelf dimensions - var shelf = this.shelf = - { - nTrays: res.get('nTrays') - ,trayHeight: res.get('trayHeight') * scale - ,topTrayHeight: res.get('topTrayHeight') * scale - ,width: res.get('width') * scale - ,depth: res.get('depth') * scale + var shelf = this.shelf = { + nTrays: row.nTrays + ,trayHeight: row.trayHeight * scale + ,topTrayHeight: row.topTrayHeight * scale + ,width: row.width * scale + ,depth: row.depth * scale }; // Gets the items var items = this.items = []; var remainings = this.remainings = []; - var res = resultSet.fetchResult(); + var res = resultSet.fetchData(); - if (res.data.length == 0) { + if (res.length == 0) { Htk.Toast.showError(_('No items found, check that all fields are correct')); return; } var boxScale = scale * 10; - while (res.next()) - if (!this.maxAmount || res.get('etiquetas') <= this.maxAmount) { - items.push({ - id: res.get('Id_Article') - ,name: res.get('Article') - ,packing: res.get('packing') - ,amount: res.get('etiquetas') - ,boxHeight: res.get('height') * boxScale - ,boxWidth: res.get('width') * boxScale - ,boxDepth: res.get('depth') * boxScale - }); - } else { - remainings.push({ - id: res.get('Id_Article') - ,name: res.get('Article') - ,packing: res.get('packing') - ,amount: res.get('etiquetas') - }); + for (const row of res) { + if (!this.maxAmount || row.etiquetas <= this.maxAmount) { + items.push({ + id: row.Id_Article + ,name: row.Article + ,packing: row.packing + ,amount: row.etiquetas + ,boxHeight: row.height * boxScale + ,boxWidth: row.width * boxScale + ,boxDepth: row.depth * boxScale + }); + } else { + remainings.push({ + id: row.Id_Article + ,name: row.Article + ,packing: row.packing + ,amount: row.etiquetas + }); + } } // Intializes the allocator diff --git a/rest/client/supplant.php b/rest/client/supplant.php index 4b2dbf49..4ef83402 100644 --- a/rest/client/supplant.php +++ b/rest/client/supplant.php @@ -18,12 +18,12 @@ class Supplant extends Vn\Web\JsonRequest { if (!$isClient) throw new Web\ForbiddenException(s('The user is not a client')); - $isWorker = $db->getValue( - 'SELECT COUNT(*) > 0 FROM vn.worker WHERE id = #', + $hasAccount = $db->getValue( + 'SELECT COUNT(*) > 0 FROM account.account WHERE id = #', [$userId] ); - if ($isWorker) - throw new Web\ForbiddenException(s('Workers cannot be supplanted')); + if ($hasAccount) + throw new Web\ForbiddenException(s('The user is not impersonable')); return $this->service->createToken($_REQUEST['supplantUser']); } diff --git a/rest/core/query.php b/rest/core/query.php index a188e300..fb09ab27 100644 --- a/rest/core/query.php +++ b/rest/core/query.php @@ -74,7 +74,7 @@ class Query extends Vn\Web\JsonRequest { /** * Transforms the database result into a JSON parseable object. - **/ + */ function transformResult($result) { $tableMap = []; $columns = $result->fetch_fields(); @@ -132,12 +132,11 @@ class Query extends Vn\Web\JsonRequest { $tableIndex = $tableMap[$column->table]; if ($column->flags & MYSQLI_PRI_KEY_FLAG) - $resultMap['tables'][$tableIndex]['pks'][] = $i; + $resultMap['tables'][$tableIndex]['pks'][] = $column->name; $default = $this->castValue($column->def, $type); - $resultMap['columns'][] = - [ + $resultMap['columns'][] = [ 'type' => $type, 'flags' => $column->flags, 'def' => $default, @@ -161,7 +160,7 @@ class Query extends Vn\Web\JsonRequest { /** * Transforms the database value into a JSON parseable value. - **/ + */ function castValue($value, $type) { if ($value === '' && $type != Type::STRING) $value = NULL; diff --git a/rest/edi/sql/bucket.sql b/rest/edi/sql/bucket.sql deleted file mode 100644 index 9b2d2dfa..00000000 --- a/rest/edi/sql/bucket.sql +++ /dev/null @@ -1,14 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE bucket - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8, @col9, @col10, @col11, @col12) - SET - bucket_id = @col2, - bucket_type_id = @col4, - description = @col5, - x_size = @col6, - y_size = @col7, - z_size = @col8, - entry_date = STR_TO_DATE(@col10, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col11, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col12, '%Y%m%d%H%i') diff --git a/rest/edi/sql/bucket_type.sql b/rest/edi/sql/bucket_type.sql deleted file mode 100644 index 11bcc7f0..00000000 --- a/rest/edi/sql/bucket_type.sql +++ /dev/null @@ -1,10 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE bucket_type - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6) - SET - bucket_type_id = @col2, - description = @col3, - entry_date = STR_TO_DATE(@col4, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col5, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col6, '%Y%m%d%H%i') diff --git a/rest/edi/sql/feature.sql b/rest/edi/sql/feature.sql deleted file mode 100644 index a5d2833c..00000000 --- a/rest/edi/sql/feature.sql +++ /dev/null @@ -1,11 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE `feature` - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6, @col7) - SET - item_id = @col2, - feature_type_id = @col3, - feature_value = @col4, - entry_date = STR_TO_DATE(@col5, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col6, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col7, '%Y%m%d%H%i') diff --git a/rest/edi/sql/genus.sql b/rest/edi/sql/genus.sql deleted file mode 100644 index 0e60fd79..00000000 --- a/rest/edi/sql/genus.sql +++ /dev/null @@ -1,10 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE genus - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6) - SET - genus_id = @col2, - latin_genus_name = @col3, - entry_date = STR_TO_DATE(@col4, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col5, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col6, '%Y%m%d%H%i') diff --git a/rest/edi/sql/item.sql b/rest/edi/sql/item.sql deleted file mode 100644 index 1c348439..00000000 --- a/rest/edi/sql/item.sql +++ /dev/null @@ -1,13 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE item - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8, @col9, @col10, @col11, @col12) - SET - id = @col2, - product_name = @col4, - name = @col5, - plant_id = @col7, - group_id = @col9, - entry_date = STR_TO_DATE(@col10, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col11, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col12, '%Y%m%d%H%i') diff --git a/rest/edi/sql/item_feature.sql b/rest/edi/sql/item_feature.sql deleted file mode 100644 index 81ddbc73..00000000 --- a/rest/edi/sql/item_feature.sql +++ /dev/null @@ -1,12 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE `item_feature` - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8) - SET - item_id = @col2, - feature = @col3, - regulation_type = @col4, - presentation_order = @col5, - entry_date = STR_TO_DATE(@col6, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col7, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col8, '%Y%m%d%H%i') diff --git a/rest/edi/sql/item_group.sql b/rest/edi/sql/item_group.sql deleted file mode 100644 index cbdc1328..00000000 --- a/rest/edi/sql/item_group.sql +++ /dev/null @@ -1,10 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE item_group - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6) - SET - group_code = @col2, - dutch_group_description = @col3, - entry_date = STR_TO_DATE(@col4, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col5, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col6, '%Y%m%d%H%i') diff --git a/rest/edi/sql/plant.sql b/rest/edi/sql/plant.sql deleted file mode 100644 index ba969afa..00000000 --- a/rest/edi/sql/plant.sql +++ /dev/null @@ -1,11 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE plant - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8, @col9) - SET - plant_id = @col3, - genus_id = @col4, - specie_id = @col5, - entry_date = STR_TO_DATE(@col7, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col8, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col9, '%Y%m%d%H%i') diff --git a/rest/edi/sql/specie.sql b/rest/edi/sql/specie.sql deleted file mode 100644 index 883d97b7..00000000 --- a/rest/edi/sql/specie.sql +++ /dev/null @@ -1,11 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE specie - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6, @col7) - SET - specie_id = @col2, - genus_id = @col3, - latin_species_name = @col4, - entry_date = STR_TO_DATE(@col5, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col6, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col7, '%Y%m%d%H%i') diff --git a/rest/edi/sql/supplier.sql b/rest/edi/sql/supplier.sql deleted file mode 100644 index 636d0a0b..00000000 --- a/rest/edi/sql/supplier.sql +++ /dev/null @@ -1,11 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE supplier - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8, @col9, @col10, @col11, @col12, @col13, @col14, @col15, @col16, @col17, @col18, @col19, @col20) - SET - GLNAddressCode = @col2, - supplier_id = @col4, - company_name = @col3, - entry_date = STR_TO_DATE(@col9, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col10, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col11, '%Y%m%d%H%i') diff --git a/rest/edi/sql/type.sql b/rest/edi/sql/type.sql deleted file mode 100644 index 77c0883d..00000000 --- a/rest/edi/sql/type.sql +++ /dev/null @@ -1,11 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE `type` - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6, @col7) - SET - type_id = @col2, - type_group_id = @col3, - description = @col4, - entry_date = STR_TO_DATE(@col5, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col6, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col7, '%Y%m%d%H%i') diff --git a/rest/edi/sql/value.sql b/rest/edi/sql/value.sql deleted file mode 100644 index 288b8c10..00000000 --- a/rest/edi/sql/value.sql +++ /dev/null @@ -1,11 +0,0 @@ -LOAD DATA LOCAL INFILE #file - INTO TABLE `value` - FIELDS TERMINATED BY ';' - LINES TERMINATED BY '\n' (@col1, @col2, @col3, @col4, @col5, @col6, @col7) - SET - type_id = @col2, - type_value = @col3, - type_description = @col4, - entry_date = STR_TO_DATE(@col5, '%Y%m%d'), - expiry_date = IFNULL(NULL,STR_TO_DATE(@col6, '%Y%m%d')), - change_date_time = STR_TO_DATE(@col7, '%Y%m%d%H%i') diff --git a/rest/edi/update.php b/rest/edi/update.php deleted file mode 100644 index 87ca6d21..00000000 --- a/rest/edi/update.php +++ /dev/null @@ -1,113 +0,0 @@ -<?php - -class Update extends Vn\Lib\Method { - function run($db) { - $db->selectDb('edi'); - $db->getHandler()->options(MYSQLI_OPT_LOCAL_INFILE, TRUE); - - $tmpDir = '/tmp/floricode'; - - // Establish the FTP connection - - $ftpConf = $db->getRow('SELECT host, user, password FROM ftpConfig'); - - echo "Openning FTP connection to {$ftpConf['host']}\n"; - $ftpConn = ftp_connect($ftpConf['host']); - - if (!$ftpConn) - throw new Exception('Can not connect to '. $ftpConf['host']); - - if (!ftp_login($ftpConn, $ftpConf['user'], $ftpConf['password'])) - throw new Exception('Can not login to '. $ftpConf['user'] .'@'. $ftpConf['host']); - ftp_pasv($ftpConn, true); - - // Gets the list with the tables to update - - set_time_limit(0); - - $res = $db->query( - 'SELECT fileName, toTable, file, updated FROM fileConfig'); - - $dwFiles = []; - - if (!file_exists($tmpDir)) - mkdir($tmpDir); - - while ($row = $res->fetch_assoc()) - try { - $file = $row['file']; - $table = $row['toTable']; - $baseName = $row['fileName']; - - if ($row['updated']) { - $updated = DateTime::createFromFormat('Y-m-d', $row['updated']); - $updated->setTime(0, 0, 0); - } else - $updated = NULL; - - $remoteFile = "codes/$file.ZIP"; - $zipFile = "$tmpDir/$file.zip"; - $ucDir = "$tmpDir/$file"; - - // Downloads and decompress the file with the data - - if (!isset($dwFiles[$file])) { - $dwFiles[$file] = TRUE; - - echo "Downloading $remoteFile\n"; - if (!ftp_get($ftpConn, $zipFile, $remoteFile, FTP_BINARY)) - throw new Exception("Error downloading $remoteFile to $zipFile"); - - $zip = new ZipArchive; - - if ($zip->open($zipFile) !== TRUE) - throw new Exception("Can not open $zipFile"); - - @mkdir($ucDir, 0774, TRUE); - - if (!$zip->extractTo($ucDir)) - throw new Exception("Can not uncompress file $zipFile"); - - $zip->close(); - unlink($zipFile); - } - - foreach (glob("$ucDir/$baseName*.txt") as $fileName) - break; - - if (empty($fileName)) - throw new Exception("Import file for table $table does not exist"); - - // If data is updated, omits the table - - $lastUpdated = substr($fileName, -10, 6); - $lastUpdated = DateTime::createFromFormat('dmy', $lastUpdated); - $lastUpdated->setTime(0, 0, 0); - - if (isset($updated) && $lastUpdated <= $updated) { - echo "Table $table is updated, omitted\n"; - continue; - } - - // Updates the table - - echo "Dumping data to table $table\n"; - - $db->query("START TRANSACTION"); - $db->query("DELETE FROM {$db->quote($table)}"); - $db->queryFromFile(__DIR__."/sql/$table", ['file' => $fileName]); - $db->query("UPDATE fileConfig SET updated = # WHERE fileName = #", - [$lastUpdated, $baseName] - ); - $db->query("COMMIT"); - } catch (Exception $e) { - error_log($e->getMessage()); - $db->query('ROLLBACK'); - } - - shell_exec("rm -R $tmpDir"); - ftp_close($ftpConn); - - echo "Update completed\n"; - } -} diff --git a/rest/image/image.php b/rest/image/image.php index 1e5b3112..0c104851 100644 --- a/rest/image/image.php +++ b/rest/image/image.php @@ -7,7 +7,7 @@ class Image { * Creates an image resource from a valid image file. * * @param string $srcFile The source file name - **/ + */ static function create($srcFile) { $imageType = exif_imagetype($srcFile); @@ -20,7 +20,13 @@ class Image { $image = imagecreatefrompng($srcFile); break; case IMAGETYPE_GIF: - $image = imagecreatefromgif ($srcFile); + $image = imagecreatefromgif($srcFile); + break; + case IMAGETYPE_WEBP: + $image = imagecreatefromwebp($srcFile); + break; + case IMAGETYPE_BMP: + $image = imagecreatefrombmp($srcFile); break; default: throw new UserException(s('Bad file format')); @@ -39,7 +45,7 @@ class Image { * @param integer $maxWidth The maximum width of resized image in pixels * @param boolean $crop Wether to crop the image * @param boolean $symbolicSrc If it is not necessary to resize the image creates a symbolic link using the passed path as source - **/ + */ static function resizeSave($image, $dstFile, $maxHeight, $maxWidth, $crop = FALSE, $symbolicSrc = NULL) { $width = imagesx($image); $height = imagesy($image); diff --git a/rest/core/IndieFlower.ttf b/rest/misc/IndieFlower.ttf similarity index 100% rename from rest/core/IndieFlower.ttf rename to rest/misc/IndieFlower.ttf diff --git a/rest/misc/access-version.php b/rest/misc/access-version.php deleted file mode 100644 index 63f74a8d..00000000 --- a/rest/misc/access-version.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php - -use Vn\Lib; -use Vn\Lib\UserException; - -/** - * Uploads a access module. - */ -class AccessVersion extends Vn\Web\JsonRequest { - const PARAMS = [ - 'appName' - ,'newVersion' - ]; - - function run($db) { - // Checks for file errors. - - $moduleFile = $_FILES['moduleFile']; - - if (empty($moduleFile['name'])) - throw new UserException(s('File not choosed')); - - if ($moduleFile['error'] != 0) { - switch ($_FILES['image']['error']) { - case UPLOAD_ERR_INI_SIZE: - $message = 'ErrIniSize'; - break; - case UPLOAD_ERR_FORM_SIZE: - $message = 'ErrFormSize'; - break; - case UPLOAD_ERR_PARTIAL: - $message = 'ErrPartial'; - break; - case UPLOAD_ERR_NO_FILE: - $message = 'ErrNoFile'; - break; - case UPLOAD_ERR_NO_TMP_DIR: - $message = 'ErrNoTmpDir'; - break; - case UPLOAD_ERR_CANT_WRITE: - $message = 'ErrCantWrite'; - break; - case UPLOAD_ERR_EXTENSION: - $message = 'ErrExtension'; - break; - default: - $message = 'ErrDefault'; - break; - } - - throw new Lib\Exception(s($message)); - } - - // Defining parameters - - $appName = $_REQUEST['appName']; - $newVersion = $_REQUEST['newVersion']; - - $accessDir = _DATA_DIR .'/'. $this->app->getName() .'/vn-access'; - $headFile = "$accessDir/$appName.7z"; - $archiveRelPath = ".archive/$appName/$newVersion.7z"; - $archiveFullPath = "$accessDir/$archiveRelPath"; - - // Updates the application - - rename($moduleFile['tmp_name'], $archiveFullPath); - chmod($archiveFullPath, 0644); - - @unlink($headFile); - symlink($archiveRelPath, $headFile); - - return TRUE; - } -} diff --git a/rest/core/captcha.php b/rest/misc/captcha.php similarity index 100% rename from rest/core/captcha.php rename to rest/misc/captcha.php diff --git a/rest/tpv/confirm-mail.php b/rest/tpv/confirm-mail.php index 29fcbf68..719bfed1 100644 --- a/rest/tpv/confirm-mail.php +++ b/rest/tpv/confirm-mail.php @@ -4,7 +4,7 @@ require_once(__DIR__.'/tpv.php'); /** * Gets transaction confirmations from the IMAP mailbox. - **/ + */ class ConfirmMail extends Vn\Lib\Method { function run($db) { $imap = NULL; diff --git a/rest/tpv/confirm-post.php b/rest/tpv/confirm-post.php index 9aef1112..20d3cb79 100644 --- a/rest/tpv/confirm-post.php +++ b/rest/tpv/confirm-post.php @@ -4,7 +4,7 @@ require_once(__DIR__.'/tpv.php'); /** * Gets transaction confirmation from HTTP POST. - **/ + */ class ConfirmPost extends Vn\Web\RestRequest { function run($db) { Tpv::confirm($db, $_POST); diff --git a/rest/tpv/confirm-soap.php b/rest/tpv/confirm-soap.php index 07e44d2b..0af1cd8e 100644 --- a/rest/tpv/confirm-soap.php +++ b/rest/tpv/confirm-soap.php @@ -5,7 +5,7 @@ require_once(__DIR__.'/tpv.php'); /** * Gets transaction confirmation from SOAP service. - **/ + */ class ConfirmSoap extends Vn\Web\RestRequest { function run($db) { global $tpvConfirmSoap; diff --git a/rest/tpv/tpv.php b/rest/tpv/tpv.php index 652de159..3ae34f04 100644 --- a/rest/tpv/tpv.php +++ b/rest/tpv/tpv.php @@ -3,7 +3,7 @@ class Tpv { /** * Tryes to confirm a transaction with the given params. - **/ + */ static function confirm($db, $params) { if (!(isset($params['Ds_Amount']) && isset($params['Ds_Order']) diff --git a/rest/core/account.php b/rest/user/account.php similarity index 100% rename from rest/core/account.php rename to rest/user/account.php diff --git a/rest/core/recover-password.php b/rest/user/recover-password.php similarity index 100% rename from rest/core/recover-password.php rename to rest/user/recover-password.php diff --git a/rest/core/restore-password.php b/rest/user/restore-password.php similarity index 98% rename from rest/core/restore-password.php rename to rest/user/restore-password.php index 7dec59df..4b87672f 100644 --- a/rest/core/restore-password.php +++ b/rest/user/restore-password.php @@ -4,7 +4,7 @@ include __DIR__.'/account.php'; /** * Restores the user password. - **/ + */ class RestorePassword extends Vn\Web\JsonRequest { const PARAMS = ['verificationToken', 'newPassword']; diff --git a/rest/core/supplant.php b/rest/user/supplant.php similarity index 100% rename from rest/core/supplant.php rename to rest/user/supplant.php diff --git a/web/app.php b/web/app.php index c47d31b2..4f1e5636 100644 --- a/web/app.php +++ b/web/app.php @@ -7,7 +7,7 @@ namespace Vn\Web; * * Format for $_REQUEST['srv'] variable: * - [serviceName]:[requestDir]/[requestFile] - **/ + */ class App extends \Vn\Lib\App { protected $conn = NULL; private $allowedServices = @@ -48,7 +48,7 @@ class App extends \Vn\Lib\App { * or the default config file if isn't defined a file for the vhost. * * @return string The config file name - **/ + */ function getConfigFile() { if (!empty($_SERVER['SERVER_NAME']) && preg_match('/^[\w\-\.]+$/', $_SERVER['SERVER_NAME'])) { diff --git a/web/html-service.php b/web/html-service.php index 5eb3cc6e..cef4c6ec 100644 --- a/web/html-service.php +++ b/web/html-service.php @@ -66,7 +66,7 @@ class HtmlService extends Service { // Setting the version - setcookie('vnVersion', $this->getVersion()); + setcookie('vnVersion', $this->getVersion(), ['samesite' => 'Lax']); // Loading the requested page diff --git a/web/html.php b/web/html.php index 1f72e134..a92c9072 100644 --- a/web/html.php +++ b/web/html.php @@ -30,15 +30,25 @@ function getWebpackAssets() { if (_DEV_MODE) { $devServerPort = $wpConfig->devServerPort; $host = $_SERVER['SERVER_NAME']; - $serverPath = "http://$host:$devServerPort/"; + $serverPath = "http://$host:$devServerPort"; } $wpAssets = json_decode(file_get_contents("$buildDir/webpack-assets.json")); $jsFiles = []; foreach ($wpAssets as $name => $asset) - if (!empty($name) && $name != '_empty_' && property_exists($asset, 'js')) + if (!empty($name) + && $name != '_empty_' + && $name != 'main' + && property_exists($asset, 'js')) $jsFiles[] = $serverPath . $asset->js; + if (isset($wpAssets->_empty_)) + $jsFiles[] = $serverPath . $wpAssets->_empty_->js[0]; + if (isset($wpAssets->{''})) + $jsFiles[] = $serverPath . $wpAssets->{''}->js[0]; + + $jsFiles[] = $serverPath . $wpAssets->main->js; + return $jsFiles; } diff --git a/web/json-exception.php b/web/json-exception.php index d71e16f6..7b22549b 100644 --- a/web/json-exception.php +++ b/web/json-exception.php @@ -8,7 +8,7 @@ namespace Vn\Web; * @property string $exception The exception name * @property string $message The message string * @property string $code The code of message - **/ + */ class JsonException { var $exception = NULL; var $message; diff --git a/web/json-reply.php b/web/json-reply.php index a3f7a4fa..07b24579 100644 --- a/web/json-reply.php +++ b/web/json-reply.php @@ -7,7 +7,7 @@ namespace Vn\Web; * * @property Object $data The returned data * @property array $warnings Array with warning messages - **/ + */ class JsonReply { var $data = NULL; var $warnings = NULL; diff --git a/web/json-request.php b/web/json-request.php index 58c5bdf5..f8535fa8 100644 --- a/web/json-request.php +++ b/web/json-request.php @@ -4,6 +4,6 @@ namespace Vn\Web; /** * Base class for JSON services. - **/ + */ abstract class JsonRequest extends RestRequest {} diff --git a/web/json-service.php b/web/json-service.php index 497d033e..07cad21a 100644 --- a/web/json-service.php +++ b/web/json-service.php @@ -3,6 +3,7 @@ namespace Vn\Web; use Vn\Lib; +use Vn\Lib\Locale; /** * Base class for JSON application. diff --git a/web/jwt.php b/web/jwt.php index 121ac22a..5aec98e5 100644 --- a/web/jwt.php +++ b/web/jwt.php @@ -7,7 +7,7 @@ use Exception; /** * Basic class to encode, decode and verify JWT tokens. It implements the HS256 * algorithm from the RFC 7519 standard. - **/ + */ class Jwt { /** * Creates a new JWT token with the passed $payload and $key. @@ -15,7 +15,7 @@ class Jwt { * @param {Array} $payload The data to encode * @param {string} $key The key used to sign the token * @return {string} The new JWT token - **/ + */ static function encode($payload, $key) { $header = [ 'alg' => 'HS256', @@ -35,7 +35,7 @@ class Jwt { * @param {Array} $token The JWT token * @param {string} $key The key used to validate the token * @return {string} The JWT validated and decoded data - **/ + */ static function decode($token, $key) { $parts = explode('.', $token); diff --git a/web/rest-request.php b/web/rest-request.php index 78f6796a..55fa0878 100644 --- a/web/rest-request.php +++ b/web/rest-request.php @@ -9,7 +9,7 @@ class Security { /** * Base class for REST services. - **/ + */ abstract class RestRequest extends \Vn\Lib\Method { const PARAMS = NULL; const SECURITY = Security::DEFINER; diff --git a/web/service.php b/web/service.php index 5ed93443..b0a45be5 100644 --- a/web/service.php +++ b/web/service.php @@ -124,7 +124,10 @@ abstract class Service { ); if (isset($row['access'])) { - setcookie('vnVisit', $row['visit'], time() + 31536000); // 1 Year + setcookie('vnVisit', $row['visit'], [ + 'expires' => time() + 31536000, // 1 Year + 'samesite' => 'Lax' + ]); $_SESSION['access'] = $row['access']; } else $_SESSION['skipVisit'] = TRUE; diff --git a/webpack.config.js b/webpack.config.js index 547379d5..84eba3a8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,15 +1,15 @@ -var path = require('path'); -var webpack = require('webpack'); -var AssetsWebpackPlugin = require('assets-webpack-plugin'); -var merge = require('webpack-merge'); -var wpConfig = require('./webpack.config.json'); +const path = require('path'); +const webpack = require('webpack'); +const AssetsWebpackPlugin = require('assets-webpack-plugin'); +const merge = require('webpack-merge').merge; +const wpConfig = require('./webpack.config.json'); let env = process.env.NODE_ENV || 'development'; -var devMode = env === 'development'; -var outputPath = path.join(__dirname, wpConfig.buildDir); -var publicPath = wpConfig.buildDir +'/'; +const devMode = env === 'development'; +const outputPath = path.join(__dirname, wpConfig.buildDir); +const publicPath = '/' + wpConfig.buildDir + '/'; -var baseConfig = { +const baseConfig = { entry: wpConfig.entry, mode: devMode ? 'development' : 'production', output: { @@ -18,10 +18,31 @@ var baseConfig = { }, module: { rules: [ - { test: /\.css$/, loader: 'style-loader!css-loader' }, - { test: /\.yml$/, loader: 'json-loader!yaml-loader' }, - { test: /\.xml$/, loader: 'raw-loader' }, - { test: /\.ttf$/, loader: 'file-loader' } + { + test: /\.css$/, + use: ['style-loader', 'css-loader'], + }, { + test: /\.yml$/, + use: ['json-loader', 'yaml-loader'] + }, { + test: /\.xml$/, + use: 'raw-loader' + }, { + test: /\.ttf$/, + type: 'asset/resource' + }, { + test: /\.scss$/, + use: [ + 'style-loader', + 'css-loader', + { + loader: 'sass-loader', + options: { + sourceMap: true + } + } + ] + } ] }, resolve: { @@ -56,30 +77,31 @@ var baseConfig = { } }; -var prodConfig = { +const prodConfig = { output: { filename: '[name].[chunkhash].js', chunkFilename: 'chunk.[id].[chunkhash].js' }, - plugins: [ - new webpack.HashedModuleIdsPlugin() - ], + optimization: { + moduleIds: 'deterministic' + }, devtool: 'source-map' }; -var devConfig = { +const devConfig = { output: { filename: '[name].js', chunkFilename: 'chunk.[id].js' }, - plugins: [ - new webpack.NamedModulesPlugin() - ], + optimization: { + moduleIds: 'named' + }, devServer: { host: '0.0.0.0', + static: __dirname, port: wpConfig.devServerPort, headers: {'Access-Control-Allow-Origin': '*'}, - stats: { chunks: false }, + //stats: { chunks: false }, proxy: { '/api': 'http://localhost:3000', '/': { @@ -91,5 +113,5 @@ var devConfig = { devtool: 'eval' }; -var mrgConfig = devMode ? devConfig : prodConfig; +const mrgConfig = devMode ? devConfig : prodConfig; module.exports = merge(baseConfig, mrgConfig); diff --git a/webpack.config.json b/webpack.config.json index 165f3eb4..9822dd4d 100644 --- a/webpack.config.json +++ b/webpack.config.json @@ -1,5 +1,5 @@ { "buildDir": "build", - "devServerPort": 9000, - "entry": {"main": "./app.js"} + "devServerPort": 9090, + "entry": "./app.js" } \ No newline at end of file