Comparing version 2.0.1 to 2.1.0
@@ -9,2 +9,7 @@ # Changelog | ||
## [2.1.0] - 2020-18-04 | ||
- Added support for `exist` selector | ||
- Rename `GeType` to `TypeOfQuery` | ||
## [2.0.0] - 2020-13-02 | ||
@@ -11,0 +16,0 @@ |
@@ -1,2 +0,2 @@ | ||
var scrapq=function(t){var e={};function r(n){if(e[n])return e[n].exports;var u=e[n]={i:n,l:!1,exports:{}};return t[n].call(u.exports,u,u.exports,r),u.l=!0,u.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var u in t)r.d(n,u,function(e){return t[e]}.bind(null,u));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=r(1),u=r(2),o=r(3);function c(t){return"type"in t&&"select"in t}function i(t,e,r){switch(r.type){case"text":var n=""===r.select?t(e).text():t(r.select,e).text();return n||n.trim();case"attr":return(f=""===r.select?e:t(r.select,e)).attr(r.attr);case"count":return(o=t(r.select,e)).length;case"list":for(var u=[],o=t(r.select,e),s=0;s<o.length;s++){var f=o.eq(s),a=c(r.query)?i(t,f,r.query):l(t,f,r.query,{});u.push(a)}return u;case"html":if(""===r.select)return t(e).html();var p=(f=t(r.select,e)).html();return"string"==typeof p?p.trim():p;default:throw new Error('Undefined selector "'+JSON.stringify(r)+'"')}}function l(t,e,r,n){return Object.keys(r).forEach((function(u){var o=r[u];c(o)?n[u]=i(t,e,o):n[u]=l(t,e,o,{})})),n}e.scrap=function(t,e){var r=n.load(t),u=r.root();return c(e)?i(r,u,e):l(r,u,e,{})},e.$={attr:u.attr,text:u.text,count:u.count,list:o.list,html:u.html}},function(t,e){t.exports=cheerio},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.attr=function(t,e){return{type:"attr",select:t,attr:e}},e.text=function(t){return{type:"text",select:t}},e.count=function(t){return{type:"count",select:t}},e.html=function(t){return{type:"html",select:t}}},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.list=function(t,e){return{type:"list",select:t,query:e}}}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zY3JhcHEvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc2NyYXBxLy4vbGliL2luZGV4LnRzIiwid2VicGFjazovL3NjcmFwcS9leHRlcm5hbCBcImNoZWVyaW9cIiIsIndlYnBhY2s6Ly9zY3JhcHEvLi9saWIvc2VsZWN0b3JzLnRzIiwid2VicGFjazovL3NjcmFwcS8uL2xpYi9jb250cm9scy50cyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsImlzU2VsZWN0b3JPckNvbnRyb2wiLCJ0ZXN0Iiwic2NyYXBTZWxlY3RvciIsIiQiLCJjb250ZXh0Iiwic2VsZWN0b3IiLCJ0eXBlIiwic2VsZWN0IiwidGV4dCIsInRyaW0iLCJlbCIsImF0dHIiLCJlbHMiLCJsZW5ndGgiLCJyZXN1bHQiLCJlcSIsInNjcmFwZWRFbCIsInF1ZXJ5Iiwic2NyYXBRdWVyeSIsInB1c2giLCJodG1sIiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwicmVmIiwia2V5cyIsImZvckVhY2giLCJwcm9wIiwidmFsIiwibG9hZCIsInJvb3QiLCJjb3VudCIsImxpc3QiLCJjaGVlcmlvIiwiYXR0cmlidXRlIl0sIm1hcHBpbmdzIjoidUJBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdB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TkMsT0FBUUYsRUFDUlksTUFBSyIsImZpbGUiOiJzY3JhcHEubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwiaW1wb3J0IHsgbG9hZCB9IGZyb20gXCJjaGVlcmlvXCI7XG5pbXBvcnQgeyBBbnlTZWxlY3RvciwgdGV4dCwgY291bnQsIGF0dHIsIGh0bWwgfSBmcm9tIFwiLi9zZWxlY3RvcnNcIjtcbmltcG9ydCB7IFF1ZXJ5LCBHZXRSZXN1bHQgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBBbnlDb250cm9sLCBsaXN0IH0gZnJvbSBcIi4vY29udHJvbHNcIjtcblxuZnVuY3Rpb24gaXNTZWxlY3Rvck9yQ29udHJvbCh0ZXN0OiBhbnkpOiB0ZXN0IGlzIChBbnlTZWxlY3RvciB8IEFueUNvbnRyb2wpIHtcbiAgICBpZiAoKFwidHlwZVwiIGluIHRlc3QpICYmIChcInNlbGVjdFwiIGluIHRlc3QpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHNjcmFwU2VsZWN0b3IoJDogQ2hlZXJpb1N0YXRpYywgY29udGV4dDogQ2hlZXJpbywgc2VsZWN0b3I6IEFueVNlbGVjdG9yIHwgQW55Q29udHJvbCkge1xuICAgIHN3aXRjaCAoc2VsZWN0b3IudHlwZSkge1xuICAgICAgICBjYXNlIFwidGV4dFwiOiB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gKHNlbGVjdG9yLnNlbGVjdCA9PT0gXCJcIilcbiAgICAgICAgICAgICAgICA/ICQoY29udGV4dCkudGV4dCgpXG4gICAgICAgICAgICAgICAgOiAkKHNlbGVjdG9yLnNlbGVjdCwgY29udGV4dCkudGV4dCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRleHQgfHwgdGV4dC50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImF0dHJcIjoge1xuICAgICAgICAgICAgY29uc3QgZWwgPSAoc2VsZWN0b3Iuc2VsZWN0ID09PSBcIlwiKVxuICAgICAgICAgICAgICAgID8gY29udGV4dFxuICAgICAgICAgICAgICAgIDogJChzZWxlY3Rvci5zZWxlY3QsIGNvbnRleHQpO1xuICAgICAgICAgICAgY29uc3QgYXR0ciA9IGVsLmF0dHIoc2VsZWN0b3IuYXR0cik7XG4gICAgICAgICAgICByZXR1cm4gYXR0cjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiY291bnRcIjoge1xuICAgICAgICAgICAgY29uc3QgZWxzID0gJChzZWxlY3Rvci5zZWxlY3QsIGNvbnRleHQpO1xuICAgICAgICAgICAgY29uc3QgY291bnQgPSBlbHMubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJsaXN0XCI6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGVscyA9ICQoc2VsZWN0b3Iuc2VsZWN0LCBjb250ZXh0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWwgPSBlbHMuZXEoaSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyYXBlZEVsID0gaXNTZWxlY3Rvck9yQ29udHJvbChzZWxlY3Rvci5xdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgPyBzY3JhcFNlbGVjdG9yKCQsIGVsLCBzZWxlY3Rvci5xdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgOiBzY3JhcFF1ZXJ5KCQsIGVsLCBzZWxlY3Rvci5xdWVyeSwge30pO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNjcmFwZWRFbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJodG1sXCI6IHtcbiAgICAgICAgICAgIGlmIChzZWxlY3Rvci5zZWxlY3QgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gJChjb250ZXh0KS5odG1sKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gJChzZWxlY3Rvci5zZWxlY3QsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBlbC5odG1sKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgaHRtbCA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICAgICAgPyBodG1sLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICA6IGh0bWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmRlZmluZWQgc2VsZWN0b3IgXCIke0pTT04uc3RyaW5naWZ5KHNlbGVjdG9yKX1cImApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzY3JhcFF1ZXJ5PFEgZXh0ZW5kcyBRdWVyeT4oJDogQ2hlZXJpb1N0YXRpYywgY29udGV4dDogQ2hlZXJpbywgcXVlcnk6IFEsIHJlZjogYW55KTogR2V0UmVzdWx0PFE+IHtcbiAgICBPYmplY3Qua2V5cyhxdWVyeSkuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgY29uc3QgdmFsID0gcXVlcnlbcHJvcF07XG5cdFx0aWYgKGlzU2VsZWN0b3JPckNvbnRyb2wodmFsKSkge1xuXHRcdFx0cmVmW3Byb3BdID0gc2NyYXBTZWxlY3RvcigkLCBjb250ZXh0LCB2YWwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWZbcHJvcF0gPSBzY3JhcFF1ZXJ5KCQsIGNvbnRleHQsIHZhbCwge30pO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiByZWY7XG59XG5cblxuXG5leHBvcnQgZnVuY3Rpb24gc2NyYXA8USBleHRlbmRzIFF1ZXJ5IHwgQW55Q29udHJvbCB8IEFueVNlbGVjdG9yPihcbiAgICBodG1sOiBzdHJpbmcsXG4gICAgcXVlcnk6IFFcbik6IEdldFJlc3VsdDxRPiB7XG4gICAgY29uc3QgJCA9IGxvYWQoaHRtbCk7XG4gICAgY29uc3Qgcm9vdCA9ICQucm9vdCgpO1xuICAgIGlmIChpc1NlbGVjdG9yT3JDb250cm9sKHF1ZXJ5KSkge1xuICAgICAgICByZXR1cm4gc2NyYXBTZWxlY3RvcigkLCByb290LCBxdWVyeSkgYXMgYW55O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzY3JhcFF1ZXJ5KCQsIHJvb3QsIHF1ZXJ5IGFzIFF1ZXJ5LCB7fSkgYXMgYW55O1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0ICQgPSB7XG4gICAgYXR0cixcbiAgICB0ZXh0LFxuICAgIGNvdW50LFxuICAgIGxpc3QsXG4gICAgaHRtbFxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gY2hlZXJpbzsiLCJpbnRlcmZhY2UgQ291bnRUeXBlIHtcbiAgICB0eXBlOiBcImNvdW50XCI7XG4gICAgc2VsZWN0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUZXh0VHlwZSB7XG4gICAgdHlwZTogXCJ0ZXh0XCI7XG4gICAgc2VsZWN0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBBdHRyVHlwZSB7XG4gICAgdHlwZTogXCJhdHRyXCI7XG4gICAgc2VsZWN0OiBzdHJpbmc7XG4gICAgYXR0cjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSHRtbFR5cGUge1xuICAgIHR5cGU6IFwiaHRtbFwiO1xuICAgIHNlbGVjdDogc3RyaW5nO1xufVxuXG4vLyBFWFBPUlRTXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0b3JUeXBlcyB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGF0dHI6IHN0cmluZztcbiAgICBjb3VudDogbnVtYmVyO1xuICAgIGh0bWw6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQW55U2VsZWN0b3IgPSBUZXh0VHlwZSB8IEF0dHJUeXBlIHwgQ291bnRUeXBlIHwgSHRtbFR5cGU7XG5cbi8vIERTTFxuXG5leHBvcnQgZnVuY3Rpb24gYXR0cihzZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZyk6IEF0dHJUeXBlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImF0dHJcIixcbiAgICAgICAgc2VsZWN0OiBzZWxlY3RvcixcbiAgICAgICAgYXR0cjogYXR0cmlidXRlXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGV4dChzZWxlY3Rvcjogc3RyaW5nKTogVGV4dFR5cGUge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICBzZWxlY3Q6IHNlbGVjdG9yXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvdW50KHNlbGVjdG9yOiBzdHJpbmcpOiBDb3VudFR5cGUge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiY291bnRcIixcbiAgICAgICAgc2VsZWN0OiBzZWxlY3RvclxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodG1sKHNlbGVjdG9yOiBzdHJpbmcpOiBIdG1sVHlwZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJodG1sXCIsXG4gICAgICAgIHNlbGVjdDogc2VsZWN0b3JcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBBbnlTZWxlY3RvciB9IGZyb20gXCIuL3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJvbFR5cGVzPFE+IHtcbiAgICBsaXN0OiBBcnJheTxRPjtcbn1cblxuLy8gRVhQT1JUU1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RUeXBlPFEgZXh0ZW5kcyBBbnlTZWxlY3RvciB8IEFueUNvbnRyb2wgfCBRdWVyeT4ge1xuICAgIHR5cGU6IFwibGlzdFwiO1xuICAgIHNlbGVjdDogc3RyaW5nO1xuICAgIHF1ZXJ5OiBRO1xufVxuXG5leHBvcnQgdHlwZSBBbnlDb250cm9sID0gTGlzdFR5cGU8YW55PjtcblxuLy8gRFNMXG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0PFEgZXh0ZW5kcyBRdWVyeSB8IEFueUNvbnRyb2wgfCBBbnlTZWxlY3Rvcj4oc2VsZWN0b3I6IHN0cmluZywgcXVlcnk6IFEpOiBMaXN0VHlwZTxRPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHNlbGVjdDogc2VsZWN0b3IsXG4gICAgICAgIHF1ZXJ5XG4gICAgfTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0= | ||
var scrapq=function(t){var e={};function r(n){if(e[n])return e[n].exports;var u=e[n]={i:n,l:!1,exports:{}};return t[n].call(u.exports,u,u.exports,r),u.l=!0,u.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var u in t)r.d(n,u,function(e){return t[e]}.bind(null,u));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=r(1),u=r(2),c=r(3);function o(t){return"type"in t&&"select"in t}function i(t,e,r){switch(r.type){case"text":var n=""===r.select?t(e).text():t(r.select,e).text();return n&&n.trim();case"attr":return(f=""===r.select?e:t(r.select,e)).attr(r.attr);case"count":return(c=t(r.select,e)).length;case"exists":return!!(c=t(r.select,e)).length;case"list":for(var u=[],c=t(r.select,e),l=0;l<c.length;l++){var f=c.eq(l),a=o(r.query)?i(t,f,r.query):s(t,f,r.query,{});u.push(a)}return u;case"html":if(""===r.select)return t(e).html();var p=(f=t(r.select,e)).html();return"string"==typeof p?p.trim():p;default:throw new Error('Undefined selector "'+JSON.stringify(r)+'"')}}function s(t,e,r,n){return Object.keys(r).forEach((function(u){var c=r[u];o(c)?n[u]=i(t,e,c):n[u]=s(t,e,c,{})})),n}e.scrap=function(t,e){var r=n.load(t),u=r.root();return o(e)?i(r,u,e):s(r,u,e,{})},e.$={attr:u.attr,text:u.text,count:u.count,list:c.list,html:u.html,exists:u.exists}},function(t,e){t.exports=cheerio},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.attr=function(t,e){return{type:"attr",select:t,attr:e}},e.text=function(t){return{type:"text",select:t}},e.count=function(t){return{type:"count",select:t}},e.html=function(t){return{type:"html",select:t}},e.exists=function(t){return{type:"exists",select:t}}},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.list=function(t,e){return{type:"list",select:t,query:e}}}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zY3JhcHEvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc2NyYXBxLy4vbGliL2luZGV4LnRzIiwid2VicGFjazovL3NjcmFwcS9leHRlcm5hbCBcImNoZWVyaW9cIiIsIndlYnBhY2s6Ly9zY3JhcHEvLi9saWIvc2VsZWN0b3JzLnRzIiwid2VicGFjazovL3NjcmFwcS8uL2xpYi9jb250cm9scy50cyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsImlzU2VsZWN0b3JPckNvbnRyb2wiLCJ0ZXN0Iiwic2NyYXBTZWxlY3RvciIsIiQiLCJjb250ZXh0Iiwic2VsZWN0b3IiLCJ0eXBlIiwic2VsZWN0IiwidGV4dCIsInRyaW0iLCJlbCIsImF0dHIiLCJlbHMiLCJsZW5ndGgiLCJyZXN1bHQiLCJlcSIsInNjcmFwZWRFbCIsInF1ZXJ5Iiwic2NyYXBRdWVyeSIsInB1c2giLCJodG1sIiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwicmVmIiwia2V5cyIsImZvckVhY2giLCJwcm9wIiwidmFsIiwibG9hZCIsInJvb3QiLCJjb3VudCIsImxpc3QiLCJleGlzdHMiLCJjaGVlcmlvIiwiYXR0cmlidXRlIl0sIm1hcHBpbmdzIjoidUJBQ0UsSUFBSUEsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFPRixFQUFpQkUsR0FBVUMsUUFHbkMsSUFBSUMsRUFBU0osRUFBaUJFLEdBQVksQ0FDekNHLEVBQUdILEVBQ0hJLEdBQUcsRUFDSEgsUUFBUyxJQVVWLE9BTkFJLEVBQVFMLEdBQVVNLEtBQUtKLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNGLEdBRy9ERyxFQUFPRSxHQUFJLEVBR0pGLEVBQU9ELFFBMERmLE9BckRBRixFQUFvQlEsRUFBSUYsRUFHeEJOLEVBQW9CUyxFQUFJVixFQUd4QkMsRUFBb0JVLEVBQUksU0FBU1IsRUFBU1MsRUFBTUMsR0FDM0NaLEVBQW9CYSxFQUFFWCxFQUFTUyxJQUNsQ0csT0FBT0MsZUFBZWIsRUFBU1MsRUFBTSxDQUFFSyxZQUFZLEVBQU1DLElBQUtMLEtBS2hFWixFQUFvQmtCLEVBQUksU0FBU2hCLEdBQ1gsb0JBQVhpQixRQUEwQkEsT0FBT0MsYUFDMUNOLE9BQU9DLGVBQWViLEVBQVNpQixPQUFPQyxZQUFhLENBQUVDLE1BQU8sV0FFN0RQLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxLQVF2RHJCLEVBQW9Cc0IsRUFBSSxTQUFTRCxFQUFPRSxHQUV2QyxHQURVLEVBQVBBLElBQVVGLEVBQVFyQixFQUFvQnFCLElBQy9CLEVBQVBFLEVBQVUsT0FBT0YsRUFDcEIsR0FBVyxFQUFQRSxHQUE4QixpQkFBVkYsR0FBc0JBLEdBQVNBLEVBQU1HLFdBQVksT0FBT0gsRUFDaEYsSUFBSUksRUFBS1gsT0FBT1ksT0FBTyxNQUd2QixHQUZBMUIsRUFBb0JrQixFQUFFTyxHQUN0QlgsT0FBT0MsZUFBZVUsRUFBSSxVQUFXLENBQUVULFlBQVksRUFBTUssTUFBT0EsSUFDdEQsRUFBUEUsR0FBNEIsaUJBQVRGLEVBQW1CLElBQUksSUFBSU0sS0FBT04sRUFBT3JCLEVBQW9CVSxFQUFFZSxFQUFJRSxFQUFLLFNBQVNBLEdBQU8sT0FBT04sRUFBTU0sSUFBUUMsS0FBSyxLQUFNRCxJQUM5SSxPQUFPRixHQUlSekIsRUFBb0I2QixFQUFJLFNBQVMxQixHQUNoQyxJQUFJUyxFQUFTVCxHQUFVQSxFQUFPcUIsV0FDN0IsV0FBd0IsT0FBT3JCLEVBQWdCLFNBQy9DLFdBQThCLE9BQU9BLEdBRXRDLE9BREFILEVBQW9CVSxFQUFFRSxFQUFRLElBQUtBLEdBQzVCQSxHQUlSWixFQUFvQmEsRUFBSSxTQUFTaUIsRUFBUUMsR0FBWSxPQUFPakIsT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLdUIsRUFBUUMsSUFHekcvQixFQUFvQmtDLEVBQUksR0FJakJsQyxFQUFvQkEsRUFBb0JtQyxFQUFJLEcsZ0ZDbEZyRCxXQUNBLE9BRUEsT0FFQSxTQUFTQyxFQUFvQkMsR0FDekIsTUFBSyxTQUFVQSxHQUFVLFdBQVlBLEVBTXpDLFNBQVNDLEVBQWNDLEVBQWtCQyxFQUFrQkMsR0FDdkQsT0FBUUEsRUFBU0MsTUFDYixJQUFLLE9BQ0QsSUFBTSxFQUE0QixLQUFwQkQsRUFBU0UsT0FDakJKLEVBQUVDLEdBQVNJLE9BQ1hMLEVBQUVFLEVBQVNFLE9BQVFILEdBQVNJLE9BQ2xDLE9BQU8sR0FBUSxFQUFLQyxPQUV4QixJQUFLLE9BS0QsT0FKTUMsRUFBMEIsS0FBcEJMLEVBQVNFLE9BQ2ZILEVBQ0FELEVBQUVFLEVBQVNFLE9BQVFILElBQ1RPLEtBQUtOLEVBQVNNLE1BR2xDLElBQUssUUFHRCxPQUZNQyxFQUFNVCxFQUFFRSxFQUFTRSxPQUFRSCxJQUNiUyxPQUd0QixJQUFLLFNBR0QsU0FGTUQsRUFBTVQsRUFBRUUsRUFBU0UsT0FBUUgsSUFDWlMsT0FHdkIsSUFBSyxPQUdELElBRkEsSUFBTUMsRUFBZ0IsR0FDaEJGLEVBQU1ULEVBQUVFLEVBQVNFLE9BQVFILEdBQ3RCcEMsRUFBSSxFQUFHQSxFQUFJNEMsRUFBSUMsT0FBUTdDLElBQUssQ0FDakMsSUFBTTBDLEVBQUtFLEVBQUlHLEdBQUcvQyxHQUNaZ0QsRUFBWWhCLEVBQW9CSyxFQUFTWSxPQUN6Q2YsRUFBY0MsRUFBR08sRUFBSUwsRUFBU1ksT0FDOUJDLEVBQVdmLEVBQUdPLEVBQUlMLEVBQVNZLE1BQU8sSUFDeENILEVBQU9LLEtBQUtILEdBRWhCLE9BQU9GLEVBRVgsSUFBSyxPQUNELEdBQXdCLEtBQXBCVCxFQUFTRSxPQUVULE9BRGFKLEVBQUVDLEdBQVNnQixPQUd4QixJQUNNLEdBREFWLEVBQUtQLEVBQUVFLEVBQVNFLE9BQVFILElBQ2RnQixPQUNoQixNQUF3QixpQkFBVCxFQUNULEVBQUtYLE9BQ0wsRUFHZCxRQUNJLE1BQU0sSUFBSVksTUFBTSx1QkFBdUJDLEtBQUtDLFVBQVVsQixHQUFTLE1BSzNFLFNBQVNhLEVBQTRCZixFQUFrQkMsRUFBa0JhLEVBQVVPLEdBU2xGLE9BUkc5QyxPQUFPK0MsS0FBS1IsR0FBT1MsU0FBUSxTQUFBQyxHQUN2QixJQUFNQyxFQUFNWCxFQUFNVSxHQUNwQjNCLEVBQW9CNEIsR0FDdkJKLEVBQUlHLEdBQVF6QixFQUFjQyxFQUFHQyxFQUFTd0IsR0FFdENKLEVBQUlHLEdBQVFULEVBQVdmLEVBQUdDLEVBQVN3QixFQUFLLE9BR25DSixFQUdSLGlCQUNJSixFQUNBSCxHQUVBLElBQU1kLEVBQUksRUFBQTBCLEtBQUtULEdBQ1RVLEVBQU8zQixFQUFFMkIsT0FDZixPQUFJOUIsRUFBb0JpQixHQUNiZixFQUFjQyxFQUFHMkIsRUFBTWIsR0FFdkJDLEVBQVdmLEVBQUcyQixFQUFNYixFQUFnQixLQUl0QyxFQUFBZCxFQUFJLENBQ2JRLEtBQUksT0FDSkgsS0FBSSxPQUNKdUIsTUFBSyxRQUNMQyxLQUFJLE9BQ0paLEtBQUksT0FDSmEsT0FBTSxXLGNDbEdWbEUsRUFBT0QsUUFBVW9FLFMsOEVDZ0NqQixnQkFBcUI3QixFQUFrQjhCLEdBQ25DLE1BQU8sQ0FDSDdCLEtBQU0sT0FDTkMsT0FBUUYsRUFDUk0sS0FBTXdCLElBSWQsZ0JBQXFCOUIsR0FDakIsTUFBTyxDQUNIQyxLQUFNLE9BQ05DLE9BQVFGLElBSWhCLGlCQUFzQkEsR0FDbEIsTUFBTyxDQUNIQyxLQUFNLFFBQ05DLE9BQVFGLElBSWhCLGdCQUFxQkEsR0FDakIsTUFBTyxDQUNIQyxLQUFNLE9BQ05DLE9BQVFGLElBSWhCLGtCQUF1QkEsR0FDbkIsTUFBTyxDQUNIQyxLQUFNLFNBQ05DLE9BQVFGLEssOEVDN0NoQixnQkFBaUVBLEVBQWtCWSxHQUMvRSxNQUFPLENBQ0hYLEtBQU0sT0FDTkMsT0FBUUYsRUFDUlksTUFBSyIsImZpbGUiOiJzY3JhcHEubWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwiaW1wb3J0IHsgbG9hZCB9IGZyb20gXCJjaGVlcmlvXCI7XG5pbXBvcnQgeyBBbnlTZWxlY3RvciwgdGV4dCwgY291bnQsIGF0dHIsIGh0bWwsIGV4aXN0cyB9IGZyb20gXCIuL3NlbGVjdG9yc1wiO1xuaW1wb3J0IHsgUXVlcnksIFR5cGVPZlF1ZXJ5IH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgQW55Q29udHJvbCwgbGlzdCB9IGZyb20gXCIuL2NvbnRyb2xzXCI7XG5cbmZ1bmN0aW9uIGlzU2VsZWN0b3JPckNvbnRyb2wodGVzdDogYW55KTogdGVzdCBpcyAoQW55U2VsZWN0b3IgfCBBbnlDb250cm9sKSB7XG4gICAgaWYgKChcInR5cGVcIiBpbiB0ZXN0KSAmJiAoXCJzZWxlY3RcIiBpbiB0ZXN0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzY3JhcFNlbGVjdG9yKCQ6IENoZWVyaW9TdGF0aWMsIGNvbnRleHQ6IENoZWVyaW8sIHNlbGVjdG9yOiBBbnlTZWxlY3RvciB8IEFueUNvbnRyb2wpIHtcbiAgICBzd2l0Y2ggKHNlbGVjdG9yLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcInRleHRcIjoge1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChzZWxlY3Rvci5zZWxlY3QgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgPyAkKGNvbnRleHQpLnRleHQoKVxuICAgICAgICAgICAgICAgIDogJChzZWxlY3Rvci5zZWxlY3QsIGNvbnRleHQpLnRleHQoKTtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0ICYmIHRleHQudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhdHRyXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IGVsID0gKHNlbGVjdG9yLnNlbGVjdCA9PT0gXCJcIilcbiAgICAgICAgICAgICAgICA/IGNvbnRleHRcbiAgICAgICAgICAgICAgICA6ICQoc2VsZWN0b3Iuc2VsZWN0LCBjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBlbC5hdHRyKHNlbGVjdG9yLmF0dHIpO1xuICAgICAgICAgICAgcmV0dXJuIGF0dHI7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImNvdW50XCI6IHtcbiAgICAgICAgICAgIGNvbnN0IGVscyA9ICQoc2VsZWN0b3Iuc2VsZWN0LCBjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZWxzLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBjb3VudDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiZXhpc3RzXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IGVscyA9ICQoc2VsZWN0b3Iuc2VsZWN0LCBjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IGVscy5sZW5ndGggPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RzO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJsaXN0XCI6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGVscyA9ICQoc2VsZWN0b3Iuc2VsZWN0LCBjb250ZXh0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWwgPSBlbHMuZXEoaSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyYXBlZEVsID0gaXNTZWxlY3Rvck9yQ29udHJvbChzZWxlY3Rvci5xdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgPyBzY3JhcFNlbGVjdG9yKCQsIGVsLCBzZWxlY3Rvci5xdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgOiBzY3JhcFF1ZXJ5KCQsIGVsLCBzZWxlY3Rvci5xdWVyeSwge30pO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNjcmFwZWRFbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJodG1sXCI6IHtcbiAgICAgICAgICAgIGlmIChzZWxlY3Rvci5zZWxlY3QgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gJChjb250ZXh0KS5odG1sKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gJChzZWxlY3Rvci5zZWxlY3QsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBlbC5odG1sKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlb2YgaHRtbCA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICAgICAgPyBodG1sLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICA6IGh0bWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmRlZmluZWQgc2VsZWN0b3IgXCIke0pTT04uc3RyaW5naWZ5KHNlbGVjdG9yKX1cImApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzY3JhcFF1ZXJ5PFEgZXh0ZW5kcyBRdWVyeT4oJDogQ2hlZXJpb1N0YXRpYywgY29udGV4dDogQ2hlZXJpbywgcXVlcnk6IFEsIHJlZjogYW55KTogVHlwZU9mUXVlcnk8UT4ge1xuICAgIE9iamVjdC5rZXlzKHF1ZXJ5KS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSBxdWVyeVtwcm9wXTtcblx0XHRpZiAoaXNTZWxlY3Rvck9yQ29udHJvbCh2YWwpKSB7XG5cdFx0XHRyZWZbcHJvcF0gPSBzY3JhcFNlbGVjdG9yKCQsIGNvbnRleHQsIHZhbCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlZltwcm9wXSA9IHNjcmFwUXVlcnkoJCwgY29udGV4dCwgdmFsLCB7fSk7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHJlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNjcmFwPFEgZXh0ZW5kcyBRdWVyeSB8IEFueUNvbnRyb2wgfCBBbnlTZWxlY3Rvcj4oXG4gICAgaHRtbDogc3RyaW5nLFxuICAgIHF1ZXJ5OiBRXG4pOiBUeXBlT2ZRdWVyeTxRPiB7XG4gICAgY29uc3QgJCA9IGxvYWQoaHRtbCk7XG4gICAgY29uc3Qgcm9vdCA9ICQucm9vdCgpO1xuICAgIGlmIChpc1NlbGVjdG9yT3JDb250cm9sKHF1ZXJ5KSkge1xuICAgICAgICByZXR1cm4gc2NyYXBTZWxlY3RvcigkLCByb290LCBxdWVyeSkgYXMgYW55O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzY3JhcFF1ZXJ5KCQsIHJvb3QsIHF1ZXJ5IGFzIFF1ZXJ5LCB7fSkgYXMgYW55O1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0ICQgPSB7XG4gICAgYXR0cixcbiAgICB0ZXh0LFxuICAgIGNvdW50LFxuICAgIGxpc3QsXG4gICAgaHRtbCxcbiAgICBleGlzdHMsXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBjaGVlcmlvOyIsImludGVyZmFjZSBDb3VudFR5cGUge1xuICAgIHR5cGU6IFwiY291bnRcIjtcbiAgICBzZWxlY3Q6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRleHRUeXBlIHtcbiAgICB0eXBlOiBcInRleHRcIjtcbiAgICBzZWxlY3Q6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEF0dHJUeXBlIHtcbiAgICB0eXBlOiBcImF0dHJcIjtcbiAgICBzZWxlY3Q6IHN0cmluZztcbiAgICBhdHRyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBIdG1sVHlwZSB7XG4gICAgdHlwZTogXCJodG1sXCI7XG4gICAgc2VsZWN0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBFeGlzdHNUeXBlIHtcbiAgICB0eXBlOiBcImV4aXN0c1wiLFxuICAgIHNlbGVjdDogc3RyaW5nO1xufVxuXG4vLyBFWFBPUlRTXG5cbmV4cG9ydCB0eXBlIEFueVNlbGVjdG9yID0gVGV4dFR5cGUgfCBBdHRyVHlwZSB8IENvdW50VHlwZSB8IEh0bWxUeXBlIHwgRXhpc3RzVHlwZTtcblxuLy8gRFNMXG5cbmV4cG9ydCBmdW5jdGlvbiBhdHRyKHNlbGVjdG9yOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nKTogQXR0clR5cGUge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiYXR0clwiLFxuICAgICAgICBzZWxlY3Q6IHNlbGVjdG9yLFxuICAgICAgICBhdHRyOiBhdHRyaWJ1dGVcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KHNlbGVjdG9yOiBzdHJpbmcpOiBUZXh0VHlwZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIHNlbGVjdDogc2VsZWN0b3JcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY291bnQoc2VsZWN0b3I6IHN0cmluZyk6IENvdW50VHlwZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJjb3VudFwiLFxuICAgICAgICBzZWxlY3Q6IHNlbGVjdG9yXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGh0bWwoc2VsZWN0b3I6IHN0cmluZyk6IEh0bWxUeXBlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcImh0bWxcIixcbiAgICAgICAgc2VsZWN0OiBzZWxlY3RvclxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGlzdHMoc2VsZWN0b3I6IHN0cmluZyk6IEV4aXN0c1R5cGUge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiZXhpc3RzXCIsXG4gICAgICAgIHNlbGVjdDogc2VsZWN0b3JcbiAgICB9O1xufVxuIiwiaW1wb3J0IHsgQW55U2VsZWN0b3IgfSBmcm9tIFwiLi9zZWxlY3RvcnNcIjtcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xUeXBlczxRPiB7XG4gICAgbGlzdDogQXJyYXk8UT47XG59XG5cbi8vIEVYUE9SVFNcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0VHlwZTxRIGV4dGVuZHMgQW55U2VsZWN0b3IgfCBBbnlDb250cm9sIHwgUXVlcnk+IHtcbiAgICB0eXBlOiBcImxpc3RcIjtcbiAgICBzZWxlY3Q6IHN0cmluZztcbiAgICBxdWVyeTogUTtcbn1cblxuZXhwb3J0IHR5cGUgQW55Q29udHJvbCA9IExpc3RUeXBlPGFueT47XG5cbi8vIERTTFxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdDxRIGV4dGVuZHMgUXVlcnkgfCBBbnlDb250cm9sIHwgQW55U2VsZWN0b3I+KHNlbGVjdG9yOiBzdHJpbmcsIHF1ZXJ5OiBRKTogTGlzdFR5cGU8UT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzZWxlY3Q6IHNlbGVjdG9yLFxuICAgICAgICBxdWVyeVxuICAgIH07XG59XG4iXSwic291cmNlUm9vdCI6IiJ9 |
@@ -1,2 +0,2 @@ | ||
import { AnySelector, SelectorTypes } from "./selectors"; | ||
import { AnySelector } from "./selectors"; | ||
import { ListType, AnyControl } from "./controls"; | ||
@@ -6,8 +6,15 @@ export interface Query { | ||
} | ||
export declare type GetResult<Q extends AnySelector | ListType<any> | Query> = { | ||
0: Q extends AnySelector ? SelectorTypes[Q["type"]] : never; | ||
1: Q extends ListType<infer T> ? GetResult<T>[] : never; | ||
export interface SelectorResultType { | ||
text: string; | ||
attr: string; | ||
count: number; | ||
html: string; | ||
exists: boolean; | ||
} | ||
export declare type TypeOfQuery<Q extends AnySelector | ListType<any> | Query> = { | ||
0: Q extends AnySelector ? SelectorResultType[Q["type"]] : never; | ||
1: Q extends ListType<infer T> ? TypeOfQuery<T>[] : never; | ||
2: Q extends Query ? { | ||
[prop in keyof Q]: GetResult<Q[prop]>; | ||
[prop in keyof Q]: TypeOfQuery<Q[prop]>; | ||
} : never; | ||
}[Q extends AnySelector ? 0 : Q extends ListType<any> ? 1 : Q extends Query ? 2 : boolean]; |
@@ -1,5 +0,5 @@ | ||
import { AnySelector, text, count, attr, html } from "./selectors"; | ||
import { Query, GetResult } from "./helpers"; | ||
import { AnySelector, text, count, attr, html, exists } from "./selectors"; | ||
import { Query, TypeOfQuery } from "./helpers"; | ||
import { AnyControl, list } from "./controls"; | ||
export declare function scrap<Q extends Query | AnyControl | AnySelector>(html: string, query: Q): GetResult<Q>; | ||
export declare function scrap<Q extends Query | AnyControl | AnySelector>(html: string, query: Q): TypeOfQuery<Q>; | ||
export declare const $: { | ||
@@ -11,2 +11,3 @@ attr: typeof attr; | ||
html: typeof html; | ||
exists: typeof exists; | ||
}; |
@@ -18,3 +18,3 @@ "use strict"; | ||
: $(selector.select, context).text(); | ||
return text_1 || text_1.trim(); | ||
return text_1 && text_1.trim(); | ||
} | ||
@@ -33,2 +33,7 @@ case "attr": { | ||
} | ||
case "exists": { | ||
var els = $(selector.select, context); | ||
var exists_1 = els.length ? true : false; | ||
return exists_1; | ||
} | ||
case "list": { | ||
@@ -92,4 +97,5 @@ var result = []; | ||
list: controls_1.list, | ||
html: selectors_1.html | ||
html: selectors_1.html, | ||
exists: selectors_1.exists, | ||
}; | ||
//# sourceMappingURL=index.js.map |
// Generated by dts-bundle v0.7.3 | ||
declare module 'scrapq' { | ||
import { AnySelector, text, count, attr, html } from "scrapq/selectors"; | ||
import { Query, GetResult } from "scrapq/helpers"; | ||
import { AnySelector, text, count, attr, html, exists } from "scrapq/selectors"; | ||
import { Query, TypeOfQuery } from "scrapq/helpers"; | ||
import { AnyControl, list } from "scrapq/controls"; | ||
export function scrap<Q extends Query | AnyControl | AnySelector>(html: string, query: Q): GetResult<Q>; | ||
export function scrap<Q extends Query | AnyControl | AnySelector>(html: string, query: Q): TypeOfQuery<Q>; | ||
export const $: { | ||
@@ -14,2 +14,3 @@ attr: typeof attr; | ||
html: typeof html; | ||
exists: typeof exists; | ||
}; | ||
@@ -36,9 +37,7 @@ } | ||
} | ||
export interface SelectorTypes { | ||
text: string; | ||
attr: string; | ||
count: number; | ||
html: string; | ||
interface ExistsType { | ||
type: "exists"; | ||
select: string; | ||
} | ||
export type AnySelector = TextType | AttrType | CountType | HtmlType; | ||
export type AnySelector = TextType | AttrType | CountType | HtmlType | ExistsType; | ||
export function attr(selector: string, attribute: string): AttrType; | ||
@@ -48,2 +47,3 @@ export function text(selector: string): TextType; | ||
export function html(selector: string): HtmlType; | ||
export function exists(selector: string): ExistsType; | ||
export {}; | ||
@@ -53,3 +53,3 @@ } | ||
declare module 'scrapq/helpers' { | ||
import { AnySelector, SelectorTypes } from "scrapq/selectors"; | ||
import { AnySelector } from "scrapq/selectors"; | ||
import { ListType, AnyControl } from "scrapq/controls"; | ||
@@ -59,7 +59,14 @@ export interface Query { | ||
} | ||
export type GetResult<Q extends AnySelector | ListType<any> | Query> = { | ||
0: Q extends AnySelector ? SelectorTypes[Q["type"]] : never; | ||
1: Q extends ListType<infer T> ? GetResult<T>[] : never; | ||
export interface SelectorResultType { | ||
text: string; | ||
attr: string; | ||
count: number; | ||
html: string; | ||
exists: boolean; | ||
} | ||
export type TypeOfQuery<Q extends AnySelector | ListType<any> | Query> = { | ||
0: Q extends AnySelector ? SelectorResultType[Q["type"]] : never; | ||
1: Q extends ListType<infer T> ? TypeOfQuery<T>[] : never; | ||
2: Q extends Query ? { | ||
[prop in keyof Q]: GetResult<Q[prop]>; | ||
[prop in keyof Q]: TypeOfQuery<Q[prop]>; | ||
} : never; | ||
@@ -66,0 +73,0 @@ }[Q extends AnySelector ? 0 : Q extends ListType<any> ? 1 : Q extends Query ? 2 : boolean]; |
@@ -18,9 +18,7 @@ interface CountType { | ||
} | ||
export interface SelectorTypes { | ||
text: string; | ||
attr: string; | ||
count: number; | ||
html: string; | ||
interface ExistsType { | ||
type: "exists"; | ||
select: string; | ||
} | ||
export declare type AnySelector = TextType | AttrType | CountType | HtmlType; | ||
export declare type AnySelector = TextType | AttrType | CountType | HtmlType | ExistsType; | ||
export declare function attr(selector: string, attribute: string): AttrType; | ||
@@ -30,2 +28,3 @@ export declare function text(selector: string): TextType; | ||
export declare function html(selector: string): HtmlType; | ||
export declare function exists(selector: string): ExistsType; | ||
export {}; |
@@ -33,2 +33,9 @@ "use strict"; | ||
exports.html = html; | ||
function exists(selector) { | ||
return { | ||
type: "exists", | ||
select: selector | ||
}; | ||
} | ||
exports.exists = exists; | ||
//# sourceMappingURL=selectors.js.map |
@@ -1,2 +0,2 @@ | ||
import { AnySelector, SelectorTypes } from "./selectors"; | ||
import { AnySelector } from "./selectors"; | ||
import { ListType, AnyControl } from "./controls"; | ||
@@ -8,7 +8,15 @@ | ||
export type GetResult<Q extends AnySelector | ListType<any> | Query> = { | ||
0: Q extends AnySelector ? SelectorTypes[Q["type"]] : never; | ||
1: Q extends ListType<infer T> ? GetResult<T>[] : never; | ||
export interface SelectorResultType { | ||
text: string; | ||
attr: string; | ||
count: number; | ||
html: string; | ||
exist: boolean; | ||
} | ||
export type TypeOfQuery<Q extends AnySelector | ListType<any> | Query> = { | ||
0: Q extends AnySelector ? SelectorResultType[Q["type"]] : never; | ||
1: Q extends ListType<infer T> ? TypeOfQuery<T>[] : never; | ||
2: Q extends Query ? { | ||
[prop in keyof Q]: GetResult<Q[prop]> | ||
[prop in keyof Q]: TypeOfQuery<Q[prop]> | ||
}: never; | ||
@@ -15,0 +23,0 @@ }[Q extends AnySelector ? 0 |
import { load } from "cheerio"; | ||
import { AnySelector, text, count, attr, html } from "./selectors"; | ||
import { Query, GetResult } from "./helpers"; | ||
import { AnySelector, text, count, attr, html, exist } from "./selectors"; | ||
import { Query, TypeOfQuery } from "./helpers"; | ||
import { AnyControl, list } from "./controls"; | ||
@@ -19,3 +19,3 @@ | ||
: $(selector.select, context).text(); | ||
return text || text.trim(); | ||
return text && text.trim(); | ||
} | ||
@@ -34,2 +34,7 @@ case "attr": { | ||
} | ||
case "exist": { | ||
const els = $(selector.select, context); | ||
const exist = els.length ? true : false; | ||
return exist; | ||
} | ||
case "list": { | ||
@@ -65,3 +70,3 @@ const result: any[] = []; | ||
function scrapQuery<Q extends Query>($: CheerioStatic, context: Cheerio, query: Q, ref: any): GetResult<Q> { | ||
function scrapQuery<Q extends Query>($: CheerioStatic, context: Cheerio, query: Q, ref: any): TypeOfQuery<Q> { | ||
Object.keys(query).forEach(prop => { | ||
@@ -78,8 +83,6 @@ const val = query[prop]; | ||
export function scrap<Q extends Query | AnyControl | AnySelector>( | ||
html: string, | ||
query: Q | ||
): GetResult<Q> { | ||
): TypeOfQuery<Q> { | ||
const $ = load(html); | ||
@@ -99,3 +102,4 @@ const root = $.root(); | ||
list, | ||
html | ||
html, | ||
exist, | ||
}; |
@@ -22,13 +22,11 @@ interface CountType { | ||
interface ExistType { | ||
type: "exist", | ||
select: string; | ||
} | ||
// EXPORTS | ||
export interface SelectorTypes { | ||
text: string; | ||
attr: string; | ||
count: number; | ||
html: string; | ||
} | ||
export type AnySelector = TextType | AttrType | CountType | HtmlType | ExistType; | ||
export type AnySelector = TextType | AttrType | CountType | HtmlType; | ||
// DSL | ||
@@ -62,3 +60,10 @@ | ||
select: selector | ||
} | ||
}; | ||
} | ||
export function exist(selector: string): ExistType { | ||
return { | ||
type: "exist", | ||
select: selector | ||
}; | ||
} |
{ | ||
"name": "scrapq", | ||
"version": "2.0.1", | ||
"version": "2.1.0", | ||
"description": "Lightweight Typescript library for scrapping html", | ||
@@ -9,5 +9,3 @@ "main": "./dist/index.js", | ||
"scripts": { | ||
"test": "npm run test:basic && npm run test:exhaustive", | ||
"test:basic": "jasmine-ts ./test/basic.test.ts", | ||
"test:exhaustive": "jasmine-ts ./test/**/*.ts", | ||
"test": "ts-node node_modules/tape/bin/tape test/**/*.ts", | ||
"dist": "npm run test; npm run build; npm run build:web", | ||
@@ -31,7 +29,6 @@ "build": "npm run build:node && npm run build:web && npm run build:dts", | ||
"devDependencies": { | ||
"@types/jasmine": "^2.8.16", | ||
"@types/node": "^10.17.15", | ||
"jasmine": "^3.5.0", | ||
"jasmine-ts": "^0.2.1", | ||
"ts-loader": "^5.4.5", | ||
"@types/tape": "^4.2.34", | ||
"tape": "^4.13.2", | ||
"ts-loader": "^7.0.0", | ||
"ts-node": "^8.8.2", | ||
"typescript": "^3.7.5", | ||
@@ -38,0 +35,0 @@ "webpack": "^4.41.6", |
@@ -104,22 +104,26 @@ # ScrapQ | ||
`Q.text(selector: string): string` | ||
`$.text(selector: string): string` | ||
get text from an element | ||
`Q.attr(selector: string, htmlAttribute: string): string` | ||
`$.attr(selector: string, htmlAttribute: string): string` | ||
get attribute from an element | ||
`Q.html(selector: string): string` | ||
`$.html(selector: string): string` | ||
get html | ||
`Q.count(selector: string): number` | ||
`$.count(selector: string): number` | ||
get elements count | ||
`$.exist(selector: string): boolean` | ||
check if element exists | ||
### Controls | ||
`Q.List(selector: string, query: Query | QueryType, predicate?): Array<query>` | ||
`$.list(selector: string, query: Query | QueryType, predicate?): Array<query>` | ||
get list of items |
@@ -0,1 +1,2 @@ | ||
import test from "tape"; | ||
import { scrap, $ } from '../lib'; | ||
@@ -13,19 +14,21 @@ | ||
describe('Basic', () => { | ||
test('Basic', (main) => { | ||
it('should scrap <h1/> text from string', () => { | ||
test('should scrap <h1/> text from string', (t) => { | ||
const result = scrap(STR_TO_SCRAP, { | ||
title: $.text('h1.title') | ||
}); | ||
expect(result).toEqual({ title: 'Hello'}); | ||
t.equal(result, { title: 'Hello'}); | ||
t.end(); | ||
}); | ||
it('should scrap attributes from <h1/>', () => { | ||
test('should scrap attributes from <h1/>', (t) => { | ||
const result = scrap(STR_TO_SCRAP, { | ||
title: $.attr('h1.title', 'class') | ||
}); | ||
expect(result).toEqual({ title: 'title'}); | ||
t.equal(result, { title: 'title'}); | ||
t.end(); | ||
}); | ||
it('should scrap items from <span/>', () => { | ||
test('should scrap items from <span/>', (t) => { | ||
const result = scrap(STR_TO_SCRAP, { | ||
@@ -36,7 +39,8 @@ items: $.list('li', { | ||
}); | ||
expect(result.items.length).toBe(3); | ||
expect(result.items[2].text).toBe('Bonjour') | ||
t.equal(result.items.length, 3); | ||
t.equal(result.items[2].text, 'Bonjour'); | ||
t.end(); | ||
}); | ||
it('should scrap text from <li><span/>', () => { | ||
test('should scrap text from <li><span/>', (t) => { | ||
const result = scrap(STR_TO_SCRAP, { | ||
@@ -47,7 +51,8 @@ items: $.list('li', { | ||
}); | ||
expect(result.items.length).toBe(3); | ||
expect(result.items[2].text).toBe('Bonjour') | ||
t.equal(result.items.length, 3); | ||
t.equal(result.items[2].text, 'Bonjour'); | ||
t.end(); | ||
}); | ||
it('should scrap text from <span/> by omitting <li/>', () => { | ||
test('should scrap text from <span/> by omitting <li/>', (t) => { | ||
const result = scrap(STR_TO_SCRAP, { | ||
@@ -58,11 +63,12 @@ items: $.list('span', { | ||
}); | ||
expect(result.items.length).toBe(3); | ||
expect(result.items[2].text).toBe('Bonjour') | ||
t.equal(result.items.length, 3); | ||
t.equal(result.items[2].text, 'Bonjour'); | ||
t.end(); | ||
}); | ||
it('should get list of texts', () => { | ||
test('should get list of texts', (t) => { | ||
const result = scrap(STR_TO_SCRAP, { | ||
texts: $.list('li', $.text('span')) | ||
}); | ||
expect(result.texts).toEqual([ | ||
t.equals(result.texts, [ | ||
'Guten Tag', | ||
@@ -72,5 +78,6 @@ 'Ciao', | ||
]); | ||
t.end(); | ||
}); | ||
it('should user deep query', () => { | ||
test('should user deep query', (t) => { | ||
const result = scrap(STR_TO_SCRAP, { | ||
@@ -82,31 +89,36 @@ title: $.text('.title'), | ||
}); | ||
expect(result.title).toBe('Hello'); | ||
expect(result.data.msg).toBe('Ciao'); | ||
t.equal(result.title, 'Hello'); | ||
t.equal(result.data.msg, 'Ciao'); | ||
t.end(); | ||
}); | ||
it('should count <span/> elements', () => { | ||
test('should count <span/> elements', (t) => { | ||
const result = scrap(STR_TO_SCRAP, { | ||
spanCount: $.count('span') | ||
}); | ||
expect(result.spanCount).toBe(3); | ||
t.equal(result.spanCount, 3); | ||
t.end(); | ||
}); | ||
it('should count not exists element', () => { | ||
test('should count not exists element', (t) => { | ||
const result = scrap(STR_TO_SCRAP, { | ||
spanCount: $.count('table') | ||
}); | ||
expect(result.spanCount).toBe(0); | ||
t.equal(result.spanCount, 0); | ||
t.end(); | ||
}); | ||
it('should use only selector to scrap title', () => { | ||
test('should use only selector to scrap title', (t) => { | ||
const title = scrap(STR_TO_SCRAP, $.text('.title')); | ||
expect(title).toBe('Hello'); | ||
t.equal(title, 'Hello'); | ||
}); | ||
it('should use only selector to scrap <span/>', () => { | ||
test('should use only selector to scrap <span/>', (t) => { | ||
const spans = scrap(STR_TO_SCRAP, $.list('span', $.text(''))); | ||
expect(spans.length).toBe(3); | ||
expect(spans[0]).toBe('Guten Tag'); | ||
t.equal(spans.length, 3); | ||
t.equal(spans[0], 'Guten Tag'); | ||
t.end(); | ||
}); | ||
main.end(); | ||
}); |
@@ -0,12 +1,15 @@ | ||
import test from "tape"; | ||
import { scrap, $ } from "../../lib"; | ||
import { html } from "../data"; | ||
describe("select", () => { | ||
it("should scrap items from <span/>", () => { | ||
test("select", (main) => { | ||
test("should scrap items from <span/>", (t) => { | ||
const spans = scrap(html, $.list("span", $.text(""))); | ||
expect(spans.length).toBe(3); | ||
expect(spans[0]).toBe("Guten Tag"); | ||
t.equal(spans.length, 3); | ||
t.equal(spans[0], "Guten Tag"); | ||
t.end(); | ||
}); | ||
it("should scrap items from <span/> using query", () => { | ||
test("should scrap items from <span/> using query", (t) => { | ||
const result = scrap(html, { | ||
@@ -17,5 +20,8 @@ items: $.list("li", { | ||
}); | ||
expect(result.items.length).toBe(3); | ||
expect(result.items[2].text).toBe("Bonjour"); | ||
t.equal(result.items.length, 3); | ||
t.equal(result.items[2].text, "Bonjour"); | ||
t.end(); | ||
}); | ||
main.end(); | ||
}); |
@@ -0,1 +1,2 @@ | ||
import test from "tape"; | ||
import { readFileSync } from "fs"; | ||
@@ -6,4 +7,5 @@ import { scrap, $ } from "../../lib"; | ||
describe("agescx documentation", () => { | ||
it("should get all navigation items from agescx", () => { | ||
test("agescx documentation", (main) => { | ||
test("should get all navigation items from agescx", (t) => { | ||
const result = scrap(shtml, { | ||
@@ -22,8 +24,11 @@ navs: $.list("ul.navbar-nav>li:not(.disabled)", { | ||
expect(result.navs.length).toBe(9); | ||
expect(result.navs[2].submenu.length).toBe(2); | ||
expect(result.navs[2].submenu[0].text).toBe("Adding new unit"); | ||
expect(result.content.length).toBeGreaterThan(30); | ||
expect(result.title).toBe("Agescx Documentation"); | ||
t.equal(result.navs.length, 9); | ||
t.equal(result.navs[2].submenu.length, 2); | ||
t.equal(result.navs[2].submenu[0].text, "Adding new unit"); | ||
t.equal(result.content.length, 1114); | ||
t.equal(result.title, "Agescx Documentation"); | ||
t.end(); | ||
}); | ||
main.end(); | ||
}); |
@@ -0,21 +1,28 @@ | ||
import test from "tape"; | ||
import { scrap, $ } from "../../lib"; | ||
import { html } from "../data"; | ||
describe("attr", () => { | ||
it("should scrap href attr from an <a/>", () => { | ||
test("attr", (main) => { | ||
test("should scrap href attr from an <a/>", (t) => { | ||
const result = scrap(html, $.attr("a", "href")); | ||
expect(result).toBe("/read-more"); | ||
t.equal(result, "/read-more"); | ||
t.end(); | ||
}); | ||
it("should scrap data-extra from <div/>", () => { | ||
test("should scrap data-extra from <div/>", (t) => { | ||
const result = scrap(html, $.attr(".footer", "data-extra")); | ||
expect(result).toBe("footer"); | ||
t.equal(result, "footer"); | ||
t.end(); | ||
}); | ||
it("should scrap data using query", () => { | ||
test("should scrap data using query", (t) => { | ||
const result = scrap(html, { | ||
footer: $.attr(".footer", "data-extra") | ||
}); | ||
expect(result.footer).toBe("footer"); | ||
t.equal(result.footer, "footer"); | ||
t.end(); | ||
}); | ||
main.end(); | ||
}); |
@@ -0,26 +1,34 @@ | ||
import test from "tape"; | ||
import { scrap, $ } from "../../lib"; | ||
import { html } from "../data"; | ||
describe("count", () => { | ||
it("should count <li/> elements", () => { | ||
test("count", (main) => { | ||
test("should count <li/> elements", (t) => { | ||
const result = scrap(html, $.count("li")); | ||
expect(result).toBe(3); | ||
t.equal(result, 3); | ||
t.end(); | ||
}); | ||
it("should count <h1/>", () => { | ||
test("should count <h1/>", (t) => { | ||
const result = scrap(html, $.count("h1")); | ||
expect(result).toBe(1); | ||
t.equal(result, 1); | ||
t.end(); | ||
}); | ||
it("should count non-existing element", () => { | ||
test("should count non-existing element", (t) => { | ||
const result = scrap(html, $.count("h3")); | ||
expect(result).toBe(0); | ||
t.equal(result, 0); | ||
t.end(); | ||
}); | ||
it("should count using query", () => { | ||
test("should count using query", (t) => { | ||
const result = scrap(html, { | ||
liCounts: $.count("li") | ||
}); | ||
expect(result.liCounts).toBe(3); | ||
t.equal(result.liCounts, 3); | ||
t.end(); | ||
}); | ||
main.end(); | ||
}); |
@@ -0,16 +1,22 @@ | ||
import test from "tape"; | ||
import { scrap, $ } from "../../lib"; | ||
import { html } from "../data"; | ||
describe("html", () => { | ||
it("should get html from <ul/>", () => { | ||
test("html", (main) => { | ||
test("should get html from <ul/>", (t) => { | ||
const result = scrap(html, $.html("ul>li:first-child")); | ||
expect(result).toBe(`<span>Guten Tag</span>`); | ||
t.equal(result, `<span>Guten Tag</span>`); | ||
t.end(); | ||
}); | ||
it("should count using query", () => { | ||
test("should count using query", (t) => { | ||
const result = scrap(html, { | ||
footer: $.html("ul>li:last-child") | ||
}); | ||
expect(result.footer).toBe(`<span>Bonjour</span>`); | ||
t.equal(result.footer, `<span>Bonjour</span>`); | ||
t.end(); | ||
}); | ||
main.end(); | ||
}); |
@@ -0,21 +1,28 @@ | ||
import test from "tape"; | ||
import { scrap, $ } from "../../lib"; | ||
import { html } from "../data"; | ||
describe("text", () => { | ||
it("should get text from .msg", () => { | ||
test("text", (main) => { | ||
test("should get text from .msg", (t) => { | ||
const result = scrap(html, $.text(".msg")); | ||
expect(result).toBe("Ciao"); | ||
t.equal(result, "Ciao"); | ||
t.end(); | ||
}); | ||
it("should not get text from non existing element", () => { | ||
test("should not get text from non existing element", (t) => { | ||
const result = scrap(html, $.text("h3")); | ||
expect(result).toBe(""); | ||
t.equal(result, ""); | ||
t.end(); | ||
}); | ||
it("should count using query", () => { | ||
test("should count using query", (t) => { | ||
const result = scrap(html, { | ||
link: $.text("a") | ||
}); | ||
expect(result.link).toBe("read more ..."); | ||
t.equal(result.link, "read more ..."); | ||
t.end(); | ||
}); | ||
main.end(); | ||
}); |
# TODO | ||
- [ ] add strict mode for parsing | ||
- [x] add if control | ||
- [ ] add if control | ||
- [ ] better context passing (if) | ||
@@ -9,2 +9,1 @@ - [ ] fix test for non existing elements | ||
- [x] test nested lists | ||
- [x] callback function to convert selector output |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
65723
7
35
862
129