yet-another-js-utils 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,14 +11,15 @@ npm install yet-another-js-utils
11
11
  ```js
12
12
  const yaju = require('yet-another-js-utils');
13
13
  // (...)
14
- yaju.diffVDomAndUpdate(newRender, previousRender, dom);
14
+ yaju.diffVDomAndUpdate(previousRender, newRender, dom);
15
15
  this.previousRender = newRender;
16
- applyState(dom);
16
+ yaju.resetDataState(dom);
17
+ yaju.addDataState(dom, 'updated');
17
18
  ```
18
19
 
19
20
  ## Dependencies
20
21
 
21
- 0
22
+ None.
22
23
 
23
24
  ## License
24
25
 
package/dist/yaju.min.js CHANGED
@@ -1 +1 @@
1
- "use strict";(()=>{var l=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var f=l((g,p)=>{"use strict";p.exports={nil(e){return e===null||typeof e>"u"},hack(e,t,r){return e.slice(t,r+1)},pick(e,t){return e.filter(t)},prune(e,t){return e.filter(function(r){return!t(r)})},check(e,t){return e.every(t)},escape(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")},html(e){let t=e[0],r=Math.max(e.length,arguments.length-1);for(let s=1;s<r;s++)t+=arguments[s],t+=e[s];return t},diffVDomAndUpdate(e,t,r){let s=this;s.changedNodes=[];let n=e.childNodes,d=t.childNodes,i=r.childNodes;if(i.length>d.length){let a=i.length-d.length;for(let u=0,o=a;u<o;u++)r.lastChild.remove()}for(let a=0,u=d.length;a<u;a++)if(n[a]){if(n[a].outerHTML!==d[a].outerHTML){let o=d[a].cloneNode(!0);s.changedNodes.push(o),i[a].replaceWith(o)}}else{let o=d[a].cloneNode(!0);s.changedNodes.push(o),r.appendChild(o)}},addDataState(e,t){let r=[];e.dataset.state&&e.dataset.state.indexOf(" ")>-1?r=e.dataset.state.split(" "):r=[e.dataset.state],r.indexOf(t)===-1&&(r.push(t),e.dataset.state=r.join(" "))},removeDataState(e,t){let r=[];e.dataset.state&&e.dataset.state.indexOf(" ")>-1?r=e.dataset.state.split(" "):r=[e.dataset.state],e.dataset.state=r.filter(s=>s!==t).join(" ")},replaceDataState(e,t,r){this.removeDataState(e,t),this.addDataState(e,r)},toggleDataState(e,t){e.dataset.state.split(" ").indexOf(t)==-1?this.addDataState(e,t):this.removeDataState(e,t)},ajaxGet(e,t,r,s){var n=new XMLHttpRequest;n.open("GET",e),n.addEventListener("load",function(){if(n.status>=200&&n.status<400)if(r){var d={};try{d=JSON.parse(n.responseText)}catch{console.error("Get request returned invalid JSON.")}s===void 0?t(d):t.apply(s,[d])}else s===void 0?t(n.responseText):t.apply(s,[n.responseText]);else console.error(n.status+" "+n.statusText+" "+e)}),n.addEventListener("error",function(){console.error("Network error trying to access: "+e)}),n.send(null)},ajaxPost(e,t,r,s,n,d,i){var a=new XMLHttpRequest;a.open("POST",e),a.addEventListener("load",function(){a.status>=200&&a.status<400?d===void 0?r(a):r.apply(d,[a]):(i===void 0?s(a):s.apply(i,[a]),console.error(a.status+" "+a.statusText+" "+e))}),a.addEventListener("error",function(){console.error("Network error trying to access: "+e)}),n&&(a.setRequestHeader("Content-Type","application/json"),t=JSON.stringify(t)),a.send(t)},pipe(e,...t){return t.reduce((r,s)=>s(r),e)}}});(function(){window.yaju=f()})();})();
1
+ "use strict";(()=>{var l=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var f=l((g,p)=>{"use strict";p.exports={nil(e){return e===null||typeof e>"u"},hack(e,t,r){return e.slice(t,r+1)},pick(e,t){return e.filter(t)},prune(e,t){return e.filter(function(r){return!t(r)})},check(e,t){return e.every(t)},escape(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")},html(e){let t=e[0],r=Math.max(e.length,arguments.length-1);for(let s=1;s<r;s++)t+=arguments[s],t+=e[s];return t},diffVDomAndUpdate(e,t,r){let s=this;s.changedNodes=[];let n=e.childNodes,d=t.childNodes,i=r.childNodes;if(i.length>d.length){let a=i.length-d.length;for(let u=0,o=a;u<o;u++)r.lastChild.remove()}for(let a=0,u=d.length;a<u;a++)if(n[a]){if(n[a].outerHTML!==d[a].outerHTML){let o=d[a].cloneNode(!0);s.changedNodes.push(o),i[a].replaceWith(o)}}else{let o=d[a].cloneNode(!0);s.changedNodes.push(o),r.appendChild(o)}},addDataState(e,t){let r=[];e.dataset.state&&e.dataset.state.indexOf(" ")>-1?r=e.dataset.state.split(" "):r=[e.dataset.state],r.indexOf(t)===-1&&(r.push(t),e.dataset.state=r.join(" "))},removeDataState(e,t){let r=[];e.dataset.state&&e.dataset.state.indexOf(" ")>-1?r=e.dataset.state.split(" "):r=[e.dataset.state],e.dataset.state=r.filter(s=>s!==t).join(" ")},replaceDataState(e,t,r){this.removeDataState(e,t),this.addDataState(e,r)},toggleDataState(e,t){e.dataset.state.split(" ").indexOf(t)==-1?this.addDataState(e,t):this.removeDataState(e,t)},resetDataState(e){e.dataset.state=""},ajaxGet(e,t,r,s){var n=new XMLHttpRequest;n.open("GET",e),n.addEventListener("load",function(){if(n.status>=200&&n.status<400)if(r){var d={};try{d=JSON.parse(n.responseText)}catch{console.error("Get request returned invalid JSON.")}s===void 0?t(d):t.apply(s,[d])}else s===void 0?t(n.responseText):t.apply(s,[n.responseText]);else console.error(n.status+" "+n.statusText+" "+e)}),n.addEventListener("error",function(){console.error("Network error trying to access: "+e)}),n.send(null)},ajaxPost(e,t,r,s,n,d,i){var a=new XMLHttpRequest;a.open("POST",e),a.addEventListener("load",function(){a.status>=200&&a.status<400?d===void 0?r(a):r.apply(d,[a]):(i===void 0?s(a):s.apply(i,[a]),console.error(a.status+" "+a.statusText+" "+e))}),a.addEventListener("error",function(){console.error("Network error trying to access: "+e)}),n&&(a.setRequestHeader("Content-Type","application/json"),t=JSON.stringify(t)),a.send(t)},pipe(e,...t){return t.reduce((r,s)=>s(r),e)}}});(function(){window.yaju=f()})();})();
package/js-utils.js CHANGED
@@ -225,6 +225,14 @@ module.exports = {
225
225
  }
226
226
  },
227
227
 
228
+ /**
229
+ * Reset
230
+ * @param { object } element
231
+ */
232
+ resetDataState(element) {
233
+ element.dataset.state = '';
234
+ },
235
+
228
236
  //# AJAX Functions
229
237
 
230
238
  /**
package/out.js CHANGED
@@ -192,6 +192,13 @@
192
192
  this.removeDataState(element, state);
193
193
  }
194
194
  },
195
+ /**
196
+ * Reset
197
+ * @param { object } element
198
+ */
199
+ resetDataState(element) {
200
+ element.dataset.state = "";
201
+ },
195
202
  //# AJAX Functions
196
203
  /**
197
204
  * AJAX GET
package/out.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["js-utils.js", "main.js"],
4
- "sourcesContent": ["module.exports = {\r\n // # Nil\r\n\r\n // I like the NOT operator\r\n // I like strict type checking\r\n // Hence a strictly typed equivalent:\r\n // - 3-letters name n\r\n // - single argument\r\n\r\n /**\r\n * Nil\r\n * Neither null nor undefined\r\n * @param { boolean } exp\r\n * @returns { boolean }\r\n */\r\n nil(exp) { // values implicitly considered functions\r\n if (\r\n exp === null\r\n || typeof exp === 'undefined'\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n },\r\n\r\n // # Hack\r\n\r\n // .slice() uses a closed-open interval\r\n // the mathematical convention goes closed-closed\r\n\r\n /**\r\n * Hack\r\n * @param { number } start\r\n * @param { number } end\r\n * @returns\r\n */\r\n hack(array, start, end) {\r\n return array.slice(start, end + 1);\r\n },\r\n\r\n // # Prune/Pick\r\n\r\n // Javascript inherited spreadsheet-like .filter()\r\n // It felt confusing there\r\n // It feels confusing here too\r\n\r\n /**\r\n * Pick\r\n * @param {*} array\r\n * @param {*} pruningFunction\r\n * @returns\r\n */\r\n pick(array, pruningFunction) {\r\n return array.filter(pruningFunction);\r\n },\r\n\r\n /**\r\n * Prune\r\n * The inverse of filter()\r\n * @param {*} array\r\n * @param {*} filteringFunction\r\n * @returns\r\n */\r\n prune(array, filteringFunction) {\r\n return array.filter(function (x) {\r\n return !filteringFunction(x);\r\n });\r\n },\r\n\r\n // # Check\r\n\r\n // .every() just sounds weird\r\n /**\r\n * Check\r\n * @param {*} array\r\n * @param {*} checkingFunction\r\n * @returns\r\n */\r\n check(array, checkingFunction) {\r\n return array.every(checkingFunction);\r\n },\r\n\r\n /**\r\n * Escape\r\n * @param { string } string\r\n * @returns\r\n */\r\n escape(string) {\r\n return string\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;');\r\n },\r\n\r\n /**\r\n * DOM-rendering template tag\r\n * @param {Array} strings\r\n * @returns {object} a DocumentFragment\r\n */\r\n html(strings) {\r\n let output = strings[0], // assumes empty string start?\r\n max = Math.max(strings.length, arguments.length - 1);\r\n for (let i = 1; i < max; i++) {\r\n output += arguments[i];\r\n output += strings[i];\r\n }\r\n return output;\r\n },\r\n\r\n /**\r\n * Basic contents updater\r\n * Assuming:\r\n * - Rendering applied event-listeners already\r\n * - You can apply state afterwards\r\n * - You can store newRender afterwards\r\n * @param {object} previousRender\r\n * @param {object} newRender\r\n * @param {object} dom\r\n */\r\n diffVDomAndUpdate(previousRender, newRender, dom) {\r\n // Assuming overwrite or insertion\r\n let $ = this;\r\n $.changedNodes = [];\r\n let leftItems = previousRender.childNodes,\r\n rightItems = newRender.childNodes,\r\n domItems = dom.childNodes;\r\n if (domItems.length > rightItems.length) {\r\n let diffLength = domItems.length - rightItems.length;\r\n for (let i = 0, c = diffLength; i < c; i++) {\r\n dom.lastChild.remove();\r\n }\r\n }\r\n for (let i = 0, c = rightItems.length; i < c; i++) {\r\n if (!leftItems[i]) {\r\n let node = rightItems[i].cloneNode(true);\r\n $.changedNodes.push(node);\r\n dom.appendChild(node);\r\n } else if (\r\n leftItems[i].outerHTML !== rightItems[i].outerHTML\r\n ) {\r\n let node = rightItems[i].cloneNode(true);\r\n $.changedNodes.push(node);\r\n domItems[i].replaceWith(node);\r\n }\r\n }\r\n },\r\n\r\n // # DATA-STATE\r\n\r\n // Alternative CSS state management\r\n // - using data-attributes instead of classes\r\n // - easier to match model and vue\r\n // - dataset over classlist allows specialization\r\n // - classes work as booleans (\".walked\")\r\n // - you need to notice abscence\r\n // - data-state work as a string type you can dedicate to store state only, and more than one state\r\n\r\n /**\r\n * Add\r\n * @param { object } element\r\n * @param { string } state\r\n */\r\n addDataState(element, state) {\r\n let stateArray = [];\r\n if (\r\n element.dataset.state\r\n && element.dataset.state.indexOf(' ') > -1\r\n ) {\r\n stateArray = element.dataset.state.split(' ');\r\n } else {\r\n stateArray = [element.dataset.state];\r\n }\r\n if (stateArray.indexOf(state) === -1) {\r\n stateArray.push(state);\r\n element.dataset.state = stateArray.join(' ');\r\n }\r\n },\r\n\r\n /**\r\n * Remove\r\n * @param { object } element\r\n * @param { string } state\r\n */\r\n removeDataState(element, state) {\r\n let stateArray = [];\r\n if (\r\n element.dataset.state\r\n && element.dataset.state.indexOf(' ') > -1\r\n ) {\r\n stateArray = element.dataset.state.split(' ');\r\n } else {\r\n stateArray = [element.dataset.state];\r\n }\r\n element.dataset.state =\r\n stateArray\r\n .filter(element => (element !== state))\r\n .join(' ');\r\n },\r\n\r\n /**\r\n * Replace\r\n * @param { object } element\r\n * @param { string } stateToRemove\r\n * @param { string } stateToAdd\r\n */\r\n replaceDataState(element, stateToRemove, stateToAdd) {\r\n this.removeDataState(element, stateToRemove);\r\n this.addDataState(element, stateToAdd);\r\n },\r\n\r\n /**\r\n * Toggle\r\n * @param { object } element\r\n * @param { string } state\r\n */\r\n toggleDataState(element, state) {\r\n let stateArray = element.dataset.state.split(' ');\r\n if (stateArray.indexOf(state) == -1) {\r\n this.addDataState(element, state);\r\n } else {\r\n this.removeDataState(element, state);\r\n }\r\n },\r\n\r\n //# AJAX Functions\r\n\r\n /**\r\n * AJAX GET\r\n * @param {string} url The target url\r\n * @param {function} callback\r\n * @param {boolean} isJson Response contains json\r\n * @param {object} callbackContext\r\n */\r\n ajaxGet(url, callback, isJson, callbackContext) {\r\n var req = new XMLHttpRequest();\r\n req.open(\"GET\", url);\r\n req.addEventListener(\"load\", function () {\r\n if (req.status >= 200 && req.status < 400) {\r\n if (isJson) {\r\n var json = {};\r\n try {\r\n json = JSON.parse(req.responseText);\r\n } catch (error) {\r\n console.error(\"Get request returned invalid JSON.\")\r\n }\r\n callbackContext === undefined ? callback(json) : callback.apply(callbackContext, [json]);\r\n } else {\r\n callbackContext === undefined ? callback(req.responseText) : callback.apply(callbackContext, [req.responseText]);\r\n }\r\n } else {\r\n console.error(req.status + \" \" + req.statusText + \" \" + url);\r\n }\r\n });\r\n req.addEventListener(\"error\", function () {\r\n console.error(\"Network error trying to access: \" + url);\r\n });\r\n req.send(null);\r\n },\r\n\r\n /**\r\n * AJAX POST\r\n * @param {string} url\r\n * @param {string} data\r\n * @param {function} successCallback\r\n * @param {function} failureCallback\r\n * @param {boolean} isJson\r\n * @param {object} successCallbackContext\r\n * @param {object} failureCallbackContext\r\n */\r\n ajaxPost(url, data, successCallback, failureCallback, isJson, successCallbackContext, failureCallbackContext) {\r\n var req = new XMLHttpRequest();\r\n req.open(\"POST\", url);\r\n req.addEventListener(\"load\", function () {\r\n if (req.status >= 200 && req.status < 400) {\r\n successCallbackContext === undefined ? successCallback(req) : successCallback.apply(successCallbackContext, [req]);\r\n } else {\r\n failureCallbackContext === undefined ? failureCallback(req) : failureCallback.apply(failureCallbackContext, [req]);\r\n console.error(req.status + \" \" + req.statusText + \" \" + url);\r\n }\r\n });\r\n req.addEventListener(\"error\", function () {\r\n console.error(\"Network error trying to access: \" + url);\r\n });\r\n if (isJson) {\r\n req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n data = JSON.stringify(data);\r\n }\r\n req.send(data);\r\n },\r\n\r\n /**\r\n * Pipe\r\n * Function piping with initial input\r\n * @param {*} functions\r\n * @param {*} input\r\n * @returns {*}\r\n */\r\n pipe(input, ...functions) {\r\n return functions.reduce((res, fun) => fun(res), input);\r\n }\r\n}\r\n", "(function () {\r\n window.yaju = require('./js-utils.js');\r\n})();\r\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["module.exports = {\r\n // # Nil\r\n\r\n // I like the NOT operator\r\n // I like strict type checking\r\n // Hence a strictly typed equivalent:\r\n // - 3-letters name n\r\n // - single argument\r\n\r\n /**\r\n * Nil\r\n * Neither null nor undefined\r\n * @param { boolean } exp\r\n * @returns { boolean }\r\n */\r\n nil(exp) { // values implicitly considered functions\r\n if (\r\n exp === null\r\n || typeof exp === 'undefined'\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n },\r\n\r\n // # Hack\r\n\r\n // .slice() uses a closed-open interval\r\n // the mathematical convention goes closed-closed\r\n\r\n /**\r\n * Hack\r\n * @param { number } start\r\n * @param { number } end\r\n * @returns\r\n */\r\n hack(array, start, end) {\r\n return array.slice(start, end + 1);\r\n },\r\n\r\n // # Prune/Pick\r\n\r\n // Javascript inherited spreadsheet-like .filter()\r\n // It felt confusing there\r\n // It feels confusing here too\r\n\r\n /**\r\n * Pick\r\n * @param {*} array\r\n * @param {*} pruningFunction\r\n * @returns\r\n */\r\n pick(array, pruningFunction) {\r\n return array.filter(pruningFunction);\r\n },\r\n\r\n /**\r\n * Prune\r\n * The inverse of filter()\r\n * @param {*} array\r\n * @param {*} filteringFunction\r\n * @returns\r\n */\r\n prune(array, filteringFunction) {\r\n return array.filter(function (x) {\r\n return !filteringFunction(x);\r\n });\r\n },\r\n\r\n // # Check\r\n\r\n // .every() just sounds weird\r\n /**\r\n * Check\r\n * @param {*} array\r\n * @param {*} checkingFunction\r\n * @returns\r\n */\r\n check(array, checkingFunction) {\r\n return array.every(checkingFunction);\r\n },\r\n\r\n /**\r\n * Escape\r\n * @param { string } string\r\n * @returns\r\n */\r\n escape(string) {\r\n return string\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;');\r\n },\r\n\r\n /**\r\n * DOM-rendering template tag\r\n * @param {Array} strings\r\n * @returns {object} a DocumentFragment\r\n */\r\n html(strings) {\r\n let output = strings[0], // assumes empty string start?\r\n max = Math.max(strings.length, arguments.length - 1);\r\n for (let i = 1; i < max; i++) {\r\n output += arguments[i];\r\n output += strings[i];\r\n }\r\n return output;\r\n },\r\n\r\n /**\r\n * Basic contents updater\r\n * Assuming:\r\n * - Rendering applied event-listeners already\r\n * - You can apply state afterwards\r\n * - You can store newRender afterwards\r\n * @param {object} previousRender\r\n * @param {object} newRender\r\n * @param {object} dom\r\n */\r\n diffVDomAndUpdate(previousRender, newRender, dom) {\r\n // Assuming overwrite or insertion\r\n let $ = this;\r\n $.changedNodes = [];\r\n let leftItems = previousRender.childNodes,\r\n rightItems = newRender.childNodes,\r\n domItems = dom.childNodes;\r\n if (domItems.length > rightItems.length) {\r\n let diffLength = domItems.length - rightItems.length;\r\n for (let i = 0, c = diffLength; i < c; i++) {\r\n dom.lastChild.remove();\r\n }\r\n }\r\n for (let i = 0, c = rightItems.length; i < c; i++) {\r\n if (!leftItems[i]) {\r\n let node = rightItems[i].cloneNode(true);\r\n $.changedNodes.push(node);\r\n dom.appendChild(node);\r\n } else if (\r\n leftItems[i].outerHTML !== rightItems[i].outerHTML\r\n ) {\r\n let node = rightItems[i].cloneNode(true);\r\n $.changedNodes.push(node);\r\n domItems[i].replaceWith(node);\r\n }\r\n }\r\n },\r\n\r\n // # DATA-STATE\r\n\r\n // Alternative CSS state management\r\n // - using data-attributes instead of classes\r\n // - easier to match model and vue\r\n // - dataset over classlist allows specialization\r\n // - classes work as booleans (\".walked\")\r\n // - you need to notice abscence\r\n // - data-state work as a string type you can dedicate to store state only, and more than one state\r\n\r\n /**\r\n * Add\r\n * @param { object } element\r\n * @param { string } state\r\n */\r\n addDataState(element, state) {\r\n let stateArray = [];\r\n if (\r\n element.dataset.state\r\n && element.dataset.state.indexOf(' ') > -1\r\n ) {\r\n stateArray = element.dataset.state.split(' ');\r\n } else {\r\n stateArray = [element.dataset.state];\r\n }\r\n if (stateArray.indexOf(state) === -1) {\r\n stateArray.push(state);\r\n element.dataset.state = stateArray.join(' ');\r\n }\r\n },\r\n\r\n /**\r\n * Remove\r\n * @param { object } element\r\n * @param { string } state\r\n */\r\n removeDataState(element, state) {\r\n let stateArray = [];\r\n if (\r\n element.dataset.state\r\n && element.dataset.state.indexOf(' ') > -1\r\n ) {\r\n stateArray = element.dataset.state.split(' ');\r\n } else {\r\n stateArray = [element.dataset.state];\r\n }\r\n element.dataset.state =\r\n stateArray\r\n .filter(element => (element !== state))\r\n .join(' ');\r\n },\r\n\r\n /**\r\n * Replace\r\n * @param { object } element\r\n * @param { string } stateToRemove\r\n * @param { string } stateToAdd\r\n */\r\n replaceDataState(element, stateToRemove, stateToAdd) {\r\n this.removeDataState(element, stateToRemove);\r\n this.addDataState(element, stateToAdd);\r\n },\r\n\r\n /**\r\n * Toggle\r\n * @param { object } element\r\n * @param { string } state\r\n */\r\n toggleDataState(element, state) {\r\n let stateArray = element.dataset.state.split(' ');\r\n if (stateArray.indexOf(state) == -1) {\r\n this.addDataState(element, state);\r\n } else {\r\n this.removeDataState(element, state);\r\n }\r\n },\r\n\r\n /**\r\n * Reset\r\n * @param { object } element\r\n */\r\n resetDataState(element) {\r\n element.dataset.state = '';\r\n },\r\n\r\n //# AJAX Functions\r\n\r\n /**\r\n * AJAX GET\r\n * @param {string} url The target url\r\n * @param {function} callback\r\n * @param {boolean} isJson Response contains json\r\n * @param {object} callbackContext\r\n */\r\n ajaxGet(url, callback, isJson, callbackContext) {\r\n var req = new XMLHttpRequest();\r\n req.open(\"GET\", url);\r\n req.addEventListener(\"load\", function () {\r\n if (req.status >= 200 && req.status < 400) {\r\n if (isJson) {\r\n var json = {};\r\n try {\r\n json = JSON.parse(req.responseText);\r\n } catch (error) {\r\n console.error(\"Get request returned invalid JSON.\")\r\n }\r\n callbackContext === undefined ? callback(json) : callback.apply(callbackContext, [json]);\r\n } else {\r\n callbackContext === undefined ? callback(req.responseText) : callback.apply(callbackContext, [req.responseText]);\r\n }\r\n } else {\r\n console.error(req.status + \" \" + req.statusText + \" \" + url);\r\n }\r\n });\r\n req.addEventListener(\"error\", function () {\r\n console.error(\"Network error trying to access: \" + url);\r\n });\r\n req.send(null);\r\n },\r\n\r\n /**\r\n * AJAX POST\r\n * @param {string} url\r\n * @param {string} data\r\n * @param {function} successCallback\r\n * @param {function} failureCallback\r\n * @param {boolean} isJson\r\n * @param {object} successCallbackContext\r\n * @param {object} failureCallbackContext\r\n */\r\n ajaxPost(url, data, successCallback, failureCallback, isJson, successCallbackContext, failureCallbackContext) {\r\n var req = new XMLHttpRequest();\r\n req.open(\"POST\", url);\r\n req.addEventListener(\"load\", function () {\r\n if (req.status >= 200 && req.status < 400) {\r\n successCallbackContext === undefined ? successCallback(req) : successCallback.apply(successCallbackContext, [req]);\r\n } else {\r\n failureCallbackContext === undefined ? failureCallback(req) : failureCallback.apply(failureCallbackContext, [req]);\r\n console.error(req.status + \" \" + req.statusText + \" \" + url);\r\n }\r\n });\r\n req.addEventListener(\"error\", function () {\r\n console.error(\"Network error trying to access: \" + url);\r\n });\r\n if (isJson) {\r\n req.setRequestHeader(\"Content-Type\", \"application/json\");\r\n data = JSON.stringify(data);\r\n }\r\n req.send(data);\r\n },\r\n\r\n /**\r\n * Pipe\r\n * Function piping with initial input\r\n * @param {*} functions\r\n * @param {*} input\r\n * @returns {*}\r\n */\r\n pipe(input, ...functions) {\r\n return functions.reduce((res, fun) => fun(res), input);\r\n }\r\n}\r\n", "(function () {\r\n window.yaju = require('./js-utils.js');\r\n})();\r\n"],
5
+ "mappings": "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",
6
6
  "names": ["element"]
7
7
  }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "yet-another-js-utils",
3
3
  "description": "Basic javascript utils",
4
4
  "authors": "Adrian Turcev",
5
- "version": "1.0.0",
5
+ "version": "1.1.1",
6
6
  "license": "MPL-2.0",
7
7
  "homepage": "https://github.com/adrianturcev/js-utils",
8
8
  "repository": {