{"version":3,"sources":["jsdelivr-header.js","/npm/advanced-seo-checker@3.2.0/src/index.js"],"names":[],"mappings":"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","file":"/npm/advanced-seo-checker@3.2.0/src/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/advanced-seo-checker@3.2.0/src/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","const http = require('http');\nconst parseURL = require('url-parse');\nconst request = require('request');\nconst urlExists = require('url-exists-deep').default;\nconst normalizeUrl = require('normalize-url');\nconst mitt = require('mitt');\nconst createAnalyzer = require('./createAnalyzer');\nconst ssllabs = require(\"node-ssllabs\");\nconst msg = require('./helpers/msg-helper');\n\nmodule.exports = function AdvancedSEOChecker(uri, opts) {\n  const defaultOpts = {\n    ignoreSSLTest: true,\n    ignoreRobotsTest: true,\n    ignoreSitemapTest: true,\n    ignoreInternalPagesIssues: false,\n    useTerminalOption: false\n  };\n  const options = Object.assign({}, defaultOpts, opts);\n  if (options.ignoreInternalPagesIssues) {\n    options.ignoreSSLTest = false;\n    options.ignoreRobotsTest = false;\n    options.ignoreSitemapTest = false;\n  }\n  if (!uri) {\n    throw new Error('Requires a valid URL.');\n  }\n\n  const emitter = mitt();\n  const parsedUrl = parseURL(\n    normalizeUrl(uri, {\n      stripWWW: false,\n      removeTrailingSlash: false\n    })\n  );\n\n  const getValidatedURL = (url) => {\n    // Check if user input protocol\n    if (url.indexOf('http://') < 0 && url.indexOf('https://') < 0) { // TODO: Turn this into its own function\n      url = 'http://' + url;\n    }\n    return url;\n  }\n  const load = (url) => {\n    let limit = 3;\n    const getPage = (url, done) => {\n      request.get({\n          url: url.toLowerCase(),\n          timeout: 60000,\n          followAllRedirects: true,\n          strictSSL: false,\n          rejectUnauthorized: false,\n          agent: false,\n          headers: {\n            'User-Agent': 'Node.js/0.6.6',\n            'Proxy-Connections': 'keep-alive'\n          },\n          pool: {\n            maxSockets: 100\n          }\n        },\n        function(error, response, body) {\n          if (error) {\n            msg.error(error);\n          }\n\n          if (!error || limit === 0) {\n            return done(error, body);\n          }\n          limit--;\n          return getPage(url, done);\n        });\n    };\n    const init = (resolve, reject) => {\n      url = getValidatedURL(url);\n      // Make request and fire callback\n      getPage(url.toLowerCase(), function(error, body) {\n        if (!error) {\n          return resolve(body);\n        }\n        return resolve('');\n      });\n    };\n\n    let promise = new Promise(init);\n    return promise;\n  };\n  const analyze = (urls, bodies) => {\n    let res = {};\n    const analyzer = createAnalyzer(options);\n    urls = Array.isArray(urls) ? urls : [urls];\n\n    const onBodiesLoad = (bodies, resolve, reject) => {\n      msg.appMsg('Retrieving urls bodies done');\n      msg.appMsg('Start analyzing urls');\n      const promises = [validateSitemap(), validateRobots(), testSSLCertificate(normalizeUrl(uri)),\n        analyzer.analyzePages(urls, bodies)\n      ];\n      Promise.all(promises).then(function(result) {\n        res = result[3];\n        if (!options.ignoreSSLTest) {\n          res.issues.warnings.ssl = result[2];\n        }\n        if (!options.ignoreSitemapTest) {\n          res.issues.notices.sitemap = result[0];\n        }\n        if (!options.ignoreRobotsTest) {\n          res.issues.notices.robots = result[1];\n        }\n\n        msg.green('Analyzing urls done');\n        resolve(res);\n      }).catch(function(err) {\n        reject(err);\n      });\n    };\n\n    const init = (resolve, reject) => {\n      if (bodies) {\n        onBodiesLoad(bodies, resolve, reject);\n      } else {\n        const bodiesPromises = [];\n        for (let i = 0; i < urls.length; i++) {\n          bodiesPromises.push(load(urls[i]));\n        }\n        msg.appMsg('Start retrieving urls bodies');\n        Promise.all(bodiesPromises).then(function(bodies) {\n          onBodiesLoad(bodies, resolve, reject);\n        }).catch(function(error) {\n          reject(error);\n        });\n      }\n    };\n\n    let promise = new Promise(init);\n    return promise;\n  };\n  const testSSLCertificate = (url) => {\n    const init = (resolve, reject) => {\n      if (options.ignoreSSLTest) {\n        return resolve();\n      }\n\n      msg.appMsg('Starting SSLLabs test');\n      ssllabs.scan(url, function(err, host) {\n        msg.appMsg('SSLLabs test was done');\n        const result = {\n          summary: '',\n          grades: [],\n          value: host,\n          score: 0,\n          weight: 1\n        };\n        const gradeScores = {\n          'A+': 100,\n          'A': 80,\n          'B': 65,\n          'C': 50,\n          'D': 35,\n          'E': 20,\n          'F': 10\n        };\n        if (err || !host) {\n          return resolve(result);\n        }\n        host.endpoints.forEach(function(endpoint) {\n          if (!endpoint.grade) {\n            return;\n          }\n          result.score += gradeScores[endpoint.grade] ? gradeScores[endpoint.grade] : 0;\n          result.grades.push(endpoint.grade);\n        });\n        result.score = result.grades.length ? result.score / result.grades.length : 0;\n        result.impact = result.score * result.weight;\n        result.summary = !result.grades.length ? 'No SSL certificate detected' : '';\n        resolve(result);\n      });\n    };\n\n    let promise = new Promise(init);\n    return promise;\n  };\n  const validateSitemap = () => {\n    let url = parsedUrl.href;\n    const init = (resolve, reject) => {\n      if (options.ignoreSitemapTest) {\n        return resolve();\n      }\n      msg.appMsg('Sitemap testing..');\n      urlExists(normalizeUrl(url) + '/sitemap.xml')\n        .then(function(response) {\n          msg.appMsg('Sitemap test was done');\n          const exists = response ? true : false;\n          resolve({\n            summary: !exists ? 'Sitemap.xml not found' : 'Sitemap.xml was found',\n            value: exists,\n            weight: 1,\n            score: exists ? 100 : 0,\n            impact: !exists ? 100 : 0\n          });\n        }).catch(function(err) {\n          resolve({\n            summary: 'Sitemap.xml not found',\n            value: false,\n            weight: 1,\n            score: 0,\n            impact: 100\n          });\n        });;\n    };\n    let promise = new Promise(init);\n    return promise;\n  };\n  const validateRobots = () => {\n    let url = parsedUrl.href;\n    const init = (resolve, reject) => {\n      if (options.ignoreRobotsTest) {\n        return resolve();\n      }\n      msg.appMsg('robots testing..');\n      urlExists(normalizeUrl(url) + '/robots.xml')\n        .then(function(response) {\n          msg.appMsg('robots test was done');\n          const exists = response ? true : false;\n          resolve({\n            summary: !exists ? 'Robots.txt not found' : 'Robots.txt was found',\n            value: exists,\n            weight: 1,\n            score: exists ? 100 : 0,\n            impact: !exists ? 100 : 0\n          });\n        }).catch(function(err) {\n          resolve({\n            summary: 'Robots.txt not found',\n            value: false,\n            weight: 1,\n            score: 0,\n            impact: 100\n          });\n        });\n    };\n    let promise = new Promise(init);\n    return promise;\n  };\n\n  const emitError = (code, url) => {\n    emitter.emit('error', {\n      code,\n      message: http.STATUS_CODES[code],\n      url\n    });\n  };\n\n  return {\n    on: emitter.on,\n    off: emitter.off,\n    load,\n    analyze\n  }\n};\n"]}