{"version":3,"sources":["jsdelivr-header.js","/npm/x-ray@2.3.4/index.js"],"names":[],"mappings":"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","file":"/npm/x-ray@2.3.4/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/x-ray@2.3.4/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict'\n\nvar objectAssign = require('./lib/util').objectAssign\nvar streamToPromise = require('./lib/promisify')\nvar compact = require('./lib/util').compact\nvar isArray = require('./lib/util').isArray\nvar absolutes = require('./lib/absolutes')\nvar streamHelper = require('./lib/stream')\nvar isUrl = require('./lib/util').isUrl\nvar Crawler = require('x-ray-crawler')\nvar resolve = require('./lib/resolve')\nvar root = require('./lib/util').root\nvar params = require('./lib/params')\nvar debug = require('debug')('x-ray')\nvar cheerio = require('cheerio')\nvar enstore = require('enstore')\nvar walk = require('./lib/walk')\nvar fs = require('fs')\n\nvar CONST = {\n  CRAWLER_METHODS: ['concurrency', 'throttle', 'timeout', 'driver', 'delay', 'limit', 'abort'],\n  INIT_STATE: {\n    stream: false,\n    concurrency: Infinity,\n    paginate: false,\n    limit: Infinity,\n    abort: false\n  }\n}\n\nfunction Xray (options) {\n  var crawler = Crawler()\n  options = options || {}\n  var filters = options.filters || {}\n\n  function xray (source, scope, selector) {\n    var args = params(source, scope, selector)\n    selector = args.selector\n    source = args.source\n    scope = args.context\n\n    var state = objectAssign({}, CONST.INIT_STATE)\n    var store = enstore()\n    var pages = []\n    var stream\n\n    var walkHTML = WalkHTML(xray, selector, scope, filters)\n    var request = Request(crawler)\n\n    function node (source2, fn) {\n      if (arguments.length === 1) {\n        fn = source2\n      } else {\n        source = source2\n      }\n\n      debug('params: %j', {\n        source: source,\n        scope: scope,\n        selector: selector\n      })\n\n      if (isUrl(source)) {\n        debug('starting at: %s', source)\n        request(source, function (err, html) {\n          if (err) return next(err)\n          var $ = load(html, source)\n          walkHTML($, next)\n        })\n      } else if (scope && ~scope.indexOf('@')) {\n        debug('resolving to a url: %s', scope)\n        var url = resolve(source, false, scope, filters)\n\n        // ensure that a@href is a URL\n        if (!isUrl(url)) {\n          debug('%s is not a url. Skipping!', url)\n          return walkHTML(load(''), next)\n        }\n\n        debug('resolved \"%s\" to a %s', scope, url)\n        request(url, function (err, html) {\n          if (err) return next(err)\n          var $ = load(html, url)\n          walkHTML($, next)\n        })\n      } else if (source) {\n        var $ = load(source)\n        walkHTML($, next)\n      } else {\n        debug('%s is not a url or html. Skipping!', source)\n        return walkHTML(load(''), next)\n      }\n\n      function next (err, obj, $) {\n        if (err) return fn(err)\n        var paginate = state.paginate\n        var limit = --state.limit\n\n        // create the stream\n        if (!stream) {\n          if (paginate) stream = streamHelper.array(state.stream)\n          else stream = streamHelper.object(state.stream)\n        }\n\n        if (paginate) {\n          if (isArray(obj)) {\n            pages = pages.concat(obj)\n          } else {\n            pages.push(obj)\n          }\n\n          if (limit <= 0) {\n            debug('reached limit, ending')\n            stream(obj, true)\n            return fn(null, pages)\n          }\n\n          var url = resolve($, false, paginate, filters)\n          debug('paginate(%j) => %j', paginate, url)\n\n          if (!isUrl(url)) {\n            debug('%j is not a url, finishing up', url)\n            stream(obj, true)\n            return fn(null, pages)\n          }\n\n          if (state.abort && state.abort(obj, url)) {\n            debug('abort check passed, ending')\n            stream(obj, true)\n            return fn(null, pages)\n          }\n\n          stream(obj)\n\n          // debug\n          debug('paginating %j', url)\n          isFinite(limit) && debug('%s page(s) left to crawl', limit)\n\n          request(url, function (err, html) {\n            if (err) return next(err)\n            var $ = load(html, url)\n            walkHTML($, next)\n          })\n        } else {\n          stream(obj, true)\n          fn(null, obj)\n        }\n      }\n\n      return node\n    }\n\n    node.abort = function (validator) {\n      if (!arguments.length) return state.abort\n      state.abort = validator\n      return node\n    }\n\n    node.paginate = function (paginate) {\n      if (!arguments.length) return state.paginate\n      state.paginate = paginate\n      return node\n    }\n\n    node.limit = function (limit) {\n      if (!arguments.length) return state.limit\n      state.limit = limit\n      return node\n    }\n\n    node.stream = function () {\n      state.stream = store.createWriteStream()\n      var rs = store.createReadStream()\n      streamHelper.waitCb(rs, node)\n      return rs\n    }\n\n    node.write = function (path) {\n      if (!arguments.length) return node.stream()\n      state.stream = fs.createWriteStream(path)\n      streamHelper.waitCb(state.stream, node)\n      return state.stream\n    }\n\n    node.then = function (resHandler, errHandler) {\n      return streamToPromise(node.stream()).then(resHandler, errHandler)\n    }\n\n    return node\n  }\n\n  CONST.CRAWLER_METHODS.forEach(function (method) {\n    xray[method] = function () {\n      if (!arguments.length) return crawler[method]()\n      crawler[method].apply(crawler, arguments)\n      return this\n    }\n  })\n\n  return xray\n}\n\nfunction Request (crawler) {\n  return function request (url, fn) {\n    debug('fetching %s', url)\n    crawler(url, function (err, ctx) {\n      if (err) return fn(err)\n      debug('got response for %s with status code: %s', url, ctx.status)\n      return fn(null, ctx.body)\n    })\n  }\n}\n\nfunction load (html, url) {\n  html = html || ''\n  var $ = html.html ? html : cheerio.load(html)\n  if (url) $ = absolutes(url, $)\n  return $\n}\n\nfunction WalkHTML (xray, selector, scope, filters) {\n  return function walkHTML ($, fn) {\n    walk(selector, function (v, k, next) {\n      if (typeof v === 'string') {\n        var value = resolve($, root(scope), v, filters)\n        return next(null, value)\n      } else if (typeof v === 'function') {\n        return v($, function (err, obj) {\n          if (err) return next(err)\n          return next(null, obj)\n        })\n      } else if (isArray(v)) {\n        if (typeof v[0] === 'string') {\n          return next(null, resolve($, root(scope), v, filters))\n        } else if (typeof v[0] === 'object') {\n          var $scope = $.find ? $.find(scope) : $(scope)\n          var pending = $scope.length\n          var out = []\n\n          // Handle the empty result set (thanks @jenbennings!)\n          if (!pending) return next(null, out)\n\n          return $scope.each(function (i, el) {\n            var $innerscope = $scope.eq(i)\n            var node = xray(scope, v[0])\n            node($innerscope, function (err, obj) {\n              if (err) return next(err)\n              out[i] = obj\n              if (!--pending) {\n                return next(null, compact(out))\n              }\n            })\n          })\n        }\n      }\n      return next()\n    }, function (err, obj) {\n      if (err) return fn(err)\n      fn(null, obj, $)\n    })\n  }\n}\n\nmodule.exports = Xray\n"]}