1
0
Fork 0
mirror of synced 2024-06-18 02:34:54 +12:00

New service callbacks

This commit is contained in:
eldadfux 2019-08-07 13:46:51 +03:00
parent ef9be3761f
commit 3628f356b3
5 changed files with 121 additions and 117 deletions

View file

@ -24,13 +24,11 @@
},
"require": {
"php": ">=7.3.0",
"ext-mysqlnd": "*",
"ext-curl": "*",
"ext-imagick": "*",
"ext-mbstring": "*",
"ext-json": "*",
"ext-dom": "*",
"ext-newrelic": "*",
"ext-redis": "*",
"ext-pdo": "*",
"ext-openssl": "*",
@ -53,7 +51,6 @@
"piwik/device-detector": "3.5.1",
"eldadfux/mailgun-lite": "master",
"dragonmantank/cron-expression": "2.2.0",
"sentry/sentry": "1.9.*",
"domnikl/statsd": "2.0.*",
"influxdb/influxdb-php": "1.15.*",
"bacon/bacon-qr-code": "2.0.0",

68
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"content-hash": "83fe01a42c79683e1d521172aec04743",
"content-hash": "2dfb6641e152a77d5562925e735890e0",
"packages": [
{
"name": "appwrite/php-clamav",
@ -1316,70 +1316,6 @@
"description": "A polyfill for getallheaders.",
"time": "2019-03-08T08:55:37+00:00"
},
{
"name": "sentry/sentry",
"version": "1.9.2",
"source": {
"type": "git",
"url": "https://github.com/getsentry/sentry-php.git",
"reference": "6b4c80ee1f5d9d5ab5bae949f4eb5d758a0bf64b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/getsentry/sentry-php/zipball/6b4c80ee1f5d9d5ab5bae949f4eb5d758a0bf64b",
"reference": "6b4c80ee1f5d9d5ab5bae949f4eb5d758a0bf64b",
"shasum": ""
},
"require": {
"ext-curl": "*",
"php": "^5.3|^7.0"
},
"conflict": {
"raven/raven": "*"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^1.8.0",
"monolog/monolog": "*",
"phpunit/phpunit": "^4.8.35 || ^5.7"
},
"suggest": {
"ext-hash": "*",
"ext-json": "*",
"ext-mbstring": "*",
"monolog/monolog": "Automatically capture Monolog events as breadcrumbs"
},
"bin": [
"bin/sentry"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.10.x-dev"
}
},
"autoload": {
"psr-0": {
"Raven_": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "David Cramer",
"email": "dcramer@gmail.com"
}
],
"description": "A PHP client for Sentry (http://getsentry.com)",
"homepage": "http://getsentry.com",
"keywords": [
"log",
"logging"
],
"time": "2018-08-18T19:41:03+00:00"
},
{
"name": "symfony/polyfill-ctype",
"version": "dev-master",
@ -3271,13 +3207,11 @@
"prefer-lowest": false,
"platform": {
"php": ">=7.3.0",
"ext-mysqlnd": "*",
"ext-curl": "*",
"ext-imagick": "*",
"ext-mbstring": "*",
"ext-json": "*",
"ext-dom": "*",
"ext-newrelic": "*",
"ext-redis": "*",
"ext-pdo": "*",
"ext-openssl": "*",

View file

@ -2371,10 +2371,12 @@ window.getSelection().removeAllRanges();});element.parentNode.parentNode.appendC
document.body.classList.add(prefix+'-'+value);cookie.set('language-'+prefix,value,365);document.dispatchEvent(new CustomEvent('updated-language-'+prefix));};document.addEventListener('updated-language-'+prefix,function(){element.value=cookie.get('language-'+prefix);});let def=cookie.get('language-'+prefix)||element.options[0].value;select(def);element.value=def;}}).add({selector:'data-ls-ui-chart',repeat:false,controller:function(element,container,date,document){let child=document.createElement('canvas');child.width=500;child.height=175;let stats=container.get('usage');if(!stats||!stats['requests']||!stats['requests']['data']){return;}
let config={type:'line',data:{labels:[],datasets:[{label:'Requests',backgroundColor:'rgba(230, 248, 253, 0.3)',borderColor:'#29b5d9',borderWidth:2,data:[0,0,0,0,0,0,0],fill:true}]},options:{responsive:true,title:{display:false,text:'Stats'},legend:{display:false},tooltips:{mode:'index',intersect:false,caretPadding:0},hover:{mode:'nearest',intersect:true},scales:{xAxes:[{display:false}],yAxes:[{display:false,}]}}};for(let i=0;i<stats['requests']['data'].length;i++){config.data.datasets[0].data[i]=stats['requests']['data'][i].value;config.data.labels[i]=date.format('d F Y',stats['requests']['data'][i].date);}
let chart=container.get('chart');if(chart){}
element.innerHTML='';element.appendChild(child);container.set('chart',new Chart(child.getContext('2d'),config),true);element.dataset['canvas']=true;}});(function(window){"use strict";window.ls.container.get('view').add({selector:'data-service',repeat:false,controller:function(element,view,container,form,alerts,expression,window){let action=element.dataset['service'];let service=element.dataset['name']||action;let event=element.dataset['event'];let confirm=element.dataset['confirm']||'';let loading=element.dataset['loading']||'';let loaderId=null;let scope=element.dataset['scope']||'sdk';let debug=!!(element.dataset['debug']);if(debug)console.log('%c[service init]: '+action+' ('+service+')','color:red');let resolve=function(target){let data=('FORM'===element.tagName)?form.toJson(element):{};const REGEX_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;const REGEX_FUNCTION_PARAMS=/(?:\s*(?:function\s*[^(]*)?\s*)((?:[^'"]|(?:(?:(['"])(?:(?:.*?[^\\]\2)|\2))))*?)\s*(?=(?:=>)|{)/m;const REGEX_PARAMETERS_VALUES=/\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm;function getParams(func){let functionAsString=func.toString();let params=[];let match;functionAsString=functionAsString.replace(REGEX_COMMENTS,'');functionAsString=functionAsString.match(REGEX_FUNCTION_PARAMS)[1];if(functionAsString.charAt(0)==='('){functionAsString=functionAsString.slice(1,-1);}
element.innerHTML='';element.appendChild(child);container.set('chart',new Chart(child.getContext('2d'),config),true);element.dataset['canvas']=true;}});(function(window){"use strict";window.ls.container.get('view').add({selector:'data-service',repeat:false,controller:function(element,view,container,form,alerts,expression,window,router){let action=element.dataset['service'];let service=element.dataset['name']||action;let event=element.dataset['event'];let confirm=element.dataset['confirm']||'';let loading=element.dataset['loading']||'';let loaderId=null;let scope=element.dataset['scope']||'sdk';let debug=!!(element.dataset['debug']);let callback=(element.dataset['callbacks']||'');callback=(callback&&callback!='')?callback.trim().split(','):[];if(debug)console.log('%c[service init]: '+action+' ('+service+')','color:red');let callbacks={'reset':function(){return function(){if('FORM'===element.tagName){return element.reset();}
throw new Error('This callback is only valid for forms');}},'alert':function(){return function(alerts){let alert=element.dataset['successAlert']||'Success';alerts.send({text:alert,class:'success'},3000);}},'redirect':function(){return function(router){let url=expression.parse(element.dataset['successRedirectUrl'])||'/';router.change(url);}},'reload':function(){return function(router){router.reload();}},'trigger':function(){return function(document){let triggers=element.dataset['successTriggers']||'';triggers=triggers.trim().split(',');for(let i=0;i<triggers.length;i++){if(''===triggers[i]){continue;}
if(debug)console.log('%c[event triggered]: '+triggers[i],'color:green');document.dispatchEvent(new CustomEvent(triggers[i]));}}}};let getParams=function getParams(func){const REGEX_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;const REGEX_FUNCTION_PARAMS=/(?:\s*(?:function\s*[^(]*)?\s*)((?:[^'"]|(?:(?:(['"])(?:(?:.*?[^\\]\2)|\2))))*?)\s*(?=(?:=>)|{)/m;const REGEX_PARAMETERS_VALUES=/\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm;let functionAsString=func.toString();let params=[];let match;functionAsString=functionAsString.replace(REGEX_COMMENTS,'');functionAsString=functionAsString.match(REGEX_FUNCTION_PARAMS)[1];if(functionAsString.charAt(0)==='('){functionAsString=functionAsString.slice(1,-1);}
while(match=REGEX_PARAMETERS_VALUES.exec(functionAsString)){params.push(match[1]);}
return params;}
let args=getParams(target);if(debug)console.log('%c[form data]: ','color:green',data);return target.apply(target,args.map(function(value){let result=null;if(!value){return null;}
let resolve=function(target,prefix='param',data={}){let args=getParams(target);if(debug)console.log('%c[form data]: ','color:green',data);return target.apply(target,args.map(function(value){let result=null;if(!value){return null;}
if(element.dataset['param'+value.charAt(0).toUpperCase()+value.slice(1)]){result=expression.parse(element.dataset['param'+value.charAt(0).toUpperCase()+value.slice(1)]);}
if(data[value]){result=data[value];}
if(!result){result='';}
@ -2383,12 +2385,15 @@ if(event){event.preventDefault();}
if(confirm){if(window.confirm(confirm)!==true){return false;}}
if(loading){loaderId=alerts.send({text:loading,class:''},0);}
let method=container.path(scope+'.'+action);if(!method){throw new Error('Method "'+scope+'.'+action+'" not found');}
let result=resolve(method);if(!result){return;}
let result=resolve(method,'param',('FORM'===element.tagName)?form.toJson(element):{});if(!result){return;}
result.then(function(data){if(loaderId!==null){alerts.remove(loaderId);}
if(!element){return;}
try{container.set(service.replace('.','-'),data,true,true);if(debug)console.log('%cservice ready: "'+service.replace('.','-')+'"','color:green');if(debug)console.log('%cservice:','color:blue',container.get(service.replace('.','-')));}catch(e){container.set(service.replace('.','-'),{},true);}
for(let i=0;i<callback.length;i++){container.resolve(resolve(callbacks[callback[i]],'successParam',{}));}
element.$lsSkip=false;view.render(element);},function(exception){if(loaderId!==null){alerts.remove(loaderId);}
if(!element){return;}});};let events=event.trim().split(',');for(let y=0;y<events.length;y++){if(''===events[y]){continue;}
if(!element){return;}
for(let i=0;i<callback.length;i++){container.resolve(resolve(callbacks[callback[i]],'failureParam',{}));}
element.$lsSkip=false;view.render(element);});};let events=event.trim().split(',');for(let y=0;y<events.length;y++){if(''===events[y]){continue;}
switch(events[y].trim()){case'load':exec();break;case'none':break;case'click':case'change':case'keypress':case'keydown':case'keyup':case'input':case'submit':element.addEventListener(events[y],exec);break;default:document.addEventListener(events[y],exec);}
if(debug)console.log('%cregistered: "'+events[y].trim()+'" ('+service+')','color:blue');}}});})(window);(function(window){"use strict";window.ls.container.get('view').add({'selector':'data-analytics-event','controller':function(element){var action=element.getAttribute('data-event-action')||'click';element.addEventListener(action,function(){var category=element.getAttribute('data-event-category')||'undefined';var label=element.getAttribute('data-event-label')||'undefined';if(!ga){console.error('Google Analytics ga object is not available');}
ga('send',{hitType:'event',eventCategory:category,eventAction:action,eventLabel:label});});}});})(window);(function(window){"use strict";window.ls.container.get('view').add({'selector':'data-analytics-pageview','controller':function(window,router){if(!ga){console.error('Google Analytics ga object is not available');}

View file

@ -278,10 +278,12 @@ window.getSelection().removeAllRanges();});element.parentNode.parentNode.appendC
document.body.classList.add(prefix+'-'+value);cookie.set('language-'+prefix,value,365);document.dispatchEvent(new CustomEvent('updated-language-'+prefix));};document.addEventListener('updated-language-'+prefix,function(){element.value=cookie.get('language-'+prefix);});let def=cookie.get('language-'+prefix)||element.options[0].value;select(def);element.value=def;}}).add({selector:'data-ls-ui-chart',repeat:false,controller:function(element,container,date,document){let child=document.createElement('canvas');child.width=500;child.height=175;let stats=container.get('usage');if(!stats||!stats['requests']||!stats['requests']['data']){return;}
let config={type:'line',data:{labels:[],datasets:[{label:'Requests',backgroundColor:'rgba(230, 248, 253, 0.3)',borderColor:'#29b5d9',borderWidth:2,data:[0,0,0,0,0,0,0],fill:true}]},options:{responsive:true,title:{display:false,text:'Stats'},legend:{display:false},tooltips:{mode:'index',intersect:false,caretPadding:0},hover:{mode:'nearest',intersect:true},scales:{xAxes:[{display:false}],yAxes:[{display:false,}]}}};for(let i=0;i<stats['requests']['data'].length;i++){config.data.datasets[0].data[i]=stats['requests']['data'][i].value;config.data.labels[i]=date.format('d F Y',stats['requests']['data'][i].date);}
let chart=container.get('chart');if(chart){}
element.innerHTML='';element.appendChild(child);container.set('chart',new Chart(child.getContext('2d'),config),true);element.dataset['canvas']=true;}});(function(window){"use strict";window.ls.container.get('view').add({selector:'data-service',repeat:false,controller:function(element,view,container,form,alerts,expression,window){let action=element.dataset['service'];let service=element.dataset['name']||action;let event=element.dataset['event'];let confirm=element.dataset['confirm']||'';let loading=element.dataset['loading']||'';let loaderId=null;let scope=element.dataset['scope']||'sdk';let debug=!!(element.dataset['debug']);if(debug)console.log('%c[service init]: '+action+' ('+service+')','color:red');let resolve=function(target){let data=('FORM'===element.tagName)?form.toJson(element):{};const REGEX_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;const REGEX_FUNCTION_PARAMS=/(?:\s*(?:function\s*[^(]*)?\s*)((?:[^'"]|(?:(?:(['"])(?:(?:.*?[^\\]\2)|\2))))*?)\s*(?=(?:=>)|{)/m;const REGEX_PARAMETERS_VALUES=/\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm;function getParams(func){let functionAsString=func.toString();let params=[];let match;functionAsString=functionAsString.replace(REGEX_COMMENTS,'');functionAsString=functionAsString.match(REGEX_FUNCTION_PARAMS)[1];if(functionAsString.charAt(0)==='('){functionAsString=functionAsString.slice(1,-1);}
element.innerHTML='';element.appendChild(child);container.set('chart',new Chart(child.getContext('2d'),config),true);element.dataset['canvas']=true;}});(function(window){"use strict";window.ls.container.get('view').add({selector:'data-service',repeat:false,controller:function(element,view,container,form,alerts,expression,window,router){let action=element.dataset['service'];let service=element.dataset['name']||action;let event=element.dataset['event'];let confirm=element.dataset['confirm']||'';let loading=element.dataset['loading']||'';let loaderId=null;let scope=element.dataset['scope']||'sdk';let debug=!!(element.dataset['debug']);let callback=(element.dataset['callbacks']||'');callback=(callback&&callback!='')?callback.trim().split(','):[];if(debug)console.log('%c[service init]: '+action+' ('+service+')','color:red');let callbacks={'reset':function(){return function(){if('FORM'===element.tagName){return element.reset();}
throw new Error('This callback is only valid for forms');}},'alert':function(){return function(alerts){let alert=element.dataset['successAlert']||'Success';alerts.send({text:alert,class:'success'},3000);}},'redirect':function(){return function(router){let url=expression.parse(element.dataset['successRedirectUrl'])||'/';router.change(url);}},'reload':function(){return function(router){router.reload();}},'trigger':function(){return function(document){let triggers=element.dataset['successTriggers']||'';triggers=triggers.trim().split(',');for(let i=0;i<triggers.length;i++){if(''===triggers[i]){continue;}
if(debug)console.log('%c[event triggered]: '+triggers[i],'color:green');document.dispatchEvent(new CustomEvent(triggers[i]));}}}};let getParams=function getParams(func){const REGEX_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;const REGEX_FUNCTION_PARAMS=/(?:\s*(?:function\s*[^(]*)?\s*)((?:[^'"]|(?:(?:(['"])(?:(?:.*?[^\\]\2)|\2))))*?)\s*(?=(?:=>)|{)/m;const REGEX_PARAMETERS_VALUES=/\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm;let functionAsString=func.toString();let params=[];let match;functionAsString=functionAsString.replace(REGEX_COMMENTS,'');functionAsString=functionAsString.match(REGEX_FUNCTION_PARAMS)[1];if(functionAsString.charAt(0)==='('){functionAsString=functionAsString.slice(1,-1);}
while(match=REGEX_PARAMETERS_VALUES.exec(functionAsString)){params.push(match[1]);}
return params;}
let args=getParams(target);if(debug)console.log('%c[form data]: ','color:green',data);return target.apply(target,args.map(function(value){let result=null;if(!value){return null;}
let resolve=function(target,prefix='param',data={}){let args=getParams(target);if(debug)console.log('%c[form data]: ','color:green',data);return target.apply(target,args.map(function(value){let result=null;if(!value){return null;}
if(element.dataset['param'+value.charAt(0).toUpperCase()+value.slice(1)]){result=expression.parse(element.dataset['param'+value.charAt(0).toUpperCase()+value.slice(1)]);}
if(data[value]){result=data[value];}
if(!result){result='';}
@ -290,12 +292,15 @@ if(event){event.preventDefault();}
if(confirm){if(window.confirm(confirm)!==true){return false;}}
if(loading){loaderId=alerts.send({text:loading,class:''},0);}
let method=container.path(scope+'.'+action);if(!method){throw new Error('Method "'+scope+'.'+action+'" not found');}
let result=resolve(method);if(!result){return;}
let result=resolve(method,'param',('FORM'===element.tagName)?form.toJson(element):{});if(!result){return;}
result.then(function(data){if(loaderId!==null){alerts.remove(loaderId);}
if(!element){return;}
try{container.set(service.replace('.','-'),data,true,true);if(debug)console.log('%cservice ready: "'+service.replace('.','-')+'"','color:green');if(debug)console.log('%cservice:','color:blue',container.get(service.replace('.','-')));}catch(e){container.set(service.replace('.','-'),{},true);}
for(let i=0;i<callback.length;i++){container.resolve(resolve(callbacks[callback[i]],'successParam',{}));}
element.$lsSkip=false;view.render(element);},function(exception){if(loaderId!==null){alerts.remove(loaderId);}
if(!element){return;}});};let events=event.trim().split(',');for(let y=0;y<events.length;y++){if(''===events[y]){continue;}
if(!element){return;}
for(let i=0;i<callback.length;i++){container.resolve(resolve(callbacks[callback[i]],'failureParam',{}));}
element.$lsSkip=false;view.render(element);});};let events=event.trim().split(',');for(let y=0;y<events.length;y++){if(''===events[y]){continue;}
switch(events[y].trim()){case'load':exec();break;case'none':break;case'click':case'change':case'keypress':case'keydown':case'keyup':case'input':case'submit':element.addEventListener(events[y],exec);break;default:document.addEventListener(events[y],exec);}
if(debug)console.log('%cregistered: "'+events[y].trim()+'" ('+service+')','color:blue');}}});})(window);(function(window){"use strict";window.ls.container.get('view').add({'selector':'data-analytics-event','controller':function(element){var action=element.getAttribute('data-event-action')||'click';element.addEventListener(action,function(){var category=element.getAttribute('data-event-category')||'undefined';var label=element.getAttribute('data-event-label')||'undefined';if(!ga){console.error('Google Analytics ga object is not available');}
ga('send',{hitType:'event',eventCategory:category,eventAction:action,eventLabel:label});});}});})(window);(function(window){"use strict";window.ls.container.get('view').add({'selector':'data-analytics-pageview','controller':function(window,router){if(!ga){console.error('Google Analytics ga object is not available');}

View file

@ -5,7 +5,7 @@
{
selector: 'data-service',
repeat: false,
controller: function(element, view, container, form, alerts, expression, window) {
controller: function(element, view, container, form, alerts, expression, window, router) {
let action = element.dataset['service'];
let service = element.dataset['name'] || action;
let event = element.dataset['event']; // load, click, change, submit
@ -14,55 +14,106 @@
let loaderId = null;
let scope = element.dataset['scope'] || 'sdk'; // Free text
let debug = !!(element.dataset['debug']); // Free text
let callback = (element.dataset['callbacks'] || '');
callback = (callback && callback != '') ? callback.trim().split(',') : [];
if (debug) console.log('%c[service init]: ' + action + ' (' + service + ')', 'color:red');
let resolve = function(target) {
let data = ('FORM' === element.tagName) ? form.toJson(element) : {};
let callbacks = {
'reset': function () {
return function () {
if ('FORM' === element.tagName) {
return element.reset();
}
throw new Error('This callback is only valid for forms');
}
},
'alert': function () {
return function (alerts) {
let alert = element.dataset['successAlert'] || 'Success';
alerts.send({ text: alert, class: 'success' }, 3000);
}
},
'redirect': function () {
return function (router) {
let url = expression.parse(element.dataset['successRedirectUrl']) || '/';
router.change(url);
}
},
'reload': function () {
return function (router) {
router.reload();
}
},
'trigger': function () {
return function (document) {
let triggers = element.dataset['successTriggers'] || '';
triggers = triggers.trim().split(',');
for (let i = 0; i < triggers.length; i++) {
if ('' === triggers[i]) {
continue;
}
if (debug) console.log('%c[event triggered]: ' + triggers[i], 'color:green');
document.dispatchEvent(new CustomEvent(triggers[i]));
}
}
}
};
/**
* Original Solution From:
* @see https://stackoverflow.com/a/41322698/2299554
* Notice: this version add support for $ sign in arg name.
*
* Retrieve a function's parameter names and default values
* Notes:
* - parameters with default values will not show up in transpiler code (Babel) because the parameter is removed from the function.
* - does NOT support inline arrow functions as default values
* to clarify: ( name = "string", add = defaultAddFunction ) - is ok
* ( name = "string", add = ( a )=> a + 1 ) - is NOT ok
* - does NOT support default string value that are appended with a non-standard ( word characters or $ ) variable name
* to clarify: ( name = "string" + b ) - is ok
* ( name = "string" + $b ) - is ok
* ( name = "string" + b + "!" ) - is ok
* ( name = "string" + λ ) - is NOT ok
* @param {function} func
* @returns {Array} - An array of the given function's parameter [key, default value] pairs.
*/
let getParams = function getParams(func) {
const REGEX_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
const REGEX_FUNCTION_PARAMS = /(?:\s*(?:function\s*[^(]*)?\s*)((?:[^'"]|(?:(?:(['"])(?:(?:.*?[^\\]\2)|\2))))*?)\s*(?=(?:=>)|{)/m;
const REGEX_PARAMETERS_VALUES = /\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm;
/**
* Original Solution From:
* @see https://stackoverflow.com/a/41322698/2299554
* Notice: this version add support for $ sign in arg name.
*
* Retrieve a function's parameter names and default values
* Notes:
* - parameters with default values will not show up in transpiler code (Babel) because the parameter is removed from the function.
* - does NOT support inline arrow functions as default values
* to clarify: ( name = "string", add = defaultAddFunction ) - is ok
* ( name = "string", add = ( a )=> a + 1 ) - is NOT ok
* - does NOT support default string value that are appended with a non-standard ( word characters or $ ) variable name
* to clarify: ( name = "string" + b ) - is ok
* ( name = "string" + $b ) - is ok
* ( name = "string" + b + "!" ) - is ok
* ( name = "string" + λ ) - is NOT ok
* @param {function} func
* @returns {Array} - An array of the given function's parameter [key, default value] pairs.
*/
function getParams(func) {
let functionAsString = func.toString();
let params = [];
let match;
let functionAsString = func.toString();
let params = [];
let match;
functionAsString = functionAsString.replace(REGEX_COMMENTS, '');
functionAsString = functionAsString.match(REGEX_FUNCTION_PARAMS)[1];
functionAsString = functionAsString.replace(REGEX_COMMENTS, '');
functionAsString = functionAsString.match(REGEX_FUNCTION_PARAMS)[1];
if (functionAsString.charAt(0) === '(') {
functionAsString = functionAsString.slice(1, -1);
}
while (match = REGEX_PARAMETERS_VALUES.exec(functionAsString)) {
//params.push([match[1], match[2]]); // with default values
params.push(match[1]); // only with arg name
}
return params;
if (functionAsString.charAt(0) === '(') {
functionAsString = functionAsString.slice(1, -1);
}
while (match = REGEX_PARAMETERS_VALUES.exec(functionAsString)) {
//params.push([match[1], match[2]]); // with default values
params.push(match[1]); // only with arg name
}
return params;
}
let resolve = function(target, prefix = 'param', data = {}) {
let args = getParams(target);
if (debug) console.log('%c[form data]: ', 'color:green', data);
@ -128,7 +179,7 @@
throw new Error('Method "' + scope + '.' + action + '" not found');
}
let result = resolve(method);
let result = resolve(method, 'param', ('FORM' === element.tagName) ? form.toJson(element) : {});
if(!result) {
return;
@ -152,6 +203,10 @@
container.set(service.replace('.', '-'), {}, true);
}
for (let i = 0; i < callback.length; i++) { // Trigger success callbacks
container.resolve(resolve(callbacks[callback[i]], 'successParam', {}));
}
element.$lsSkip = false;
view.render(element);
@ -163,6 +218,14 @@
if(!element) {
return;
}
for (let i = 0; i < callback.length; i++) { // Trigger success callbacks
container.resolve(resolve(callbacks[callback[i]], 'failureParam', {}));
}
element.$lsSkip = false;
view.render(element);
});
};